MySQL 8.0 · 16 条
SQL 实战指南
每篇指南都展示实际结果或可核对的影响指标,明确区分正确性、效率、安全性和可读性改进。
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
SQL 书写顺序与实际执行顺序
理解 FROM、WHERE、GROUP BY、HAVING、SELECT 和 ORDER BY 的逻辑先后。
NULL 与三值逻辑为什么容易出错
NULL 不是空字符串,和 NULL 比较可能得到 UNKNOWN。
WHERE 和 HAVING 的真正区别
WHERE 筛选明细行,HAVING 筛选聚合后的分组。
JOIN 后数据为什么重复或减少
从结果粒度、连接键唯一性和未匹配行三个方向定位 JOIN 行数异常。
LEFT JOIN 条件写在 ON 还是 WHERE
右表条件的位置会决定未匹配的左表行是否保留。
COUNT(*)、COUNT(字段) 与 COUNT DISTINCT
三种统计回答的是行数、非空值数和不同值数。
GROUP BY 常见错误与排查方法
用结果粒度检查漏分组和过度分组,并理解 MySQL ONLY_FULL_GROUP_BY 报错。
OFFSET 分页为什么越来越慢
比较 OFFSET 与游标分页的扫描成本、稳定排序和数据变化下的翻页结果。
UPDATE 和 DELETE 的安全执行流程
先验证范围,再进入事务修改并检查受影响行数。
如何阅读并定位 SQL 错误信息
从错误类型和解析停止位置开始,把复杂查询缩小到最小可运行片段。
日期范围、月底和时间边界
使用半开区间处理整天整月,避免遗漏小数秒并保留索引机会。
使用 EXPLAIN 阅读查询计划
按访问方式、索引、预计行数和额外操作阅读 MySQL 8 EXPLAIN,并验证优化效果。
NOT IN 遇到 NULL:为什么结果突然为空
用三值逻辑解释 NOT IN 空结果,并为反连接选择可靠的 NOT EXISTS 写法。
每组 Top 1:全局 LIMIT 为什么不够
用窗口函数实现每组 Top 1/Top N,并明确并列、稳定排序与结果行数规则。
条件聚合:一次扫描计算多项指标
把重复子查询改为 SUM(CASE WHEN),让指标口径集中且可扩展。
每个对象的最新一行:DISTINCT 不能替代排序
用分区窗口明确“每个客户最新订单”的行级选择规则。