MySQL 50题解析

Link: https://zhuanlan.zhihu.com/p/32137597

 

create table Student(SId varchar(10),Sname varchar(10),Sage datetime,Ssex varchar(10));
insert into Student values('01' , '赵雷' , '1990-01-01' , '');
insert into Student values('02' , '钱电' , '1990-12-21' , '');
insert into Student values('03' , '孙风' , '1990-05-20' , '');
insert into Student values('04' , '李云' , '1990-08-06' , '');
insert into Student values('05' , '周梅' , '1991-12-01' , '');
insert into Student values('06' , '吴兰' , '1992-03-01' , '');
insert into Student values('07' , '郑竹' , '1989-07-01' , '');
insert into Student values('09' , '张三' , '2017-12-20' , '');
insert into Student values('10' , '李四' , '2017-12-25' , '');
insert into Student values('11' , '李四' , '2017-12-30' , '');
insert into Student values('12' , '赵六' , '2017-01-01' , '');
insert into Student values('13' , '孙七' , '2018-01-01' , '');


create table Course(CId varchar(10),Cname nvarchar(10),TId varchar(10));
insert into Course values('01' , '语文' , '02');
insert into Course values('02' , '数学' , '01');
insert into Course values('03' , '英语' , '03');


create table Teacher(TId varchar(10),Tname varchar(10));
insert into Teacher values('01' , '张三');
insert into Teacher values('02' , '李四');
insert into Teacher values('03' , '王五');


create table SC(SId varchar(10),CId varchar(10),score decimal(18,1));
insert into SC values('01' , '01' , 80);
insert into SC values('01' , '02' , 90);
insert into SC values('01' , '03' , 99);
insert into SC values('02' , '01' , 70);
insert into SC values('02' , '02' , 60);
insert into SC values('02' , '03' , 80);
insert into SC values('03' , '01' , 80);
insert into SC values('03' , '02' , 80);
insert into SC values('03' , '03' , 80);
insert into SC values('04' , '01' , 50);
insert into SC values('04' , '02' , 30);
insert into SC values('04' , '03' , 20);
insert into SC values('05' , '01' , 76);
insert into SC values('05' , '02' , 87);
insert into SC values('06' , '01' , 31);
insert into SC values('06' , '03' , 34);
insert into SC values('07' , '02' , 89);
insert into SC values('07' , '03' , 98);

 

1. 查询" 01 "课程比" 02 "课程成绩高的学生的信息及课程分数

首先找到所有选修01课程和02课程的学生:

select sid, score from sc where sc.cid='01' as t1

select sid, score from sc where sc.cid='02' as t2

然后在从两个表里找到,sid相同(说明是同一个学生),并且t1的分比t2高的

select * from t1,t2 where t1.sid=t2.sid and t1.score>t2.score



select * 
from (select sid, score from sc where sc.cid='01') as t1,
(select sid, score from sc where sc.cid='02') as t2 
where t1.sid=t2.sid 
and t1.score>t2.score;
View Code

1.1 查询同时存在" 01 "课程和" 02 "课程的学生情况

select * from 选修01的学生 as t1,修02的学生 as t2 where t1.sid==t2.sid
select * 
from (select sid from sc where sc.cid='01') as t1,
(select sid from sc where sc.cid='02') as t2
where t1.sid=t2.sid;
View Code

1.2 查询存在" 01 "课程但可能不存在" 02 "课程的情况(不存在时显示为 null)

这个显然就是left join 的情况了

select * 
from (select sid from sc where sc.cid='01') as t1
left join (select sid from sc where sc.cid='02') as t2
on t1.sid=t2.sid;
View Code

1.3 查询不存在" 01 "课程但存在" 02 "课程的情况

如果直接用right join的特殊情况,会出现null

select *
from sc
where sc.sid not in (select sid from sc where sc.cid='01')
and sc.cid='02';
View Code

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

1. 首先求出每个人的平均分
select sc.sid, avg(sc.score) as av
from sc
group by sc.sid;

2. 选出平均分大于60分的人
select sc.sid, avg(sc.score) as av
from sc
group by sc.sid
having avg(sc.score)>=60;

3. 和student表联立,得到平均分大于等于60分的同学信息
select student.*, t1.av 
from student 
inner join
(select sc.sid, avg(sc.score) as av
from sc
group by sc.sid
having avg(sc.score)>=60) as t1
on student.sid=t1.sid;
View Code

3. 查询在 SC 表存在成绩的学生信息

1. 找出同时存在于两个表中的sid

select student.*
from student,sc
where student.sid=sc.sid;

2.过滤到相同的学生
select distinct student.*
from student,sc
where student.sid=sc.sid;
View Code

4.查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩(没成绩不显示)

1. 求出学生总分和选修课数目
select sc.sid,sum(sc.score) as sumscore,count(sc.cid) as countscore
from sc
group by sc.sid

2.
select student.sid, student.sname, t1.sumscore, t1.countscore
from student,(
select sc.sid,sum(sc.score) as sumscore,count(sc.cid) as countscore
from sc
group by sc.sid
) as t1
where student.sid=t1.sid;
View Code

5. 查询「李」姓老师的数量

select count(*)
from teacher
where teacher.tname like '李%';
View Code

6. 查询学过「张三」老师授课的同学的信息

1. 张三老师授过的课
select teacher.tname, course.cname
from course, teacher
where course.tid=teacher.tid
and teacher.tname='张三';

2.上过张三老师的课同学的信息

select student.*,course.cname, teacher.tname
from student, course, teacher,sc
where sc.sid=student.sid
and sc.cid=course.cid
and course.tid=teacher.tid
and teacher.tname='张三';
View Code

7. 查询没有学全所有课程的同学的信息

选完所有课程需要多少
select count(*) from course

select student.*
from sc ,student
where sc.SId=student.SId
GROUP BY sc.SId;
View Code

8. 查询至少有一门课与学号为" 01 "的同学所学相同的同学的信息

select distinct student.*
from student,sc 
where sc.cid in (select cid from sc where sc.cid='01')
and student.sid=sc.sid
View Code

9.查询和" 01 "号的同学学习的课程完全相同的其他同学的信息

 

10.查询没学过"张三"老师讲授的任一门课程的学生姓名

 

11.查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩

 

12. 检索" 01 "课程分数小于 60,按分数降序排列的学生信息

select student.sname, sc.score
from student, sc
where student.sid=sc.sid
and sc.score<60
and sc.cid='01'
order by sc.score desc
View Code

 

posted @ 2019-07-19 08:06  miao_a_miao  阅读(419)  评论(0编辑  收藏  举报