SQL 相关工具合集

SQL 工具合集:整理 SQL 格式化、关键字检索与语句速查,覆盖 SELECT 各子句的执行顺序、JOIN 类型的选择、聚合与窗口函数的差异,以及 WHERE 与 HAVING 的阶段差异,并附 SQL 美化、文本替换与正则调试入口。适合写复杂查询前确认语法、统一团队代码风格与排查拼接错误。

SQL(结构化查询语言)是与数据库交互的标准语言,语法细节繁多且各数据库方言存在差异。

常见方案对照

维度WHEREHAVING
执行时机GROUP BY 之前GROUP BY 之后
能否用 SELECT 别名不能能
能否聚合不能能
作用于原始明细行分组后的结果集
索引使用能用索引通常不能用
典型用途过滤明细行过滤聚合结果(如总数 > 100)
常见错误在这里写聚合条件误用来代替 WHERE
NULL 语义IS NULL 才能匹配空值同左

边界条件

  • WHERE 后加聚合条件会报「非聚合列出现在 GROUP BY 中」——因为它作用于分组前的行。
  • HAVING 可以用 SELECT 的别名,WHERE 不能,这是执行顺序的直接后果。
  • LEFT JOIN 在 WHERE 里过滤右表字段会退化为 INNER JOIN,条件应写在 ON 里。
  • COUNT(*) 统计行数,COUNT(列) 跳过 NULL,两者结果可能差很多。

常见坑

  • 用 WHERE 过滤聚合结果,报错后才改用 HAVING,其实条件放错了阶段。
  • LEFT JOIN 的 ON 里写左表条件,等于没过滤,把 JOIN 变成了笛卡尔积。
  • 认为 HAVING 能替代 WHERE,在聚合前就把明细行丢掉了。
  • NOT IN 遇到含 NULL 的子查询会返回空结果,应改用 NOT EXISTS 或先过滤 NULL。

相关工具

常见问题

SQL 里 SELECT 的执行顺序是什么?

书写顺序是 SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY → LIMIT,但**执行顺序**不同:FROM(含 JOIN)→ WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT。这个差异解释了为什么 WHERE 里不能用 SELECT 的别名(WHERE 先于 SELECT 执行),而 HAVING 可以。写复杂查询时按执行顺序思考,能避免大部分「为什么这里报错」。

JOIN 该用 INNER 还是 LEFT?

看**你要不要保留右表没有匹配的行**。INNER JOIN 只保留两边都匹配上的;LEFT JOIN 保留左表全部行,右表无匹配时补 NULL。常见错误是用 INNER JOIN 做「左表全量查询」,结果默默丢掉了未匹配的行。更隐蔽的是 WHERE 里对右表字段加条件会把 LEFT JOIN 降级成 INNER JOIN —— 条件要放在 ON 里才能保留左表全量。