首頁 >資料庫 >mysql教程 >SQL 的 GROUP BY 子句在沒有聚合函數的情況下如何運作?

SQL 的 GROUP BY 子句在沒有聚合函數的情況下如何運作?

DDD
DDD原創
2024-12-25 22:29:09989瀏覽

How Does SQL's GROUP BY Clause Work Without Aggregate Functions?

了解沒有聚合函數的GROUP BY

在SQL 中,GROUP BY 語句用於根據指定列對表中的行進行分組。在不使用聚合函數的情況下使用 GROUP BY 時,了解它的操作方式及其所需的條件非常重要。

考慮以下範例:

SELECT ename, sal
FROM emp
GROUP BY ename, sal;

此查詢不會傳回任何行,因為它違反了沒有聚合函數的GROUP BY 的規則:

  • Number of Columns in SELECT 清單: SELECT 清單中的欄位數必須等於GROUP BY子句中的列數。

在這種情況下,SELECT 清單有兩列(ename、sal) ,但 GROUP BY 子句有三個(ename、sal、sal)。若要修正此問題,請從GROUP BY 子句中刪除一個sal 欄位:

SELECT ename, sal
FROM emp
GROUP BY ename;
  • SELECT 清單中的非GROUP BY 欄位: 只能包含非GROUP BY列如果它們是常數或作為聚合參數出現,則在SELECT清單中

當您在 SELECT 清單中包含 sal 時,它會變成非 GROUP BY 資料列,因為它不在 GROUP BY 子句中。由於它不是聚合函數,因此會觸發 ORA-00979 錯誤。

修正此問題需要將sal 加到GROUP BY 子句或在其上使用聚合函數:

-- Add sal to the GROUP BY clause
SELECT ename, MIN(sal), MAX(sal)
FROM emp
GROUP BY ename, sal;

-- Use an aggregate function on sal
SELECT ename, SUM(sal)
FROM emp
GROUP BY ename;

規則背後的推理

GROUP BY 操作合併GROUP BY 列中具有相同值的行,為每個唯一的值集產生一行。在沒有聚合函數的 SELECT 清單中包含非 GROUP BY 欄位會產生歧義,因為不清楚如何為每個群組選擇代表值。

例如,如果您有一個包含 Name 和 Age 列的表,並且您 GROUP BY Name,每個名字的結果中應顯示哪個年齡?透過使用 MIN、MAX 或 SUM 等聚合函數,您可以明確指定如何處理此類列。

以上是SQL 的 GROUP BY 子句在沒有聚合函數的情況下如何運作?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn