資料庫基礎
想從員工表格(員工編號, 部門, 薪資)中,求出各部門平均薪資在300以上的部門及其平均薪資。正確的SQL敘述是下列何者?
- ASELECT 部門, AVG(薪資) FROM 員工 GROUP BY 部門 HAVING AVG(薪資) >= 300
- BSELECT 部門, AVG(薪資) FROM 員工 WHERE AVG(薪資) >= 300 GROUP BY 部門
- CSELECT 部門, AVG(薪資) FROM 員工 WHERE 薪資 >= 300 GROUP BY 部門
查看答案與解析
正確答案:A. SELECT 部門, AVG(薪資) FROM 員工 GROUP BY 部門 HAVING AVG(薪資) >= 300
SQL的處理可依下列順序思考:以WHERE從FROM的表格中選出資料列,以GROUP BY分組,再以HAVING選出群組。WHERE是針對每一筆資料列的條件,在分組之前評估,因此不能寫AVG之類的聚合函數。針對各群組彙總結果的條件要寫在HAVING,因此 HAVING AVG(薪資) >= 300 才是正確寫法。若寫成 WHERE 薪資 >= 300,會先只選出薪資在300以上的員工再求平均,意思變成「只計算薪資300以上員工的平均」,即使部門整體的平均薪資未滿300,只要有一位員工薪資在300以上,該部門也會出現在結果中。
- A. 正確。針對各群組彙總結果的條件要寫在HAVING子句。
- B. WHERE子句中不能寫聚合函數,因此這個敘述會產生錯誤。
- C. 只以薪資300以上的員工求平均,因此部門整體平均未滿300的部門也會出現在結果中。