SQL 语法速查

本文最后更新于 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 表操作-数据类型

数值类型

类型 大小 SIGNED 范围 UNSIGNED 范围 描述
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 表名 SET1 =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
列名 -- 执行顺序 4
FROM
表名 -- 执行顺序 1
WHERE
条件 -- 执行顺序 2
GROUP BY
分组列名 -- 执行顺序 3
HAVING
分组后条件 -- 执行顺序 5
ORDER BY
排序列名 排序方式 -- 执行顺序 6
LIMIT
[起始行,] 行数;

将上面的完整语法进行拆分,分为以下几个部分:

  • 基本查询(不带任何条件)
  • 条件查询(WHERE)
  • 聚合函数(count、max、min、avg、sum)
  • 分组查询(GROUP BY)
  • 排序查询(ORDER BY)
  • 分页查询(LIMIT)

1.3.1 基本查询

1
2
3
4
SELECT * FROM 表名; -- 查询所有列
SELECT1, 列2, ... FROM 表名; -- 查询指定列
SELECT1 [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
-- 列1可为多个列
SELECT1, 聚合函数(列2) FROM 表名 [WHERE 条件] GROUP BY1 [HAVING 分组后条件];

WHERE 与 HAVING 区别

  • 执行时机不同:WHERE 是分组之前进行过滤,不满足 WHERE 条件,不参与分组;而 HAVING 是分组之后对结果进行过滤。
  • 判断条件不同:WHERE 不能对聚合函数进行判断,而 HAVING 可以。

注意事项

  • 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。
  • 执行顺序: WHERE > 聚合函数 > HAVING 。
  • 支持多字段分组,具体语法为 : GROUP BY 列 A, 列 B

1.3.5 排序查询

1
2
SELECT * FROM 表名 ORDER BY 列名 排序方式; -- 1个排序依据,*可以是若干列
SELECT * FROM 表名 ORDER BY1 排序方式, 列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) -- 左填充,不足 len 位,使用 pad 填充
RPAD(str, len, pad) -- 右填充,不足 len 位,使用 pad 填充
TRIM(str) -- 去除两端空格
SUBSTRING(str, start, len) -- 截取,从 start 开始,截取 len 个字符
REPLACE(str, from_str, to_str) -- 替换,将 str 中的 from_str 替换为 to_str
REVERSE(str) -- 反转
LENGTH(str) -- 长度
CHAR_LENGTH(str) -- 长度
INSTR(str, sub_str) -- 查找子串 sub_str 在 str 中的位置
LOCATE(sub_str, str) -- 查找子串 sub_str 在 str 中的位置
LEFT(str, len) -- 截取左边 len 个字符
RIGHT(str, len) -- 截取右边 len 个字符
MID(str, start, len) -- 截取,从 start 开始,截取 len 个字符
FORMAT(num, decimal) -- 格式化数字,保留 decimal 位小数

2.2 数学函数

1
2
3
4
5
6
7
8
9
10
11
SELECT
ABS(num) -- 绝对值
CEIL(num) -- 向上取整
FLOOR(num) -- 向下取整
ROUND(num, decimal) -- 四舍五入,保留 decimal 位小数
TRUNCATE(num, decimal) -- 截断
MOD(num1, num2) -- 取余,num1 MOD num2
POW(num, n) -- 幂运算
SQRT(num) -- 开方
RAND() -- 随机数,返回 0-1 之间的随机数
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() -- 当前日期和时间,返回 YYYY-MM-DD HH:MM:SS
CURDATE() -- 当前日期,返回 YYYY-MM-DD
CURTIME() -- 当前时间,返回 HH:MM:SS
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) -- 星期的第几天,1-7 表示周日到周六
DAYOFMONTH(date) -- 月份的第几天
DAYOFYEAR(date) -- 年份的第几天
WEEK(date) -- 一年中的第几周
WEEKDAY(date) -- 一周中的第几天,0-6 表示周一到周日
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) -- 判断是否为 NULL,为 NULL 返回 default_val
NULLIF(val1, val2) -- 判断是否相等,相等返回 NULL
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() -- 生成 UUID
SLEEP(n) -- 休眠 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 外键名;

-- 外键 CASCADE 级联操作
ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY (列名) REFERENCES 主表名(主表列名) ON UPDATE CASCADE ON DELETE CASCADE;
-- 外键 SET NULL 级联操作
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] JOIN2 ON1.=2.
[INNER | LEFT | RIGHT] JOIN3 ON1.=3.
...
WHERE
条件;

自连接联合查询

1
2
3
SELECTFROM1
UNION [ALL]
SELECTFROM2; -- 去重则不带 ALL

5 子查询

1
SELECT * FROM1 WHERE= (SELECTFROM2);

5.1 标量子查询

子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式,这种子查询称为标量子查询。常用的操作符:= <> > >= < <=

5.2 列子查询

子查询返回的结果是一列值,这种子查询称为列子查询。常用的操作符:IN NOT IN ANY SOME ALL

1
2
SELECT * FROM1 WHEREIN (SELECTFROM2);
SELECT * FROM1 WHERE> ALL (SELECTFROM2);

5.3 行子查询

子查询返回的结果是一行(可以是多列),这种子查询称为行子查询。常用的操作符:= <> IN NOT IN

1
SELECT * FROM1 WHERE (列1, 列2) = (SELECT1, 列2 FROM2);

5.4 表子查询

子查询返回的结果是多行多列,这种子查询称为表子查询。常用的操作符:IN

1
SELECT * FROM1 WHERE (列1, 列2) IN (SELECT1, 列2 FROM2);

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:串行化,最高级别,保证事务之间不会产生干扰。

SQL 语法速查
https://blog.gtbcamp.cn/article/sql/
作者
Great Thunder Brother
发布于
2024年10月24日
更新于
2025年8月14日
许可协议