思维的乐趣

Enjoy it
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

SQL 中HAVING的用法 及 OVER 的用法

Posted on 2010-06-14 22:08  szh114  阅读(9303)  评论(3编辑  收藏  举报

碰到一个问 SQL  HAVING语句的用法的题目。结果没答上来。把用法摘抄在这儿,以为记录。

出处:http://www.w3school.com.cn/sql/sql_having.asp

 

HAVING 子句

在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用。

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

SQL HAVING 实例

 

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

O_Id OrderDate OrderPrice Customer
1 2008/12/29 1000 Bush
2 2008/11/23 1600 Carter
3 2008/10/05 700 Bush
4 2008/09/28 300 Bush
5 2008/08/06 2000 Adams
6 2008/07/21 100 Carter

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

我们使用如下 SQL 语句:

SELECT Customer,SUM(OrderPrice) FROM Orders
GROUP BY Customer
HAVING SUM(OrderPrice)<2000

结果集类似:

Customer SUM(OrderPrice)
Carter 1700

现在我们希望查找客户 "Bush" 或 "Adams" 拥有超过 1500 的订单总金额。

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

SELECT Customer,SUM(OrderPrice) FROM Orders
WHERE Customer='Bush' OR Customer='Adams'
GROUP BY Customer
HAVING SUM(OrderPrice)>1500

结果集:

Customer SUM(OrderPrice)
Bush 2000
Adams 2000

 

 

另外需要注意的是:

当同时含有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

 

又看到一个OVER 的用法,也是我所不清楚的,也抄记如下备查:

首先我觉得很奇怪的是W3SCHOOL的SQL教程部分中没有提到过OVER这个关键字,甚至索引中也没有,所以我想这个OVER关键字倒底是什么来头呀,这么神秘,莫非只是某一个DBMS中的一个特殊的语法特性?查了半天发现是好像是ORACLE中的一个特殊函数,所以暂时先不用理它啦!!!!!!!