group by 多个字段

 

首先group by 的简单说明:

   group by 一般和聚合函数一起使用才有意义,比如 count sum avg等,使用group by的两个要素:
   (1) 出现在select后面的字段 要么是是聚合函数中的,要么就是group by 中的.
   (2) 要筛选结果 可以先使用where 再用group by 或者先用group by 再用having

 

例一:

下面看下 group by多个条件的分析:

在SQL查询器输入以下语句
create table test
(
a varchar(20),
b varchar(20),
c varchar(20)
)

insert into test values(1,'a','甲')
insert into test values(1,'a','甲')
insert into test values(1,'a','甲')
insert into test values(1,'a','甲')
insert into test values(1,'a','乙')
insert into test values(1,'b','乙')
insert into test values(1,'b','乙')
insert into test values(1,'b','乙')

第一次查询

select * from test; 结果如下图:

 

结果中 按照b列来分:则是 5个a 3个b.


按照c列来分:则是 4个甲 4个乙.


第二次 按照 b列来分组 代码如下
select   count(a),b from test group by b

第三次 按照 c列来分组 代码如下
select count(a),c from test group by c


第四次 按照 b c两个条件来分组
select count(a),b,c from test group by b,c

第五次 按照 c b 顺序分组
select count(a),b,c from test group by c,b

 

例二:比如有一个学生选课表,表结构如下:

Table: Subject_Selection

Subject   Semester   Attendee
---------------------------------
ITB001    1          John
ITB001    1          Bob
ITB001    1          Mickey
ITB001    2          Jenny
ITB001    2          James
MKB114    1          John
MKB114    1          Erica

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

SELECT Subject, Count(*)
FROM Subject_Selection
GROUP BY Subject

得到如下结果:

Subject    Count
------------------------------
ITB001     5
MKB114     2

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

产生这个结果的原因是:
GROUP BY X意思是将所有具有相同X字段值的记录放到一个分组里。
那么GROUP BY X, Y呢?
GROUP BY X, Y意思是将所有具有相同X字段值和Y字段值的记录放到一个分组里。

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

SELECT Subject, Semester, Count(*)
FROM Subject_Selection
GROUP BY Subject, Semester

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

得到的结果是:

Subject    Semester   Count
------------------------------
ITB001     1          3
ITB001     2          2
MKB114     1          2

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

再比如有一个订单表,表中记录了所有支付过的订单

Table: Order

Product   Buyer       Spending
---------------------------------
PD001     Todd          12.00
PD001     Todd          12.00
PD001     Todd          12.00
PD001     Lily          12.00
PD001     Lily          12.00
PD002     Todd          20.00
PD002     Todd          20.00

现在我们想统计每个用户在每种商品上总共花了多少钱,执行如下SQL

SELECT Product,Buyer, SUM(Spending)
FROM Order
GROUP BY Product

获得的结果如下:

Product    Buyer     SUM
------------------------------
PD001      Todd      36.00
PD001      Lily      24.00
PD002      Todd      40.00

总结:

在MYSQL中使用GROUP BY对表中的数据进行分组时,
GROUP BY X意思是将所有具有相同X字段值的记录放到一个分组里,
GROUP BY X, Y意思是将所有具有相同X字段值和Y字段值的记录放到一个分组里。

 

例三

CREATE DATABASE db_test DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

USE db_test;

CREATE TABLE tb_book(
id INT(10) NOT NULL AUTO_INCREMENT COMMENT'编号',
name VARCHAR(20) NOT NULL COMMENT'书名',
time VARCHAR(20) NOT NULL COMMENT'时间',
action VARCHAR(10) NOT NULL COMMENT'活动',
PRIMARY KEY(id)
)COMMENT '借书还书信息表';

INSERT INTO tb_book(name, time, action) values('book1', '2013.1.1', '借出');
INSERT INTO tb_book(name, time, action) values('book2', '2013.1.2', '借出');
INSERT INTO tb_book(name, time, action) values('book1', '2013.1.3', '已还');
INSERT INTO tb_book(name, time, action) values('book3', '2013.1.4', '借出');
INSERT INTO tb_book(name, time, action) values('book2', '2013.1.5', '已还');
INSERT INTO tb_book(name, time, action) values('book1', '2013.1.6', '借出');
INSERT INTO tb_book(name, time, action) values('book3', '2013.1.7', '已还');
INSERT INTO tb_book(name, time, action) values('book2', '2013.1.8', '借出');
INSERT INTO tb_book(name, time, action) values('book1', '2013.1.9', '已还');
INSERT INTO tb_book(name, time, action) values('book1', '2013.1.10', '借出');

// 查询操作
SELECT name,COUNT('action') as count FROM tb_book WHERE action = '借出' GROUP BY name;

// 查询结果
+--------+------------+
| name  |    count    |
+--------+------------+
| book1 |       3       |
| book2 |       2       |
| book3 |       1       |
+--------+------------+

 

例四

tb_user 记录学生的姓名(name)和学号(ID),tb_score记录学生(有的学生考试以后被开除了,没有其记录)的学号(ID)、考试成绩(score)以及考试科目(sub),打印各学生姓名及对应的各科总成绩:
SELECT A.ID, sum(B.sore) as sumscore FROM tb_user A LEFT JOIN tb_score B on A.ID = B.ID GROUP BY A.ID;

posted @ 2017-03-19 08:46  PengYunjing  阅读(2187)  评论(0编辑  收藏  举报