HAVING的作用
HAVING 子句使你能够指定过滤条件,从而控制查询结果中哪些组可以出现在最终结果里面。
WHERE 子句对被选择的列施加条件,而 HAVING 子句则对 GROUP BY 子句所产生的组施加条件。
HAVING语法
下面可以看到 HAVING 子句在 SELECT 查询中的位置:
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
在 SELECT 查询中,HAVING 子句必须紧随 GROUP BY 子句,并出现在 ORDER BY 子句(如果有的话)之前。带有 HAVING 子句的 SELECT 语句的语法如下所示:
SELECT column1,column2
FROM table1,table2
WHERE [conditions]
GROUP BY column1,column2
HAVING [conditions]
ORDER BY column1,column2
HAVING实例
考虑 Customers表,表中的记录如下所示:
下面是一个有关 HAVING 子句使用的实例,该实例将会筛选出"城市"列的内容出现次数大于或等于 2 的所有记录。
SELECT * FROM Customers WHERE 城市 IN ( SELECT 城市 FROM Customers GROUP BY 城市 HAVING COUNT(1)>1 )
其执行结果如下所示:
上面的代码用了一个子查询,主要是因为在SQL Server中GROUP BY分组后,在SELECT后面显示的列里面只能显示分组的列,比如我们这里对城市分组了,那么子查询里面就只能显示城市列,如果要显示其他列,比如要还要显示"省份"
SELECT 城市,省份 FROM Customers GROUP BY 城市 HAVING COUNT(1)>1
会提示如下错误:
所以我们将筛选出来符合条件的内容,通过子查询再传递给外面的主查询。主查询就可以不受GROUP BY的约束显示你想显示的内容了。