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. WmS详解(二)之如何理解Window和窗口的关系?基于Android7.0源码

    上篇博客(WmS详解(一)之token到底是什么?基于Android7.0源码)中我们简要介绍了token的作用,这里涉及到的概念非常多,其中出现频率最高的要数Window和窗口这一对搭档了,那么我们 ...

  2. JAVA面向对象-----抽象类注意细节

    抽象类可以没有抽象方法(java.awt.*的类就是这样子操作的). 抽象类可以继承普通类与抽象类. 抽象类不能直接使用类名创建实例,但是有构造方法,构造方法是让子类进行初始化. 抽象类一定有构造方法 ...

  3. Dynamics CRM2013 用户进入系统所必需的那些权限

    本篇以CRM2013为例,在CRM中新建一个安全角色后该安全角色基本是空的,如果新建的安全角色作为一个账号的唯一安全角色时,那这个安全角色除了需要配置业务场景所需的权限外,是要优先具备进入CRM系统的 ...

  4. EBS应付(AP)模块常用表

     select * from ap_invoices_all INVOICE头 select * from ap_invoice_distributions_all INVOICE行 select ...

  5. cassandra 如何写数据以及放置副本

    application发送数据到server application 发送请求到server 根据设置的load balance 规则从cluster中挑选一个coordinator,一般使用轮询即可 ...

  6. velocity map list 数组操作

    Velocity生成模板的时候,经常需要使用到map.list对象,然后遍历输出对象的属性值.当你需要遍历的时候记录遍历的步长的时候,可以使用$velocityCount内置变量进行输出.下面demo ...

  7. 关于LT分发系统的设计构想

    git地址 https://github.com/cxyxd/LtDistribution 背景 对tomcat做集群,在多机多tomcat的情况下,如果要更新代码,只能手动的将代码复制,粘贴,然后下 ...

  8. 4.QPixmap,QTransform,绘图函数的使用

     新建一个项目Painter MyWidget.h #ifndef MYWIDGET_H #define MYWIDGET_H #include <QWidget> class MyW ...

  9. android GifView分享

    gif图动画在android中还是比较常用的,比如像新浪微博中,有很多gif图片,而且展示非常好,所以我也想弄一个.经过我多方的搜索资料和整理,终于弄出来了,其实github上有很多开源的gif的展示 ...

  10. 05 Activity 跳转传值

    第一个Activity: package com.fmyboke; import java.io.Serializable; import java.util.ArrayList; import ja ...