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. python遍历目录os.walk(''d:\\test2",topdown=False)

    os.walk(top, topdown=True, onerror=None, followlinks=False)遍历目录,topdown=false表示先返回目录,后返回文件 参数说明: top ...

  2. 【Error】:svnrdump: E130003: The XML response contains invalid XML

    我这边的使用场景是在对远程服务器进行svnrdump dump操作时出现该问题,因为是对远程仓库多级子目录进行备份,结果出现错误. 在网上搜索了很多,有很多帖子是在checkout的时候出现问题,和我 ...

  3. Linux基础命令---ifconfig

    ifconfig ifconfig指令用来配置网络接口参数,同时还可以显示当前内核网络接口的工作状态.如果没有提供参数,则ifconfig将显示当前活动接口的状态.如果给定单个接口参数,则只显示给定接 ...

  4. Linux基础命令---管理组gpasswd

    gpasswd gpasswd指令用来管理组文件“/etc/group”和“/etc/gshadow”,每个组可以设置管理员.组员.密码.系统管理员可以使用-A选项定义组管理员,使用-M选项定义成员. ...

  5. jQuery的ajaxFileUpload上传插件——刷新一次才能再次调用触发change

    这个问题并不是由change事件失效造成的,而是ajaxFileUpload插件造成的,它会把原来的file元素替换成新的file元素,所以之前绑定的change事件就失效了. 查了一些资料,有些朋友 ...

  6. Step2:SQL Server 复制事务发布

    一.背景 在复制的运用场景中,事务发布是使用最为广泛的,我遇到这样一个场景:在Task数据库中有Basic与Group两个表,需要提供这两个表的部分字段给其它程序读取放入缓存,程序需要比较及时的获取到 ...

  7. 柳暗花明又一村的———for循环

    学习过了do while循环和while循环后,我们终于剩下了循环结构重的最后一个-------for循环 本人认为for循环相比于do while ,while而言.好学一点下面就是我对for循环的 ...

  8. CI(CodeIgniter)框架下使用非自带类库实现邮件发送

    在项目开发过程中,需要到了邮件提醒功能.首先想到的是CI自身带不带邮件发送类,查看帖子,发现CI本身自带,然后试着利用CI自身带的类库来实现,经过搜搜很多帖子,不少开发者反馈CI自身的Email类有问 ...

  9. ==和equals的区别。

    1.java中equals和==的区别 值类型是存储在内存中的堆栈(简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中. 2.==操作比较的是两个变量的值是否相等,对于 ...

  10. java jdbc->mycat->oracle SqlException异常中文信息乱码解决

    mycat字符集gbk oracle字符集gbk 原jdbc连接串: base.jdbc.url=jdbc:mysql://127.0.0.1:3306/XXX?useUnicode=true& ...