LONGEPASS
Q9.

資料表Emp 之欄位屬性定義:Empid INTEGER、Name CHAR(20)、Deptno INTEGER、Sal INTEGER;欲表列「部門代號20 及50 的員工平均薪資(Sal)在22,000 元(含)以上」之部門代號(Deptno),最能符合要求之SQL 語法為何?

網頁設計 · 乙級 · 應用軟體安裝及使用 · Q9

難易度分析

3 / 5

本題要求對 SQL 子句的執行順序有精確掌握,需區分原始資料過濾與聚合結果過濾的語法差異。選項中設置了多個關於語法規範的陷阱,考生必須能辨識聚合函數在不同子句中的可用性,方能正確選出最符合標準的寫法。

正確答案:①SELECT Deptno, AVG(Sal) FROM Emp WHERE Deptno IN (20,50) GROUP BY Deptno HAVING AVG(Sal)>=22000

① SELECT Deptno, AVG(Sal) FROM Emp WHERE Deptno IN (20,50) GROUP BY Deptno HAVING AVG(Sal)>=22000:此寫法符合 SQL 執行順序(WHERE → GROUP BY → HAVING),先以 WHERE 子句過濾目標部門,再以 GROUP BY 依部門分組計算平均薪資,最後用 HAVING 子句對聚合函數結果設定條件,為標準且效能最佳的寫法。

錯誤選項解析

  • ② SELECT Deptno, AVG(Sal) FROM Emp GROUP BY Deptno HAVING AVG(Sal)>=22000 AND Deptno IN (20,50):此寫法將部門過濾條件放在 HAVING 子句中,雖然部分資料庫可執行出相同結果,但會先對「全部部門」進行 GROUP BY 分組運算後才過濾,造成不必要的運算資源浪費,不符合最佳化原則。
  • ③ SELECT Deptno, AVG(Sal) FROM Emp WHERE Deptno IN (20,50) AND AVG(Sal)>=22000 GROUP BY Deptno:此寫法在 WHERE 子句中直接使用聚合函數 AVG(Sal),違反 SQL 語法規範,因為 WHERE 在 GROUP BY 之前執行,此時聚合函數尚未產生結果,會導致語法錯誤。
  • ④ SELECT Deptno, AVG(Sal) FROM Emp WHERE Deptno IN (20,50) GROUP BY AVG(Sal) HAVING AVG(Sal)>=22000:此寫法將 GROUP BY 的對象設為聚合函數 AVG(Sal),但 GROUP BY 必須以「資料表欄位名稱」進行分組,不能以聚合函數作為分組依據,會導致語法錯誤。
Learning Tip

"此類題型常考 SQL 子句執行順序:WHERE(資料過濾)→ GROUP BY(分組)→ HAVING(聚合條件過濾)。關鍵陷阱在於混淆 WHERE 與 HAVING 的使用時機:WHERE 用於過濾原始資料列,不可使用聚合函數;HAVING 用於過濾分組後的聚合結果。實務上應優先將可過濾的條件放在 WHERE,以提升查詢效能。"

學員答題分佈

①SELECT Deptno, AVG(Sal) FROM Emp WHERE Deptno IN (20,50) GROUP BY Deptno HAVING AVG(Sal)>=220000%
②SELECT Deptno, AVG(Sal) FROM Emp GROUP BY Deptno HAVING AVG(Sal)>=22000 AND Deptno IN (20,50)0%
③SELECT Deptno, AVG(Sal) FROM Emp WHERE Deptno IN (20,50) AND AVG(Sal)>=22000 GROUP BY Deptno0%
④SELECT Deptno, AVG(Sal) FROM Emp WHERE Deptno IN (20,50) GROUP BY AVG(Sal) HAVING AVG(Sal)>=220000%

此答題分佈是根據學員在 LongePass 模擬考等實際作答紀錄計算而成。與考友分享這道歷屆試題與詳細解析!

相似類型題目