今天看一個mysql教程,看到一個例子,感覺里面的解決方案不是很合理。
問題如下:
有學生表:
成績表:
想要查詢出的效果:
其實就是原來是一個分數一條記錄,現在變成一個學生一條記錄。
那個教程里的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
就是使用了聚合函數,效果如下:
是不是比原來的效果好很多了呢