这是一份关于 SQL 技巧和窍门的列表,包含格式化/可读性、数据整理、性能、常见错误和杂项等方面的内容:
格式化/可读性:
- 使用前导逗号分隔
SELECT
子句中的字段,方便识别逗号是否缺失,也可在WHERE
子句中使用前导AND
。 - 在
WHERE
子句中使用虚拟值,方便测试和调整查询,可通过1=1
确保查询仍能运行。 - 缩进代码使其更易读,可遵循公司/团队指南或使用在线格式化工具。
- 编写复杂查询时考虑使用公共表表达式(CTEs),避免嵌套过多的内联视图。
- 为代码添加注释,解释为什么做某事,而不是如何做。
- 使用前导逗号分隔
数据整理:
- 使用反连接(anti-joins)返回一个表中在另一个表中没有匹配的行,有多种实现方式,不建议使用
NOT IN
。 - 使用
QUALIFY
根据窗口函数过滤结果,减少代码行数,但仅在大数据仓库中可用。 - 可以(但不总是)根据列位置进行
GROUP BY
,在临时/一次性查询中有用,生产代码应使用列名。 - 使用
GROUP BY ROLLUP
创建总计或小计。 - 使用
EXCEPT
查找两个表之间的差异,可以与UNION ALL
结合使用验证表数据是否相同。
- 使用反连接(anti-joins)返回一个表中在另一个表中没有匹配的行,有多种实现方式,不建议使用
性能:
- 如果列允许
NULL
,NOT EXISTS
比NOT IN
更快,NOT IN
在比较值或列时优化不佳,且在有NULL
时可能无法按预期工作。 - 隐式转换可能会使查询变慢或出错,应使用与列相同的数据类型或使用函数进行转换。
- 如果列允许
常见错误:
- 注意
NOT IN
在有NULL
值时的行为,应使用NOT EXISTS
。 - 命名计算字段时避免歧义,可使用唯一别名或在
GROUP BY
子句中更明确。 - 当有多个连接时,始终指定列属于哪个表,避免 RDBMS 出错。
- 注意
杂项:
- 理解 SQL 语句的执行顺序,可参考相关博客文章。
- 完整阅读文档,避免因不了解函数特性而导致问题,如
GREATEST()
函数在有NULL
时的行为。 - 使用描述性名称保存查询,便于查找和引用。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。