经典的SQL面试

有3个表S,C,SC
S(SNO,SNAME)代表(学号,姓名)
C(CNO,CNAME,CTEACHER)代表(课号,课名,教师)
SC(SNO,CNO,SCGRADE)代表(学号,课号成绩)
问题:
1,找出没选过“黎明”老师的所有学生姓名。
2,列出2门以上(含2门)不及格学生姓名及平均成绩。
3,即学过1号课程有学过2号课所有学生的姓名。

 

 

 

--1. 找出没选过“李”老师的所有学生姓名。
SELECT s.Sname FROM Student s WHERE s.SNO NOT IN
(SELECT sc.SNO FROM Stu_Cau sc LEFT JOIN Cause c ON sc.CNO = c.CNO
WHERE c.CTEACHAR = '李'  )
--或
SELECT DISTINCT s.Sname FROM Student s JOIN Stu_Cau sc ON (s.SNO = sc.SNO)
JOIN Cause c ON (c.CNO = sc.CNO) WHERE c.CTEACHAR <> '李'


--2. 列出2门以上(含2门)不及格学生姓名及平均成绩。
SELECT t.av,s.SNAME FROM (
SELECT sc.SNO,AVG(sc.SCGRADE) AS av FROM Stu_Cau sc
WHERE sc.SNO IN
(SELECT SNO FROM Stu_Cau WHERE SCGRADE<60 GROUP BY SNO HAVING COUNT(SNO) >= 2)
GROUP BY sc.SNO  ) AS t
LEFT JOIN Student s ON s.SNO = t.SNO


--3. 既学过1号课程又学过2号课所有学生的姓名。
SELECT s.SNAME FROM Student s WHERE s.SNO IN
(
SELECT a.SNO FROM Stu_Cau a CROSS JOIN Stu_Cau b
WHERE a.SNO = b.SNO AND a.CNO = 1 AND b.CNO = 2
)

 

 

 

简洁的

 

1.
select sname froms
join sc on (s.sno = sc.sno)
join c (c.cno = sc.cno)
where c.cteacher <> 'liming';
2.
select sname
where sno in (
  select sno from sc where scgrade < 60 group by sno having count(*) >= 2);
3.
select sname
where sno in (
   select sno from sc
   where cno = 1 and sno in
   (select sno fromsc where cno = 2)
);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值