一文详解SQL语法的方方面面

系统梳理 SQL 语法中的查询、过滤、聚合、连接、排序、分页、窗口函数和逻辑执行顺序,结合常见报表与数据分析场景,帮助建立从单表处理到多表分析的基础框架。

袋鼠云
袋鼠云

SQL 是关系型数据库和数据分析中最常用的语言之一。要真正理解 SQL 语法,不能只记住 select、where、group by 等关键字,还要理解它们在查询中的职责、执行顺序和组合方式。

单表查询的基本结构

一条常见查询通常包含选择字段、数据来源、过滤条件、分组、聚合过滤、排序和限制行数:

SELECT dept_id, COUNT(*) AS user_count
FROM users
WHERE status = 'active'
GROUP BY dept_id
HAVING COUNT(*) > 10
ORDER BY user_count DESC
LIMIT 20;

不同数据库对分页语法可能略有差异,例如 Oracle、SQL Server、MySQL、PostgreSQL 的写法并不完全一致,使用时要结合实际数据库确认。

SQL 的逻辑执行顺序

SQL 书写顺序和逻辑执行顺序并不完全一样。通常可以理解为:先确定 from 数据源,再通过 where 过滤明细行,然后 group by 分组,接着计算聚合,再用 having 过滤分组结果,最后执行 select、order by 和分页。

理解这一点可以解释很多常见问题。例如,聚合函数不能直接写在 where 中,因为 where 发生在分组聚合之前;字段别名有时不能在同层 where 中使用,也与执行阶段有关。

过滤、转换与聚合

where 用于过滤行,适合写明细级条件;标量函数用于字段转换,例如日期截取、字符串拼接、数值计算;聚合函数用于把多行汇总为一个结果,例如 count、sum、avg、max、min。

写聚合查询时,要明确分组粒度。group by user_id 得到的是用户粒度,group by user_id, date 得到的是用户加日期粒度。粒度变化会直接改变指标含义。

多表连接

SQL 的多表查询通过 join 组合不同表的数据。内连接只保留匹配行,左连接保留左表全部行,右连接保留右表全部行。连接条件应尽量明确,避免漏写 on 导致笛卡尔积。

数据仓库中常见事实表和维度表连接。事实表记录业务事件,维度表提供描述信息。连接前要确认主键、外键、时间有效期和是否存在一对多关系,否则指标可能被重复放大。

排序、分页与窗口函数

order by 用于排序,分页用于限制返回行数。窗口函数则可以在保留明细行的同时计算排名、累计值、移动平均等结果。它们常用于 TopN、去重、留存分析和分位计算。

写 SQL 的实践建议

一文详解 SQL 语法的方方面面,最终目的是让查询可读、可维护、可解释。建议给复杂字段加清晰别名,把多步逻辑拆成 CTE,避免在 join 条件中写隐式转换,重要查询上线前查看执行计划。SQL 不只是语法拼装,更是对数据关系和业务口径的表达。

开启Data+AI 之旅

填写表单,获取专属解决方案

400-002-1024

工作日 9:00-18:00

关注公众号

获取最新产品动态与技术干货

关注公众号

企业微信

扫码添加企业微信