本文最后更新于 2025年8月14日 星期四 10:51
1 SQL
SQL 语句,根据其功能,主要分为四类:DDL、DML、DQL、DCL。
1.1 数据定义语言 DDL
数据定义语言(Data Definition
Language,DDL),用来定义数据库对象(数据库,表,字段)。
1.1.1 数据库操作
1 2 3 4 5 SHOW DATABASES; SELECT DATABASE(); CREATE DATABASE 数据库名 [DEFAULT CHARACTER SET utf8mb4]; DROP DATABASE 数据库名; USE 数据库名;
1.1.2 表操作
1.1.2.1 表操作-查询创建
1 2 3 4 5 6 7 SHOW TABLES; DESC 表名; SHOW CREATE TABLE 表名; CREATE TABLE 表名 ( 列名 数据类型 [AUTO_INCREMENT] [COMMENT '注释' ], ... ) [COMMENT '注释' ];
1.1.2.2 表操作-数据类型
数值类型
TINYINT
1 byte
(-128,127)
(0,255)
小整数值
SMALLINT
2 bytes
(-32768,32767)
(0,65535)
大整数值
MEDIUMINT
3 bytes
(-8388608,8388607)
(0,16777215)
大整数值
INT 或 INTEGER
4 bytes
(-2147483648,2147483647)
(0,4294967295)
大整数值
BIGINT
8 bytes
(\(-2^{63}\) ,\(2^{63}-1\) )
\((0,2^{64}-1)\)
极大整数值
FLOAT
4 bytes
(\(-3.402823466^{-38}\) ,\(3.402823466351^{38}\) )
0 和 (\(1.175494351^{-38}\) ,\(3.402823466^{38}\) )
单精度浮点数值
DOUBLE
8 bytes
(\(-1.7976931348623157^{-308}\) ,\(1.7976931348623157^{308}\) )
0 和 (\(2.2250738585072014^{-308}\) ,\(1.7976931348623157^{308}\) )
双精度浮点数值
DECIMAL
依赖于 M(精度)和 D(标度)的值
依赖于 M(精度)和 D(标度)的值
小数值(精确定点数)
字符串类型
CHAR
0-255 bytes
定长字符串
VARCHAR
0-65535 bytes
变长字符串
TINYBLOB
0-255 bytes
不超过 255 个字符的二进制数据
TINYTEXT
0-255 bytes
短文本字符串
BLOB
0-65 535 bytes
二进制形式的长文本数据
TEXT
0-65 535 bytes
长文本数据
MEDIUMBLOB
0-16 777 215 bytes
二进制形式的中等长度文本数据
MEDIUMTEXT
0-16 777 215 bytes
中等长度文本数据
LONGBLOB
0-4 294 967 295 bytes
二进制形式的极大文本数据
LONGTEXT
0-4 294 967 295 bytes
极大文本数据
日期和时间类型
DATE
3
1000-01-01 至 9999-12-31
YYYY-MM-DD
日期值
TIME
3
-838:59:59 至 838:59:59
HH:MM:SS
时间值或持续时间
YEAR
1
1901 至 2155
YYYY
年份值
DATETIME
8
1000-01-01 00:00:00 至 9999-12-31
23:59:59
YYYY-MM-DD HH:MM:SS
混合日期和时间值
TIMESTAMP
4
1970-01-01 00:00:01 至 2038-01-19
03:14:07
YYYY-MM-DD HH:MM:SS
混合日期和时间值,时间戳
1.1.2.3 表操作-修改删除
1 2 3 4 5 6 7 8 ALTER TABLE 表名 ADD 列名 数据类型(长度) [COMMENT '注释' ] [约束]; ALTER TABLE 表名 MODIFY 列名 数据类型(长度) [COMMENT '注释' ] [约束]; ALTER TABLE 表名 CHANGE 旧列名 新列名 数据类型(长度) [COMMENT '注释' ] [约束]; ALTER TABLE 表名 DROP 列名; ALTER TABLE 表名 RENAME 新表名; DROP TABLE 表名; TRUNCATE TABLE 表名;
1.2 数据操作语言 DML
数据操作语言(Data Manipulation
Language,DML),用来对数据库表中的数据进行增删改。
1.2.1 插入数据
1 2 3 4 5 6 7 8 INSERT INTO 表名 (列1 , 列2 , ...) VALUES (值1 , 值2 , ...);INSERT INTO 表名 VALUES (值1 , 值2 , ...);INSERT INTO 表名 (列1 , 列2 , ...) VALUES (值1 , 值2 , ...), (值1 , 值2 , ...), ...;INSERT INTO 表名 VALUES (值1 , 值2 , ...), (值1 , 值2 , ...), ...;
1.2.2 修改、删除数据
1 2 UPDATE 表名 SET 列1 = 值1 , 列2 = 值2 , ... [WHERE 条件]; DELETE FROM 表名 [WHERE 条件];
1.3 数据查询语言 DQL
数据查询语言(Data Query
Language,DQL),用来查询数据库表中的数据。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 SELECT 列名 FROM 表名 WHERE 条件 GROUP BY 分组列名 HAVING 分组后条件 ORDER BY 排序列名 排序方式 LIMIT [起始行,] 行数;
将上面的完整语法进行拆分,分为以下几个部分:
基本查询(不带任何条件)
条件查询(WHERE)
聚合函数(count、max、min、avg、sum)
分组查询(GROUP BY)
排序查询(ORDER BY)
分页查询(LIMIT)
1.3.1 基本查询
1 2 3 4 SELECT * FROM 表名; SELECT 列1 , 列2 , ... FROM 表名; SELECT 列1 [AS ] 别名1 , 列2 [AS ] 别名2 , ... FROM 表名; SELECT DISTINCT 列名 FROM 表名;
1.3.2 条件查询
1 SELECT * FROM 表名 WHERE 条件;
1.3.3 聚合函数
1 2 3 4 5 SELECT COUNT (列名) FROM 表名; SELECT MAX (列名) FROM 表名; SELECT MIN (列名) FROM 表名; SELECT AVG (列名) FROM 表名; SELECT SUM (列名) FROM 表名;
1.3.4 分组查询
1 2 SELECT 列1 , 聚合函数(列2 ) FROM 表名 [WHERE 条件] GROUP BY 列1 [HAVING 分组后条件];
WHERE 与 HAVING 区别
执行时机不同:WHERE 是分组之前进行过滤,不满足 WHERE
条件,不参与分组;而 HAVING 是分组之后对结果进行过滤。
判断条件不同:WHERE 不能对聚合函数进行判断,而 HAVING 可以。
注意事项
分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。
执行顺序: WHERE > 聚合函数 > HAVING 。
支持多字段分组,具体语法为 : GROUP BY 列 A, 列 B
1.3.5 排序查询
1 2 SELECT * FROM 表名 ORDER BY 列名 排序方式; SELECT * FROM 表名 ORDER BY 列1 排序方式, 列2 排序方式, ...;
升序 ASC(默认),降序 DESC。
1.3.6 分页查询
1 SELECT * FROM 表名 LIMIT 起始行, 行数;
分页查询是数据库的方言,不同的数据库有不同的实现,MySQL 中是
LIMIT。如果从头查询,起始行可以省略。
1.4 数据控制语言 DCL
数据控制语言(Data Control
Language,DCL),用来控制数据库对象的访问权限。
1.4.1 用户控制
1 2 3 4 5 SELECT * FROM mysql.user; CREATE USER '用户名' @'主机' IDENTIFIED BY '密码' ; DROP USER '用户名' @'主机' ; ALTER USER '用户名' @'主机' IDENTIFIED WITH mysql_native_password BY '新密码' ;
主机名可以使用 % 通配。
1.4.2 权限控制
1 2 3 SHOW GRANTS FOR '用户名' @'主机' ; GRANT 权限列表 ON 数据库.表 TO '用户名' @'主机' ; REVOKE 权限列表 ON 数据库.表 FROM '用户名' @'主机' ;
注意事项:
多个权限之间,使用逗号分隔
授权时,数据库名和表名可以使用 *
进行通配,代表所有。
2 函数
2.1 字符串函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 SELECT CONCAT(str1, str2, ...) LOWER (str) UPPER (str) LPAD(str, len, pad) RPAD(str, len, pad) TRIM (str) SUBSTRING (str, start , len) REPLACE(str, from_str, to_str) REVERSE(str) LENGTH(str) CHAR_LENGTH (str) INSTR(str, sub_str) LOCATE(sub_str, str) LEFT (str, len) RIGHT (str, len) MID(str, start , len) FORMAT(num, decimal )
2.2 数学函数
1 2 3 4 5 6 7 8 9 10 11 SELECT ABS (num) CEIL (num) FLOOR (num) ROUND(num, decimal ) TRUNCATE (num, decimal ) MOD (num1, num2) POW(num, n) SQRT (num) RAND() SIGN(num)
2.3 日期函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 SELECT NOW() CURDATE() CURTIME() DATE_FORMAT(date , format) DATE_ADD(date , INTERVAL n type) DATE_SUB(date , INTERVAL n type) ADDDATE(date , INTERVAL n type) SUBDATE(date , INTERVAL n type) DATEDIFF(date1, date2) DATE (date ) TIME (date ) YEAR (date ) MONTH (date ) DAY (date ) HOUR (date ) MINUTE (date ) SECOND (date ) DAYOFWEEK(date ) DAYOFMONTH(date ) DAYOFYEAR(date ) WEEK(date ) WEEKDAY(date ) QUARTER(date ) LAST_DAY(date )
2.4 流程函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 SELECT IF(condition , true_val, false_val) IFNULL(val, default_val) NULLIF (val1, val2) CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 ... ELSE result END CASE val WHEN val1 THEN result1 WHEN val2 THEN result2 ... ELSE result END
2.5 其他函数
1 2 3 4 5 6 7 SELECT VERSION() DATABASE() USER () NOW() UUID() SLEEP(n)
3 约束
NOT NULL
非空约束
UNIQUE
唯一约束
PRIMARY KEY
主键约束,要求非空且唯一
DEFAULT
默认约束
CHECK
检查约束,保证字段值满足某一个条件
FOREIGN KEY
外键约束
3.1 外键约束
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 CREATE TABLE 表名 ( 列名 数据类型, ... [CONSTRAINT ] [外键名] FOREIGN KEY (列名) REFERENCES 主表名(主表列名) ); ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY (列名) REFERENCES 主表名(主表列名);ALTER TABLE 表名 DROP FOREIGN KEY 外键名;ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY (列名) REFERENCES 主表名(主表列名) ON UPDATE CASCADE ON DELETE CASCADE;ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY (列名) REFERENCES 主表名(主表列名) ON UPDATE SET NULL ON DELETE SET NULL ;
4 多表查询
4.1 连接查询
1 2 3 4 5 6 7 8 9 SELECT 列1 , 列2 , ...FROM 表1 [INNER | LEFT | RIGHT ] JOIN 表2 ON 表1. 列 = 表2. 列 [INNER | LEFT | RIGHT ] JOIN 表3 ON 表1. 列 = 表3. 列 ...WHERE 条件;
自连接联合查询
1 2 3 SELECT 列 FROM 表1 UNION [ALL ]SELECT 列 FROM 表2 ;
5 子查询
1 SELECT * FROM 表1 WHERE 列 = (SELECT 列 FROM 表2 );
5.1 标量子查询
子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式,这种子查询称为标量子查询。常用的操作符:=
<> > >=
< <=。
5.2 列子查询
子查询返回的结果是一列值,这种子查询称为列子查询。常用的操作符:IN
NOT IN ANY SOME
ALL。
1 2 SELECT * FROM 表1 WHERE 列 IN (SELECT 列 FROM 表2 );SELECT * FROM 表1 WHERE 列 > ALL (SELECT 列 FROM 表2 );
5.3 行子查询
子查询返回的结果是一行(可以是多列),这种子查询称为行子查询。常用的操作符:=
<> IN NOT IN。
1 SELECT * FROM 表1 WHERE (列1 , 列2 ) = (SELECT 列1 , 列2 FROM 表2 );
5.4 表子查询
子查询返回的结果是多行多列,这种子查询称为表子查询。常用的操作符:IN。
1 SELECT * FROM 表1 WHERE (列1 , 列2 ) IN (SELECT 列1 , 列2 FROM 表2 );
6 事务
事务是数据库管理系统执行过程中的一个逻辑工作单位,由一个有限的数据库操作序列组成。事务具有以下四个特性:原子性、一致性、隔离性、持久性。
1 2 3 4 5 6 START TRANSACTION; COMMIT ; ROLLBACK ; SELECT @@TRANSACTION_ISOLATION ; SET [SESSION | GLOBAL ] TRANSACTION ISOLATION LEVEL 隔离级别;
事务隔离级别
READ UNCOMMITTED:读未提交,最低级别,允许读取未提交的数据。
READ COMMITTED:读已提交,只能读取已提交的数据。
REPEATABLE
READ:可重复读,保证同一事务中多次读取的数据是一致的。
SERIALIZABLE:串行化,最高级别,保证事务之间不会产生干扰。