having子句与where都是过滤语句。

where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。

having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组。

总之,select 用where过滤,找到符合条件的元组。

而having 用在group by后,配合使用,过滤结果。过滤条件使用聚集函数。即一旦查询结果需要按某个值分组(group by语句),在组内进行过滤时,就用having,如having sum(某列)>4。

具体的区别:

聚合语句(sum,min,max,avg,count)在having 里,where 外,所以里先执行,外部的后执行。

where子句:

select sum(num) as rmb from order where id>10

//先where,后sum。只有先查询出id大于10的记录才能执行聚合语句。

在having里优先执行:

select reportsto as manager, count(*) as reports from employees

group by reportsto having count(*) > 4

分组时用having弥补where在分组数据判断时的不足。因为where执行优先级别要快于聚合语句。

聚合函数和group by都只返回一条结果:
聚合函数,例如SUM, COUNT, MAX, AVG等,区别于其他函数,他们作用在多条记录上。只返回一个结果,
如SELECT SUM(population) FROM tablename,SUM作用在所有返回记录的population字段上,返回所有
家的总人口数。

GROUP BY 子句,可以让SUM 和 COUNT 等函数只在一组内的数据起作用。

但返回结果只有一组内的一行。如GROUP BY region 时,同组(同一个region)的数据只返回一行值。表中的其他字段也只能返回一个值.

HAVING子句在聚合后对组内记录筛选.

例子:

一、显示每个地区的总人口数和总面积.

SELECT region, SUM(population), SUM(area)

FROM bbc

GROUP BY region

先以region把返回记录分成多个组,这就是GROUP BY的字面含义。分完组后,然后用聚合函数对每组中的不同字段(一或多条记录)作运算。

二、 显示每个地区的总人口数和总面积.仅显示那些面积超过1000000的地区。

SELECT region, SUM(population), SUM(area)

FROM bbc

GROUP BY region

HAVING SUM(area)>1000000

在这里,我们不能用where来筛选超过1000000的地区,因为表中不存在这样一条记录。

相反,HAVING子句可以让我们筛选成组后的各组数据.

以下示例使用的数据库是MySQL 5。

数据表:student

表结构:

Field Name DataType Len

id int 20

name varchar 25

major varchar 25

score int 20

sex varchar 20



表数据:

编号/姓名/专业/学分/性别

id name major score sex

1 jak Chinese 40 f

2 rain Math 89 m

3 leo Phy 78 f

4 jak Math 76 f

5 rain Chinese 56 m

6 leo Math 97 f

7 jak Phy 45 f

8 jak Draw 87 f

9 leo Chinese 45 f



现在我们要得到一个视图:

要求查询性别为男生,并且列出每个学生的总成绩:

SQL:

select s.*,sum(s.score) from student s where sex='f' group by s.name



Result:

id name major score sex sum(s.score)

1 jak Chinese 40 f 248

3 leo Phy 78 f 220



可以看到总共查到有两组,两组的学生分别是jak和leo,每一组都是同一个学生,这样我们就可以使用聚合函数了。

只有使用了group by语句,才能使用如:count()、sum()之类的聚合函数。



下面我们再对上面的结果做进一步的筛选,只显示总分数大于230的学生:

SQL:

select s.*,sum(s.score) from student s where sex='f' group by s.name having sum(s.score)>230



Result:

id name major score sex sum(s.score)

1 jak Chinese 40 f 248

