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','女');
mesa de curso
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');
mesa do professor
create table Teacher(TId varchar(10),Tname varchar(10));
insert into Teacher values('01','张三');
insert into Teacher values('02','李四');
insert into Teacher values('03','王五');
tabela de pontuação
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);
Questões práticas
1. Consulte as informações e as notas dos alunos com notas mais altas no curso "01" do que no curso "02"
Idéia: Primeiro filtre as informações do curso 01, 02, como T1, T2.
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. Consulte a situação de que o curso "01" e o curso "02" existem ao mesmo tempo
Idéia: Primeiro filtre as informações do curso 01, 02, como 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. Consulte a situação de que o curso "01" existe, mas pode não existir o curso "02" (será exibido como nulo se não existir)
Idéia: null aparecerá quando o método de junção for usado
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. Consulte o número do aluno e o nome do aluno e a pontuação média dos alunos cuja pontuação média é maior ou igual a 60 pontos
Ideia: use o método de agrupamento, a função AVG para calcular a média e, em seguida, use o método de associação
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. Consulte as informações de pelo menos uma turma que seja a mesma do aluno cuja carteira de estudante é "01"
Idéia: Consultar o ID do curso do relatório de 01 aluno, consultar todos os alunos que possuem resultado da primeira etapa do curso IN, consultar todas as informações do aluno
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. Consulte as informações dos alunos que estudaram o professor "Zhang San"
SELECT * from student where student.SId in(
SELECT sid from scores WHERE scores.SId in (
select sid from scores WHERE scores.CId =02)).
7. Consultar as informações de outros alunos que estão cursando os mesmos cursos que os alunos com "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