原文地址,優先更新https://hhe0.github.iomysql
- 咱們在上一節簡單介紹了
Mysql
中group by
關鍵字的用法,沒有看過的同窗點擊這裏瞭解一下;- 文中提到的
courses
表和相關記錄能夠在上一篇文章中自取;- 給出的全部
sql
僅供參考,不必定是效率最高的解法,若是你們有其餘的方法,也歡迎提供出來,一塊兒討論。
全部的課程git
咱們的第一反應是可使用distinct
關鍵字實現github
SELECT DISTINCT(`class`) FROM `courses`;!
執行的結果以下:
sql
事實上,咱們一樣可使用group by
來實現code
SELECT `class` FROM `courses` GROUP BY `class`;
結果與上面相同。所以,咱們能夠發現group by
的一個重要的做用就是枚舉出全部知足group by
條件的組合,間接達到了去重的效果。blog
全部的學生對應修讀的課程排序
SELECT `student`,`class` FROM `courses` GROUP BY `student`, `class`;
執行的結果以下
ip
每門課程的排名表get
對應的sql
爲:it
SELECT `class`, `student`, `score` FROM `courses` ORDER BY `class`, `score` DESC;
執行的結果以下:
參考每門課的最高分選擇課表明
對應的sql
爲
SELECT `c`.`class`, `c`.`student`, `c`.`score` FROM ( SELECT `class`, MAX(`score`) AS `score` FROM `courses` GROUP BY `class` )`T` INNER JOIN `courses` `c` ON `T`.`class` = `c`.`class` AND `T`.`score` = `c`.`score`;
執行結果以下
爲每門課的前三名頒獎
咱們容易寫出這樣的一個sql
SELECT `class`, `student` FROM `courses` GROUP BY `class`, `student` ORDER BY `class`, `score` LIMIT 3;
很顯然,這並非咱們想要的結果,至於爲何結果是這個樣子的,你們能夠參考上面的order by
,這裏再也不贅述。
正確的sql
爲
SELECT `c1`.`class`, `c1`.`student`, `c1`.`score` FROM `courses` `c1` INNER JOIN `courses` `c2` ON `c1`.`class` = `c2`.`class` AND `c1`.`student` <> `c2`.`student` AND `c1`.`score` > `c2`.`score` GROUP BY `c1`.`class`, `c1`.`student` ORDER BY `c1`.`class`, `c1`.`score` DESC;
再提供一種通用的解法
SELECT `c1`.`class`, `c1`.`student`, `c1`.`score` FROM `courses` `c1` INNER JOIN `courses` `c2` ON `c1`.`class` = `c2`.`class` AND `c1`.`score` <= `c2`.`score` GROUP BY `c1`.`class`, `c1`.`student` HAVING COUNT(*) <= 3 ORDER BY `c1`.`class`, `c1`.`score` DESC;
上述兩個sql
執行的結果均爲
兩個sql
中爲何一個條件是c1.score>c2.score
而另外一個是c1.score<=c2.score
,以及count(*)<=3
而不是count(*)<3
,能夠細細體會下。
瞭解每一個學生最擅長的科目和最不擅長的科目
對應的sql
爲
SELECT `T`.`student`, `c`.`class` AS `best_class`, `T`.`max_score` AS `max_score`, `c2`.`class` AS `worst_class`, `T`.`min_score` FROM ( SELECT `student`, MAX(`score`) AS `max_score`, MIN(`score`) AS `min_score` FROM `courses` GROUP BY `student` ) `T` INNER JOIN `courses` `c` ON `T`.`student` = `c`.`student` AND `c`.`score` = `T`.`max_score` INNER JOIN `courses` `c2` ON `T`.`student` = `c2`.`student` AND `c2`.`score` = `T`.`min_score`;
執行的結果以下
找到各個分數:Math>Chinese>English>History的同窗
對應的sql
爲
SELECT `c1`.`student`, `c1`.`class`, `c1`.`score`, `c2`.`class`, `c2`.`score`, `c3`.`class`, `c3`.`score`, `c4`.`class`, `c4`.`score` FROM `courses` `c1` INNER JOIN `courses` `c2` ON `c1`.`student` = `c2`.`student` AND `c2`.`class` = 'Chinese' INNER JOIN `courses` `c3` ON `c1`.`student` = `c3`.`student` AND `c3`.`class` = 'English' INNER JOIN `courses` `c4` ON `c1`.`student` = `c4`.`student` AND `c4`.`class` = 'History' WHERE `c1`.`class` = 'Math' AND `c1`.`score` > `c2`.`score` AND `c2`.`score` > `c3`.`score` AND `c3`.`score` > `c4`.`score`;
執行的結果爲