5.1 HAVING语句
SQL 中还有另一个与 一起使用的有用运算符GROUP BY
,它称为HAVING
。
就其意义而言,它完全类似于 operator WHERE
。它只WHERE
允许您在分组前设置一个行过滤器,并且在帮助下HAVING
您可以设置一个在分组后应用于记录的过滤器。
使用分组过滤分组结果时查询的一般视图如下:
SELECT columns
FROM table
WHERE condition
GROUP BY columns
HAVING condition
HAVING
只能在请求包含GROUP BY
.
让我们编写一个查询,其中我们按年显示雇用员工的数量。
SELECT
YEAR(join_date) AS hire_year,
COUNT(*) AS total
FROM employee
GROUP BY hire_year
这个查询的结果是:
hire_year | 全部的 |
---|---|
2012 | 1个 |
2013年 | 1个 |
2014 | 1个 |
2015年 | 2个 |
2018年 | 1个 |
现在,我们将雇用一名或更少员工的年份排除在外。例子:
SELECT
YEAR(join_date) AS hire_year,
COUNT(*) AS total
FROM employee
GROUP BY hire_year
HAVING total > 1
这个查询的结果是:
hire_year | 全部的 |
---|---|
2015年 | 2个 |
5.3 语句的执行顺序
要编写正确且高效的 SQL 查询,您需要了解 SQL 服务器如何执行它们。
执行操作的程序受到严格监管,不取决于您的意愿。您无法重新排列运算符并获得不同的顺序。
SQL 查询按此顺序分几个阶段执行。
- 阶段 1 - 获取行
- 首先,选择指定表中的所有行。
- 然后将计算字段添加到它们。
- 然后在所有行中,只保留满足条件的行
WHERE
- 阶段 2 - 分组
- 然后将分组应用于结果。
- 在分组期间,诸如
COUNT(*)
. - 最后,对分组结果应用过滤器
HAVING
。 - 第 3 阶段 - 排序
- 前面步骤中获得的行使用 排序
ORDER BY
。
LIMIT
最后,可以使用和修剪结果OFFSET
。