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 模擬考等實際作答紀錄計算而成。與考友分享這道歷屆試題與詳細解析!
相似類型題目
某企業(Emp)有數十個部門(Dept_name),每個部門有數百人,吳總經理欲知道:「除了部門主管(Is_dept_manager)之外,平均薪資(Salary)在50,000 元(含)以上的部門有那些?」,最能符合上述要求之SQL 語法為何?
資料表Staff 之欄位屬性定義:Id INTEGER、Name CHAR(20)、Dept INTEGER、Job CHAR(20)、Years INTEGER、 Salary DECIMAL(10, 2)、Comm DECIMAL(10,2) ;欲表列「至少有一個員工的酬金(Comm)在5,000元以上」之部門編號及員工總數,最能符合要求之SQL 語法為何?
SQL 語法包含:(A)SELECT、(B)GROUP BY、(C)WHERE、(D)HAVING、(E)ORDER BY、(F)FROM 等子句之正確順序為何?
SQL 語法『SELECT COUNT(*) FROM Books』之意義為何?
欲從資料表中刪除特定條件的紀錄,需搭配那些SQL 指令及關鍵字方能正確完成?