Toboo 发布于 1年前

Yii2的where()和having()你真的会用么?

其实我们说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的所有商品名称和价格

# A
SELECT price,name FORM `goods` WHERE `price` > 20
# B
SELECT 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元的商品信息

# A
SELECT `category_id` , AVG(`price`) AS ag FROM `goods` GROUP BY `category_id` HAVING ag > 1000
# B
SELECT `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分组

# A
SELECT `category_id` FROM `goods` WHERE `price` > 30 GROUP BY `category_id`
# B
SELECT `category_id`,`price` FROM `goods` GROUP BY `category_id` HAVING `price` > 30

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

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

没有找到数据。