Mysql中Group By使用Having语句配合查询

原创 2016年05月30日 20:00:06

注意 :

having语句是必须和GROUP BY一起使用的,语句中可以只有GROUP,但是不可以只有Having,当然可以而这可以同时出现的。

Having短语与WHERE的区别!!!
WHERE子句作用于基表或视图,从中选择满足条件的元组。HAVING短语作用于组,从中选择满足条件的组。

下面我们举例说明

首先我们创建这么一张表:
这里写图片描述

简单的介绍一下每一个域的意思:JOB—工种、SAL—–工资、DEP—–部门

插入数据:
这里写图片描述

需求:从该表中筛选出工种不是“M” ,以部门来划分平均工资大于28000,按降序排列的记录。

代码:

SELECT  DEP,    JOB,    AVG(SAL)
FROM    EMPL
WHERE   JOB <> 'M'
GROUP BY    DEP,    JOB
HAVING  AVG(SAL) > 28000
ORDER BY    3 DESC;

我们来一步一步地剖析这个长SQL语句:

第一,from得到的是所有的表中的记录,也就是:
这里写图片描述

第二,where 得到

这里写图片描述

第三步,group by DEP,JOB得到
这里写图片描述

第四步,having avg(SAL)>28000
也就是从所得的五个分组中找出平均工资大于28000的分组,也就是第二、四、五组

这里写图片描述

第五步就是降序排列:(当然SELECT我们一直在使用,其实这以整句的查询是有六个子句的)所以最终结果就是

这里写图片描述

这里有一个值得注意的地方就是,当我们把查询结果的第三个域改为SAL的时候,查询结果会怎么样呢?

SELECT
    DEP,
    JOB,
    SAL
FROM
    EMPL
WHERE
    JOB <> 'M'
GROUP BY
    DEP,
    JOB
HAVING
    AVG(SAL) > 28000
ORDER BY
    3 DESC;

那么结果就是每一个组中的第一条记录的SAL,这是没有任何实际意义的,因为这既不是最多的工资,也不是最小的工资,他只是每一个组中的第一条记录对应的SAL
这里写图片描述

正如我上面所说的一样,31000是BLU这组的第一条记录的SAL,33000是GRE这一组的第一条记录的SAL,32000是RED这一组的第一条记录

看一下查询结果:
这里写图片描述

所以我们在投影的时候一定要特别注意每一个域的实际意义!

一定要记住这一条规则

SELECT子句中包含集函数

SELECT子句中包含的列:
1、在集函数中的列
2、不在集函数中的列–这些列必须全部包含在GROUP BY子句中。

(即使用GROUP BY子句后,SELECT子句的列名列表中只能出现分组属性和集函数 )

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

mysql---select的五种子句学习(where、group by、having、order by、limit)

提示:在写sql语句的时候要注意 RE:这样的子句都是用来筛选行的,而列的筛选则在跟着select的后面。我也可以对列进行运算 field 提示:我们可以使用count(*)和sum(score ...

mysql中having的用法(和where的区别)

让我们先运行2个sql语句: 1、SELECT * FROM `welcome` HAVING id >1 LIMIT 0 , 30 2、SELECT * FROM `welcome` WHERE...
  • czh0423
  • czh0423
  • 2014年12月03日 11:20
  • 4129

数据库中group by和having语法使用详解

有个朋友问我一个返话费的问题,大概意思是这样的:只需把表deal中所有手机用户某天充值两次以上且总金额超过50的用户充值记录查询出来,至于怎么进行返话费那不是重点。 先看看group by的语法...
  • tjcyjd
  • tjcyjd
  • 2011年10月24日 18:18
  • 7650

mysql group by 用法解析(详细)

group by 用法解析 group by语法可以根据给定数据列的每个成员对查询结果进行分组统计,最终得到一个分组汇总表。 SELECT子句中的列名必须为分组列或列函数。列函数对于GROUP B...

mysql-where切不可与having乱用!

基础知识 元组 在关系演算中一组域的笛卡尔积中的每一个元素叫做元组.如(李华,计算机专业,2006);这中间的李华、计算机专业、2006都是没有属性和取值范围的。而记录中的是有属性、取值范围等约束的...

mysql必知必会——GROUP BY和HAVING

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

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

having的用法  having字句可以让我们筛选成组后的各种数据,where字句在聚合前先筛选记录,也就是说作用在group by和having字句前。而 having子句在聚合后对组记录进行筛...

mysql having的用法

having的用法 having字句可以让我们筛选成组后的各种数据,where字句在聚合前先筛选记录,也就是说作用在group by和having字句前。而 having子句在聚合后对组记录进行...

SQL HAVING用法详解

HAVING 子句对 GROUP BY 子句设置条件的方式与 WHERE 和 SELECT 的交互方式类似。WHERE 搜索条件在进行分组操作之前应用;而 HAVING 搜索条件在进行分组操作之后应用...
  • wozeze1
  • wozeze1
  • 2010年11月24日 09:48
  • 120372

MySQL数据库操作---group by、having、where、order by的使用

SUM函数用来求和、group by用来分组查询。一、建表、插入数据1、创建一个student表2、查看student表结构3、插入6条数据4、插入了6条数据后,我们可以发现自增数据(auto_inc...
  • will130
  • will130
  • 2015年11月12日 11:55
  • 2738
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Mysql中Group By使用Having语句配合查询
举报原因:
原因补充:

(最多只允许输入30个字)