SELECT empfname, empsalary
FROM qemp
WHERE empsalary < (SELECT 0.90 * AVG(empsalary) FROM qemp);
直接改寫為:
SELECT empfname, empsalary
FROM qemp
GROUP BY empsalary
HAVING empsalary > 90 * AVG(empsalary);
錯誤原因:
GROUP BY empsalary 會將相同薪資分組,但 empfname 未出現在 GROUP BY 且非聚合函數,違反 SQL 標準(MySQL ONLY_FULL_GROUP_BY 模式下報錯)。HAVING 子句中 AVG(empsalary) 是組內平均,而非全表平均,語意不同。原查詢為「薪資低於全表平均 90% 的員工」,無需 GROUP BY,子查詢已是最佳寫法。若強制用 HAVING,需先計算全表平均:
SELECT empfname, empsalary
FROM qemp
CROSS JOIN (SELECT AVG(empsalary) * 0.9 AS threshold FROM qemp) t
WHERE empsalary < t.threshold;
GROUP BY dept HAVING AVG(sal) > 5000。結論:並非所有子查詢都應改寫為 GROUP BY HAVING,應根據業務語意選擇最直觀、可維護的寫法。