GROUP BY,WHERE,HAVING间的区别和用法的更多相关文章

  1. GROUP BY,WHERE,HAVING之间的区别和用法

      GROUP BY,WHERE,HAVING之间的区别和用法 分类: Oracle学习2009-11-01 23:40 21963人阅读 评论(6) 收藏 举报 mathmanagersql数据库m ...

  2. Python中read()、readline()和readlines()三者间的区别和用法

    2019-01-15 10:48:43 前言 众所周知在python中读取文件常用的三种方法:read(),readline(),readlines(),今天看项目是又忘记他们的区别了.以前看书的时候 ...

  3. array_unique和array_flip 实现去重间的区别

    array_unique和array_flip 实现去重间的区别 ​php有内置函数array_unique可以用来删除数组中的重复值, phperz~com (PHP 4 >= 4.0.1,  ...

  4. Executor, ExecutorService 和 Executors 间的区别与联系

    UML简要类图关系: 下面详细看一下三者的区别: Executor vs ExecutorService vs Executors 正如上面所说,这三者均是 Executor 框架中的一部分.Java ...

  5. innerHTML innerText与outerHTML间的区别

    innerHTML与innerText及outerHTML间的区别最容易使初学者搞混淆,为了更好的使读者区分开.下面我就通过一个demo来解释: 代码: <!DOCTYPE html>&l ...

  6. float与position间的区别

    float与position间的区别:    个人理解为:脱离文档流不一定脱离文本流:但脱离文本流,则也脱离文档流.[如有更好的理解还望评论区一起探讨,共同学习进步]一.float 浮动(脱离文档流, ...

  7. JVM、JRE和JDK三者间的区别和联系

    简介:我们利用JDK(调用JAVA API)开发了属于我们自己的JAVA程序后,通过JDK中的编译程序(javac)将我们的文本java文件编译成JAVA字节码,在JRE上运行这些JAVA字节码,JV ...

  8. Position属性四个值:static、fixed、absolute和relative的区别和用法

    Position属性四个值:static.fixed.absolute和relative的区别和用法 在用CSS+DIV进行布局的时候,一直对position的四个属性值relative,absolu ...

  9. magic_quotes_gpc、mysql_real_escape_string、addslashes的区别及用法

    本篇文章,主要先重点说明magic_quotes_gpc.mysql_real_escape_string.addslashes 三个函数方法的含义.用法,并举例说明.然后阐述下三者间的区别.关系.一 ...

随机推荐

  1. springMVC源码分析--AbstractHandlerMethodMapping获取url和HandlerMethod对应关系(十)

    在之前的博客springMVC源码分析--AbstractHandlerMapping(二)中我们介绍了AbstractHandlerMethodMapping的父类AbstractHandlerMa ...

  2. FORM开发之说明性弹性域开发

    1.注册使用弹性域的表,字段 注册表语法:ad_dd.register_table('所有者','表名','T自动扩展/S非自动扩展','下一区','自由','已使用') AD_DD.REGISTER ...

  3. windows下Eclipse操作MapReduce例子报错:Failed to set permissions of path: \tmp\hadoop-Jerome\mapred\staging\

    windows下Eclipse操作MapReduce例子报错: 14/05/18 22:05:29 WARN util.NativeCodeLoader: Unable to load native- ...

  4. Gazebo機器人仿真學習探索筆記(五)環境模型

    環境模型構建可以通過向其中添加模型實現,待之後補充,比較有趣的是建築物模型, 可以編輯多層樓層和房間,加入樓梯,窗戶和牆壁等,具體可以參考附錄,等有空再補充. 起伏地形環境構建可以參考之前內容:在Ga ...

  5. 在非ViewController中显示AlertController的方法

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 以前我们可以在任何类中使用UIAlertView的show实例 ...

  6. 第一行代码阅读笔记---详解分析第一个Android程序

    以下是我根据作者的思路,创建的第一个Android应用程序,由于工具强大,代码都自动生成了,如下: package com.example.first_app; import android.os.B ...

  7. Tomcat内核之Tomcat的类加载器

    跟其他主流的Java Web服务器一样,Tomcat也拥有不同的自定义类加载器,达到对各种资源库的控制.一般来说,Java Web服务器需要解决以下四个问题: ①   同一个Web服务器里,各个Web ...

  8. 【Netty源码学习】ServerBootStrap

    上一篇博客[Netty源码学习]BootStrap中我们介绍了客户端使用的启动服务,接下来我们介绍一下服务端使用的启动服务. 总体来说ServerBootStrap有两个主要功能: (1)调用父类Ab ...

  9. 最简单的视频编码器:基于libvpx(编码YUV为VP8)

    ===================================================== 最简单的视频编码器系列文章列表: 最简单的视频编码器:编译 最简单的视频编码器:基于libx ...

  10. 【Android应用开发】 Android 崩溃日志 本地存储 与 远程保存

    示例代码下载 : http://download.csdn.net/detail/han1202012/8638801; 一. 崩溃日志本地存储 1. 保存原理解析 崩溃信息本地保存步骤 : -- 1 ...