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