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
。
GO TO FULL VERSION