SQL 基础语法速记清单

2 阅读4分钟

整理了一份 SQL 基础语法速记清单,涵盖日常工作中 90% 以上的场景。建议收藏以备查阅。


一、核心分类(记住这个框架)

分类英文缩写核心动词
数据查询DQLSELECT
数据操作DMLINSERT, UPDATE, DELETE
数据定义DDLCREATE, ALTER, DROP
数据控制DCLGRANT, REVOKE

二、查询语法(SELECT)—— 最常用

1. 基础查询顺序(物理书写顺序)

SELECT    [DISTINCT] 列名1, 列名2, 聚合函数
FROM      表名
JOIN      其他表 ON 连接条件
WHERE     行级过滤条件
GROUP BY  分组列
HAVING    组级过滤条件(与聚合函数配合)
ORDER BY  排序列 [ASC|DESC]
LIMIT     [偏移量,] 行数;   -- MySQL / PG 写法

2. 执行逻辑顺序(重要!帮你理解报错)

FROMJOINWHEREGROUP BY → HAVING → SELECTDISTINCTORDER BY → LIMIT

口诀:先取表,再关联,行过滤,再分组,组过滤,选列,去重,排序,截取。


三、常用过滤条件(WHERE)

场景写法
等值WHERE age = 25
不等值WHERE age <> 25!=
范围WHERE age BETWEEN 18 AND 30
列表WHERE city IN ('北京','上海')
模糊WHERE name LIKE '张%' (%任意多,_单个)
空值WHERE email IS NULL (千万不能用 = NULL)
组合AND / OR / NOT
转义WHERE path LIKE '%\_2026%' ESCAPE '\'

四、常用聚合函数(配合 GROUP BY)

函数作用
COUNT(*)计数(含空行)
COUNT(列)计数(忽略 NULL)
SUM(列)求和
AVG(列)平均(忽略 NULL)
MAX(列)最大值
MIN(列)最小值
GROUP_CONCAT(列)字符串拼接(MySQL)

注意:SELECT 中非聚合列,必须出现在 GROUP BY 中(严格模式)。


五、多表连接(JOIN)

-- 内连接(取交集)
SELECT * FROM A INNER JOIN B ON A.id = B.a_id;

-- 左连接(左全 + 右匹配)
SELECT * FROM A LEFT JOIN B ON A.id = B.a_id;

-- 右连接(右全 + 左匹配)
SELECT * FROM A RIGHT JOIN B ON A.id = B.a_id;

-- 全外连接(MySQL 不支持,用 UNION 模拟)
SELECT * FROM A LEFT JOIN B UNION
SELECT * FROM A RIGHT JOIN B;

-- 自连接(同一张表关联自己,必须起别名)
SELECT a.name, b.name FROM emp a JOIN emp b ON a.manager_id = b.id;

六、数据修改(DML)

插入

-- 全列插入
INSERT INTO 表名 VALUES (值1, 值2, ...);

-- 指定列插入
INSERT INTO 表名 (列1, 列2) VALUES (值1, 值2);

-- 批量插入
INSERT INTO 表名 VALUES (1,'a'), (2,'b'), (3,'c');

更新(务必加 WHERE

UPDATE 表名 SET1 = 新值1, 列2 = 新值2 WHERE 条件;

删除(务必加 WHERE

DELETE FROM 表名 WHERE 条件;   -- 逐行删除,可回滚
TRUNCATE TABLE 表名;          -- 清空表,速度更快,不可回滚

七、表结构操作(DDL)—— 简洁版

-- 建表
CREATE TABLE 表名 (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

-- 修改表(加列)
ALTER TABLE 表名 ADD 列名 数据类型;

-- 修改列
ALTER TABLE 表名 MODIFY 列名 新数据类型;   -- MySQL
ALTER TABLE 表名 ALTER COLUMN 列名 TYPE 新类型; -- PG

-- 删除列
ALTER TABLE 表名 DROP COLUMN 列名;

-- 删表
DROP TABLE 表名;

八、常用函数速查

字符串

  • CONCAT('a','b')'ab'
  • SUBSTRING('hello',1,3)'hel'
  • UPPER/LOWER 大小写
  • TRIM 去空格
  • LENGTH 字节长度,CHAR_LENGTH 字符长度

日期时间(MySQL)

  • NOW() 当前时间
  • CURDATE() 当前日期
  • YEAR(date) / MONTH(date) / DAY(date)
  • DATE_ADD(NOW(), INTERVAL 1 DAY)
  • DATEDIFF(date1, date2) 相差天数

条件判断

-- CASE WHEN(类似 if-else)
SELECT name,
    CASE 
        WHEN score >= 90 THEN '优秀'
        WHEN score >= 60 THEN '及格'
        ELSE '不及格'
    END AS 等级
FROM students;

-- IF (MySQL)
SELECT IF(score >= 60, '通过', '不通过') FROM students;

九、必须避开的 5 个大坑 ⚠️

错误写法正确写法原因
WHERE name = NULLWHERE name IS NULLNULL 不能用 = 判断
SELECT * FROM a WHERE id IN (SELECT ...) 子查询返回多列只返回一列IN 后只能有一列
GROUP BY aSELECT b把 b 也加到 GROUP BY 或聚合非聚合列必须分组
DELETE / UPDATE 不加 WHERE先用 SELECT 验证条件容易误删全表
HAVING score > 80(score 未聚合)WHERE 过滤原始行HAVING 用于聚合后

十、实用小技巧(面试/工作加分)

1. 去重计数

SELECT COUNT(DISTINCT user_id) FROM orders;

2. 分组取每组前 N 条(窗口函数,必学)

SELECT * FROM (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY dept_id ORDER BY salary DESC) AS rn
    FROM emp
) t WHERE rn <= 3;

3. 用 EXISTS 代替 IN(子查询数据量大时效率高)

SELECT * FROM emp e WHERE EXISTS (
    SELECT 1 FROM dept d WHERE e.dept_id = d.id
);

4. 复制表结构(不复制数据)

CREATE TABLE 新表 LIKE 旧表;      -- MySQL
CREATE TABLE 新表 AS SELECT * FROM 旧表 WHERE 1=0; -- PG/Oracle

最后送你一个 万能查询模板(可直接套用)

SELECT 
    分组维度,
    COUNT(*) AS 数量,
    SUM(金额) AS 总金额
FROM 事实表
WHERE 日期 >= '2026-01-01'
  AND 状态 = '已完成'
GROUP BY 分组维度
HAVING COUNT(*) > 10
ORDER BY 总金额 DESC
LIMIT 100;