SQL 的 GROUP BY
子句:深入探究
SQL GROUP BY
子句是一個強大的工具,用於根據指定列對行進行分組,支援對分組資料進行聚合計算(如 SUM
、COUNT
、AVG
)。 讓我們來探索一下它在使用和不使用聚合函數時的行為。
GROUP BY
沒有聚合函數:陷阱
在沒有聚合函數的情況下使用 GROUP BY
會導致錯誤。 考慮這個例子:
<code class="language-sql">SELECT * FROM order_details GROUP BY order_no</code>
這會失敗,因為 GROUP BY
要求 SELECT
清單中的所有非聚合列也包含在 GROUP BY
子句中。 *
通配符選擇所有列,使查詢不明確,因為資料庫無法確定為每個 order_no
群組內的非分組列傳回哪個值。
GROUP BY
使用聚合函數:解
使用聚合函數時問題已解決。 聚合函數對整個群組進行操作,允許查詢產生有意義的結果。 例如計算每個訂單的總價:
<code class="language-sql">SELECT SUM(order_price) FROM order_details GROUP BY order_no</code>
此查詢成功傳回每個唯一 order_price
的 order_no
之和。
聚合函數與分組資料:揭示隱藏屬性
聚合函數提供了一種存取每個群組內的屬性的方法。 在前面的範例中,SUM
函數計算每個 order_no
組的總和。 這展示了聚合函數「深入」分組並檢索匯總資訊的能力。
標準 SQL 合規性:GROUP BY
規則
標準 SQL(與 MySQL 更寬鬆的方法不同)要求 SELECT
清單中的所有非聚合列必須出現在 GROUP BY
子句中。 因此,以下查詢是有效的:
<code class="language-sql">SELECT order_no, SUM(order_price) FROM order_details GROUP BY order_no</code>
這是有效的,因為 order_no
(非聚合列)出現在 GROUP BY
子句中。 同樣的原則也適用於具有多個分組列和聚合函數的查詢:
<code class="language-sql">SELECT order_no, order_price, MAX(order_item) FROM order_details GROUP BY order_no, order_price</code>
此查詢有效,因為 order_no
和 order_price
都包含在 GROUP BY
子句中。
以上是SQL 的 GROUP BY 子句在有或沒有聚合函數的情況下如何運作?的詳細內容。更多資訊請關注PHP中文網其他相關文章!