SQL 速查表
SQL 速查:SELECT、JOIN、GROUP BY、INSERT、UPDATE、DELETE、聚合函数与约束等常用语句的语法与示例,写查询时快速查阅。
| 语句 | 说明 | 示例 |
|---|---|---|
| SELECT | 查询列(* 表示全部) | SELECT id, name FROM users |
| FROM | 指定数据来源表 | FROM orders |
| WHERE | 行过滤条件 | WHERE status = 'paid' |
| GROUP BY | 按列分组聚合 | GROUP BY category |
| HAVING | 对分组结果再过滤 | HAVING COUNT(*) > 1 |
| ORDER BY | 排序(ASC/DESC) | ORDER BY created_at DESC |
| LIMIT | 限制返回行数 | LIMIT 10 |
| OFFSET | 跳过前 N 行(分页) | OFFSET 20 |
| DISTINCT | 去重返回 | SELECT DISTINCT city |
| JOIN | 内连接两表 | FROM a JOIN b ON a.id = b.a_id |
| LEFT JOIN | 左连接,保留左表全部行 | FROM a LEFT JOIN b ON a.id = b.a_id |
| RIGHT JOIN | 右连接,保留右表全部行 | FROM a RIGHT JOIN b ON a.id = b.a_id |
| INNER JOIN | 内连接(同 JOIN) | FROM a INNER JOIN b ON a.id = b.a_id |
| ON | 连接条件 | ON a.id = b.a_id |
| AS | 表或列别名 | SELECT name AS 姓名 |
| INSERT INTO | 插入行 | INSERT INTO users (name) VALUES ('Tom') |
| UPDATE | 更新行 | UPDATE users SET name = 'Tom' WHERE id = 1 |
| DELETE | 删除行 | DELETE FROM users WHERE id = 1 |
| CREATE TABLE | 建表 | CREATE TABLE t (id INT PRIMARY KEY) |
| ALTER TABLE | 修改表结构 | ALTER TABLE t ADD COLUMN age INT |
| DROP TABLE | 删除表 | DROP TABLE t |
| PRIMARY KEY | 主键约束 | id INT PRIMARY KEY |
| FOREIGN KEY | 外键约束 | FOREIGN KEY (a_id) REFERENCES a(id) |
| INDEX | 创建索引加速查询 | CREATE INDEX idx_name ON users(name) |
| UNION | 合并两个查询结果(去重) | SELECT a FROM t1 UNION SELECT a FROM t2 |
| LIKE | 模糊匹配(% 任意, _ 单字) | WHERE name LIKE 'T%' |
| IN | 值属于集合 | WHERE status IN ('paid','done') |
| BETWEEN | 范围闭区间 | WHERE age BETWEEN 18 AND 30 |
| NULL / IS NULL | 空值判断(不能用 =) | WHERE deleted_at IS NULL |
| COUNT / SUM / AVG | 聚合函数 | SELECT COUNT(*) FROM users |
| CASE WHEN | 条件表达式 | CASE WHEN age>18 THEN 'adult' ELSE 'minor' END |
| EXPLAIN | 查看执行计划 | EXPLAIN SELECT * FROM users |
常见问题
INNER JOIN 和 LEFT JOIN 有什么区别?
INNER JOIN 只返回两表都匹配的行;LEFT JOIN 返回左表全部行,右表无匹配时对应列填 NULL。需要"保留主表所有记录"时用 LEFT JOIN,只需交集时用 INNER JOIN。
WHERE 和 HAVING 有什么区别?
WHERE 在分组前过滤行;HAVING 在 GROUP BY 之后过滤分组结果,且可引用聚合函数(如 COUNT(*))。不能在 WHERE 中使用聚合函数。
LIKE 的 % 和 _ 有什么区别?
% 匹配任意长度(含零)字符;_ 只匹配单个字符。如 'T%' 匹配以 T 开头任意串,'T_m' 只匹配 T 后一个任意字符再接 m(如 Tom)。
如何判断 NULL?
NULL 表示未知,不能用 = NULL 判断,必须用 IS NULL / IS NOT NULL。在多数数据库中 NULL 与任何值比较都返回未知(非真),容易踩坑。