WHERE和HAVING的区别?

where子句和having子句一样,都是用于条件判断的.这也是很多人区分不开的主要原因.不知道什么时候用什么的子句判断.既然定义了这两个判断子句,就肯定是有区别的,下面从四方面解释一下

1. where子句和having子句都可以使用的场景.

2. 只可以用where,不可以用having的情况.

3. 只可以用having,不可以用where情况.

4. 总结

1.where子句和having子句都可以使用的场景.

SELECT id,price from goodshaving id>1 LIMIT 0,5;

SELECTid,price from goods where id>1 LIMIT 0,5;

解释:在这种情况下和where的效果是等效的,但是如果没有筛选having所需字段(having id>1)就会报错! 因为having是从前筛选的字段再筛选,而where是从数据表中的字段直接进行的筛选的。

2. 只可以用where,不可以用having的场景

SELECT price from goods  having id>1 LIMIT 0,5; (报错:1054 - Unknown column'id' in 'having clause')

由于having 是筛选组的.而查询语句没有将id这个字段筛选,所以这种场景下只能用where.如下:

SELECT price from goods  where id>1 LIMIT 0,5; 

3.只可以用having,不可以用where的场景
    · GROUP BY 后只能 用having

        SELECT id, AVG(price) avgprice,goodsName FROMgoods GROUP BY id having avgprice > 6000;

        SELECT id, AVG(price)avgprice,goodsName FROM goods GROUP BY id where avgprice > 6000; 

        (错:1064 - You        have an error in your SQL syntax; check the manual thatcorresponds to your MySQL server         version for the right         syntax to  use near'where avgprice > 6000' at line 1)

        但是WHERE可以这么使用 :SELECT id, AVG(price)avgprice,goodsName FROM goods WHERE id>100 GROUP BY id

    · having能够使用统计函数,但是where不能使用

        SELECT sum(price) fromgoods group by goodsName having sum(price)>210;

       SELECT sum(price) from goods groupby goodsName where sum(price)>210; 

        (1064 - You have an error in your SQL syntax; check the manualthat corresponds to your MySQL server version         for the right syntax to use near'where sum(price)>210' at line 1)

    · having子句中可以使用字段别名,而where不能使用

        SELECT id as asd, goodsName FROM goodshaving asd>5;

        SELECTid as asd, goodsName FROM goods where asd>5; (1054 - Unknown column 'asd' in'where clause')

4.总结
    1.Where语句是一条一条从磁盘读取的, 然后进行判断,满足条件的存放到内存,不满足忽略,而having是将所有的数据读入内存中,然后在内存内部逐条判断,不满足直接删除(where是判断数据从磁盘读入内存的时候,having是判断分组统计之前的所有条件)
    2.having子句中可以使用字段别名,而where不能使用
    3.having能够使用统计函数,但是where不能使用
    4.where 后不能跟聚合函数,因为where执行顺序大于聚合函数。
    5.having 是筛选组  而where是筛选记录
注意:HAVING用于应被用于WHERE子句的条目,从我们开头的2条语句来看,这样用并没有出错,但是mysql不推荐。而且也没有明确说明原因,但是既然它要求,我们遵循就可以了。
注:大神们莫要吝啬哦,哪里不对就评论哪里,对你有所帮助就点一个赞!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值