Oracle Having子句


在本教學中將學習如何使用Oracle HAVING子句過濾由GROUP BY子句返回分組。

Oracle HAVING子句簡介

HAVING子句是SELECT語句的可選子句。它用於過濾由GROUP BY子句返回的行分組。 這就是為什麼HAVING子句通常與GROUP BY子句一起使用的原因。

以下說明了OracleHAVING子句的語法:

SELECT
    column_list
FROM
    T
GROUP BY
    c1
HAVING
    group_condition;

在這個語句中,HAVING子句緊跟在GROUP BY子句之後。如果使用不帶GROUP BY子句的HAVING子句,則HAVING子句將像WHERE子句那樣工作。

請注意,HAVING子句過濾分組的行,而WHERE子句過濾行。這是HAVINGWHERE子句之間的主要區別。

Oracle HAVING子句的例子

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

1. 簡單的Oracle HAVING範例

以下語句使用GROUP BY子句從order_items表中檢索訂單及其總金額的值:

SELECT
    order_id,
    SUM( unit_price * quantity ) order_value
FROM
    order_items
GROUP BY
    order_id
ORDER BY
    order_value DESC;

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

要查詢總金額值大於1百萬的訂單,請按如下所示新增HAVING子句:

SELECT
    order_id,
    SUM( unit_price * quantity ) order_value
FROM
    order_items
GROUP BY
    order_id
HAVING
    SUM( unit_price * quantity ) > 1000000
ORDER BY
    order_value DESC;

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

在這個例子中:

  • 首先,GROUP BY子句通過訂單的ID對訂單進行分組,並使用SUM()函式計算每個訂單的總金額。
  • 然後,HAVING子句過濾所有值小於或等於1,000,000的訂單。

2. Oracle HAVING具有複雜的條件範例

可以在HAVING子句中使用複雜過濾條件來過濾分組。
例如,以下語句查詢值大於500,000的訂單,並且每個訂單中的產品數量在1012之間:

SELECT
    order_id,
    COUNT( item_id ) item_count,
    SUM( unit_price * quantity ) total
FROM
    order_items
GROUP BY
    order_id
HAVING
    SUM( unit_price * quantity ) > 500000 AND
    COUNT( item_id ) BETWEEN 10 AND 12
ORDER BY
    total DESC,
    item_count DESC;

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

在本教學中,您學習了如何使用Oracle HAVING子句過濾由GROUP BY子句返回的行分組。