Sql语句的练习合集

表格创建

student表

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);

练习题

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

思路:首先筛选课程为01,02的信息,为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.查询同时存在" 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

猜你喜欢

转载自blog.csdn.net/weixin_44429965/article/details/107327521