数据库的高级查询四:Having子句(Having子句需要和GROUP BY子句结合,才能使用)

这篇博客写的太啰嗦,究其原因还是理解的不到位,以后理解深入之后,回头简化吧。 

● Having子句要和GROUP BY子句联合起来才能使用;Having子句不能单独使用。

● WHERE子句和Having子句功能是相同的,都是做数据筛选的;【普通条件】的判断建议放在WHERE子句中,【聚合函数和其他的数据】的条件判断需要放在Having子句中;

● 在Having子句中,拿聚合函数跟具体的数据做比较是没有问题的,比如“HAVING COUNT(*)>=2;”是没有问题的;但是,拿聚合函数跟某个字段作条件判断是不行的,这个必须用表连接才能实现;表连接的内容在后面会介绍;  

目录

零:为什么需要【Having子句】

一:Having子句的一个例子:初体验

二:Having子句:基本内容

(1)基本内容

(2)一个容易出错的地方:

三:Having子句的特殊用法:


零:为什么需要【Having子句】

引入【Having子句】纯属无奈。(具体,Having子句的作用,以后用着用着就能更好的理解了吧…

因为,【GROUP BY子句】确实很强大,但是有些查询业务,仅仅靠【GROUP BY子句】并不能满足要求;

如:
数据库的高级查询四:Having子句(Having子句需要和GROUP BY子句结合,才能使用)_第1张图片

数据库的高级查询四:Having子句(Having子句需要和GROUP BY子句结合,才能使用)_第2张图片

注:(1)在数据库的高级查询三这篇文章中有各个子句的执行顺序说明;

       (2)聚合函数不能放在WHERE子句中!!!聚合函数的使用之前,需要先明确无误的确定数据的范围;在WHERE中使用聚合函数是万万不能的,这在逻辑上就说不通,MySQL自然也不支持这样做!!!


一:Having子句的一个例子:初体验

通过下面这个例子,感觉having子句或许可以看成是一个分组后,再筛选一次的操作。

例子:查询部门平均底薪超过2000的部门:

SELECT deptno
FROM t_emp
GROUP BY deptno HAVING AVG(sal)>=2000;

数据库的高级查询四:Having子句(Having子句需要和GROUP BY子句结合,才能使用)_第3张图片

前面提到过,聚合函数写在了SELECT子句中的,这是因为,SELECT子句的执行顺序是在WHERE子句之后的,WHERE子句执行完了之后,基本的数据范围就确定了,自然可以使用聚合函数;

经过这个例子之后,可以发现,聚合函数并不一定非得写在SELECT子句中;;;只要WHERE子句执行完了之后,后续执行的子句中都可以使用聚合函数;;;;(目前来看,这种理解大概率是没有问题的,在逻辑上也可以理解。。。) 

话句话说:(假设下面的子句都有的话),执行顺序是【FROM】【WHERE】【GROUP BY】→【SELECT】【ORDER BY】→【LIMIT】::黑色的部分是没有必要使用聚合函数的;红色的部分是不能使用聚合函数的;绿色的部分可以使用聚合函数,只是【GROUP BY】在使用聚合函数的时候,需要结合Having子句!!!


二:Having子句:基本内容

(1)基本内容

● Having子句的作用和WHERE子句差不多,都是用来做条件筛选的;

● 只是Having子句需要写在GROPY BY子句的后面;

● GROPY BY 子句执行完毕之后,才会轮到Having子句去执行;自然Having子句的执行顺序是在WHERRE子句之后的,所以在Having子句中可以使用聚合函数做条件判断。

如下面的例子,【WHERE子句】是做普通条件判断的,即WHERE子句是作淳朴的判断的,如下面1982年之后入职的这个就是个简单的判断;具体点说,WHERE的在判断的主要目的是:基于原表获取“最初的结果集”;【Having子句】是做聚合函数和其他数据做条件判断的;换句话说Having子句的的筛选是:【WHERE已经获取了“最初的结果集”,然后GROUP BY对“最初的结果集”做了分组处理,然后having子句再上场,做进一步筛选】;

即一句关键的话:【普通条件】的判断放在了WHERE子句中,【聚合函数和其他的数据】的条件判断放在了Having子句中了!!!

数据库的高级查询四:Having子句(Having子句需要和GROUP BY子句结合,才能使用)_第4张图片

数据库的高级查询四:Having子句(Having子句需要和GROUP BY子句结合,才能使用)_第5张图片

…………………………………………………………………………………………

(2)一个容易出错的地方:

还需要注意一个特别容易出错的点!!!:

          在Having子句中,拿聚合函数跟具体的数据做比较是没有问题的,比如“HAVING COUNT(*)>=2;”是没有问题的;

          但是,拿聚合函数跟某个字段作条件判断是不行的,这个必须用表连接才能实现;  

数据库的高级查询四:Having子句(Having子句需要和GROUP BY子句结合,才能使用)_第6张图片

AND子句也可以用在Having子句中哎。


三:Having子句的特殊用法:

数据库的高级查询四:Having子句(Having子句需要和GROUP BY子句结合,才能使用)_第7张图片

数据库的高级查询四:Having子句(Having子句需要和GROUP BY子句结合,才能使用)_第8张图片

数据库的高级查询四:Having子句(Having子句需要和GROUP BY子句结合,才能使用)_第9张图片

 

 

 

你可能感兴趣的:((7)MySQL基础)