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. 阶段 1 - 获取行
    • 首先,选择指定表中的所有行。
    • 然后将计算字段添加到它们。
    • 然后在所有行中,只保留满足条件的行WHERE
  2. 阶段 2 - 分组
    • 然后将分组应用于结果。
    • 在分组期间,诸如COUNT(*).
    • 最后,对分组结果应用过滤器HAVING
  3. 第 3 阶段 - 排序
    • 前面步骤中获得的行使用 排序ORDER BY

LIMIT最后,可以使用和修剪结果OFFSET