开发者社区> 游客r426lz522voxi> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

MySQL基础知识——HAVING

简介: MySQL基础知识
+关注继续查看

HAVING的作用

HAVING 子句使你能够指定过滤条件,从而控制查询结果中哪些组可以出现在最终结果里面。

WHERE 子句对被选择的列施加条件,而 HAVING 子句则对 GROUP BY 子句所产生的组施加条件。


HAVING语法

在 SELECT 查询中,HAVING 子句必须紧随 GROUP BY 子句,并出现在 ORDER BY 子句(如果有的话)之前。带有 HAVING 子句的 SELECT 语句的语法如下所示:

SELECT column1,column2

FROM table1,table2

WHERE [conditions]

GROUP BY column1,column2

HAVING [conditions]

ORDER BY column1,column2


示例数据表

我们以表customers为例,表中数据如下:

5.jpg

表customers


HAVING实例

我们希望将"城市"列中,相同记录的出现两次及以上的数据显示出来,可以这样写:


SELECT * FROM Customers
WHERE 城市 IN (
SELECT 城市 FROM Customers
GROUP BY 城市
HAVING COUNT(1)>1
)


结果为:

6.jpg

上面的代码用了一个嵌套子查询(后面会介绍),因为我们只是对城市列进行分组,所以子查询中先将符合条件的城市查询出来,然后将结果集返回给主查询的IN条件。最后得到我们看到的结果集。


HAVING与WHERE的区别

HAVING和WHERE都是用来过滤数据的,他们可以使用相同的运算符来进行数据过滤,不同的是:

  • WHERE发生在HAVING之前,在执行HAVING之前,会先将不符合WHERE条件的数据过滤掉。
  • WHERE过滤的是行,而HAVING过滤的是分组聚集后的数据。


例如查询不在广州的顾客信息,可以这样写:


SELECT * FROM customers
WHERE `城市`<>'广州'


结果为:


7.jpg


这里只是单纯的行过滤,没有涉及分组聚集。


再例如查询城市不在广州,且城市相同记录出现两次及以上的客户信息,可以这样写:


SELECT * FROM Customers
WHERE 城市 IN (
SELECT 城市 FROM Customers
WHERE 城市<>'广州'
GROUP BY 城市
HAVING COUNT(1)>1
)


结果为:

8.jpg

这里我们首先用WHERE过滤掉了广州的数据行,之后将相同记录的数据使用HAVING进行分组后筛选出来,最后才得到上述结果。


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
8个实用SQL操作小技巧
SQL在使用过程中,经常会遇到一些奇奇怪怪的小问题,今天给大家总结一下常见的几个问题该如何处理。
34 0
这两个SQL高级函数,你用过吗?
SQL Server从2012版本开始,引入了LEAD和LAG函数,这两个函数可以把之前要关联查询的方法,改为可直接获取当前数据上下相邻多少行数据,可以很方便的对上下相邻两行的数据进行加减乘除。今天我们就给大家介绍一下这两个函数的用法。
21 0
面试官:说说WHERE,HAVING和ON的区别?
最近有小伙伴私信我:今天面试有道题把我一下子问懵了,让我说出WHERE,HAVING和ON的区别。 觉得这个问题很有价值给小伙伴们分享一下。
32 0
Go 调用 Java 方案和性能优化分享
一个基于 Golang 编写的日志收集和清洗的应用需要支持一些基于 JVM 的算子。
578 0
SpringBoot-18-之AOP+log4j 记录访问请求信息
org.springframework.boot spring-boot-starter-aop log4j log4j 1.
1170 0
569
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载