一道面试SQL题

逛论坛发现一道SQL面试题,刚开始想了几秒钟竟然没有思路

于是就打开SQLDeveloper给他搞定了。

题目: 

  姓名  科目  成绩
   aa    语文  99
   aa    数学  88
   aa    英语  77
   bb    语文  99
   bb    数学  88
   bb    英语  77
   cc    语文  99
   cc    数学  88
   cc    英语  77


查询结果:
   姓名  语文  数学  英语
   aa     99    88    77
   bb     99    88    77
   cc     99    88    77

写了几种答案,有性能好的也有性能差的。

--使用decode
select 
s.stuname,
sum(decode(s.stuno,'语文',s.fenshu,'0')) ch,
sum(decode(s.stuno,'数学',s.fenshu,'0')) ma,
sum(decode(s.stuno,'英语',s.fenshu,'0')) en
from student s 
group by s.stuname
--使用case when then
select 
stuname,
sum(case stuno when '语文' then fenshu else 0 end ) ch ,
sum(case stuno when '数学' then fenshu else 0 end ) ma ,
sum(case stuno when '英语' then fenshu else 0 end ) en 
from student 
group by stuname ;
--使用子查询
select distinct s.stuname,
(select  fenshu from student where stuname=s.stuname and stuno='语文')"语文",
(select  fenshu from student where stuname=s.stuname and stuno='数学')"数学",
(select  fenshu from student where stuname=s.stuname and stuno='英语')"英语"
from student s order by s.stuname;
--使用连接查询
SELECT DISTINCT a0.stuname,
  a0.fenshu   AS 语文,
  b.fenshu   AS 数学,
  c0.fenshu  AS 英语
FROM student  a0,
  student    b,
  student  c0
WHERE a0.stuno = '语文'
AND b.stuno    = '数学'
AND c0.stuno   = '英语';
突然感觉写sql有两项一定要把握好

1.数据库基本语法和常用的函数一定要熟练

2.逻辑分析能力要多锻炼

你可能感兴趣的:(一道面试SQL题)