跳到主要内容

附录二:SQL 速查表

全书 SQL 命令一页汇总,按主题分区。忘了语法就来这里查,示例均基于全书统一的 school 库(class / student / course / score 四张表)。

一、数据库操作

语法说明示例
SHOW DATABASES;列出所有数据库SHOW DATABASES;
CREATE DATABASE 库名;创建数据库CREATE DATABASE school DEFAULT CHARACTER SET utf8mb4;
USE 库名;切换到某个数据库USE school;
SELECT DATABASE();查看当前所在数据库SELECT DATABASE();
DROP DATABASE 库名;删除数据库(不可恢复,慎用)DROP DATABASE school;

二、表操作

语法说明示例
SHOW TABLES;列出当前库的所有表SHOW TABLES;
CREATE TABLE 表名 (列 类型, ...);创建表CREATE TABLE class (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20) NOT NULL);
DESC 表名;查看表结构DESC student;
SHOW CREATE TABLE 表名;查看建表语句(含字符集)SHOW CREATE TABLE score;
ALTER TABLE 表 ADD 列 类型;添加列ALTER TABLE student ADD phone VARCHAR(20);
ALTER TABLE 表 MODIFY 列 新类型;修改列类型ALTER TABLE student MODIFY phone VARCHAR(30);
ALTER TABLE 表 CHANGE 旧列 新列 类型;改列名(含类型)ALTER TABLE student CHANGE phone tel VARCHAR(30);
ALTER TABLE 表 DROP 列;删除列ALTER TABLE student DROP tel;
RENAME TABLE 旧名 TO 新名;表改名RENAME TABLE student TO stu;
TRUNCATE TABLE 表名;清空表数据(快、不可回滚)TRUNCATE TABLE score;
DROP TABLE 表名;删除整张表DROP TABLE score;

三、增删改(INSERT / DELETE / UPDATE)

语法说明示例
INSERT INTO 表 (列...) VALUES (值...);插入一行INSERT INTO class (name) VALUES ('三班');
INSERT INTO 表 (列...) VALUES (...),(...);一次插入多行INSERT INTO class (name) VALUES ('四班'),('五班');
UPDATE 表 SET 列=值 WHERE 条件;修改数据(务必带 WHERE)UPDATE score SET score = 61.0 WHERE id = 9;
DELETE FROM 表 WHERE 条件;删除行(务必带 WHERE)DELETE FROM score WHERE score IS NULL;
INSERT ... ON DUPLICATE KEY UPDATE ...有则更新、无则插入INSERT INTO score (student_id,course_id,score) VALUES (1,1,95.0) ON DUPLICATE KEY UPDATE score = 95.0;

四、查询(SELECT)

