MySQL经典四表查询(教师,学生,成绩,课程表)多表查询

DB Fiddle - SQL Database Playground

上面的链接是在线数据库查询,请选择SQL8.0

131-以满足客户需求为准_哔哩哔哩_bilibili

上面是sql学习网站

资源链接:Mysql+JDBC资料:
链接:https://pan.baidu.com/s/18W0ZRYaCR60mQWFP92CJsg
提取码:2you

 SQL99  源自MySQL经典四表查询(教师,学生,成绩,课程表)多表查询_Hank.ll的博客-CSDN博客_学生表成绩表课程表多表查询

SQL92,个人练习的答案!!

  • student(sid,sname,sage,ssex) 学生表 

  • teacher(tid,tname) 教师表

  • course(cid,cname,tid) 课程表 

  • sc(sid,cid,score) 成绩表 

-- 1.学生表
CREATE TABLE student(
sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(20),
sage DATE,
ssex ENUM ('男','女')
);
 
-- 2.课程表中使用了外键教师编号,因而需要先建立教师表
CREATE TABLE teacher(
tid INT PRIMARY KEY AUTO_INCREMENT,
tname VARCHAR(20)
);
 
-- 3.建立课程表
CREATE TABLE course(
cid INT PRIMARY KEY AUTO_INCREMENT,
cname VARCHAR(20),
tid INT,
FOREIGN KEY (tid) REFERENCES teacher (tid)
);
 
-- 4.建立成绩表
CREATE TABLE sc(
sid INT,
cid INT,
score INT
);
 
 
-- 先给student表插入数据
INSERT INTO student VALUES (1,'赵雷','1990-01-01','男'),
	(2,'钱电','1990-12-21','男'),
	(3,'孙风','1990-05-20','男'),
	(4,'李云','1990-08-06','男'),
	(5,'周梅','1991-12-01','女'),
	(6,'吴兰','1992-03-01','女'),
	(7,'郑竹','1989-07-01','女'),
	(8,'王菊','1990-01-20','女');
	
-- 给teacher表插入数据,这里不可以先给course表插入数据,因为course表外键连接到teacher的主键
INSERT INTO teacher VALUES(1,'张三'),(2,'李四'),(3,'王五');
		
--  给course表插入数据
INSERT INTO course VALUES(1,'语文',2),(2,'数学',1),(3,'英语',3);
 
-- 最后给sc表插入数据
INSERT INTO sc VALUES(1,1,90),(1,2,80),(1,3,90),(2,1,70),(2,2,60),(2,3,80),(3,1,80),
(3,2,80),(3,3,80),(4,1,50),(4,2,30),(4,3,20),(5,1,76),(5,2,87),(6,1,31),(6,3,34),(7,2,89),(7,3,98);


(1)查询 1 课程比 2 课程成绩高的学生的信息及课程分数

select *  from student s
join (select s1.sid,s1.score as score1,s2.score as score2 from sc s1 join sc s2 
on s1.sid=s2.sid
where s1.cid=1 and s2.cid=2 and s1.score>s2.score)t on
s.sid=t.sid;

sid    sname    sage    ssex    sid    score1    score2
1    赵雷    1990-01-01    男    1           90      80
2    钱电    1990-12-21    男    2           70      60
4    李云    1990-08-06    男    4           50      30

(2)查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩

select s.sid,s.sname,t.avgscore 
from student s
join 
(select sid,avg(score) avgscore from sc group by sid having avgscore>=60)t 
on s.sid=t.sid;

sid    sname    avgscore
1    赵雷            86.6667
2    钱电            70.0000
3    孙风            80.0000
5    周梅            81.5000
7    郑竹            93.5000

 (3)查询名字中含有"风"字的学生信息

select * from student where sname like '%风%';

   sid    sname    sage        ssex
    3    孙风    1990-05-20    男

(4)查询课程名称为"数学",且分数低于60的学生姓名和分数
 

select s.sname,t.score
 from student s 
join (select sc.score,sid  
from sc,(select cid,cname from course where cname='数学') t 
where sc.cid=t.cid and sc.score<60)t 
on s.sid=t.sid;

 sname    score
李云    30


(5)查询所有学生的课程及分数情况
 

select s.sname, c.cid,c.cname,sc.score from
 student s left join sc 
on s.sid=sc.sid left join course c 
on c.cid=sc.cid order by cid;

 sname    cid    cname    score
王菊    null    null    null
赵雷    1    语文    90
吴兰    1    语文    31
钱电    1    语文    70
周梅    1    语文    76
孙风    1    语文    80
李云    1    语文    50
赵雷    2    数学    80
郑竹    2    数学    89
周梅    2    数学    87
李云    2    数学    30
孙风    2    数学    80
钱电    2    数学    60
李云    3    英语    20
孙风    3    英语    80
吴兰    3    英语    34
郑竹    3    英语    98
钱电    3    英语    80
赵雷    3    英语    90

(6)查询没学过"张三"老师授课的同学的信息
 

 select * from student 
