SQL 速查表 - 常用查询语法与示例大全
面向要写对业务又能跑快的 SQL 的开发者。SQL 的坑往往不在它本身,而在 NULL 的传播、GROUP BY 之后的筛选必须用 HAVING、窗口函数与普通聚合的边界这些最容易记混的地方。读完能写带分组、筛选子句的正确查询,用窗口函数做行号与同组内排名而非先 join 再自聚合,规避 NULL 比较与聚合陷阱,并在需要时把多条语句放进事务保证原子性。
基础查询 Basic 6
SELECT * FROM users查询全部列
SELECT name, age FROM users查询指定列
SELECT * FROM users WHERE age > 18带条件过滤
SELECT DISTINCT city FROM users去重
SELECT * FROM users LIMIT 10 OFFSET 20分页(跳过 20 取 10)
SELECT * FROM users ORDER BY age DESC排序(降序)
过滤与逻辑 Filtering 6
WHERE name LIKE 'A%'前缀匹配,命中前缀通常可走索引;% 开头则无法用普通索引,容易退化为全表扫
WHERE name LIKE '%son'后缀匹配,以 % 开头会失去索引能力,数据量大时应考虑全文索引或反向存储
WHERE age BETWEEN 18 AND 30范围
WHERE id IN (1, 2, 3)集合匹配
WHERE a IS NULL空值判断;SQL 里 NULL ≠ 空串,a = NULL 永远为假,必须用 IS NULL/IS NOT NULL
WHERE a AND b OR c逻辑组合(AND 优先于 OR)
聚合与分组 Aggregation 5
SELECT COUNT(*) FROM users计数
SELECT AVG(age) FROM users平均值
SELECT city, COUNT(*) FROM users GROUP BY city分组
HAVING COUNT(*) > 5分组后过滤(对聚合结果)
SELECT MAX(age), MIN(age) FROM users最大/最小值
连接 JOIN 5
FROM a JOIN b ON a.id = b.a_id内连接,只返回两边都能匹配的行;连接一对多表会放大父表行数,需注意去重
FROM a LEFT JOIN b ON a.id = b.a_id左连接(保留 a 全部)
FROM a RIGHT JOIN b ON a.id = b.a_id右连接
FROM a CROSS JOIN b笛卡尔积,返回 a×b 全部组合,行数会暴涨;仅在结果集可预期很小(如常量表)时使用
SELECT * FROM a NATURAL JOIN b按同名列自动连接
窗口函数 Window 4
ROW_NUMBER() OVER (ORDER BY age)行号
RANK() OVER (PARTITION BY city ORDER BY age)排名(并列跳号)
SUM(amount) OVER (PARTITION BY user_id)分区累计
LAG(price) OVER (ORDER BY date)取上一行
写入与事务 DML/TX 5
INSERT INTO t (a, b) VALUES (1, 'x')插入
UPDATE t SET a = 2 WHERE id = 1更新
DELETE FROM t WHERE id = 1删除
BEGIN; ... COMMIT;事务提交,把一组操作作为一个原子单元一次落盘,中途任一失败可回滚到 BEGIN 之前
ROLLBACK;回滚事务,撤销本次事务内未提交的全部改动;多步操作用事务包裹更安全
表结构 DDL 4
CREATE TABLE t (id INT PRIMARY KEY, name TEXT)建表
ALTER TABLE t ADD COLUMN age INT加列
DROP TABLE t删表
CREATE INDEX idx_name ON t(name)建索引
提示
- AND 优先级高于 OR,复杂条件务必加括号。
- GROUP BY 的列必须出现在 SELECT(聚合列除外)。
- LIKE 区分大小写取决于数据库排序规则。
- 改数据前先用 BEGIN; 开启事务,确认后 COMMIT。
由 巧匠 维护
公开更新于 2026年8月2日,内容持续校对官方文档。