需要注意的是,having不是只能对结果集中的数据进行操作,其也可以通过原表数据进行查询筛选。
要好好看一下这道综合题的练习,对于count,having的使用,以及逻辑判断的结果都有涉及。燕十八mysql-21
比如,有一个列字段名为score,那么score<60要么返回0,要么返回1。而对于前一篇中所讲,count(arg)中arg等于1或0,结果都是一样的(来一行数一个0,或者来一行数一个1)。。。
一、查询过程。
- 1、如果goods表中有a/b/c/d/e列,那么where条件中用到的列也只能是abcde之一。
如下图,用where进行筛选,也只能对于abcde进行筛选。
- 2、在经过筛选以及列之间的计算以后,得到了一个结果集,结果集中有新的列xy
- 3、对于已经用where筛选过的结果集,再用having筛选一下,得到的就是最终结果集。
二、举个例子
回顾之前做过的查询:找到店铺价格比市场价格便宜200的商品。07,sql 的查询模型(很重要)
对于第一步的解释:where只能作用于表中已有的字段。
其中最后的语句,我们用的是where market_price- shop_price >200.而不是where discount > 200(会出错)
解释原因是,where只能作用于goods表中已有的列,因此用where market_price- shop_price >200才不会出错。
对于第二步的解释:经过where筛选以后,会得到一个中间的结果集
这里,我们令where=1,那么经过筛选的结果集中,有goods_id,market_price,shop_price以及discount字段。
对于第三步的解释:having对中间的结果集进行筛选。
这里可以直接用having对中间结果集discount进行筛选了。
三、查询实例
3.1、把列字段看成变量,比如,查询商店积压的总贷款(每个商品积压贷款(商品数乘以商品价格)之和),查询每个栏目下的物品的积压贷款(分组即可)
利用sum。
继续查询,如有对结果集进行操作。
3.2、查询出每个商品栏目的积压贷款且筛选出积压金额>20000的栏目
对结果集进行操作,就要利用having了。(注意,因为是要对结果集进行操作,那么having应该加在上面语句中的group语句后面才是)
网友评论