SQL查询答疑:错误写法为何失效?为何需要ORDER BY子句?
SQL常见语法与排序问题解答
为什么标注为错误写法的SQL不符合规则、无法运行?
SQL聚合查询的核心语法规则是:SELECT子句里出现的所有非聚合字段,必须全部包含在GROUP BY子句的分组字段列表中。
给出的错误写法SQL如下:
-- Wrong SELECT first_name, last_name, count(*) FROM customer GROUP BY first_name
这段查询里,SELECT查询了两个非聚合字段:first_name、last_name,但GROUP BY仅指定了first_name作为分组依据。现实场景里同一个first_name可能对应数十上百个不同的last_name,数据库无法确定分组后该行应该返回哪个last_name值,语义逻辑不成立,因此会直接抛出语法错误,无法正常执行。
为什么正确写法需要加ORDER BY子句才能达到预期效果?
先看给出的正确写法示例:
-- Correct SELECT first_name, count(*) FROM customer GROUP BY first_name ORDER BY count(*) DESC
首先要明确一个很多新手容易踩的误区:GROUP BY分组操作本身不会对返回结果做任何排序。数据库完成分组聚合后,返回的结果顺序是不确定的,不同数据库、不同数据量下返回的顺序都可能发生变化,没有任何规律。
这类统计查询的普遍预期是拿到「同名用户数从高到低的排名结果」,因此必须加上ORDER BY count(*) DESC子句,明确要求数据库按照聚合后的用户计数倒序排列,才能得到顺序确定、符合预期的结果。如果不加这个子句,返回的结果顺序随机,根本无法满足排名统计的需求。
内容的提问来源于stack exchange,提问作者Duh Huh
相关产品推荐
相关产品推荐

