为了测试GROUP BY 语句,我们创建两张表,并往表中添加数据

-- 创建部门表

CREATE TABLE IF NOT EXISTS department(

id TINYINT UNSIGNED AUTO_INCREMENT KEY,

depName VARCHAR(20) NOT NULL UNIQUE

);

-- 添加部门

INSERT department(depName) VALUES('开发部');

INSERT department(depName) VALUES('视频部');

INSERT department(depName) VALUES('教学部');

INSERT department(depName) VALUES('运营部');

-- 创建员工表

CREATE TABLE IF  NOT EXISTS employee(

id Int UNSIGNED AUTO_INCREMENT KEY,

username VARCHAR(20) NOT NULL,

age TINYINT UNSIGNED DEFAULT 18,

addr VARCHAR(50) NOT NULL DEFAULT '北京',

salary FLOAT(6,2) NOT NULL DEFAULT 0,

sex ENUM('男','女','保密'),

depId TINYINT UNSIGNED

);

 

-- 添加员工记录

INSERT employee(username,age,addr,salary,sex,depId) VALUES('张三','21','山东','5432.12','男',1);

INSERT employee(username,age,addr,salary,sex,depId) VALUES('李四','32','河北','6432.00','男',2);

INSERT employee(username,age,addr,salary,sex,depId) VALUES('王五','26','北京','5932.92','女',3);

INSERT employee(username,age,addr,salary,sex,depId) VALUES('赵六','32','上海','6232.14','男',4);

INSERT employee(username,age,addr,salary,sex,depId) VALUES('Mr Adword','55','美国','9432.99','男',4);

INSERT employee(username,age,addr,salary,sex,depId) VALUES('田七','19','北京','4932.92','保密',1);

INSERT employee(username,age,addr,salary,sex,depId) VALUES('孙八','62','上海','9932.14','男',2);

INSERT employee(username,age,addr,salary,sex,depId) VALUES('Mr lili','45','美国','9132.99','女',1);

 
-- 创建省份表

CREATE TABLE IF NOT EXISTS provinces(

    -> id TINYINT UNSIGNED AUTO_INCREMENT KEY,

    -> pName VARCHAR(10) NOT NULL UNIQUE

    -> );

-- 添加省份记录

INSERT provinces(pName) VALUES('山东'),('河北'),('北京'),('上海'),('美国');

mysql> SELECT * FROM department;
+----+---------+
| id | depName |
+----+---------+
|  1 | 开发部  |
|  3 | 教学部  |
|  2 | 视频部  |
|  4 | 运营部  |
+----+---------+
4 rows in set (0.06 sec)
mysql> SELECT * FROM employee;
+----+-----------+------+------+---------+------+-------+
| id | username  | age  | addr | salary  | sex  | depId |
+----+-----------+------+------+---------+------+-------+
|  1 | 张三      |   21 | 山东 | 5432.12 | 男   |     1 |
|  2 | 李四      |   32 | 河北 | 6432.00 | 男   |     2 |
|  3 | 王五      |   26 | 北京 | 5932.92 | 女   |     3 |
|  4 | 赵六      |   32 | 上海 | 6232.14 | 男   |     4 |
|  5 | 田七      |   19 | 北京 | 4932.92 | 保密 |     1 |
|  6 | Mr Adword |   55 | 美国 | 9432.99 | 男   |     4 |
|  7 | 田七      |   19 | 北京 | 4932.92 | 保密 |     1 |
|  8 | 孙八      |   62 | 上海 | 9932.14 | 男   |     2 |
|  9 | Mr lili   |   45 | 美国 | 9132.99 | 女   |     1 |
+----+-----------+------+------+---------+------+-------+
mysql> SELECT * FROM provinces;
+----+-------+
| id | pName |
+----+-------+
|  4 | 上海  |
|  3 | 北京  |
|  1 | 山东  |
|  2 | 河北  |
|  5 | 美国  |
+----+-------+
 
 
1、只使用GROUP BY语句查询结果只显示每一组的一条记录:
mysql> -- 按照性别分组
mysql> SELECT * FROM employee GROUP BY sex;
+----+----------+------+------+---------+------+-------+
| id | username | age  | addr | salary  | sex  | depId |
+----+----------+------+------+---------+------+-------+
|  1 | 张三     |   21 | 山东 | 5432.12 | 男   |     1 |
|  3 | 王五     |   26 | 北京 | 5932.92 | 女   |     3 |
|  5 | 田七     |   19 | 北京 | 4932.92 | 保密 |     1 |
+----+----------+------+------+---------+------+-------+
3 rows in set (0.05 sec)
 
