如何分组数据,以便能汇总表内容的子集。这涉及两个新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中使用 GROUP BY 对数据进行分组,GROUP BY从字面意义上理解就是根据'BY'指定的规则对数据进行分组, 所谓分组就是将一个'数据集'划分成若干个'子区域',然后针对若干个'小区域'进行数据处理 。基本语法形式为:
字段值为进行分组时所依据的列名称, “HAVING <条件表达式>” 指定满足表达式限定条件的结果将被显示。
GROUP BY关键字通常和集合函数一起使用,例如:MAX()、MIN()、COUNT()、SUM()、AVG()。即把数据分为多个逻辑组,并对每个组进行集合计算。
WHERE 子句过滤行,在数据分组前过滤;HAVING 子句过滤分组,在数据分组后过滤。WHERE排除的行不包括在分组里,且HAVING支持所有WHERE *** 作符。
使用GROUP BY可以对多个字段进行分组,根据多字段的值来进行层次分组,分组从左到右。
注意事项:
/*语法:select 分组函数 列(要求出现在group by的后面)
from 表
【where 筛选条件】
group by 分组的列表
[order by 子句]
注意:查询列表必须特殊,要求是分组函数和group by 后出现的字段
特点:
1.分组查询中筛选条件分为两类:
数据源 位置 关键字
分组前筛选 原始表 group by子句的前面 where
分组后筛选 分组后的结果集 group by子句的后面 having
1.分组函数做条件肯定是放在having子句中
2.能用分组前筛选的,优先考虑使用分组前筛选
2.group by 子句支持单个字段、多个字段分组(用逗号隔开没有顺序要求)表达式或函数(用的较少)
3.也可以添加排序(放在整个group by子句之后)
*/
count(1),其实就是计算一共有多少符合条件的行。
1并不是表示第一个字段,而是表示一个固定值。
其实就可以想成表中有这么一个字段,这个字段就是固定值1,count(1),就是计算一共有多少个1.
同理,count(2),也可以,得到的值完全一样,count('x'),count('y')都是可以的。一样的理解方式。在你这个语句理都可以使用,返回的值完全是一样的。就是计数。
count(*),执行时会把星号翻译成字段的具体名字,效果也是一样的,不过多了一个翻译的动作,比固定值的方式效率稍微低一些。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)