SQL语句HAVING的用法



HAVING 子句


因SQL语句中WHERE 关键字无法与合计函数一起使用,

所以增加 HAVING 子句来使用,

其用法如下所示:


1  SQL HAVING 语法

//-------------------------------------

SELECT column_name, aggregate_function(column_name)

FROM table_name

WHERE column_name operator value

GROUP BY column_name

HAVING aggregate_function(column_name) operator value


//-------------------------------------


select 列名1,聚集函数(列名2)

from 表名

where 列名1 操作符 值

group by 列名1

having 聚集函数(列名2) 操作符 值


//-------------------------------------



2  SQL HAVING 实例

//------------------------------------- 

我们拥有下面这个 "Buys" 表:

BuysId BuyDate    BuysPrice Customer

1 2008/12/29 2000 push

2 2008/11/23 2600 oarter

3 2008/10/05 800 push

4 2008/09/28 400 push

5 2008/08/06 3000 zdams

6 2008/07/21 200 oarter

//-------------------------------------

2.1用法: 现在,我们希望查找订单总金额少于 2000 的客户。

我们使用如下 SQL 语句:

SELECT Customer,SUM(BuysPrice) FROM Buys

GROUP BY Customer

HAVING SUM(BuysPrice)<3000


执行结果集类似:

Customer SUM(BuysPrice)

oarter        2800



2.2用法: 现在我们希望查找客户 "push" 或 "zdams" 拥有超过 1500 的订单总金额。

我们在 SQL 语句中增加了一个普通的 WHERE 子句:

SELECT Customer,SUM(BuysPrice) FROM Buys

WHERE Customer='push' OR Customer='zdams'

GROUP BY Customer

HAVING SUM(BuysPrice)>2500

结果集:

Customer SUM(BuysPrice)

push 3200

zdams 3000


执行原理:

SQL语句中同时含有where子句、group by 子句 、having子句及聚集函数时执行过程:


当同时含有where子句、group by 子句 、having子句及聚集函数时,


执行顺序如下:

执行where子句查找符合条件的数据;

使用group by 子句对数据进行分组;对group by 子句形成的组运行聚集函数计算每一组的值;

最后用having 子句去掉不符合条件的组。

select dno,count(*)

   from employee

   group by dno

   having count(*)>3


需要注意:having 子句中的每一个元素也必须出现在select列表中。

有些数据库例外,如oracle having子句和where子句都可以用来设定限制条件以使查询结果满足一定的条件限

制。


having子句限制的是组,而不是行。

where子句中不能使用聚集函数,而having子句中可以。

select dno,sum(salary)

   from employee

   group by dno

   having sum(salary)>10000


---the---end---