语法说明示例
SELECT * FROM 表;查询全部行和列SELECT * FROM student;
SELECT 列1, 列2 FROM 表;只查指定列SELECT name, gender FROM student;
SELECT 列 AS 别名 FROM 表;给列起别名SELECT name AS 姓名 FROM student;
SELECT DISTINCT 列 FROM 表;去重SELECT DISTINCT class_id FROM student;
WHERE 条件行过滤SELECT * FROM student WHERE class_id = 1;
WHERE ... AND / OR / NOT组合条件SELECT * FROM score WHERE score >= 60 AND score < 80;
WHERE 列 BETWEEN a AND b区间(含两端)SELECT * FROM score WHERE score BETWEEN 80 AND 90;
WHERE 列 IN (值...)属于集合SELECT * FROM student WHERE id IN (1, 3, 5);
WHERE 列 LIKE '模式'模糊查询,% 任意多字符、_ 单字符SELECT * FROM student WHERE name LIKE '王%';
WHERE 列 IS NULL / IS NOT NULL判断空值(不能用 = NULLSELECT * FROM score WHERE score IS NULL;
ORDER BY 列 [ASC|DESC]排序,默认升序SELECT * FROM score ORDER BY score DESC;
LIMIT n / LIMIT 偏移, n截取前 n 行 / 分页SELECT * FROM score ORDER BY score DESC LIMIT 3;

五、常用函数

语法说明示例
CONCAT(a, b, ...)字符串拼接SELECT CONCAT(name, '同学') FROM student;
LENGTH(s) / CHAR_LENGTH(s)字节长度 / 字符个数SELECT CHAR_LENGTH(name) FROM student;
UPPER(s) / LOWER(s)转大写 / 小写SELECT UPPER('abc');
SUBSTRING(s, 起点, 长度)截取子串(起点从 1 开始)SELECT SUBSTRING(name, 1, 1) FROM student;
ROUND(x, n)四舍五入保留 n 位小数SELECT ROUND(AVG(score), 1) FROM score;
CEIL(x) / FLOOR(x)向上 / 向下取整SELECT CEIL(81.2), FLOOR(81.8);
NOW() / CURDATE()当前日期时间 / 当前日期SELECT NOW();
YEAR(d) / MONTH(d) / DAY(d)提取年 / 月 / 日SELECT name, YEAR(birthday) FROM student;
DATEDIFF(d1, d2)两日期相差天数(d1−d2)SELECT DATEDIFF(CURDATE(), birthday) FROM student;
TIMESTAMPDIFF(YEAR, d1, d2)按年/月等计算差值(算年龄)SELECT TIMESTAMPDIFF(YEAR, birthday, CURDATE()) AS 年龄 FROM student;
IFNULL(a, b)a 为 NULL 时返回 bSELECT name, IFNULL(score, 0) FROM ...;
IF(条件, a, b)条件成立返回 a,否则 bSELECT IF(score >= 60, '及格', '不及格') FROM score;
CASE WHEN ... THEN ... ELSE ... END多分支判断SELECT CASE WHEN score >= 90 THEN '优秀' WHEN score >= 60 THEN '及格' ELSE '不及格' END FROM score;

六、聚合与分组

语法说明示例
COUNT(*) / COUNT(列)计数;COUNT(列) 忽略 NULLSELECT COUNT(*) FROM student;
SUM(列) / AVG(列)求和 / 平均(忽略 NULL)SELECT AVG(score) FROM score WHERE course_id = 1;
MAX(列) / MIN(列)最大值 / 最小值SELECT MAX(score), MIN(score) FROM score;
GROUP BY 列按列分组SELECT class_id, COUNT(*) FROM student GROUP BY class_id;
HAVING 条件分组后过滤(可用聚合函数)SELECT student_id, AVG(score) FROM score GROUP BY student_id HAVING AVG(score) >= 80;
书写顺序SELECT→FROM→WHERE→GROUP BY→HAVING→ORDER BY→LIMITSELECT course_id, AVG(score) FROM score WHERE score IS NOT NULL GROUP BY course_id HAVING AVG(score) > 75 ORDER BY AVG(score) DESC LIMIT 2;

七、多表连接(JOIN)

语法说明示例
A JOIN B ON 条件内连接:只保留两边都匹配的行SELECT s.name, c.name FROM student s JOIN class c ON s.class_id = c.id;
A LEFT JOIN B ON 条件左连接:左表全保留,右表没匹配的补 NULLSELECT s.name, sc.score FROM student s LEFT JOIN score sc ON sc.student_id = s.id;
A RIGHT JOIN B ON 条件右连接:右表全保留SELECT sc.score, s.name FROM score sc RIGHT JOIN student s ON sc.student_id = s.id;
三表连接依次 JOIN 下去SELECT st.name, c.name, sc.score FROM score sc JOIN student st ON sc.student_id = st.id JOIN course c ON sc.course_id = c.id;
表别名简化书写,表名 别名FROM student s JOIN class c ON s.class_id = c.id
UNION / UNION ALL上下拼接结果集(UNION 去重)SELECT name FROM student WHERE class_id = 1 UNION SELECT name FROM student WHERE gender = '女';

八、子查询

语法说明示例
WHERE 列 = (子查询)子查询返回单个值SELECT name FROM student WHERE id = (SELECT student_id FROM score ORDER BY score DESC LIMIT 1);
WHERE 列 IN (子查询)子查询返回一列多值SELECT name FROM student WHERE id IN (SELECT student_id FROM score WHERE score >= 90);
WHERE 列 NOT IN (子查询)取反:"没有……的"SELECT name FROM student WHERE id NOT IN (SELECT student_id FROM score WHERE course_id = 3);
WHERE EXISTS (子查询)存在匹配行即为真SELECT name FROM student s WHERE EXISTS (SELECT 1 FROM score WHERE student_id = s.id);
FROM (子查询) AS 别名把子查询当临时表用(必须起别名)SELECT AVG(总分) FROM (SELECT SUM(score) AS 总分 FROM score GROUP BY student_id) AS t;
与聚合比较拿聚合值当"标尺"SELECT * FROM score WHERE score > (SELECT AVG(score) FROM score);

九、约束

语法说明示例
PRIMARY KEY主键:唯一 + 非空,一表一个id INT PRIMARY KEY AUTO_INCREMENT
AUTO_INCREMENT自增,配合主键使用同上
NOT NULL不允许为空name VARCHAR(20) NOT NULL
DEFAULT 值默认值gender CHAR(1) NOT NULL DEFAULT '男'
UNIQUE唯一约束(可多列联合)CONSTRAINT uk_sc UNIQUE (student_id, course_id)
CHECK (条件)值必须满足条件CONSTRAINT chk_score CHECK (score BETWEEN 0 AND 100)
FOREIGN KEY ... REFERENCES ...外键:值必须在父表中存在CONSTRAINT fk_s FOREIGN KEY (class_id) REFERENCES class(id)
ON DELETE CASCADE父行删除时子行级联删除FOREIGN KEY (student_id) REFERENCES student(id) ON DELETE CASCADE

十、索引

语法说明示例
CREATE INDEX 索引名 ON 表 (列);创建普通索引CREATE INDEX idx_name ON student (name);
CREATE UNIQUE INDEX 索引名 ON 表 (列);创建唯一索引CREATE UNIQUE INDEX uk_cname ON course (name);
CREATE INDEX 索引名 ON 表 (列1, 列2);联合索引(注意最左前缀)CREATE INDEX idx_sc ON score (student_id, course_id);
SHOW INDEX FROM 表;查看表上的索引SHOW INDEX FROM score;
DROP INDEX 索引名 ON 表;删除索引DROP INDEX idx_name ON student;
EXPLAIN 查询语句;查看执行计划,判断是否用到索引EXPLAIN SELECT * FROM student WHERE name = '张三';

十一、事务

语法说明示例
START TRANSACTION;(或 BEGIN;开启事务START TRANSACTION;
COMMIT;提交:让改动真正生效COMMIT;
ROLLBACK;回滚:撤销事务内的所有改动ROLLBACK;
SAVEPOINT 名; / ROLLBACK TO 名;设置 / 回滚到保存点SAVEPOINT sp1; ROLLBACK TO sp1;
SET autocommit = 0;关闭自动提交SET autocommit = 0;
典型用法多条语句要么全成功要么全失败START TRANSACTION; UPDATE ...; UPDATE ...; COMMIT;

十二、视图

语法说明示例
CREATE VIEW 视图名 AS 查询;创建视图(把查询"存名字")CREATE VIEW v_score_report AS SELECT st.name, c.name AS course, sc.score FROM score sc JOIN student st ON sc.student_id = st.id JOIN course c ON sc.course_id = c.id;
SELECT * FROM 视图名;像查表一样查视图SELECT * FROM v_score_report;
CREATE OR REPLACE VIEW ... AS ...;修改(覆盖)视图定义CREATE OR REPLACE VIEW v_score_report AS SELECT ...;
SHOW CREATE VIEW 视图名;查看视图定义SHOW CREATE VIEW v_score_report;
DROP VIEW 视图名;删除视图(不影响底层表数据)DROP VIEW v_score_report;

十三、用户与权限

语法说明示例
CREATE USER '用户'@'主机' IDENTIFIED BY '密码';创建用户CREATE USER 'teacher'@'localhost' IDENTIFIED BY 'Teach@2026';
GRANT 权限 ON 库.表 TO '用户'@'主机';授权(权限如 SELECT、INSERT、ALL)GRANT SELECT ON school.v_score_report TO 'teacher'@'localhost';
SHOW GRANTS FOR '用户'@'主机';查看某用户的权限SHOW GRANTS FOR 'teacher'@'localhost';
REVOKE 权限 ON 库.表 FROM '用户'@'主机';收回权限REVOKE SELECT ON school.v_score_report FROM 'teacher'@'localhost';
ALTER USER '用户'@'主机' IDENTIFIED BY '新密码';修改密码ALTER USER 'teacher'@'localhost' IDENTIFIED BY 'New@2026';
DROP USER '用户'@'主机';删除用户DROP USER 'teacher'@'localhost';
FLUSH PRIVILEGES;刷新权限FLUSH PRIVILEGES;

十四、备份与恢复(系统命令行执行,不是 SQL)

语法说明示例
mysqldump -u 用户 -p 库名 > 文件.sql备份单个库mysqldump -u root -p school > school_backup.sql
mysqldump -u 用户 -p 库名 表名 > 文件.sql备份单张表mysqldump -u root -p school score > score_backup.sql
mysqldump -u 用户 -p --databases 库1 库2 > 文件.sql备份多个库(含建库语句)mysqldump -u root -p --databases school > school_full.sql
mysqldump -u 用户 -p --all-databases > 文件.sql备份全部数据库mysqldump -u root -p --all-databases > all.sql
mysql -u 用户 -p 库名 < 文件.sql恢复到指定库(库需先存在)mysql -u root -p school < school_backup.sql
SOURCE 文件路径;在 mysql 客户端内执行 SQL 文件SOURCE D:/backup/school_backup.sql;

使用小贴士

  • 忘记语法先来这里查,查不到再去对应章节复习——速查表帮你"想起来",章节帮你"搞明白"。
  • 所有写操作(UPDATE / DELETE / DROP / TRUNCATE)动手前默念三遍:有没有 WHERE?有没有备份?
  • 判断 NULL 只能用 IS NULL / IS NOT NULL;聚合函数会自动忽略 NULL。
  • 建库建表统一 utf8mb4,中文、emoji 通吃,一劳永逸。

⬅ 上一节 | 🏠 返回目录