SELECT deptno, ename
FROM emp
GROUP BY deptno
SQL 標準規定:`SELECT` 列表中的每一列,必須滿足以下任一條件:
錯誤 SQL 中 `ename` 既不在 `GROUP BY`,也無聚合函數。分組後每組包含多行,每行 `ename` 可能不同 (如 10 部門有 CLARK, KING, MILLER),數據庫**無法決定選哪一個** 代表該組,因此拒絕執行。
SELECT deptno, COUNT(*) AS emp_count, AVG(sal) AS avg_sal
FROM emp
GROUP BY deptno
使用窗口函數 (MySQL 8.0+, PostgreSQL, Oracle, SQL Server):
SELECT deptno, ename, sal
FROM (
SELECT deptno, ename, sal,
ROW_NUMBER() OVER (PARTITION BY deptno ORDER BY sal DESC) AS rn
FROM emp
) t
WHERE rn = 1
-- MySQL
SELECT deptno, GROUP_CONCAT(ename ORDER BY ename) AS enames
FROM emp
GROUP BY deptno
-- PostgreSQL
SELECT deptno, STRING_AGG(ename, ',' ORDER BY ename) AS enames
FROM emp
GROUP BY deptno
-- SQL Server (2017+)
SELECT deptno, STRING_AGG(ename, ',') WITHIN GROUP (ORDER BY ename) AS enames
FROM emp
GROUP BY deptno
-- Oracle
SELECT deptno, LISTAGG(ename, ',') WITHIN GROUP (ORDER BY ename) AS enames
FROM emp
GROUP BY deptno
SELECT deptno, ename -- 任意取組內一行的 ename (不可預測哪一行)
FROM emp
GROUP BY deptno
**強烈不推薦**:結果不確定,遷移數據庫版本或開啟 `ONLY_FULL_GROUP_BY` 即報錯。
「分組後每組是很多記錄,沒有分組的字段的值可能不同,你選擇字段,你選擇的是哪個呢?」
始終明確:`GROUP BY` 產生的是**組級別**的摘要行,`SELECT` 必須表達「組的屬性」。