select 两个where_group by、where、having用法及顺序

学习交流,欢迎留言~~

昨天学习SQL,碰到了个小问题:既然where和having都可以表示“有条件地筛选出想要的内容”,那么,它们的区别是什么呢?

肯定是有区别的,否则的话SQL语言体系当中没必要出现两个作用和适用场合一样的关键子句,那样太啰嗦了,绝不是一种有逻辑、自成体系的计算机语言会出现的情况~~

所以,查了资料,发现了where、having使用过程中的一些细节:

1、select子句及其顺序

b2ef0d6f48b648ec67cfc44d2c195cfc.png
图片摘自:MYSQL必知必会

0c176ca455b47bcdb4264c8f8bdc8d61.png
图片摘自:MYSQL必知必会

1)在SQL语句中,where子句并不是必须出现的

2)where子句是对检索记录中每一行记录的过滤。

3)having子句出现在group by子句后面。

where子句对检索结果中每一条记录第一次过滤后,group by对每条记录进行分组,having对各个组中的记录进行再次过滤。因此是先通过where子句过滤、再通过group by子句分组、最后通过having子句对组中记录再次进行过滤。

4)如果在一句SQL语句中,where子句和group by……having子句同时都有的话,必须where子句在前,group by……having子句在后。

即group by子句必须出现在where子句之后,having子句必须在group by子句之后。

(where先执行,再groupby分组;groupby先分组,having再执行)

5)group by子句是对检索记录的分组,后面跟随的字段名是分组的依据。根据语法,在select子句中,除聚合函数语句外,SELECT子句中的每个列名称都必须在GROUP BY子句中作为分组的依据。

比如说按照姓名分组的正确示范:

查出没门课程都大于80分的学生姓名,select name from table group by name having min(grade) > 80

(注意,where没有出现哦~~)

比如带着聚合函数的正确示范:

a452db15ce5e5438e6e61f3a534c2fc6.png
图片参考自博客https://blog.csdn.net/weixin_41512727/article/details/80697331

比如错误的示范:

select vend_id, count(*) , sales from products group by vend_id;
这个语句,其中sales字段,在group by中没有,所以查询的结果,sales的值是错误的!
摘自:group by 与 where, having以及顺序

把它改正确的方法是将sales字段添加到group by子句中,语法倒是正确了,但是不是有业务上的实际含义,这个就另说了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值