where sid not in(select sid from sc 
where cid=
(select cid from course where tid=(select tid from teacher where tname='张三')))

 sid    sname    sage        ssex
6    吴兰    1992-03-01    女
8    王菊    1990-01-20    女

(7)查询学过编号为 1 并且也学过编号为 2 的课程的同学的信息
 

select s.* from student s join 
(select s1.sid from sc s1 join sc s2 
on s1.sid=s2.sid
where s1.cid=1 and s2.cid=2)t
on s.sid=t.sid;

 sid    sname    sage        ssex
1    赵雷    1990-01-01    男
2    钱电    1990-12-21    男
3    孙风    1990-05-20    男
4    李云    1990-08-06    男
5    周梅    1991-12-01    女


(8)查询学过编号为 1 但是没有学过编号为 2 的课程的同学的信息
 

select * from student 
where sid=(select sid from sc 
where sid not in(select sid from sc where cid =2) 
and cid =1);

 sid    sname    sage        ssex
6    吴兰    1992-03-01    女


(10)查询没有学全所有课程的同学的信息
 

select student.* from student join (select sid,count(cid) countcid 
from sc 
group by sid 
having countcid<(select count(cid) from course))t 
on student.sid=t.sid;

改进的SQL语句 

(select student.* from student join 
(select sid,count(cid) countcid 
from sc 
group by  sid
having countcid<(select count(cid) from course))t 
on student.sid=t.sid )
UNION(select * from student where sid not in(select sid from sc))

 

 sid    sname    sage        ssex
5    周梅    1991-12-01    女
6    吴兰    1992-03-01    女
7    郑竹    1989-07-01    女

(11)查询至少有一门课与学号为"1"的同学所学相同的同学的信息
 

select * from student 
where sid
in(select sid from sc where cid 
in(select cid from sc where sid=1) group by sid) 
and sid<>1;

 sid    sname    sage        ssex
2    钱电    1990-12-21    男
3    孙风    1990-05-20    男
4    李云    1990-08-06    男
5    周梅    1991-12-01    女
6    吴兰    1992-03-01    女
7    郑竹    1989-07-01    女

(12)查询和"1"号的同学学习的课程完全相同的其他同学的信息
 

select s.* from student s
join (select sid,count(cid) c from sc group by sid 
having c =(select count(cid) from sc where sid=1)) t
on s.sid=t.sid where s.sid<>1;

 sid    sname    sage        ssex
2    钱电    1990-12-21    男
3    孙风    1990-05-20    男
4    李云    1990-08-06    男

(13)查询没学过"张三"老师讲授的任一门课程的学生信息

select s.* 
from student s 
where sid not in(select sid from sc 
where cid=(select cid from course 
where tid=(select tid from teacher where tname='张三' )));

 sid    sname    sage        ssex
6    吴兰    1992-03-01    女
8    王菊    1990-01-20    女


(14)查询任何一门课程成绩在70分以上的姓名、课程名称和分数

select s.sname,sc.*  
from student s 
join sc on s.sid=sc.sid 
where sc.score>70;

 sname    sid    cid    score
赵雷    1    1    90
赵雷    1    2    80
赵雷    1    3    90
钱电    2    3    80
孙风    3    1    80
孙风    3    2    80
孙风    3    3    80
周梅    5    1    76
周梅    5    2    87
郑竹    7    2    89
郑竹    7    3    98

 15)查询1990年出生的学生信息(注:student表中sage列的类型是datetime)

select * from student where sage like '1990-%';

sidsnamesagessex
1赵雷1990-01-01
2钱电1990-12-21
3孙风1990-05-20
4李云1990-08-06
8王菊1990-01-20

 (16)查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列

select avg(score) as avgscore,cid from sc group by cid
order by avgscore  desc ,cid asc ;

avgscorecid
71.00002
67.00003
66.16671

 (17)查询任何一门课程成绩在70分以上的姓名、课程名称和分数

select s.sname,t.cid,t.score from student s
join (select * from sc where score>70)t on s.sid=t.sid;
snamecidscore
赵雷190
赵雷280
赵雷390
钱电380
孙风180
孙风280
孙风380
周梅176
周梅287
郑竹289
郑竹398

(18)查询平均成绩大于等于85的所有学生的学号、姓名和平均成绩,并按照平均成绩降序排列 

select s.sid,s.sname,t.avgscore 
from student s 
join (select sid,avg(score) as avgscore
      from sc group by sid having avg(score)>=85 )t 
on s.sid=t.sid order by avgscore desc;

sidsnameavgscore
7郑竹93.5000
1赵雷86.6667

 (21)求每门课程的学生人数

select cid ,count(sid) from sc group by cid;
cidcount(sid)
16
26
36

 (23)查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩

select a1.*,a2.cid,a2.score  from sc a1 join sc a2 on a1.sid=a2.sid
where a1.score=a2.score and a1.cid<>a2.cid order by a1.score;

sidcidscorecidscore
3380180
3280180
3380280
3180280
3280380
3180380
1390190
1190390

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值