SQL教學
SQL RDBMS概念
SQL簡介
SQL NOT NULL約束
SQL DEFAULT約束
SQL唯一約束
SQL主鍵
SQL外鍵
SQL CHECK約束
SQL示例數據庫
SQL索引約束
SQL NULL值
數據庫 - 第一範式(1NF)
數據庫 - 第二範式(2NF)
數據庫 - 第三範式(3NF)
SQL RDBMS數據庫
SQL語法
SQL數據類型
SQL操運算符
SQL算術運算符
SQL比較運算符
SQL邏輯運算符
SQL表達式
SQL創建數據庫(CREATE DATABASE)
SQL丟棄或刪除數據庫(DROP DATABASE)
SQL選擇數據庫(SELECT Database, USE語句)
SQL創建表(CREATE Table)
SQL從現有表創建表
SQL刪除表(DROP或DELETE Table)
SQL INSERT INTO插入查詢
SQL SELECT查詢語句
SQL WHERE子句
SQL AND和OR運算符
SQL UPDATE更新查詢
SQL DELETE刪除查詢
SQL LIKE子句
SQL TOP,LIMIT,ROWNUM子句
SQL ORDER BY排序子句
SQL GROUP BY(分組)
SQL Distinct關鍵字
SQL排序結果
SQL約束
SQL Join聯接
SQL INNER JOIN(內部連接)
SQL LEFT JOIN(左連接)
SQL RIGHT JOIN(右連接)
SQL FULL JOIN(全連接)
SQL自連接
SQL笛卡爾或交叉連接
SQL UNION子句/操作符
SQL INTERSECT子句
SQL EXCEPT子句
SQL別名語法
SQL索引
SQL ALTER TABLE(修改表)
SQL TRUNCATE TABLE(截斷表)
SQL View(視圖)
SQL Having子句
SQL事務
SQL通配符運算符
SQL日期函數
SQL ADDDATE()函數
SQL ADDTIME()函數
SQL CONVERT_TZ()函數
SQL CURDATE()函數
SQL CURRENT_DATE()函數
SQL CURTIME()函數
SQL CURRENT_TIME()函數
SQL CURRENT_TIMESTAMP()方法
SQL DATE(expr)函數
SQL DATEDIFF()方法
SQL DATE_ADD()和DATE_SUB()方法
SQL DATE_FORMAT()函數
SQL DATE_SUB()方法
SQL DAY()函數
SQL DAYNAME()函數
SQL DAYOFMONTH()函數
SQL DAYOFWEEK()函數
SQL DAYOFYEAR()函數
SQL EXTRACT()函數
SQL FROM_DAYS()函數
SQL FROM_UNIXTIME()函數
SQL HOUR()方法
SQL LAST_DAY()函數
SQL LOCALTIME和LOCALTIME()函數
SQL LOCALTIMESTAMP和LOCALTIMESTAMP()函數
SQL MAKEDATE()函數
SQL MAKETIME()函數
SQL MICROSECOND()函數
SQL MINUTE()函數
SQL MONTH()函數
SQL MONTHNAME()函數
SQL NOW()函數
SQL PERIOD_ADD()函數
SQL PERIOD_DIFF()函數
SQL QUARTER()函數
SQL SECOND()函數
SQL SEC_TO_TIME()函數
SQL STR_TO_DATE()函數
SQL SUBDATE()函數
SQL SUBTIME()函數
SQL SYSDATE()函數
SQL TIME()函數
SQL TIMEDIFF()函數
SQL TIMESTAMP()函數
SQL TIMESTAMPADD()函數
SQL TIMESTAMPDIFF()函數
SQL TIME_FORMAT()函數
SQL TIME_TO_SEC()函數
SQL TO_DAYS()函數
SQL UNIX_TIMESTAMP()函數
SQL UTC_DATE()函數
SQL UTC_TIME()函數
SQL UTC_TIMESTAMP()函數
SQL WEEK()函數
SQL WEEKDAY()函數
SQL WEEKOFYEAR()函數
SQL YEAR()函數
SQL YEARWEEK()函數
SQL臨時表
SQL克隆表
SQL子查詢
SQL使用序列(自動遞增)
SQL DISTINCT重複處理
SQL注入
SQL實用函數
SQL MAX()函數
SQL MIN()函數
SQL AVG()函數
SQL SUM()函數
SQL SQRT()函數
SQL RAND()函數
SQL CONCAT()函數
SQL數值函數
SQL ABS()函數
SQL ACOS()函數
SQL ASIN(X)函數
SQL ATAN(X)函數
SQL ATAN2()函數
SQL BIT_AND()函數
SQL BIT_COUNT()函數
SQL BIT_OR()函數
SQL CEIL()函數
SQL CONV()函數
SQL COS()函數
SQL COT()函數
SQL DEGREES()函數
SQL EXP(X)函數
SQL FLOOR(X)函數
SQL FORMAT(X,D)函數
SQL GREATEST()函數
SQL INTERVAL()函數
SQL LEAST()函數
SQL LOG()函數
SQL LOG10(X)函數
SQL MOD()函數
SQL OCT(N)函數
SQL PI()函數
SQL POW()函數
SQL RADIANS()函數
SQL ROUND()函數
SQL SIGN(X)函數
SQL SIN(X)函數
SQL SQRT(X)函數
SQL STD()函數
SQL TAN(X)函數
SQL TRUNCATE()函數
SQL字符串函數
SQL ASCII(str)函數
SQL BIN(N)函數
SQL BIT_LENGTH()函數
SQL CHAR()函數
SQL CHAR_LENGTH()函數
SQL CHARACTER_LENGTH()函數
SQL字符串CONCAT()函數
SQL CONCAT_WS()函數
SQL CONV(N,from_base,to_base)函數
SQL ELT()函數
SQL EXPORT_SET()函數
SQL FIELD()函數
SQL FIND_IN_SET()函數
SQL FORMAT()函數
SQL HEX()函數
SQL INSERT()函數
SQL INSTR()函數
SQL LCASE()函數
SQL LEFT()函數
SQL LENGTH()函數
SQL LOAD_FILE()函數
SQL LOCATE()函數
SQL LOWER()函數
SQL LPAD()函數
SQL LTRIM()函數
SQL MAKE_SET()函數
SQL MID()函數
SQL OCT()函數
SQL OCTET_LENGTH()函數
SQL ORD()函數
SQL POSITION()函數
SQL QUOTE()函數
SQL REGEXP模式
SQL REPEAT()函數
SQL REPLACE()函數
SQL REVERSE()函數
SQL RIGHT()函數
SQL RPAD()函數
SQL SOUNDEX()函數
SQL SPACE()函數
SQL STRCMP()函數
SQL SUBSTRING()函數
SQL SUBSTRING_INDEX()函數
SQL TRIM()函數
SQL UCASE()函數
SQL UNHEX()函數
SQL UPPER()函數

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表進行演示。

SQL

要獲取經理及其下屬員工數量,請使用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;

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

SQL

要查找至少包含五個下屬員工的經理,請在上面的查詢中添加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子句將條件應用於分組。