如何分组数据,以便能汇总表内容的子集。这涉及两个新SELECT语句子句,分别是GROUP BY子句和HAVING子句。
分组允许把数据分为多个逻辑组,以便能对每个组进行聚集计算。
分组是在SELECT语句的GROUP BY 子句中建立的。
来看例子理解:
mysql>select vend_id,COUNT(*) AS num_prods from products group by vend_id
也就是不同的Id的商品总数都能分别查出来。
除了能用GROUP BY分组数据外,Mysql还允许过滤分组,规定包括哪些分组,排除哪些分组。
也就是HAVING子句。
mysql>select cust_id,COUNT( /) AS orders from orders <u>GROUP BY</u>cust_id <u>HAVING</u>COUNT( /) >=2
注意:这里HAVING换成WHERE是不管用的。HAVING针对于分组。
WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。
那么咱么看看怎么混合WHERE和HAVING。
mysql>select vend_id, COUNT( / ) AS num_prods from products <u>where prod_price>=10 group by</u>vend_id HAVING COUNT( /) >=2
mysql>select order_num,SUM(quantity*item_price) AS ordertotal
from orderitems
GROUP BY order_num
HAVING SUM(quantity*item_price) >=50
order by ordertotal
MySQL:5.7
SQL语句的写法:
思路:先进行排序,然后再进行分组,获取每组的第一条。
derived_merge指的是一种查询优化技术,作用就是把派生表合并到外部的查询中,提高数据检索的效率。这个特性在MySQL5.7版本中被引入,可以通过如下SQL语句进行查看/开启/关闭等 *** 作。
上面虽然听起来感觉很牛逼的样子,但是实际情况是,这个新特性,不怎么受欢迎,容易引起错误。
假设我们现在把sql中的 distinct(a.id) tid ,去掉,会发现子查询(或者叫:临时表)中的order by a.id desc失效了。
为什么会这样呢?
原理分析:
我们这里使用了临时表排序,继而对其结果进行分组,结果显示失败,加了distinct(a.id) tid,后结果正确,原因是因为临时表(派生表derived table)中使用order by且使其生效,必须满足三个条件:
一旦外部表使用了group by, 那么临时表(派生表 derived table)将不会执行filesort *** 作(即 order by 会被忽略 )。之后我使用了limit可以使其生效,原因是因为要使派生表order by生效, 派生表可以通过使用group by、limit、having、distinct等等使其生效 (方法有好多,详情可看文档 https://dev.mysql.com/doc/refman/5.7/en/derived-table-optimization.html )
原文链接:
https://blog.csdn.net/u013066244/article/details/116461584
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)