GROUP BY 的內在細節展示!!
(重點:group by 分組后會生成一張虛擬表,having判斷的就是虛擬表,但是查詢陳述句執行完后顯示的是分組后每組的第一個值!!)
students表,從左到右每列依次是學號、課程號、分數,

- 查詢各科最高分同學的sno、cno和degree列!
錯誤答案:
SELECT *
FROM scores
GROUP BY cno
HAVING degree=MAX(degree);
結果如下:

決議:答案錯誤的原因就在于GROUP BY,按照課程號分組后,其實生成是一張虛擬的表,如果單獨執行 SELECT *FROM scores GROUP BY cno 時,結果是:
這里把按照學科分組后的,第一個值拿出來展示,再加上HAVING degree=MAX(degree),這里having 里判斷出的最大值是從學科分組后的虛擬表中(虛擬表中展示全部資料)找到每科的最大值,比如3-105學科的最大值為92,所以再執行一整句時92>64,所以1-105科目經過SELECT *FROM scores GROUP BY cno篩選出來的值64會被去掉,所以執行SELECT * FROM scores GROUP BY cno HAVING degree=MAX(degree)一整句時結果只有三條,科目3-105的值被抹去!!
正確答案:
SELECT * FROM
(SELECT * FROM scores ORDER BY degree DESC)t
GROUP BY t.cno
結果如下:

決議:這里是先按照成績降序排序,然后再按照科目分組篩選出來!!這樣做的原因是SQL執行時先執行GROUP BY 后執行ORDER BY(上一篇博客中有說),為了先執行ORDER BY所以運用子查詢!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/13011.html
標籤:其他
