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;

 

MySQL GROUP BY语句的更多相关文章

  1. 十九、MySQL GROUP BY 语句

    MySQL GROUP BY 语句 GROUP BY 语句根据一个或多个列对结果集进行分组. 在分组的列上我们可以使用 COUNT, SUM, AVG,等函数. GROUP BY 语法 SELECT ...

  2. MySQL GROUP BY 语句

    GROUP BY 语句根据一个或多个列对结果集进行分组. 在分组的列上我们可以使用 COUNT, SUM, AVG,等函数. GROUP BY 语法 SELECT column_name, funct ...

  3. 吴裕雄--天生自然MySQL学习笔记:MySQL GROUP BY 语句

    GROUP BY 语句根据一个或多个列对结果集进行分组. 在分组的列上我们可以使用 COUNT, SUM, AVG,等函数. GROUP BY 语法 SELECT column_name, funct ...

  4. 关于MySQL GROUP BY 语句

    GROUP BY 语句根据一个或多个列对结果集进行分组.在分组的列上我们可以使用 COUNT, SUM, AVG,等函数. 例如: CREATE TABLE `employee_tbl` ( `id` ...

  5. mysql group by语句流程是怎么样的

    group by流程是怎么样的 注意点: select id%10 as m, count(*) as c from t1 group by m; group by是用于对数据进行分组,我们排序用到了 ...

  6. Mysql group by语句的优化

    默认情况下,MySQL排序所有GROUP BY col1, col2, ....,查询的方法如同在查询中指定ORDER BY  col1, col2, ....如果显式包括一个包含相同的列的ORDER ...

  7. DB-MySQL:MySQL GROUP BY

    ylbtech-DB-MySQL:MySQL GROUP BY 1.返回顶部 1. MySQL GROUP BY 语句 GROUP BY 语句根据一个或多个列对结果集进行分组. 在分组的列上我们可以使 ...

  8. [MySQL] 5.7版本以上group by语句报1055错误问题

    1. 在5.7版本以上mysql中使用group by语句进行分组时, 如果select的字段 , 不是完全对应的group by后面的字段 , 有其他字段 , 那么就会报这个错误 ERROR 105 ...

  9. Mysql 常用 SQL 语句集锦

    Mysql 常用 SQL 语句集锦 基础篇 //查询时间,友好提示 $sql = "select date_format(create_time, '%Y-%m-%d') as day fr ...

随机推荐

  1. mongoDB3.4的sharding集群搭建及JavaAPI的简易使用

    第一部分 在搭建mongoDB之前,我们要考虑几个小问题: 1.我们搭建集群的目的是什么?是多备份提高容错和系统可用性还是横向拓展存储大规模数据还是两者兼有? 如果是为了多备份那么选择replicat ...

  2. Linux基础命令---设置程序优先级nice

    nice nice指令可以设置程序运行的优先级,优先级会影响到程序的调度时间.nice的范围是-20~19,其中-20级别最高,19级别最低. 此命令的适用范围:RedHat.RHEL.Ubuntu. ...

  3. 使用SpringBoot的优势。

    Spring Boot 让开发变得更简单 Spring Boot 对开发效率的提升是全方位的,我们可以简单做一下对比: 在没有使用 Spring Boot 之前我们开发一个 web 项目需要做哪些工作 ...

  4. MongoDB优化,建立索引实例及索引机制原理讲解

    MongoDB优化,建立索引实例及索引机制原理讲解 为什么需要索引? 当你抱怨MongoDB集合查询效率低的时候,可能你就需要考虑使用索引了,为了方便后续介绍,先科普下MongoDB里的索引机制(同样 ...

  5. AtCoder Beginner Contest 044 A - 高橋君とホテルイージー / Tak and Hotels (ABC Edit)

    Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement There is a hotel with ...

  6. 大数据自学3-Windows客户端DbVisualizer/SQuirreL配置连接hive

    前面已经学习了将数据从Sql Server导入到Hive DB,并在Hue的Web界面可以查询,接下来是配置客户端工具直接连Hive数据库,常用的有DbVisualizer.SQuirreL SQL ...

  7. hiho一下 第144周

    题目1 : 机会渺茫 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi最近在追求一名学数学的女生小Z.小Z其实是想拒绝他的,但是找不到好的说辞,于是提出了这样的要求: ...

  8. Java笔记 #04# 类的初始化顺序补充

    参考java中的类的初始化顺序详解 package org.sample; class Bread { Bread() { System.out.println("Bread()" ...

  9. MySQL笔记(八)存储过程练习&补充

    存储过程有什么优缺点?为什么要用存储过程?或者在什么情况下才用存储过程? 最直白的好处是存储过程比较快. 1.利用存储过程,给Employee表添加一条业务部门员工的信息. DROP PROCEDUR ...

  10. win7安装mysql-8.0.13-winx64

    这里展示一下,由于需要安装一个版本测试一下数据,其实就是超简单的啦. 下包 注:https://dev.mysql.com/downloads/mysql/ 解压与配置 [mysqld] basedi ...