Coleção de exercícios de instrução SQL

Criação de formulário

mesa do aluno

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.

	 将T1,T2按学号SID连接,并筛选出01课程分数大于02课程分数的学生,得到TEM
 	 **将TEM和student进行JOIN,以TEM为主,不然会出现NULL**
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

Acho que você gosta

Origin blog.csdn.net/weixin_44429965/article/details/107327521
Recomendado
Clasificación