今天看一個mysql教程,看到一個例子,感受裏面的解決方案不是很合理。
問題以下:
有學生表:
成績表:
想要查詢出的效果:
mysql
其實就是原來是一個分數一條記錄,如今變成一個學生一條記錄。
那個教程裏的sql以下:sql
select a.id as 學號, a.name as 姓名, (case when b.kemu='語文' then score else 0 end) as 語文, (case when b.kemu='數學' then score else 0 end) as 數學, (case when b.kemu='英語' then score else 0 end) as 英語 from student a, grade b where a.id = b.id
實現的效果:
很明顯,每一個學生的每一個成績都是單獨一條記錄,那和原來沒有什麼區別嘛。
改進後的sql以下:函數
SELECT s.id, s.name, max(case when g.kemu='語文' then score else 0 end) as 語文, max(case when g.kemu='數學' then score else 0 end) as 數學, max(case when g.kemu='英語' then score else 0 end) as 英語, sum(score) as 總分, avg(score) as 平均分 from student s LEFT JOIN grade g ON s.id = g.s_id GROUP BY s.id
就是使用了聚合函數,效果以下:
是否是比原來的效果好不少了呢spa