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. CSS3 滤镜学习

    html篇 样式篇 grayscale sepia saturate hue-rotate invert opactiy brightness contrast blur drop-shadow 综合 ...

  2. Android Multimedia框架总结(十三)CodeC部分之OpenMAX框架初识及接口与适配层实现

    转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52629598 前言:上篇中介绍O ...

  3. EJB_开发EJB容器模型的WEB服务

    开发EJB容器模型的WEB服务 WEB服务 Web服务也是一种分布式技术,它与EJB最大的不同是,Web服务属于行业规范,可以跨平台及语言.而EJB属于Java平台的规范,尽管理论上可以跨平台,但实现 ...

  4. Android Device Administration 设备管理器——实现一键锁屏

    Android Device Administration 设备管理器--实现一键锁屏 最近研究了一下安全这一块的内容,当然,我是比较水的,所以也拿不出什么好知识点,但是有一些冷门的东西我还是可以聊聊 ...

  5. 【一天一道LeetCode】#225. Implement Stack using Queues

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Impleme ...

  6. Dynamics CRM 2015 站点地图公告配置实体显示名称的变更

    CRM更新2015后,在设置里找不到公告配置了 在原来的位置上你会东西一个叫活动源配置的东西,点开看后就是原来的公告配置.

  7. JAVA之旅(二十九)——文件递归,File结束练习,Properties,Properties存取配置文件,load,Properties的小练习

    JAVA之旅(二十九)--文件递归,File结束练习,Properties,Properties存取配置文件,load,Properties的小练习 我们继续学习File 一.文件递归 我们可以来实现 ...

  8. 统计git代码提交量

    以下是我写的一个脚本,可以统计在某个项目中,自己修改代码的行数,包括增加多少行,删除多少行. 可以统计当天,24小时内或全部时间内.使用时需要把代码中的author对应的值换成自己的名字. 代码如下: ...

  9. Linux服务器Jboss运行环境搭建步骤和开机自动启动脚本编写运行

    Jboss运行环境:Linux+Jdk+Jboss+jsp系统 Jboss软件说明:类似于Tomcat,就是一个跑Jsp系统的环境,他的站点路径跟Tomcat类似,Tomcat存放站点文件到webap ...

  10. flume1.4.0 保存文件到hdfs错误调试

    报错如下 解决方案:将FLUME_HOME/lib目录下的jar文件,替换成HADOOP_HOME/share/hadoop/common/lib下版本更新的jar文件