SQL Having子句


本教學將向您介紹SQL HAVING子句,該子句用於為GROUP BY子句彙總的組指定條件。

1. SQL HAVING子句簡介

在上一個教學中,我們學習了如何使用GROUP BY子句將行匯總到分組中,並將聚合函式(如MIN,MAX,SUM,COUNT,AVG)應用於每個分組。

要指定分組的條件,請使用HAVING子句。

HAVING子句通常與SELECT語句中的GROUP BY子句一起使用。 如果使用帶GROUP BY子句的HAVING子句,HAVING子句的行為類似於WHERE子句

以下是HAVING子句的語法:

SELECT
    column1,
    column2,
    AGGREGATE_FUNCTION (column3)
FROM
    table1
GROUP BY
    column1,
    column2
HAVING
    group_condition;

請注意,HAVING子句緊跟在GROUP BY子句之後出現。

HAVING與WHERE
在通過GROUP BY子句將行匯總到分組之前,WHERE子句將條件應用於各個行。 但是,HAVING子句在將行分組到組之後將條件應用於組。

因此,需要注意的是,在GROUP BY子句之前應用WHERE子句之後應用HAVING子句。

2. SQL HAVING子句範例

我們將使用範例資料庫中的employeesdepartments表進行演示。

要獲取經理及其下屬員工數量,請使用GROUP BY子句按管理員對員工進行分組,並使用COUNT函式計算下屬員工數量。

以下查詢實現了上面要求:

SELECT 
    manager_id,
    first_name,
    last_name,
    COUNT(employee_id) direct_reports
FROM
    employees
WHERE
    manager_id IS NOT NULL
GROUP BY manager_id;

執行上面查詢語句,得到以下結果:

要查詢至少包含五個下屬員工的經理,請在上面的查詢中新增HAVING子句,如下所示:

SELECT 
    manager_id,
    first_name,
    last_name,
    COUNT(employee_id) direct_reports
FROM
    employees
WHERE
    manager_id IS NOT NULL
GROUP BY manager_id
HAVING direct_reports >= 5;

執行上面查詢語句,得到以下結果:

+------------+------------+-----------+----------------+
| manager_id | first_name | last_name | direct_reports |
+------------+------------+-----------+----------------+
|        100 | Neena      | Wong      |             14 |
|        101 | Nancy      | Chen      |              5 |
|        108 | Daniel     | Chen      |              5 |
|        114 | Alexander  | Su        |              5 |
+------------+------------+-----------+----------------+
4 rows in set

2.1. SQL HAVING與SUM函式範例

以下語句計算公司為每個部門支付的工資總和,並僅選擇工資總和在2000030000之間的部門。

SELECT 
    department_id, SUM(salary)
FROM
    employees
GROUP BY department_id
HAVING SUM(salary) BETWEEN 20000 AND 30000
ORDER BY SUM(salary);

執行上面查詢語句,得到以下結果 -

+---------------+-------------+
| department_id | SUM(salary) |
+---------------+-------------+
|            11 | 20300.00    |
|             3 | 24900.00    |
|             6 | 28800.00    |
+---------------+-------------+
3 rows in set

2.2. SQL HAVING與MIN函式範例

要查詢具有最低工資大於10000的員工的部門,請使用以下查詢:

SELECT
    e.department_id,
    department_name,
    MIN(salary)
FROM
    employees e
INNER JOIN departments d ON d.department_id = e.department_id
GROUP BY
    e.department_id
HAVING
    MIN(salary) >= 10000
ORDER BY
    MIN(salary);

執行上面查詢語句,得到以下結果 -

+---------------+-----------------+-------------+
| department_id | department_name | MIN(salary) |
+---------------+-----------------+-------------+
|             7 | 公共關係        | 10000       |
|             9 | 行政人員        | 17000       |
+---------------+-----------------+-------------+
2 rows in set

以上查詢的工作原理。

  • 首先,使用GROUP BY子句按部門對員工進行分組。
  • 其次,使用MIN函式查詢每個分組最低工資。
  • 第三,將條件應用於HAVING子句。

2.3. SQL HAVING子句帶有AVG函式的範例
要查詢員工平均薪水在50007000之間的部門,請使用AVG函式如下查詢語句:

SELECT
    e.department_id,
    department_name,
    ROUND(AVG(salary), 2)
FROM
    employees e
INNER JOIN departments d ON d.department_id = e.department_id
GROUP BY
    e.department_id
HAVING
    AVG(salary) BETWEEN 5000
AND 7000
ORDER BY
    AVG(salary);

執行上面範例程式碼,得到以下結果:

+---------------+-----------------+-----------------------+
| department_id | department_name | ROUND(AVG(salary), 2) |
+---------------+-----------------+-----------------------+
|             6 | IT              | 5760                  |
|             5 | 運輸            | 5885.71               |
|             4 | 人力資源        | 6500                  |
+---------------+-----------------+-----------------------+
3 rows in set

在本教學中,您學習了如何使用SQLHAVING子句將條件應用於分組。