我们仍然使用那四张表来做题。四个题目安排如下:
查询「李」姓老师的数量
查询学过「张三」老师授课的同学的信息
查询没有学全所有课程的同学的信息
查询至少有一门课与学号为" 01 "的同学所学相同的同学的信息
我们来解答这些习题:
第一题:
select '李姓老师',count(tid) as numfrom Teacherwhere tname like '李%';
第一题非常简单:只需要使用通配符就可以了(%表示匹配多个字符,_表示匹配一个字符)
结果如下:

第二题:
select S.sid,S.sname,S.ssex,S.sagefrom Student Sinner join SC using(sid)inner join Course Ce using(cid)inner join Teacher Te using(tid)where Te.tname='张三';
结果如下:

我们还可以通过视图的方式来简化查询:
-- 建立视图create view view2 asselect * from Course Ce inner join Teacher Te using(tid);-- 查询select S.sid,S.sname,S.ssex,S.sagefrom Student Sinner join SC using(sid)inner join view2 using(cid)where view2.tname='张三';
第三题:
select sid,sname,ssex,sage from(select S.sid,S.Sname,S.ssex,S.sage,Count(SC.cid) as numfrom Student S left join SC using(sid)group by S.sid,S.sname,S.sage,S.ssexorder by sid)as aawhere num<(select count(cid) from Course);
结果如下:

我们还可以有第二种写法:
-- 建立一个视图create view view3 asselect sid,count(cid) as num from SC group by sid having count(cid)<(select count(cid) from Course);-- 查询结果select * from Student where sid not in (select sid from SC)unionselect * from Student where sid in (select sid from view3)order by sid;
第四题:
select distinct sid,sname,ssex,sage from Studentinner join SC using(sid)where cid in (select cid from SC where sid='01')and sid !='01'order by sid;
结果如下:

在有些数据库中,我们还可以采用如下的写法:
select distinct sid,sname,ssex,sage from Studentinner join SC using(sid)where cid in (select cid from SC where sid='01')except select sid,sname,ssex,sage from Student inner join SC using(sid) where sid='01'order by sid;
文章转载自小辉数据分析,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




