MysqL group by 用法解析
2015-11-16 13:36
585 查看
一、group by语法可以根据给定数据列的每个成员对查询结果进行分组统计,最终得到一个分组汇总表。
SELECT子句中的列名必须为分组列或列函数。列函数对于GROUP BY子句定义的每个组各返回一个结果。
某个员工信息表结构和数据如下:
[sql]
view plaincopyprint?
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]
view plaincopyprint?
SELECT DEPT, MAX(SALARY) AS MAXIMUM FROM STAFF GROUP BY DEPT
[sql]
view plaincopyprint?
DEPT MAXIMUM
开发部 2500
设计部 2600
销售部 3500
1、满足“SELECT子句中的列名必须为分组列或列函数”,因为SELECT有GROUP BY DEPT中包含的列DEPT。
2、“列函数对于GROUP BY子句定义的每个组各返回一个结果”,根据部门分组,对每个部门返回一个结果,就是每个部门的最高薪水。
注意:计算的是每个部门(由 GROUP BY 子句定义的组)而不是整个公司的 MAX(SALARY)。
例如,查询每个部门的总的薪水数
[sql]
view plaincopyprint?
SELECT DEPT, sum( SALARY ) AS total
FROM STAFF GROUP BY DEPT
[sql]
view plaincopyprint?
DEPT total
开发部 4500
设计部 7000
销售部 9600
分组查询可以在形成组和计算列函数之前具有消除非限定行的标准 WHERE 子句。必须在GROUP BY 子句之前指定 WHERE 子句。
例如,查询公司2010年入职的各个部门每个级别里的最高薪水
[sql]
view plaincopyprint?
SELECT DEPT, EDLEVEL, MAX( SALARY ) AS MAXIMUM
FROM staff
WHERE HIREDATE > '2010-01-01'
GROUP BY DEPT, EDLEVEL
ORDER BY DEPT, EDLEVEL
[sql]
view plaincopyprint?
DEPT EDLEVEL MAXIMUM
设计部 4 2300
设计部 5 2600
销售部 5 3000
销售部 7 3500
GROUP BY子句对DEPT和EDLEVEL的每个唯一组合各返回一行。
三、在GROUP BY子句之后使用HAVING子句
可应用限定条件进行分组,以便系统仅对满足条件的组返回结果。为此,在GROUP BY子句后面包含一个HAVING子句。HAVING子句可包含一个或多个用AND和OR连接的谓词。每个谓词将组特性(如AVG(SALARY))与下列之一进行比较:
例如:寻找雇员数超过2个的部门的最高和最低薪水:
[sql]
view plaincopyprint?
SELECT DEPT, MAX( SALARY ) AS MAXIMUM, MIN( SALARY ) AS MINIMUM
FROM staff
GROUP BY DEPT
HAVING COUNT( * ) >2
ORDER BY DEPT
[sql]
view plaincopyprint?
DEPT MAXIMUM MINIMUM
设计部 2600 2100
销售部 3500 3000
[sql]
view plaincopyprint?
SELECT DEPT, MAX( SALARY ) AS MAXIMUM, MIN( SALARY ) AS MINIMUM
FROM staff
GROUP BY DEPT
HAVING AVG( SALARY ) >3000
ORDER BY DEPT
[sql]
view plaincopyprint?
DEPT MAXIMUM MINIMUM
销售部 3500 3000
原文地址:http://blog.csdn.net/qbg19881206/article/details/8648991
SELECT子句中的列名必须为分组列或列函数。列函数对于GROUP BY子句定义的每个组各返回一个结果。
某个员工信息表结构和数据如下:
[sql]
view plaincopyprint?
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
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语句如下:
[sql]
view plaincopyprint?
SELECT DEPT, MAX(SALARY) AS MAXIMUM FROM STAFF GROUP BY DEPT
SELECT DEPT, MAX(SALARY) AS MAXIMUM FROM STAFF GROUP BY DEPT查询结果如下:
[sql]
view plaincopyprint?
DEPT MAXIMUM
开发部 2500
设计部 2600
销售部 3500
DEPT MAXIMUM 开发部 2500 设计部 2600 销售部 3500解释一下这个结果:
1、满足“SELECT子句中的列名必须为分组列或列函数”,因为SELECT有GROUP BY DEPT中包含的列DEPT。
2、“列函数对于GROUP BY子句定义的每个组各返回一个结果”,根据部门分组,对每个部门返回一个结果,就是每个部门的最高薪水。
注意:计算的是每个部门(由 GROUP BY 子句定义的组)而不是整个公司的 MAX(SALARY)。
例如,查询每个部门的总的薪水数
[sql]
view plaincopyprint?
SELECT DEPT, sum( SALARY ) AS total
FROM STAFF GROUP BY DEPT
SELECT DEPT, sum( SALARY ) AS total FROM STAFF GROUP BY DEPT查询结果如下:
[sql]
view plaincopyprint?
DEPT total
开发部 4500
设计部 7000
销售部 9600
DEPT total 开发部 4500 设计部 7000 销售部 9600二、将 WHERE 子句与 GROUP BY 子句一起使用.
分组查询可以在形成组和计算列函数之前具有消除非限定行的标准 WHERE 子句。必须在GROUP BY 子句之前指定 WHERE 子句。
例如,查询公司2010年入职的各个部门每个级别里的最高薪水
[sql]
view plaincopyprint?
SELECT DEPT, EDLEVEL, MAX( SALARY ) AS MAXIMUM
FROM staff
WHERE HIREDATE > '2010-01-01'
GROUP BY DEPT, EDLEVEL
ORDER BY DEPT, EDLEVEL
SELECT DEPT, EDLEVEL, MAX( SALARY ) AS MAXIMUM FROM staff WHERE HIREDATE > '2010-01-01' GROUP BY DEPT, EDLEVEL ORDER BY DEPT, EDLEVEL查询结果如下:
[sql]
view plaincopyprint?
DEPT EDLEVEL MAXIMUM
设计部 4 2300
设计部 5 2600
销售部 5 3000
销售部 7 3500
DEPT EDLEVEL MAXIMUM 设计部 4 2300 设计部 5 2600 销售部 5 3000 销售部 7 3500注意:在SELECT语句中指定的每个列名也在GROUP BY子句中提到。未在这两个地方提到的列名将产生错误。
GROUP BY子句对DEPT和EDLEVEL的每个唯一组合各返回一行。
三、在GROUP BY子句之后使用HAVING子句
可应用限定条件进行分组,以便系统仅对满足条件的组返回结果。为此,在GROUP BY子句后面包含一个HAVING子句。HAVING子句可包含一个或多个用AND和OR连接的谓词。每个谓词将组特性(如AVG(SALARY))与下列之一进行比较:
例如:寻找雇员数超过2个的部门的最高和最低薪水:
[sql]
view plaincopyprint?
SELECT DEPT, MAX( SALARY ) AS MAXIMUM, MIN( SALARY ) AS MINIMUM
FROM staff
GROUP BY DEPT
HAVING COUNT( * ) >2
ORDER BY DEPT
SELECT DEPT, MAX( SALARY ) AS MAXIMUM, MIN( SALARY ) AS MINIMUM FROM staff GROUP BY DEPT HAVING COUNT( * ) >2 ORDER BY DEPT查询结果如下:
[sql]
view plaincopyprint?
DEPT MAXIMUM MINIMUM
设计部 2600 2100
销售部 3500 3000
DEPT MAXIMUM MINIMUM 设计部 2600 2100 销售部 3500 3000例如:寻找雇员平均工资大于3000的部门的最高和最低薪水:
[sql]
view plaincopyprint?
SELECT DEPT, MAX( SALARY ) AS MAXIMUM, MIN( SALARY ) AS MINIMUM
FROM staff
GROUP BY DEPT
HAVING AVG( SALARY ) >3000
ORDER BY DEPT
SELECT DEPT, MAX( SALARY ) AS MAXIMUM, MIN( SALARY ) AS MINIMUM FROM staff GROUP BY DEPT HAVING AVG( SALARY ) >3000 ORDER BY DEPT查询结果如下:
[sql]
view plaincopyprint?
DEPT MAXIMUM MINIMUM
销售部 3500 3000
原文地址:http://blog.csdn.net/qbg19881206/article/details/8648991
相关文章推荐
- windows下mysql远程访问慢
- windows下mysql开启远程访问权限
- MySQL数据库十大优化技巧
- 关于mysql数据库不出现名为mysql数据库的解决办法
- mysql_navicat-permium 在Mac下破解方法
- MySQL调优系列基础篇
- LoadRunner Mysql性能优化
- MySQL 中隔离级别 RC 与 RR 的区别
- Mysql 数据库 ERROR 1044(42000)
- [MySQL FAQ]系列 — 为什么InnoDB表要建议用自增列做主键
- mysql数据库常用语句系列
- MySQL和Gbase中information_schema是什么
- mysql密码修改
- mysql Error Code:1175
- MySQL关键字(保留字)列表
- 【转】mysql行列转换方法总结
- mysql 数据插入优化方法
- navicat for mysql注册码
- MySQL字段类型详解
- mysql安装图解