# SQL结果排序与HAVING

本文详细介绍了SQL中ORDER BY指令的使用方法,包括如何指定排序键和排序规则,并解释了NULL值在排序中的行为。同时,文章还探讨了HAVING子句的功能及其与WHERE子句的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SQL结果排序与HAVING

SQL结果排序

默认SELECT出来的数据是无须排列的,当然,有时候看起来可能像是按照一定顺序排列的。然而那只是偶然。

我们如果想要SELECT出来的结果是按照一定顺序排列的话,就需要使用到ORDER BY指令。该指令的使用格式为ORDER BY <排序键> <排序规则>

其中,排序规则不是必须的,如果不指定排序规则的话,默认就是ASC升序,如果想要降序的话,就应该使用DESC

之前有讲到NULL值不能用于比较,因为他的返回值是一个不确定值。而对于ORDER BY来讲,拥有NULL值的行会集中出现在开头或者结尾。有的DBMS可以选择其出现的位置。

ORDER BY的执行出现的返回结果之前的最后一步。同时,即使是SELECT之句中没有出现过的列也可以作为排序键。

排序键允许有多个,同时可以对多个排序键指定不同的排序规则。

HAVING

与WHERE的作用都是限制数据的条件,但是他们的作用有明显的不同。

WHERE用来筛选数据记录,而HAVING用来筛选GROUP BY之后生成的子数据表。然而有时候我们可以发现使用HAVING或者WHERE的结果并没有区别,都可以得到自己想要的数据。

但是优先选择WHERE,因为一般来讲他更快。

同时HAVING的聚合键允许使用函数以及常数,聚合函数以及GROUP BY使用的聚合键。

总结

现在我们再排一遍语法顺序:

SELECT --> FROM --> WHERE --> GROUP BY --> HAVING --> ORDER BY

DBMS的执行顺序是:

FROM --> WHERE --> GROUP BY --> HAVING --> SELECT --> ORDER BY

我们可以发先语法顺序和执行顺序还是拥有很大差别的。

同时之前有讲到GROUP BY不能够使用SELECT子句中定义的别名,从这里就可以看出原因。因为GROUP BY的执行在SELECT子句之前。然后ORDER BY是可以使用定义的别名的。

同时HAVING的聚合键和WHERE的聚合键拥有同样的限制。我们只要明白HAVING的聚合键是为了筛选子数据表的,对于聚合键的选择就应该容易明白了。

转载于:https://www.cnblogs.com/freesfu/p/11440269.html

### SQLHAVING子句ORDER BY排序的用法及区别 在SQL查询中,`HAVING`子句和`ORDER BY`子句是两个重要的组成部分,它们各自承担不同的功能,并且在查询语句中的位置也有所不同。以下是关于这两个子句的详细说明: #### 1. HAVING 子句的用法 `HAVING`子句主要用于对分组后的聚合结果进行筛选。它通常`GROUP BY`子句一起使用,用于过滤那些不满足特定条件的分组。`HAVING`子句可以包含聚合函数(如`SUM()`、`COUNT()`等),并且只能应用于分组后的数据[^3]。 示例代码如下: ```sql SELECT department, COUNT(*) AS employee_count FROM employees GROUP BY department HAVING COUNT(*) > 5; ``` 上述查询将返回每个部门的员工数量,并仅显示员工数量大于5的部门[^4]。 #### 2. ORDER BY 子句的用法 `ORDER BY`子句用于对查询结果进行排序。它可以基于一个或多个列进行升序(ASC)或降序(DESC)排序。默认情况下,如果没有指定排序顺序,则默认为升序排序[^2]。 示例代码如下: ```sql SELECT name, salary FROM employees ORDER BY salary DESC; ``` 此查询将按工资从高到低的顺序列出所有员工的名字和工资。 #### 3. HAVING 子句 ORDER BY 子句的区别 - **执行顺序**:`HAVING`子句在`GROUP BY`之后执行,用于筛选分组后的数据;而`ORDER BY`子句是在整个查询执行完毕后,对最终结果进行排序[^3]。 - **作用范围**:`HAVING`子句用于筛选分组后的聚合结果,不能直接用于单行数据;`ORDER BY`子句则用于对查询结果进行排序,无论是否进行了分组[^4]。 - **语法位置**:在SQL语句中,`HAVING`子句必须位于`GROUP BY`之后,`ORDER BY`之前;而`ORDER BY`子句必须位于查询语句的最后[^5]。 #### 4. 结合HAVINGORDER BY的示例 以下是一个结合`HAVING`和`ORDER BY`子句的完整示例: ```sql SELECT department, AVG(salary) AS avg_salary FROM employees GROUP BY department HAVING AVG(salary) > 5000 ORDER BY avg_salary DESC; ``` 该查询首先按部门对员工进行分组,然后计算每个部门的平均工资,并筛选出平均工资超过5000的部门,最后按平均工资从高到低排序### 注意事项 - `HAVING`子句不能直接替代`WHERE`子句,因为`WHERE`子句用于筛选单行数据,而`HAVING`子句用于筛选分组后的聚合结果[^4]。 - 如果需要对分组后的数据进行进一步排序,必须使用`ORDER BY`子句,而不能依赖`HAVING`子句。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值