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-12-20','男');
insert into Student values('04','李云','1990-12-06','男');
insert into Student values('05','周梅','1991-12-01','女');
insert into Student values('06','吴兰','1992-01-01','女');
insert into Student values('07','郑竹','1989-01-01','女');
insert into Student values('09','张三','2017-12-20','女');
insert into Student values('10','李四','2017-12-25','女');
insert into Student values('11','李四','2012-06-06','女');
insert into Student values('12','赵六','2013-06-13','女');
insert into Student values('13','孙七','2014-06-01','女');
course表
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');
teacher表
create table Teacher(TId varchar(10),Tname varchar(10));
insert into Teacher values('01','张三');
insert into Teacher values('02','李四');
insert into Teacher values('03','王五');
scores表
create table Scores(SId varchar(10),CId varchar(10),score decimal(18,1));
insert into Scores values('01','01',80);
insert into Scores values('01','02',90);
insert into Scores values('01','03',99);
insert into Scores values('02','01',70);
insert into Scores values('02','02',60);
insert into Scores values('02','03',80);
insert into Scores values('03','01',80);
insert into Scores values('03','02',80);
insert into Scores values('03','03',80);
insert into Scores values('04','01',50);
insert into Scores values('04','02',30);
insert into Scores values('04','03',20);
insert into Scores values('05','01',76);
insert into Scores values('05','02',87);
insert into Scores values('06','01',31);
insert into Scores values('06','03',34);
insert into Scores values('07','02',89);
insert into Scores values('07','03',98);
SELECT S.SID AS ID , S.SNAME AS NAME ,TEM.CLASS1 AS CLASS1,TEM.CLASS2 AS CLASS2 FROM student AS S RIGHT JOIN
(SELECT T1.SID AS ID,T1.SCORE AS CLASS1,T2.SCORE AS CLASS2 FROM
(SELECT * FROM scores WHERE CID =01)T1,
(SELECT * FROM scores WHERE CID =02)T2
WHERE T1.SID=T2.SID AND T1.SCORE > T2.SCORE
)TEM ON TEM.ID = S.SID
2.查询同时存在" 01 “课程和” 02 "课程的情况
思路:首先筛选课程为01,02的信息,为T1,T2。
将两表sid相同的数据提取出来
SELECT * FROM (
(SELECT * from scores WHERE scores.CId=01) T1,
(SELECT * from scores WHERE scores.CId=02) T2
) WHERE t1.sid =T2.sid
3.查询存在" 01 “课程但可能不存在” 02 "课程的情况(不存在时显示为 null )
思路:用到join方法就会出现null
SELECT * FROM
(SELECT * from scores WHERE scores.CId=01 )T1
LEFT JOIN
(SELECT * from scores WHERE scores.CId=02) T2
ON T1.SID = T2.SID
4.查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩
思路:使用groupby方法,AVG函数求平均值,再用join方法
SELECT S.SID, S.SNAME,TEM.avg_score FROM
(SELECT SID,AVG(SCORE) as avg_score from scores GROUP BY SId HAVING avg_score >60)TEM
LEFT JOIN student S ON S.SID =TEM.SID
5.查询至少有一门课与学号为" 01 "的同学所学相同的同学的信息
思路:查询01学生报的课程ID,查询所有的学生有课程IN第一步结果,查询学生的所有信息
select * from student
where student.sid in (
select sc.sid from sc
where sc.cid in(
select sc.cid from sc
where sc.sid = '01'
)
)
6.查询学过「张三」老师授课的同学的信息
SELECT * from student where student.SId in(
SELECT sid from scores WHERE scores.SId in (
select sid from scores WHERE scores.CId =02)).
7.查询和" 01 "号的同学学习的课程完全相同的其他同学的信息
-- 得到学生信息
SELECT * from student where sid in(
-- 课程和01完全相同的学生
select sid from scores where sid not in
-- 课程不包含在01的课程里面的学生号码
(select sid from scores where sid !=01 and cid not in
-- 01的所有课程号码
(select cid from scores where sid='01'))) a
-- 按照sid分组
group by sid
-- 课程总数和01学生相同的总数筛选
HAVING count(*)=(select count(*) from scores where sid='01')
-- 排除掉01自己
and sid !=01