为了测试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. scrapy---callback 传递自定义参数

    在scrapy提交一个链接请求是用 Request(url,callback=func) 这种形式的,而parse只有一个response参数,如果自定义一个有多参数的parse可以考虑用下面的方法实 ...

  2. 使用cocopod管理第三方

    扭捏了两年多一直不愿意使用cocopod来管理第三方,一直感觉直接拖拽第三方就挺方便的,直到今天使用第三方库WebViewJavascriptBridge,拖拽一直有问题,不得已研究.使用了cocop ...

  3. alpha冲刺第七天

    一.合照 二.项目燃尽图 三.项目进展 问答界面问答内容呈现 设置里的帐号设置呈现 能爬取教务处网站的内容保存到本地数据库 四.明日规划 继续完善各个内容的界面呈现 查找关于如何自动更新爬取内容 搜索 ...

  4. 基于Python的Web应用开发实践总结

    基于Python的Web应用开发学习总结 项目地址   本次学习采用的是Flask框架.根据教程开发个人博客系统.博客界面如图所示. 整个学习过程收获很多,以下是学习总结. 1.virtualenv ...

  5. C语言-最后一次作业

    1.当初你是如何做出选择计算机专业的决定的? 经过一个学期,你的看法改变了么,为什么? 你觉得计算机是你喜欢的领域吗,它是你擅长的领域吗? 为什么? 我当初选择计算机专业是因为我是真的很向往计算机这方 ...

  6. (转)如何在Eclipse中查看JDK类库的源代码

    在Eclipse中查看JDK类库的源代码!!! 设置: 1.点 “window”-> "Preferences" -> "Java" -> & ...

  7. bzoj千题计划177:bzoj1858: [Scoi2010]序列操作

    http://www.lydsy.com/JudgeOnline/problem.php?id=1858 2018 自己写的第1题,一遍过 ^_^ 元旦快乐 #include<cstdio> ...

  8. nyoj 星期几?

    星期几? 时间限制:500 ms  |  内存限制:65535 KB 难度:2   描述                      Acmer 小鱼儿 埋头ku算一道题 条件:已知给定 一日期 告诉你 ...

  9. DOM中的事件对象(event)

    在触发DOM上的某个事件时,会产生一个事件对象event,这个对象中包含着所有与事件相关的信息. 包括导致事件的元素.事件的类型以及其他与特定事件相关的信息. 例如:鼠标操作导致的事件对象中,会包含鼠 ...

  10. python pickle 模块的使用

    用于序列化的两个模块 json:用于字符串和Python数据类型间进行转换 pickle: 用于python特有的类型和python的数据类型间进行转换 json提供四个功能:dumps,dump,l ...