SQL 50题

SQL 50题

--Q1,Q2
select st.* ,sc.s_score as s1,sc2.s_score as s2
from student st
left join score sc on sc.s_id =st.s_id  and sc.c_id ="01"
left join score sc2 on sc2.s_id =st.s_id  and sc2.c_id ="02"
where s1>s2

--Q3
SELECT s.s_id,s.s_name,AVG(sc.s_score) 
from student s
left join score sc on sc.s_id =s.s_id
group by s.s_id 
having AVG(sc.s_score) >60

--Q4
SELECT s.s_id,s.s_name,AVG(sc.s_score) 
from student s
left join score sc on sc.s_id =s.s_id
group by s.s_id 
having AVG(sc.s_score) <60 or AVG(sc.s_score) is NULL 

--Q5
SELECT s2.s_id ,s2.s_name ,count(s.c_id ),SUM(s.s_score )
from student s2 left join Score s 
on s2.s_id =s.s_id 
group by s2.s_id 

--Q6
SELECT count(t2.t_id )
from Teacher t2 
group by t2.t_id 
having t2.t_name LIKE "李%"

--Q7 
select *
from student s 
where s.s_id in(
select DISTINCT s_id from Score s2 
where c_id in(
select  c_id from Course c2 ,Teacher t 
where c2.t_id =t.t_id and t.t_name like "张三")
)

SELECT s.s_id ,s.s_birth ,s.s_name ,s.s_sex 
from student s 
join score sc on s.s_id =sc.s_id 
join Course c on sc.c_id =c.c_id 
join Teacher t on c.t_id =t.t_id 
where t.t_name like "张三"

--Q8
SELECT *
from student s 
where s.s_id  not in (
SELECT s2.s_id 
from Score s2,Course c ,Teacher t 
where s2.c_id =c.c_id and c.t_id =t.t_id and t.t_name like "张三"
)

--Q9 还可以一口气写一起然后where,但不规范就算了。
select s.*
from (student s
inner join score sc on s.s_id =sc.s_id 
)
inner join score sc2 on s.s_id=sc2.s_id 
where sc.c_id ="01" and sc2.c_id ="02"

--Q10
SELECT s.*
from student s,Score  sc 
where s.s_id =sc.s_id and sc.c_id ="01" and s.s_id not in (
SELECT s2.s_id from Score s2 where s2.c_id ="02")

--Q11
SELECT s.*
from student s
where s.s_id in(
SELECT s2.s_id 
from Score s2 group by s2.s_id having COUNT(s2.c_id ) <3)

--Q12
SELECT DISTINCT s.*
from student s,Score s2 
where s.s_id=s2.s_id  and s2.c_id in (
SELECT s3.c_id 
from Score s3 where s3.s_id ="01")

--Q13
SELECT s2.*
from student s2
left join Score sc on s2.s_id =sc.s_id 
group by s2.s_id 
having group_concat(sc.c_id )=
( SELECT group_concat(sc2.c_id) from student s3 
left join score sc2 on sc2.s_id =s3.s_id 
where s3.s_id ="01"
) and s2.s_id !="01"

PART2

14.用一下EXISTS

--Q14
select s.s_name 
from student s 
where not EXISTS (
select s2.s_id 
from score s2, Course c2 ,Teacher t 
where s2.c_id =c2.c_id  and c2.t_id =t.t_id and t.t_name ="张三" and s2.s_id =s.s_id )

15\16.用round()统一小数,结果会好看点

--Q15
SELECT s2.s_id ,s2.s_name ,round(AVG(s.s_score ) ,2)
from student s2 ,Score s 
where s.s_score <60 and s2.s_id =s.s_id 
group by s2.s_id 
HAVING count(*) >=2

--Q16
SELECT s2.*, s.s_score
from student s2 ,Score s 
where s.s_id =s2.s_id and s.c_id ="01" and s.s_score <60
order by s.s_score desc
  1. 我觉得这个算简单的写法了吧,先把三个课程分列,然后用max()合并行,最后加上平均值。其实我就是想用case when 了…
    在这里插入图片描述在这里插入图片描述
--Q17
select t1.s_name ,max(t1.C1),max(t1.C2),max(t1.C3),avg(s3.s_score )
from
(select s2.s_id ,s2.s_name,
case when s1.c_id ="01" then s1.s_score end as C1, 
case when s1.c_id ="02" then s1.s_score end as C2,
case when s1.c_id ="03" then s1.s_score end as C3
from student s2 , Score s1
where s1.s_id =s2.s_id )t1,score s3
where s3.s_id =t1.s_id
group by t1.s_name
ORDER by t1.s_id  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值