mysql> -- 按照部门编号分组
mysql> SELECT * FROM employee GROUP BY depId;
+----+----------+------+------+---------+------+-------+
| id | username | age  | addr | salary  | sex  | depId |
+----+----------+------+------+---------+------+-------+
|  1 | 张三     |   21 | 山东 | 5432.12 | 男   |     1 |
|  2 | 李四     |   32 | 河北 | 6432.00 | 男   |     2 |
|  3 | 王五     |   26 | 北京 | 5932.92 | 女   |     3 |
|  4 | 赵六     |   32 | 上海 | 6232.14 | 男   |     4 |
+----+----------+------+------+---------+------+-------+
4 rows in set (0.00 sec)
 
mysql> -- 根据多个字段分组
mysql> SELECT * FROM employee GROUP BY sex,depId;
+----+----------+------+------+---------+------+-------+
| id | username | age  | addr | salary  | sex  | depId |
+----+----------+------+------+---------+------+-------+
|  1 | 张三     |   21 | 山东 | 5432.12 | 男   |     1 |
|  2 | 李四     |   32 | 河北 | 6432.00 | 男   |     2 |
|  4 | 赵六     |   32 | 上海 | 6232.14 | 男   |     4 |
|  9 | Mr lili  |   45 | 美国 | 9132.99 | 女   |     1 |
|  3 | 王五     |   26 | 北京 | 5932.92 | 女   |     3 |
|  5 | 田七     |   19 | 北京 | 4932.92 | 保密 |     1 |
+----+----------+------+------+---------+------+-------+
 
2、分组查询配合GROUP_CONCAT()来使用,可以看到每个组中的详细信息:
 
mysql> -- 按照性别分组,得到每组中人员的名称
mysql> SELECT *,GROUP_CONCAT(username) FROM employee GROUP BY sex;
+----+----------+------+------+---------+------+-------+-------------------------------+
| id | username | age  | addr | salary  | sex  | depId | GROUP_CONCAT(username)        |
+----+----------+------+------+---------+------+-------+-------------------------------+
|  1 | 张三     |   21 | 山东 | 5432.12 | 男   |     1 | 张三,李四,赵六,Mr Adword,孙八 |
|  3 | 王五     |   26 | 北京 | 5932.92 | 女   |     3 | 王五,Mr lili                  |
|  5 | 田七     |   19 | 北京 | 4932.92 | 保密 |     1 | 田七,田七                     |
+----+----------+------+------+---------+------+-------+-------------------------------+
 
3、配合聚合函数来使用
  • COUNT():统计记录的数目
  • SUM():求字段的和
  • AVG():求字段的平均值
  • MAX():求字段的最大值
  • MIN():求字段的最小值
mysql> -- 统计员工表中员工数目,以及薪水的总和、最大值、最小值、平均值
mysql> SELECT id AS '编号',username AS '用户名',COUNT(*) AS '员工总数',SUM(salary) AS '总薪水',MAX(s
alary) AS '最高薪水',MIN(salary) AS '最低薪水',AVG(salary) AS '平均薪水' FROM employee;
*************************** 1. row ***************************
    编号: 1
  用户名: 张三
员工总数: 9
  总薪水: 62393.14
最高薪水: 9932.14
最低薪水: 4932.92
平均薪水: 6932.571126
1 row in set (0.00 sec)
mysql> -- 按照性别分组,统计出每个组中年龄最大值、最小值,薪水最大值,每个组中的人数,人名,以及平均薪水。
mysql> SELECT id,sex,MAX(age) AS max_age,MIN(age) AS min_age,MAX(salary) AS max_salary,COUNT(*) AS total_peo,AVG(salary)

AS avg_salary ,GROUP_CONCAT(username)FROM employee GROUP BY sex;

+----+------+---------+---------+------------+-----------+-------------+-------------------------------+

| id | sex  | max_age | min_age | max_salary | total_peo | avg_salary  | GROUP_CONCAT(username)        |

+----+------+---------+---------+------------+-----------+-------------+-------------------------------+

|  1 | 男   |      62 |      21 |    9932.14 |         5 | 7492.278027 | 张三,李四,赵六,Mr Adword,孙八 |

|  3 | 女   |      45 |      26 |    9132.99 |         2 | 7532.955078 | 王五,Mr lili                  |

|  5 | 保密 |      19 |      19 |    4932.92 |         2 | 4932.919922 | 田七,田七                     |

+----+------+---------+---------+------------+-----------+-------------+-------------------------------+
 
 
4、使用HAVING 对分组结果进行二次筛选
 
mysql> -- 按照性别分组,并找到分组后组中人数大于3的组
mysql> SELECT id,sex,COUNT(*) AS total_peo FROM employee GROUP BY sex HAVING COUNT(*)>3;
+----+------+-----------+
| id | sex  | total_peo |
+----+------+-----------+
|  1 | 男   |         5 |
+----+------+-----------+
 

