GROUP BY 分组的含义

GROUP BY 分组的含义,第1张

在平时的开发任务中我们经常会用到MySQL的GROUP BY分组, 用来获取数据表中以分组字段为依据的统计数据。比如有一个学生选课表,表结构如下:

Table: Subject_Selection

Subject Semester Attendee

---------------------------------

ITB0011 John

ITB0011 Bob

ITB0011 Mickey

ITB0012 Jenny

ITB0012 James

MKB1141 John

MKB1141 Erica

我们想统计每门课程有多少个学生报名,应用如下SQL:

得到如下结果:

SubjectCount

------------------------------

ITB001 5

MKB114 2

因为表里记录了有5个学生选择ITB001,2个学生选择了MKB114。

产生这个结果的原因是:

GROUP BY X意思是将所有具有相同X字段值的记录放到一个分组里。

那么GROUP BY X, Y呢?

GROUP BY X, Y意思是将所有具有相同X字段值和Y字段值的记录放到一个分组里。

我们下面再接着要求统计出每门学科每个学期有多少人选择,应用如下SQL:

上面SQL的意思是,对Subject_Selection表中的数据进行分组,将具有相同Subject和Semester字段值的记录放到同一个分组里去, 然后对每个分组中的数据应用聚合函数(COUNT,SUM, AVG,etc)。

得到的结果是:

SubjectSemester Count

------------------------------

ITB001 1 3

ITB001 2 2

MKB114 1 2

从表中的记录我们可以看出这个分组结果是正确的有3个学生在第一学期选择了ITB001, 2个学生在第二学期选择了ITB001,

还有两个学生在第一学期选择了MKB114, 没人在第二学期选择MKB114。

注:分组后的查询结果中每行记录就是一个组的记录

MySQL中使用 GROUP BY 对数据进行分组,GROUP BY从字面意义上理解就是根据'BY'指定的规则对数据进行分组, 所谓分组就是将一个'数据集'划分成若干个'子区域',然后针对若干个'小区域'进行数据处理 。基本语法形式为:

字段值为进行分组时所依据的列名称, “HAVING <条件表达式>” 指定满足表达式限定条件的结果将被显示。

GROUP BY关键字通常和集合函数一起使用,例如:MAX()、MIN()、COUNT()、SUM()、AVG()。即把数据分为多个逻辑组,并对每个组进行集合计算。

WHERE 子句过滤行,在数据分组前过滤;HAVING 子句过滤分组,在数据分组后过滤。WHERE排除的行不包括在分组里,且HAVING支持所有WHERE *** 作符。

使用GROUP BY可以对多个字段进行分组,根据多字段的值来进行层次分组,分组从左到右。

注意事项:

如何分组数据,以便能汇总表内容的子集。这涉及两个新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


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/8541196.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-17
下一篇 2023-04-17

发表评论

登录后才能评论

评论列表(0条)

保存