博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Yii2的where()和having()你真的会用么?
阅读量:6324 次
发布时间:2019-06-22

本文共 1316 字,大约阅读时间需要 4 分钟。

其实我们说yii2的WHERE和HAVING区别,就是在说mysql中WHERE和HAVING的区别。这两个货都能完成数据的筛选功能,一般来说我们喜欢将HAVING和GROUP BY搭配使用。

但是一定不要误以为:“HAVING只能和GROUP BY搭配使用”。

记住一大原则三大场景就可准确把握它们的使用方法~~

一大原则:HAVING从筛选的结果再筛选,WHERE直接筛选。

三大场景

  1. 沒有GROUP BY的时候,只使用WHERE而不使用HAVING(其实也能用,但是不推荐)。

  2. 有GROUP BY的时候,WHERE在GROUP BY前面,HAVING在GROUP BY后面。

  3. 使用HAVING的时候,只用在跟GROUP BY相关结果的处理上。

没看明白?下面举例说明

例子一:获取价格大于20的所有商品名称和价格

# ASELECT price,name FORM `goods` WHERE `price` > 20
# BSELECT price,name FORM `goods` HAVING `price` > 20

在A和B中会得到相同的结果,这也证明了HAVING完全可以独立门户,但是我们不推荐,对于B语句而言,是从SELECT price,name FROM goods 的结果集中再一次筛选price > 20这个条件。

若B 改为

SELECT name FORM `goods` HAVING `price` > 20

则会报错,因为在结果集中没有price。

例子二:查询每种category_id商品的价格平均值,获取平均价格大于1000元的商品信息

# ASELECT `category_id` , AVG(`price`) AS ag FROM `goods` GROUP BY `category_id` HAVING ag > 1000
# BSELECT `category_id` , AVG(`price`) AS ag FROM `goods` WHERE ag>1000 GROUP BY `category_id`

执行后,我们发现A语句莫问题,B语句报错了~说明什么?

HAVING是对已经查到的ag再次进行了筛选,而WHERE是对数据表直接查询,数据表中并没有ag字段。这个例子也证明了HAVING是作用在GROUP BY执行后的结果集上。

例子三:将所有价格大于30的商品搜索出来,然后按照category_id分组

# ASELECT `category_id` FROM `goods` WHERE `price` > 30 GROUP BY `category_id`
# BSELECT `category_id`,`price` FROM `goods` GROUP BY `category_id` HAVING `price` > 30

二者都可以执行,例子中WHERE和GROUP BY没有任何关系,而having必须作用于group by执行后的结果。

总之一句话:HAVING从筛选的结果再筛选,WHERE直接筛选,把握住这点就一起明朗。

分享自

转载地址:http://damaa.baihongyu.com/

你可能感兴趣的文章
“RESOURCE MONITOR“CPU占用特别高
查看>>
机器人可以比人类优秀,那未来会替代人类吗?
查看>>
Linux-(tar,gzip,df,du)
查看>>
Android开发之蓝牙操作
查看>>
前后端分离的思考与实践(四)
查看>>
获取网卡IP地址命令
查看>>
Java反射机制详解上篇
查看>>
对BBS中一个问题的解答
查看>>
Linux系统基础调优
查看>>
Chrome源码剖析 【序】 && 【一】
查看>>
Redis 3.0 新特性,支持redis 集群
查看>>
mysql主从
查看>>
PHP转换emoji表情为HTML字符实体
查看>>
exchange 2016 辅助角色
查看>>
SQLServer 延迟事务持久性
查看>>
atomikos 创建数据源,报Max number of active transactions
查看>>
关于mount在unix系统上
查看>>
Linux CentOS 硬盘分区、格式化、挂载与卸载
查看>>
Configuration Manager 内置报表列表04
查看>>
linux logrotate 配置
查看>>