zoukankan      html  css  js  c++  java
  • MySQL GROUP BY语句

    GROUP BY 语句根据一个或多个列对结果集进行分组

    在分组的列上我们可以使用COUNT、SUM、AVG等函数

    SELECT column_name,function(column_name)
    FROM table_name
    WHERE column_name operator value
    GROUP BY  column_name
    

    示例演示1:

    SET NAMES utf8;
    SET FOREIGN_KEY_CHECKS = 0;
    
    -- ----------------------------
    --  Table structure for `employee_tbl`
    -- ----------------------------
    DROP TABLE IF EXISTS `employee_tbl`;
    CREATE TABLE `employee_tbl` (
      `id` int(11) NOT NULL,
      `name` char(10) NOT NULL DEFAULT '',
      `date` datetime NOT NULL,
      `singin` tinyint(4) NOT NULL DEFAULT '0' COMMENT '登录次数',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    -- ----------------------------
    --  Records of `employee_tbl`
    -- ----------------------------
    BEGIN;
    INSERT INTO `employee_tbl` VALUES ('1', '小明', '2016-04-22 15:25:33', '1'), ('2', '小王', '2016-04-20 15:25:47', '3'), ('3', '小丽', '2016-04-19 15:26:02', '2'), ('4', '小王', '2016-04-07 15:26:14', '4'), ('5', '小明', '2016-04-11 15:26:40', '4'), ('6', '小明', '2016-04-04 15:26:54', '2');
    COMMIT;
    
    SET FOREIGN_KEY_CHECKS = 1;
    

      

    导入成功之后,执行下面的SQL语句:

    mysql> set names utf8;
    mysql> SELECT * FROM employee_tbl;
    +----+--------+---------------------+--------+
    | id | name   | date                | singin |
    +----+--------+---------------------+--------+
    |  1 | 小明 | 2016-04-22 15:25:33 |      1 |
    |  2 | 小王 | 2016-04-20 15:25:47 |      3 |
    |  3 | 小丽 | 2016-04-19 15:26:02 |      2 |
    |  4 | 小王 | 2016-04-07 15:26:14 |      4 |
    |  5 | 小明 | 2016-04-11 15:26:40 |      4 |
    |  6 | 小明 | 2016-04-04 15:26:54 |      2 |
    +----+--------+---------------------+--------+
    6 rows in set (0.00 sec)
    

    接下来我们使用GROUP BY 语句,将数据表按名字(name)进行分组,并统计每个人有多少条记录:

    mysql> SELECT name, COUNT(name) FROM   employee_tbl GROUP BY name;
    +--------+----------+
    | name   | COUNT(name) |
    +--------+----------+
    | 小丽 |        1 |
    | 小明 |        3 |
    | 小王 |        2 |
    +--------+----------+
    3 rows in set (0.01 sec)
    

    示例演示2:

    SET NAMES utf8;
    SET FOREIGN_KEY_CHECKS = 0;
    
    -- ----------------------------
    --  Table structure for `employee_info`
    -- ----------------------------
    DROP TABLE IF EXISTS `employee_info`;
    CREATE TABLE `employee_info` (
      `id` int(11) NOT NULL,
      `name` varchar(20) NOT NULL DEFAULT '',
      `dept` varchar(20) NOT NULL DEFAULT '',
      `salary` char(10) NOT NULL DEFAULT '0',
      `edlevel` int(11) NOT NULL DEFAULT '0',
      `hiredate` datetime NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    -- ----------------------------
    --  Records of `employee_info`
    -- ----------------------------
    BEGIN;
    INSERT INTO `employee_info` VALUES ('1', '张三', '开发部', '2000', 3, '2009-10-11'), ('2', '李四', '开发部', '2500', 3, '2009-10-01'), ('3', '王五', '设计部', '2600', 5, '2010-10-02'), ('4', '王六', '设计部', '2300', 4, '2010-10-03'), 
    ('5', '马七', '设计部', '2100', 4, '2010-10-06'), ('6', '赵八', '销售部', '3000', 5, '2010-10-05'), ('7', '钱九', '销售部', '3100', 7, '2010-10-07'), ('8', '孙十', '销售部', '3500', 7, '2010-10-06'); COMMIT; SET FOREIGN_KEY_CHECKS = 1;

    员工信息表结构和数据如下:

     id  name  dept  salary  edlevel  hiredate 
     1 张三 开发部 2000 3 2009-10-11
     2 李四 开发部 2500 3 2009-10-01
     3 王五 设计部 2600 5 2010-10-02
     4 王六 设计部 2300 4 2010-10-03
     5 马七 设计部 2100 4 2010-10-06
     6 赵八 销售部 3000 5 2010-10-05
     7 钱九 销售部 3100 7 2010-10-07
     8 孙十 销售部 3500 7 2010-10-06 
    

    例如:我想列出每个部门最高薪水的结果,执行如下SQL语句:

    mysql> SELECT dept, MAX(salary) FROM   employee_info GROUP BY dept;
    +--------+----------+
    | dept   | MAX(salary) |
    +--------+----------+
    | 开发部 |        2500 |
    | 设计部 |        2600 |
    | 销售部 |        3500 |
    +--------+----------+
    3 rows in set (0.01 sec)
    

    例如,查询每个部门总的薪水数:

    mysql> SELECT dept, SUM(salary) FROM   employee_info GROUP BY dept;
    +--------+----------+
    | dept   | SUM(salary) |
    +--------+----------+
    | 开发部 |        4500 |
    | 设计部 |        7000 |
    | 销售部 |        9600 |
    +--------+----------+
    3 rows in set (0.00 sec)
    

    将WHERE子句与GROUP BY 子句一起使用

    例如:查询公司2010年入职的各个部门每个级别里的最高薪水

    mysql> SELECT dept,edlevel MAX(salary) FROM   employee_info GROUP BY dept,edlevel;
    +--------+----------+----------+
    | dept   | edleve |MAX(salary) |
    +--------+----------+----------+
    | 开发部 |        4 |        2300 |
    | 设计部 |        5 |        2600 |
    | 销售部 |        5 |        3000 |
    | 销售部 |        5 |        3500 |
    +--------+----------+----------+
    4 rows in set (0.00 sec)
    

     在GROUP BY 子句之后使用HAVING子句,HAVING子句一般跟在GROUP BY之后,再者,HAVING可以用聚合函数,常见的聚合函数有:COUNT、SUM、AVG

     例如:寻找员工数超过2个的部门的最高薪水和最低薪水

     解析:先去寻找每个部门里面最高薪水和最低薪水

    mysql> SELECT dept,MAX(salary),MIN(salary) FROM   employee_info GROUP BY dept;
    +--------+----------+----------+
    | dept   | MAX(salary) |MIN(salary) |
    +--------+----------+----------+
    | 开发部 |        2500 |        2000 |
    | 设计部 |        2600 |        2100 |
    | 销售部 |        3500 |        3000 |
    +--------+----------+----------+
    3 rows in set (0.00 sec)

    再去查找部门员工数超过2个的

    mysql> SELECT dept,MAX(salary),MIN(salary) FROM   employee_info GROUP BY dept HAVING COUNT(name) > 2;
    +--------+----------+----------+
    | dept   | MAX(salary) |MIN(salary) |
    +--------+----------+----------+
    | 设计部 |        2600 |        2100 |
    | 销售部 |        3500 |        3000 |
    +--------+----------+----------+
    2 rows in set (0.00 sec)
    

     

    例如:寻找员工平均工资大于3000的部门的最高和最低薪水

    首先第一步还是先去查找每个部门的最高和最低薪水,执行SQL语句:

    SELECT dept ,MAX(salary),MIN(salary) from employee_info GROUP BY dept;

    然后再去查找平均薪水>3000的,执行SQL语句:

    SELECT dept ,MAX(salary),MIN(salary) from employee_info GROUP BY dept HAVING AVG(salary) > 3000;
    

     

  • 相关阅读:
    Atitit.ati orm的设计and架构总结 适用于java c# php版
    Atitit.ati dwr的原理and设计 attilax 总结 java php 版本
    Atitit.ati dwr的原理and设计 attilax 总结 java php 版本
    Atitit. 软件设计 模式 变量 方法 命名最佳实践 vp820 attilax总结命名表大全
    Atitit. 软件设计 模式 变量 方法 命名最佳实践 vp820 attilax总结命名表大全
    Atitit 插件机制原理与设计微内核 c# java 的实现attilax总结
    Atitit 插件机制原理与设计微内核 c# java 的实现attilax总结
    atitit.基于  Commons CLI 的命令行原理与 开发
    atitit.基于  Commons CLI 的命令行原理与 开发
    atitit.js 与c# java交互html5化的原理与总结.doc
  • 原文地址:https://www.cnblogs.com/leeyongbard/p/9391557.html
Copyright © 2011-2022 走看看