SQL查询
写法顺序:
SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY → LIMIT执行顺序:
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT一、基础查询
语句/函数 | 作用 | 用法 | 示例 |
SELECT | 查询指定列 |
|
|
DISTINCT | 去重 |
|
|
LIMIT | 限制返回行数 |
|
|
WHERE | 条件筛选 |
|
|
AND / OR | 多条件组合 |
|
|
IN | 匹配多个值之一 |
|
|
BETWEEN | 范围匹配(含边界) |
|
|
LIKE | 模糊匹配 |
|
|
IS NULL/IS NOT NULL | 判断是否为空 |
|
|
⚠️ 易错提醒:
IS只能配 NULL!等值判断用=不用IS(如city = '北京'√,city IS '北京'×)OR两侧都要写完整条件:city = '北京' OR city = '广州'√,city = '北京' OR '广州'×BETWEEN包含两端边界值
二、排序与分组聚合
语句/函数 | 作用 | 用法 | 示例 |
ORDER BY | 排序 |
|
|
GROUP BY | 分组 |
|
|
COUNT(*) | 统计行数 |
|
|
COUNT(DISTINCT 列) | 去重统计 |
|
|
SUM(列) | 求和 |
|
|
AVG(列) | 求平均 |
|
|
MAX(列) / MIN(列) | 最大/最小值 |
|
|
HAVING | 分组后筛选 |
|
|
⚠️ 易错提醒:
- GROUP BY 规则:SELECT 中每个非聚合列都必须放进 GROUP BY
- 记法:「每个XX的…」→ GROUP BY XX,「的」后面的是聚合结果不是分组依据
- 别名能用在哪:
ORDER BY✅、HAVING✅、GROUP BY❌ - 子句顺序:
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT COUNT(*)不会返回 NULL,不需要包 IFNULL- 只要用聚合函数就要分组,且SELECT 中每个非聚合列都必须放进分组
WHERE不能放聚合函数 → 用HAVING- ORDER BY 只能写一次,多个排序字段用逗号分隔
三、连接查询
语句 | 作用 | 用法 | 示例 |
INNER JOIN | 只返回匹配的行 |
|
|
LEFT JOIN | 左表全保留,右表无匹配为 NULL |
|
|
⚠️ 易错提醒:
JOIN后面写ON→ON c.customer_id = o.customer_id√,不要用WHERE×- 左表选择:从主体出发("查询所有客户"→ customers 放左边)
四、子查询
类型 | 作用 | 用法 | 示例 |
WHERE 子查询·单值 | 返回一个值供比较 |
|
|
WHERE 子查询·列表 | 返回一列值供 IN 判断 |
|
|
FROM 子查询 | 把查询结果当临时表 |
|
|
⚠️ 易错提醒:
- FROM 子查询必须起别名:
FROM (子查询) AS t - FROM 子查询可以继续 JOIN 其他表:
customers c LEFT JOIN (子查询) t ON ... - 嵌套子查询从内往外写,先确认内部结果对不对
五、条件分支
语句 | 作用 | 用法 | 示例 |
CASE WHEN | SQL 里的 if-else |
|
|
CASE WHEN + GROUP BY | 分组后的条件判断 |
|
|
⚠️ 易错提醒:
- CASE WHEN 条件从严格到宽松(VIP > 普通 > 低消)
- 有 GROUP BY 时,条件里用
WHEN SUM(amount) >= 5000不是WHEN amount >= 5000 - 别名只写在
END后面:... END AS 等级√,AS 等级 ... END× - CASE WHEN 前一个条件不满足时,自动去匹配下一条件,直接case when salary>5000 then 结果 when salary>2000 then 结果 else 结果
六、数值函数
函数 | 作用 | 用法 | 示例 |
ROUND(数值, 位数) | 四舍五入 |
|
|
ROUND 负数精度 | 整数位四舍五入 |
|
|
⚠️ 易错提醒:
- 先 AVG 再 ROUND:
ROUND(AVG(...), 2)√,AVG(ROUND(...))× - ORDER BY 里可以用别名:
ORDER BY 平均工资√ - GROUP BY 里不可以用别名
七、日期函数
函数 | 作用 | 用法 | 示例 |
DATE_FORMAT(日期, 格式) | 日期格式化 |
|
|
NOW() | 当前时间 |
|
|
DATE_SUB(日期, INTERVAL N 单位) | 日期加减 |
| 当前时间往前推30天 |
格式符:%Y四位年份、%m两位月份、%d两位日期、%m月中文格式也可用
八、NULL 处理
函数 | 作用 | 用法 | 示例 |
IFNULL(值, 默认) | NULL 替换(两个参数) |
|
|
COALESCE(值1, 值2, ...) | 返回第一个非 NULL(多个参数) |
|
|
九、字符串函数
函数 | 作用 | 用法 | 示例 |
CONCAT(a, b, ...) | 拼接字符串 |
|
|
SUBSTRING(字符串, 起始, 长度) | 截取子串 |
|
|
REPLACE(字符串, 旧, 新) | 替换字符 |
|
|
LENGTH(字符串) | 字符数 |
|
|
UPPER(字符串) / LOWER(字符串) | 大小写转换 |
|
|
TRIM(字符串) | 去除首尾空格 |
|
|
LOCATE(要找的, 从哪里找) | 返回位置 |
|
|
⚠️ 易错提醒:
- 列名不加引号,文本加引号:
CONCAT(customer_name, '文本', city)√ - 函数可以嵌套,从内往外执行
UNION 核心总结:
语句 | 作用 | 注意 |
| 合并 SELECT 结果 + 去重 | 列数必须相同,性能比 UNION ALL 稍差 |
| 合并 SELECT 结果,不去重 | 性能更好,不需要去重时优先用 |
| 给每组数据打标签 |
|
UNION 的主要使用场景:
- 合并不同表的结构相同的数据
- 给每组数据打不同标签再合并(分类报表)
- 不能用一个 WHERE 或 JOIN 简单替代时才值得用