注意 :

having语句一般结合GROUP BY一起使用的。。。。。

Having短语与WHERE的区别!!!

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

where是从查询满足条件的数据,用于查询数据之前;having用于在查出的数据中挑选满足条件的数据,在数据查出来之后处理。

select语法的顺序问题:

select  一般在的后面的内容都是要查询的字段

from  要查询到表

where

group by

having  分组后带有条件只能使用having

order by 

 limit 0,100  它必须放到最后面

下面我们举例说明

首先我们创建这么一张表:

简单的介绍一下每一个域的意思: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子句的列名列表中只能出现分组属性和集函数 )

-------------------------另一种解释----------------

聚合函数是比较where、having 的关键。 
开门见山。where、聚合函数、having 在from后面的执行顺序:

where>聚合函数(sum,min,max,avg,count)>having

列出group by来比较二者。()因where和having 在使用group by时问的最多) 
若须引入聚合函数来对group by 结果进行过滤 则只能用having。(此处不多说,自己想 是先执行聚合函数还是先过滤 然后比对我上面列出的执行顺序 一看便知)

例如:

select sum(score) from student  where sex='man' group by name having sum(score)>210

注意事项 : 
  1、where 后不能跟聚合函数,因为where执行顺序大于聚合函数。 
  2、where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。 
  3、having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组。

Mysql中Group By使用Having语句配合查询(where和having区别)的更多相关文章

  1. 转:深入研究mysql中group by与order by取分类最新时间内容

    鉴于项目的需要,就从网上找到该文章,文章分析得很详细也很易懂,在android里, (不知道是不是现在水平的限制,总之我还没找到在用ContentProvider时可以使用子查询),主要方法是用SQL ...

  2. 深入研究mysql中group by与order by取分类最新时间内容

    鉴于项目的需要,就从网上找到该文章,文章分析得很详细也很易懂,在android里,(不知道是不是现在水平的限制,总之我还没找到在用 ContentProvider时可以使用子查询),主要方法是用SQL ...

  3. mysql中与 in 相反的语句 find_in_set('数据',字段名)

    在 mysql 中,我们经常用 in 来查询众多数据中是否有数据表字段中的值: 如果我们在数据表的字段中添加了很多值,然后查询某个值是否是这个字段中众多值的一个时可以用 find_in_set('数据 ...

  4. MySQL的EXPLAIN命令用于SQL语句的查询执行计划

    MySQL的EXPLAIN命令用于SQL语句的查询执行计划(QEP).这条命令的输出结果能够让我们了解MySQL 优化器是如何执行SQL 语句的.这条命令并没有提供任何调整建议,但它能够提供重要的信息 ...

  5. MySQL中KEY、PRIMARY KEY、UNIQUE KEY、INDEX 的区别

    参考:MySQL中KEY.PRIMARY KEY.UNIQUE KEY.INDEX 的区别 对于题目中提出的问题,可以拆分来一步步解决.在 MySQL 中 KEY 和 INDEX 是同义.那这个问题就 ...

  6. MySQL中不允许使用列别名作为查询条件

    在MySQL中有个特殊的规定,即不允许使用列别名作为查询条件.比如有下面一个表: select     ID,     title,     concept,     conceptLength,   ...

  7. mysql中tinyint、smallint、int和bigint类型的用法区别

    mysql中tinyint.smallint.int和bigint类型的用法区别: 在MySQL的数据类型中,Tinyint的取值范围是:带符号的范围是-128到127.无符号的范围是0到255(见官 ...

  8. mysql中group by 的用法解析

    1. group by的常规用法 group by的常规用法是配合聚合函数,利用分组信息进行统计,常见的是配合max等聚合函数筛选数据后分析,以及配合having进行筛选后过滤. 假设现有数据库表如下 ...

  9. MySQL中group by , sum , case when then 的使用

    在我们使用数据库的时候,可能会遇到需要进行统计的情况. 比如需要统计一下,下表中各个年份的胜负场数. 遇到这样的情况,我们应该怎么办呢? 在mysql中我们可以使用group by sum  case ...

随机推荐

  1. HTML <input>标签属性

  2. 使用frp工具实现内网的穿透以及配置多个ssh和web服务

    frp简介 FRP 项目地址 https://github.com/fatedier/frp/blob/master/README_zh.md frp 是一个可用于内网穿透的高性能的反向代理应用,支持 ...

  3. iOS静态库.Framework制作

    首先要解释一下什么是库,库(Library)其实就是一段编译好的二进制代码,加上头文件就可以供别人使用,一般会有两种情况要用到库: 某些代码需要给别人使用,但是我们不希望别人看到源码,就需要以库的形式 ...

  4. JavaScript--编程练习2

    制作一个跳转提示页面: 要求: 1. 如果打开该页面后,如果不做任何操作则5秒后自动跳转到一个新的地址,如慕课网主页. 2. 如果点击“返回”按钮则返回前一个页面. 效果: 注意: 在窗口中运行该程序 ...

  5. C# 生成 bmp 格式的图片

    using System; using System.Collections.Generic; using System.Diagnostics; using System.Drawing; usin ...

  6. 喜欢Swift编程语言的人主要是初学者?

    一早一起来,朋友圈除了被苹果发布会刷屏外,还漫天散布着一条类似的招聘消息:“招聘iOS程序员,要求拥有5年的Swift开发经验,有狼性,待遇月薪20K+,专车接送.” 随后身边的朋友很快就开始调侃:& ...

  7. 待销售分拣单App数据推送

    管理待分拣商品的App的显示操作

  8. es6之Proxy,Reflect

    Proxy 可以理解成,在目标对象之前架设一层“拦截”,外界对该对象的访问,都必须先通过这层拦截,因此提供了一种机制,可以对外界的访问进行过滤和改写. var proxy = new Proxy(ta ...

  9. VMWare虚拟机中Ubuntu 16.04 (linux无桌面)配置静态IP上网

    1. 基础环境说明 虚拟机: VMWare 12.5.2 操作系统: Ubuntu 16.04 (无桌面) 物理主机操作系统: win 7 旗舰版 2. 摸底 VMware在安装之后,会创建2个虚拟的 ...

  10. Windows下编译64位GSL

    GSL (GNU Scientific Library, http://www.gnu.org/software/gsl/)官方并没有提供编译好的Windows版本.首先要保证Windows是64位的 ...