是一種特定目的程序語言,用於管理關係數據庫管理系統(RDBMS),或在關係流數據管理系統(RDSMS)中進行流處理。html
在數據庫系統中,SQL語句不區分大小寫(建議用大寫)mysql
但字符串常量區分大小寫正則表達式
SQL語句可單行或多行書寫,以「;」結尾sql
關鍵詞不能跨多行或簡寫數據庫
用空格和縮進來提升語句的可讀性centos
子句一般位於獨立行,便於編輯,提升可讀性性能
註釋:測試
數據庫對象的命名規則優化
- 必須以字母開頭 - 可包括數字和三個特殊字符(# _ $) - 不要使用MySQL的保留字 - 同一database(Schema)下的對象不能同名
DDL: Data Defination Language 數據定義語言centos7
- CREATE, DROP, ALTER
DML: Data Manipulation Language 數據操做語言
- INSERT, DELETE, UPDATE
DCL:Data Control Language 數據控制語言
- GRANT, REVOKE
DQL:Data Query Language 數據查詢語言
- SELECT
CREATE DATABASE [IF NOT EXISTS] db_name; 建立數據庫
CHARACTER SET 'character set name' 設置字符集類型
COLLATE 'collate name' 設置排序規則
查看支持全部字符集:SHOW CHARACTER SET;
查看支持全部排序規則:SHOW COLLATION;
MariaDB [(none)]> CREATE DATABASE IF NOT EXISTS testdb;
我不會
SHOW DATABASES;
CREATE TABLE [IF NOT EXISTS] tbl_name (create_definition,...)
MariaDB [testdb]> CREATE TABLE IF NOT EXISTS students (id TINYINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,name VARCHAR(30) NOT NULL,phone CHAR(11),gender ENUM('M','F'));
CREATE TABLE [IF NOT EXISTS] tbl_name select_statement
MariaDB [testdb]> CREATE TABLE user SELECT user,host,password FROM mysql.user;
若是隻想模仿查詢舊錶建立一個無記錄的表咱們能夠加入條件
WHERE 0=1;
MariaDB [testdb]> CREATE TABLE user2 SELECT user,host,password FROM mysql.user WHERE 0=1;
CREATE TABLE [IF NOT EXISTS] tbl_name LIKE old_tbl_name
MariaDB [testdb]> CREATE TABLE user3 LIKE mysql.user;
ALTER TABLE tbl_name [alter_specification [, alter_specification] ...]
MariaDB [testdb]> ALTER TABLE students ADD age TINYINT AFTER name;
MariaDB [testdb]> ALTER TABLE students DROP phone;
MariaDB [testdb]> ALTER TABLE students CHANGE age ages TINYINT(2) NOT NULL;
MariaDB [testdb]> ALTER TABLE students MODIFY gender ENUM('M','F');
MariaDB [testdb]> DROP TABLE user3;
SHOW TABLES; 列出庫中全部的表
DESC [db_name.]tb_name; 查看錶結構
SHOW CREATE TABLE tbl_name; 查看建立表的命令
SHOW TABLE STATUS LIKE 'tbl_name'; 查看錶狀態
SHOW TABLE STATUS FROM db_name; 查看指定庫中全部表狀態
SHOW ENGINES; 查看全部存儲引擎
MariaDB [testdb]> DESC students; #示例表 +--------+---------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------+---------------------+------+-----+---------+----------------+ | id | tinyint(3) unsigned | NO | PRI | NULL | auto_increment | | name | varchar(30) | NO | | NULL | | | ages | tinyint(2) | NO | | NULL | | | gender | enum('M','F') | YES | | NULL | | +--------+---------------------+------+-----+---------+----------------+
INSERT INTO tb_name (col1,col2,...) VALUES (val1,val2,...);
MariaDB [testdb]> INSERT students(id,name,ages,gender) VALUES (1,'tom',26,'M'); MariaDB [testdb]> INSERT students(name,ages,gender) VALUES ('jerry',19,'M'); MariaDB [testdb]> INSERT students(name,ages,gender) VALUES ('maria',19,'M'); MariaDB [testdb]> INSERT students SET name='ouyangfeng',ages=56,gender='M';
INSERT INTO tb_name (col1,col2,...) VALUES (val1,val2,...)[,(val1,val2,...),...];
MariaDB [testdb]> INSERT students(name,ages,gender) VALUES ('xiaolongnv',18,'F'),('dongfangbubai',28,'F');
MariaDB [testdb]> SELECT * FROM students; +----+---------------+------+--------+ | id | name | ages | gender | +----+---------------+------+--------+ | 1 | tom | 26 | M | | 2 | jerry | 19 | M | | 3 | maria | 19 | M | | 4 | xiaolongnv | 18 | F | | 5 | dongfangbubai | 28 | F | | 6 | ouyangfeng | 56 | M | +----+---------------+------+--------+
MariaDB [testdb]> ALTER TABLE students ADD address TEXT; #加個字段作測試用
MariaDB [testdb]> INSERT students(name,address) SELECT user,host FROM mysql.user;
MariaDB [testdb]> SELECT * FROM students; +----+---------------+------+--------+-----------+ | id | name | ages | gender | address | +----+---------------+------+--------+-----------+ | 1 | tom | 26 | M | NULL | | 2 | jerry | 19 | M | NULL | | 3 | maria | 19 | M | NULL | | 4 | xiaolongnv | 18 | F | NULL | | 5 | dongfangbubai | 28 | F | NULL | | 6 | ouyangfeng | 56 | M | NULL | | 7 | root | 0 | NULL | 127.0.0.1 | | 8 | root | 0 | NULL | ::1 | | 9 | | 0 | NULL | centos7 | | 10 | root | 0 | NULL | centos7 | | 11 | | 0 | NULL | localhost | | 12 | root | 0 | NULL | localhost | +----+---------------+------+--------+-----------+
UPDATE tbl_name SET col1=value1,col2=value2,... WHERE col=value;
MariaDB [testdb]> UPDATE students SET gender='F' WHERE id=3;
MariaDB [testdb]> DELETE FROM students WHERE name=''; #刪除名字爲空的記錄 MariaDB [testdb]> TRUNCATE TABLE user; #狀況表記錄
注意:必定要有限制條件(WHERE | LIMIT),不然將修改全部行的指定字段
MariaDB [testdb]> SELECT * FROM students WHERE name='maria'; #查詢maria的信息 MariaDB [testdb]> SELECT * FROM students WHERE id BETWEEN 2 AND 5; #查詢2到5號學生的信息 MariaDB [testdb]> SELECT * FROM students WHERE name IN ('jerry','xiaolongnv'); #查詢jerry和xiaolongnv的信息 MariaDB [testdb]> SELECT * FROM students WHERE gender IS NOT NULL; #查詢年齡不爲空的信息 MariaDB [testdb]> SELECT * FROM students WHERE name LIKE '%o%'; #查詢姓名中包含'o'的信息
MariaDB [testdb]> SELECT user AS 用戶,host AS 主機,password AS 密碼 FROM mysql.user;
MariaDB [testdb]> SELECT gender,AVG(ages) FROM students GROUP BY gender; #查詢男生、女生年齡的平均值 MariaDB [testdb]> SELECT gender,AVG(ages) FROM students GROUP BY gender HAVING gender='M'; #只顯示男生的平均年齡信息
MariaDB [testdb]> SELECT * FROM students ORDER BY ages DESC; #按年齡排序,倒序顯示 MariaDB [testdb]> SELECT * FROM students WHERE ages > 0 ORDER BY ages LIMIT 3; #按年齡排序,過濾年齡大於0的,正序排序,取前三條記錄
爲了練習,咱們將表在擴展一下
MariaDB [testdb]> DELETE FROM students WHERE id BETWEEN 7 AND 12; MariaDB [testdb]> CREATE TABLE score (id TINYINT(2) UNSIGNED AUTO_INCREMENT PRIMARY KEY,score TINYINT(3)); MariaDB [testdb]> ALTER TABLE students ADD sid TINYINT(2); MariaDB [testdb]> UPDATE students SET sid=6 WHERE id=6; MariaDB [testdb]> INSERT score SET score=87; MariaDB [testdb]> SELECT * FROM students; +----+---------------+------+--------+---------+------+ | id | name | ages | gender | address | sid | +----+---------------+------+--------+---------+------+ | 1 | tom | 26 | M | NULL | 1 | | 2 | jerry | 19 | M | NULL | 2 | | 3 | maria | 19 | F | NULL | 3 | | 4 | xiaolongnv | 18 | F | NULL | 4 | | 5 | dongfangbubai | 28 | F | NULL | 5 | | 6 | ouyangfeng | 56 | M | NULL | 6 | +----+---------------+------+--------+---------+------+ MariaDB [testdb]> SELECT * FROM score; +----+-------+ | id | score | +----+-------+ | 1 | 99 | | 2 | 98 | | 3 | 88 | | 4 | 68 | | 5 | 78 | | 6 | 87 | +----+-------+
JOIN ON:交叉鏈接
INNER JOIN ON:內鏈接
LEFT OUTER JOIN ON:左外鏈接
RIGHT OUTER JOIN ON:右外鏈接
UNION ON:徹底外鏈接
MariaDB [testdb]> SELECT * FROM students AS s,score AS o WHERE s.sid=o.id; #倆張表取交集
MariaDB [testdb]> SELECT * FROM students JOIN score;
MariaDB [testdb]> SELECT t.name,s.score FROM students AS t INNER JOIN score AS s ON t.sid=s.id; +---------------+-------+ | name | score | +---------------+-------+ | tom | 99 | | jerry | 98 | | maria | 88 | | xiaolongnv | 68 | | dongfangbubai | 78 | | ouyangfeng | 87 | +---------------+-------+
MariaDB [testdb]> SELECT t.name,s.score FROM students AS t LEFT JOIN score AS s ON t.sid=s.id; #左外鏈接 +---------------+-------+ | name | score | +---------------+-------+ | tom | 99 | | jerry | 98 | | maria | 88 | | xiaolongnv | 68 | | dongfangbubai | 78 | | ouyangfeng | 87 | +---------------+-------+
MariaDB [testdb]> SELECT * FROM students AS t RIGHT JOIN score AS s ON t.sid=s.id; #右外鏈接
MariaDB [testdb]> SELECT name,address FROM students -> UNION -> SELECT user,host FROM mysql.user; +---------------+-----------+ | name | address | +---------------+-----------+ | tom | NULL | | jerry | NULL | | maria | NULL | | xiaolongnv | NULL | | dongfangbubai | NULL | | ouyangfeng | NULL | | root | 127.0.0.1 | | root | ::1 | | | centos7 | | root | centos7 | | | localhost | | root | localhost | +---------------+-----------+
MariaDB [testdb]> ALTER TABLE students ADD tid TINYINT(2); #再加一個tid字段 MariaDB [testdb]> SELECT * FROM students; +----+---------------+------+--------+---------+------+------+ | id | name | ages | gender | address | sid | tid | +----+---------------+------+--------+---------+------+------+ | 1 | tom | 26 | M | NULL | 1 | 2 | | 2 | jerry | 19 | M | NULL | 2 | 1 | | 3 | maria | 19 | F | NULL | 3 | 4 | | 4 | xiaolongnv | 18 | F | NULL | 4 | 5 | | 5 | dongfangbubai | 28 | F | NULL | 5 | 4 | | 6 | ouyangfeng | 56 | M | NULL | 6 | 4 | +----+---------------+------+--------+---------+------+------+
MariaDB [testdb]> SELECT s1.name AS studentname,s2.name AS teachername FROM students AS s1 INNER JOIN students AS s2 ON s1.id=s2.tid; +---------------+---------------+ | studentname | teachername | +---------------+---------------+ | jerry | tom | | tom | jerry | | xiaolongnv | maria | | dongfangbubai | xiaolongnv | | xiaolongnv | dongfangbubai | | xiaolongnv | ouyangfeng | +---------------+---------------+
子查詢:在查詢語句嵌套着查詢語句,性能較差,基於某語句的查詢結果再次進行的查詢
MariaDB [testdb]> SELECT name,ages FROM students WHERE ages > (SELECT AVG(ages) FROM students); #查詢大於平均年齡的同窗
SELECT tb_alias.col1,... FROM (SELECT clause) AS tb_alias WHERE Clause;
選擇正確的數據類型對於得到高性能相當重要,三大原則:
精確數值
INT
TINYINT 微整型 1
SMALLINT 小整型 2
MEDIUMINT 中整型 3
INT 整型 4
BIGINT 大整型 8
DECIMAL 精肯定點型
近似數值
FLOAT 單精度浮點型 4
DOUBLE 雙精度浮點型 8
REAL
BIT
定長
- CHAR(不區分大小寫)255 - BINARY(區分大小寫)
變長
VARCHAR(不區分大小寫)65,535
VARBINNARY(區分大小寫)
TEXT(不區分大小寫)
TINYTEXT 255
TEXT 65,535
MEDIUMTEXT 16,777,215
LONGTEXT 4,294,967,295
BLOB(區分大小寫)
TINYBLOB 微二進制大對象 255
BLOB 二進制大對象 64K
MEDIUMBLOB 中二進制大對象 16M
LONGBLOB 長二進制大對象 4G
ENUM 枚舉 65535種變化
SET 集合 1-64個字符串,能夠隨意組合
DATE 3
TIME 3
DATETIME 8
TIMESTAMP 4
YEAR{2|4} 1
參考官方文檔:https://dev.mysql.com/doc/refman/5.5/en/data-types.html
@^_^@ 2018.06.07 13:37