`

mysql group by where having 用法详情(转)

 
阅读更多

group by语法可以根据给定数据列的每个成员对查询结果进行分组统计,最终得到一个分组汇总表。

SELECT子句中的列名必须为分组列或列函数。列函数对于GROUP BY子句定义的每个组各返回一个结果。
某个员工信息表结构和数据如下:
  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语句如下:
SELECT DEPT, MAX(SALARY) AS MAXIMUM
FROM STAFF
GROUP BY DEPT
查询结果如下:
      DEPT  MAXIMUM 
      开发部 2500
      设计部 2600
      销售部 3500
解释一下这个结果:
1、满足“SELECT子句中的列名必须为分组列或列函数”,因为SELECT有GROUP BY DEPT中包含的列DEPT。
2、“列函数对于GROUP BY子句定义的每个组各返回一个结果”,根据部门分组,对每个部门返回一个结果,就是每个部门的最高薪水。
注意:计算的是每个部门(由 GROUP BY 子句定义的组)而不是整个公司的 MAX(SALARY)。
例如,查询每个部门的总的薪水数
SELECT DEPT, sum( SALARY ) AS total
FROM STAFF
GROUP BY DEPT
查询结果如下:
DEPT  total 
开发部 4500
设计部 7000
销售部 9600
将 WHERE 子句与 GROUP BY 子句一起使用
分组查询可以在形成组和计算列函数之前具有消除非限定行的标准 WHERE 子句。必须在GROUP BY 子句之前指定 WHERE 子句。
例如,查询公司2010年入职的各个部门每个级别里的最高薪水
SELECT DEPT, EDLEVEL, MAX( SALARY ) AS MAXIMUM
FROM staff
WHERE HIREDATE > '2010-01-01'
GROUP BY DEPT, EDLEVEL
ORDER BY DEPT, EDLEVEL
查询结果如下:
  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个的部门的最高和最低薪水:
SELECT DEPT, MAX( SALARY ) AS MAXIMUM, MIN( SALARY ) AS MINIMUM
FROM staff
GROUP BY DEPT
HAVING COUNT( * ) >2
ORDER BY DEPT
查询结果如下:
  DEPT  MAXIMUM  MINIMUM 
      设计部 2600 2100
      销售部 3500 3000
例如:寻找雇员平均工资大于3000的部门的最高和最低薪水:
SELECT DEPT, MAX( SALARY ) AS MAXIMUM, MIN( SALARY ) AS MINIMUM
FROM staff
GROUP BY DEPT
HAVING AVG( SALARY ) >3000
ORDER BY DEPT
查询结果如下:
  DEPT  MAXIMUM  MINIMUM 
      销售部 3500 3000

 

来源:http://www.5iphp.com/node/62

分享到:
评论

相关推荐

    mysql group by用法

    mysql group by用法:文章以图文并茂的方式详细介绍了mysql group by用法,包含语法和sql的使用、与where子句连用、与having子句连用等方式。

    深度分析mysql GROUP BY 与 ORDER BY

    本文就和大家一起深入研究下mysql中group by与order by.下面是我模拟我的内容表   我现在需要取出每个分类中最新的内容 select * from test group by category_id order by `date` 结果如下   明显。这不是我想...

    mysql having用法解析

    having字句可以让我们筛选成组后的各种数据,where字句在聚合前先筛选记录,也就是说作用在group by和having字句前。而 having子句在聚合后对组记录进行筛选。 SQL实例: 一、显示每个地区的总人口数和总面积. ...

    关于mysql数据查询中 count()等聚集函数,关键字limit,group by,having的一些用法

    对于初学者来说,一般用学生及其选课等信息这些基本的操作入手。...group by 表示 以······分组, 查询表中被选人数少于3的课程及人数: having 后跟附加条件, 4、其他聚集函数的应用: 最大值max()、最

    MySQL数据库优化SQL

    MySQL数据库优化SQL20、查询显示每个雇员加入公司的准确时间,按××××年××月××日 时分秒显示; select ename, to_char(hiredate, 'yyyy... having avg(sal) = (select min(avg(sal)) from emp group by deptno))

    MySQL根据某一个或者多个字段查找重复数据的sql语句

    select * from xi a where (a.username) in (select username from xi group by username having count(*) > 1) 2、查询出所有数据进行分组之后,和重复数据的重复次数的查询数据,先列下: select count...

    【MySQL】:分组查询where与having

    但是,在某些情况下,我们需要显式地对记录进行分组,使用的是group by [column1,column2…]。 这样,查询结果将会根据group by后面的字段,将值相同的记录分成一组。举个例子,我有一份管理学生信息的表,这时候我...

    mysql查询必练50题

    GROUP BY sid HAVING 平均成绩 > 60; SELECT sid, AVG(score) FROM sc GROUP BY sid HAVING AVG(score)>60; -- 3、查询所有同学的学号、姓名、选课数、总成绩; SELECT s.sid 学号, s.sname 姓名, COUNT(*) 选...

    干货题目 mysql 面试题集锦 常见练习题目 考试题目 共28页.pdf

    having, 在group by 之前司以使用where, 即表示对过滤后的结果分组): mysql> select employee921.id,employee921.name,employee921.salary,employee921.dep tid tid from employee921 where salary > (select avg...

    mysql基础知识小结

    select .......[where|group by|order by|having].... # DML数据操作语言 处理表内的数据 insert update delete # TPL事务处理语言 运维常用 commit提交实务,mysql默认commit开启 rollback回滚事务 # DCL...

    数据库MySQL基础知识点3

     group by + having:【注】having只能用于group by。而where是用来过滤表数据的  group by + with rollup:分组+小计 限制记录limit:限制取出记录的数量,要写在SQL语句的最后 标准的SQL书写格式

    Mysql-DQL(分组查询)

    group by 分组的字段 【order by 排序的字段】; 注意: 查询列表必须特殊,要求是分组函数和group by后出现的字段 特点: 1、分组查询中的筛选条件分两类 数据源 位置 关键字 分组前筛选 原始表 group by前面 ...

    MySQL中查询、删除重复记录的方法大全

    select title,count(*) as count from user_table group by title having count>1; SELECT * FROM t_info a WHERE ((SELECT COUNT(*) FROM t_info WHERE Title = a.Title) > 1) ORDER BY Title DESC 一、查找重复...

    MySQL命令大全

    MySql的用户管理是通过User表来实现的,添加新用户常用的方法有两个,一是在User表插入相应的数据行,同时设置相应的权限;二是通过GRANT命令创建具有某种权限的用户。其中GRANT的常用用法如下: grant all on mydb...

    Mysql数据库设计.pdf

    select group by having order by limit desc asc count sum avg max min resource mysql_connect(host,root,password); mysql_close(); bool mysql_select_db(tablename[,],连接返回变量); resource mysql_query...

    MYSQL常用命令大全

    MySql的用户管理是通过 User表来实现的,添加新用户常用的方法有两个,一是在User表插入相应的数据行,同时设置相应的权限;二是通过GRANT命令创建具有某种权限的用户。其中GRANT的常用用法如下: grant all on mydb...

    MySql中having字句对组记录进行筛选使用说明

    having的用法 having字句可以让我们筛选成组后的各种数据,where字句在聚合前先筛选记录,也就是说作用在group by和having字句前。而 having子句在聚合后对组记录进行筛选。SQL实例: 一、显示每个地区的总人口数和...

    MySql基本查询、连接查询、子查询、正则表达查询讲解

    如果GROUP BY子句后面带着HAVING关键字,那么只有满足“条件表达式2”中指定的条件的记录才能够输出。GROUP BY子句通常和COUNT()、SUM()等聚合函数一起使用。 如果有ORDER BY子句,就按照“属性名2”指定的字段进行...

Global site tag (gtag.js) - Google Analytics