文章目录
  1. 1. 语法区别
    1. 1.1. WHERE
    2. 1.2. HAVING
  2. 2. 使用区别
  3. 3. 例子说明
    1. 3.1. WHERE实例
    2. 3.2. HAVING实例
    3. 3.3. WHERE与HAVING综合例子
  4. 4. 结论
  5. 5. 参考资料

在查询数据库表时,需要对表中的记录进行筛选,SQL提供了两个约束子句,即WHEREHAVING,二者效果有雷同,但用法有区别。

语法区别

WHERE

1
SELECT column_name FROM table_name WHERE column operator value

HAVING

1
2
3
4
5
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

使用区别

  • WHERE作用对象为数据库表、视图,HAVING作用对象为于组(Group);

  • WHERE在分组和聚集计算之前选取输入行(因此,它控制哪些行进入聚集计算),而HAVING在分组和聚集之后选取分组的行。因此,WHERE子句不能包含聚集函数;因为试图用聚集函数判断那些行输入给聚集运算是没有意义的。相反,HAVING子句总是包含聚集函数。(严格说来,你可以写不使用聚集的HAVING子句, 但这样做只是白费劲。同样的条件可以更有效地用于WHERE阶段。)

例子说明

WHERE实例

如果只希望选取居住在城市 “Beijing” 中的人,我们需要向SELECT语句添加WHERE子句:

1
SELECT * FROM Persons WHERE City='Beijing'

“Persons”

LastName FirstName Address City Year
Adams John Oxford Street London 1970
Bush George Fifth Avenue New York 1975
Carter Thomas Changan Street Beijing 1980
Gates Bill Xuanwumen 10 Beijing 1985

结果:

LastName FirstName Address City Year
Carter Thomas Changan Street Beijing 1980
Gates Bill Xuanwumen 10 Beijing 1985

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语句:

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

结果集类似:

Customer SUM(OrderPrice)
Carter 1700

WHERE与HAVING综合例子

HAVING中例子,现在我们希望查找客户 “Bush”“Adams” 拥有超过 1500 的订单总金额。

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

1
2
3
4
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

结论

  1. WHERE子句用来筛选FROM子句中指定的操作所产生的行。
  2. GROUP BY子句用来分组WHERE子句的输出。
  3. HAVING子句用来从分组的结果中筛选行。

下面的运算符可在WHERE子句中使用:

操作符 描述
= 等于
<> 不等于
> 大于
< 小于
>= 大于等于
<= 小于等于
BETWEEN 在某个范围内
LIKE 搜索某种模式

SQL使用单引号来环绕文本值(大部分数据库系统也接受双引号)。如果是数值,请不要使用引号。

这是正确的:

1
SELECT * FROM Persons WHERE FirstName = 'Bush'

这是错误的:

1
SELECT * FROM Persons WHERE FirstName = Bush

这是正确的:

1
SELECT * FROM Persons WHERE Year > 1965

这是错误的:

1
SELECT * FROM Persons WHERE Year > '1965'

参考资料

  1. W3CShool
  2. 王丹小筑
文章目录
  1. 1. 语法区别
    1. 1.1. WHERE
    2. 1.2. HAVING
  2. 2. 使用区别
  3. 3. 例子说明
    1. 3.1. WHERE实例
    2. 3.2. HAVING实例
    3. 3.3. WHERE与HAVING综合例子
  4. 4. 结论
  5. 5. 参考资料