打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
mysql常用语句——GROUP BY和HAVING

创建表结构

create table `employ_info` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `name` char(20) NOT NULL DEFAULT '',
   `dept` char(20) NOT NULL DEFAULT '',
   `salary` varchar(255) NOT NULL DEFAULT '',
   `edlevel` int(11) NOT NULL DEFAULT 0,
   `hiredate` varchar(255) NOT NULL DEFAULT '',
   PRIMARY KEY(`id`)) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

添加表内容

INSERT INTO `employ_info` VALUES(1,'张三','开发部','2000','3','2009-10-11'),(2,'李四','开发部','2500','3','2009-10-11'),(3,'王五','设计部','2600','5','2010-10-02'),(4,'王六','设计部','2300','4','2010-10-03'),(5,'马七','设计部','2100','4','2010-10-05'),(6,'赵八','销售部','3000','5','2010-10-07'),(7,'钱九','销售部','3100','7','2010-10-07'),(8,'孙十','销售部','3500','7','2010-10-06');

GROUP BY语法可以根据给定数据列的每个成员对查询结果进行分组统计,最终得到一个分组汇总表。 select子句中的列名必须为分组列或列函数,列函数对于group by子句定义的每个组返回一个结果。 某个员工信息表结构和数据如下:

mysql> select * from employ_info;+----+--------+-----------+--------+---------+------------+| id | name   | dept      | salary | edlevel | hiredate   |+----+--------+-----------+--------+---------+------------+|  1 | 张三   | 开发部    | 2000   |       3 | 2009-10-11 ||  2 | 李四   | 开发部    | 2500   |       3 | 2009-10-11 ||  3 | 王五   | 设计部    | 2600   |       5 | 2010-10-02 ||  4 | 王六   | 设计部    | 2300   |       4 | 2010-10-03 ||  5 | 马七   | 设计部    | 2100   |       4 | 2010-10-05 ||  6 | 赵八   | 销售部    | 3000   |       5 | 2010-10-07 ||  7 | 钱九   | 销售部    | 3100   |       7 | 2010-10-07 ||  8 | 孙十   | 销售部    | 3500   |       7 | 2010-10-06 |+----+--------+-----------+--------+---------+------------+8 rows in set (0.07 sec)

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

mysql> select dept,max(salary) AS MAXIMUM from employ_info group by dept;+-----------+---------+| dept      | MAXIMUM |+-----------+---------+| 开发部    | 2500    || 设计部    | 2600    || 销售部    | 3500    |+-----------+---------+3 rows in set (0.37 sec)

解释一下这个结果: 1、 满足“SELECT子句中的列名必须为分组列或列函数”,因为SELECT有group by中包含的列dept; 2、“列函数对于group by子句定义的每个组各返回一个结果”,根据部门分组,对每个部门返回一个结果,就是每个部门的最高薪水。 将where子句与group by子句一起使用 分组查询可以在形成组和计算列函数之前具有消除非限定行的标准where子句。必须在group by子句之前指定where子句

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

mysql> select dept,edlevel,MAX(salary) AS MAXIMUM from employ_info group by dept,edlevel;+-----------+---------+---------+| dept      | edlevel | MAXIMUM |+-----------+---------+---------+| 开发部    |       3 | 2500    || 设计部    |       4 | 2300    || 设计部    |       5 | 2600    || 销售部    |       5 | 3000    || 销售部    |       7 | 3500    |+-----------+---------+---------+5 rows in set (0.00 sec)mysql> select dept,edlevel,MAX(salary) AS MAXIMUM from employ_info where hiredate='2010-01-01' group by dept,edlevel;Empty set (0.00 sec)mysql> select dept,edlevel,MAX(salary) AS MAXIMUM from employ_info where hiredate='2010-01-07' group by dept,edlevel;Empty set (0.00 sec)

在SELECT语句中指定的每个列名也在GROUP BY子句中提到,未在这两个地方提到的列名将产生错误。GROUP BY子句对dept和edlevel的每个唯一组合各返回一行。

GROUP BY子句之后使用Having子句

可应用限定条件进行分组,以便系统仅对满足条件的组返回结果。因此,在GROUP BY子句后面包含了一个HAVING子句。HAVING类似于WHERE(唯一的差别是WHERE过滤行,HAVING过滤组)AVING支持所有WHERE操作符。

例如,查找雇员数超过2个的部门的最高和最低薪水:

mysql> select dept,MAX(salary) as MAXIMUM,MIN(salary) as MINIMUM from employ_info group by dept having count(*)>2 order by dept;+-----------+---------+---------+| dept      | MAXIMUM | MINIMUM |+-----------+---------+---------+| 设计部    | 2600    | 2100    || 销售部    | 3500    | 3000    |+-----------+---------+---------+2 rows in set (0.09 sec)

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

mysql> select dept,max(salary) as MAXIMUM,MIN(salary) as MINIMUM from employ_info group by dept having avg(salary)>3000 order by dept;+-----------+---------+---------+| dept      | MAXIMUM | MINIMUM |+-----------+---------+---------+| 销售部    | 3500    | 3000    |+-----------+---------+---------+1 row in set (0.00 sec)
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
mysql group by 用法解析(详细)
Group by having 详解
mysql 查询语句执行顺序
查询(select)相关的语句
sql server查询(SELECT ,where,distinct,like 查询,in,is null,group by 和having,order by,as)
MySQL多表查询讲解
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服