MySQL-分组查询(GROUP BY)及二次筛选(HAVING)的更多相关文章

  1. Oracle和MySQL分组查询GROUP BY

    Oracle和MySQL分组查询GROUP BY 真题1.Oracle和MySQL中的分组(GROUP BY)有什么区别? 答案:Oracle对于GROUP BY是严格的,所有要SELECT出来的字段 ...

  2. Mysql分组查询group by语句详解

    (1) group by的含义:将查询结果按照1个或多个字段进行分组,字段值相同的为一组(2) group by可用于单个字段分组,也可用于多个字段分组 select * from employee; ...

  3. MySQL之单表查询 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER BY 八 限制查询的记录数:LIMIT 九 使用正则表达式查询

    MySQL之单表查询 阅读目录 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER B ...

  4. MySQL进阶5--分组函数 / 分组排序和分组查询 group by(having) /order by

    MySQL进阶--分组排序和分组查询 group by(having) /order by /* 介绍分组函数 功能:用做统计使用,又称为聚合函数或组函数 1.分类: sum, avg 求和 /平均数 ...

  5. mysql 分组查询

    mysql 分组查询 获取id最大的一条 (1)分组查询获取最大id SELECT MAX(id) as maxId FROM `d_table` GROUP BY `parent_id` ; (2) ...

  6. [Mysql 查询语句]——分组查询group by

    group by (1) group by的含义:将查询结果按照1个或多个字段进行分组,字段值相同的为一组(2) group by可用于单个字段分组,也可用于多个字段分组 select * from ...

  7. 【转】 [MySQL 查询语句]——分组查询group by

    group by (1) group by的含义:将查询结果按照1个或多个字段进行分组,字段值相同的为一组(2) group by可用于单个字段分组,也可用于多个字段分组 select * from ...

  8. MySQL分组查询与连接查询

    一,分组查询 使用ORDER BY子句将表中的数据分成若干组(还是按行显示) 语法: SELECT 字段名[,聚集函数] FROM 表名 [WHERE子句] GROUP BY 要分组的字段名 [ORD ...

  9. mysql 分组查询问题 group_concat

    这几天在做购物车的时候.购物车内的商品为一个商品占一行,结果再从数据库读出的时候,没有分组,而是循环所有的内容出来,然后进行判断.如果一样的话就把他保存到一个变量中.但是自己逻辑没搞清楚.一直出bug ...

  10. SQL Server温故系列(5):SQL 查询之分组查询 GROUP BY

    1.GROUP BY 与聚合函数 2.GROUP BY 与 HAVING 3.GROUP BY 扩展分组 3.1.GROUP BY ROLLUP 3.2.GROUP BY CUBE 3.3.GROUP ...

随机推荐

  1. Spring MVC核心技术

    目录 异常处理 类型转换器 数据验证 文件上传与下载 拦截器 异常处理 Spring MVC中, 系统的DAO, Service, Controller层出现异常, 均通过throw Exceptio ...

  2. sqlite的limit使用

    如果我要取11-20的Account表的数据,则为: Select * From Person  Limit 9 Offset 10;表示从Person  表获取数据,跳过10行,取9行 .也可以这样 ...

  3. jQuery学习笔记 .addClass()/.removeClass()简单学习

    使用jQuery或javaScript来动态改变页面中某个或部分元素的样式,为了实现这样的功能,我们往往都是使用jQuery或javaScript来控制HTML中DOM的类名(class)从而实现增加 ...

  4. [日常] NOIWC 2018爆零记

    开个坑慢慢更(逃 (然而没准会坑掉?) day 0 大概 $8:30$ 就滚去雅礼了qwq 过去的时候发现并没有人...进报到处楼门的时候还被强行拍照围观了一波OwO 然后就领了HZ所有人的提包和狗牌 ...

  5. php 常用数据大全

    一.数组操作的基本函数 数组的键名和值 array_values($arr);获得数组的值 array_keys($arr);获得数组的键名 array_flip($arr);数组中的值与键名互换(如 ...

  6. zookeeper入门系列:概述

    zookeeper可谓是目前使用最广泛的分布式组件了.其功能和职责单一,但却非常重要. 在现今这个年代,介绍zookeeper的书和文章可谓多如牛毛,本人不才,试图通过自己的理解来介绍zookeepe ...

  7. node框架koa

    node的两大常见web服务器框架有express和koa,之前已经介绍过express了现在来介绍下koa吧~ koa也是express团队的出品,意在利用es7新出的async来告别"回 ...

  8. Python内置函数(17)——chr

    英文文档: chr(i) Return the string representing a character whose Unicode code point is the integer i. F ...

  9. SSH 配置

    ssh免密通用配置 Host * Port 1234 User root #ProxyCommand nc -X 5 -x 127.0.0.1:1081 %h %p #5 socks5, 4 sock ...

  10. kubernetes入门(10)kubernetes单机安装后 - helloworld

    前言 查看端口是否被监听了 ::netstat -tlp |grep 31002 我是用的yum install etcd kubernetes docker vim, 这样装的是1.5.2,不是最新 ...