zoukankan      html  css  js  c++  java
  • 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;

  • 相关阅读:
    《世界是数字的》
    IT小小鸟读书笔记
    Codeforces Round #665 Div.2 (CF1401)
    Codeforces Round #662 Div.2 (CF1392)
    std::array的效率问题
    CSS布局学习总结
    TCP中三次握手与四次挥手
    初见Vuex
    初见webpack
    CentOS7使用yum简便安装mysql5.7
  • 原文地址:https://www.cnblogs.com/pengyunjing/p/6579247.html
Copyright © 2011-2022 走看看