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必知必会——GROUP BY和HAVING

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

Mysql数据分组GROUP BY 和HAVING,与WHERE组合使用

理解分组,可以这样:对GROUP BY子句后面跟随的列名进行分组,然后对每一个分组而不是整个表进行操作。 举例:在产品表中,检索每一个供应商提供的商品的数量。 mysql> SELECT vend_i...
  • liuchunming033
  • liuchunming033
  • 2015-08-04 17:00
  • 15875

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

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

mysql笔试题一:查询where having 以及统计函数的使用

题目: 有表如下: 只用一个select语句查询:不及格科目大于或等于2科的学生,的平均分(所有科目的平均分)。 mysql> select * from student; +---...
  • gaotong2055
  • gaotong2055
  • 2013-01-31 16:08
  • 9972

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

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

Mysql数据分组GROUP BY 和HAVING,与WHERE组合使用

理解分组,可以这样:对GROUP BY子句后面跟随的列名进行分组,然后对每一个分组而不是整个表进行操作。 举例:在产品表中,检索每一个供应商提供的商品的数量。 mysql> SELECT vend_i...
  • liuchunming033
  • liuchunming033
  • 2015-08-04 17:00
  • 15875

当一个查询语句同时出现了where,group by,having,order by的时候,执行顺序和编写顺序

当一个查询语句同时出现了where,group by,having,order by的时候,执行顺序和编写顺序 2010-06-06 15:34 使用count(列名)当某列出现null值的时...
  • superhosts
  • superhosts
  • 2014-09-15 21:14
  • 11950

mysql常用查询:group by,左连接,子查询,having where

前几天去了两个比较牛的互联网公司面试,在sql这块都遇到问题了,哎,可惜呀,先把简单的梳理一下 成绩表 score 1、group by 使用 按某一个维度进行分组 例如: 求每个同学的总分 SE...
  • smile0198
  • smile0198
  • 2014-04-27 17:33
  • 2658

Mysql 语句之group by, having, count

Mysql的group by, having, count平时经常用错,这里举一些使用的例子。 group by having 聚合函数count,avg,min,max,sum等 一些基础的sql语...
  • Matthewhou
  • Matthewhou
  • 2017-08-01 11:07
  • 288

sql 语句 嵌套查询 (where,group by,having,in,some,all...)

SQL语句 - 嵌套查询    嵌套查询的意思是,一个查询语句(select-from-where)查询语句块可以嵌套在另外一个查询块的where子句中,称为嵌套查询。其中外层查询也称为父查询,...
  • kpchen_0508
  • kpchen_0508
  • 2015-04-21 16:18
  • 3011
[startrelatedarticlesad1]

{relatedtitle}

{relateddes}
[endrelatedarticlesad1] [startrelatedarticlesad2] [endrelatedarticlesad2]
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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