SQL经典50题,这套题作的人不少,今天本身也写了一下,互相学习!
引用数据
sql
四张测试表以下:
–1.学生表
Student(Sid,Sname,Sage,Ssex)
–Sid 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别
学习
–2.课程表
Course(Cid,Cname,Tid)
–Cid --课程编号,Cname 课程名称,Tid 教师编号
测试
–3.教师表
Teacher(Tid,Tname)
–Tid 教师编号,Tname 教师姓名
spa
–4.成绩表
SC(Sid,Cid,score)
–Sid 学生编号,Cid 课程编号,score 分数
.net
--建表语句 --学生表 Student create table Student(Sid varchar(10),Sname nvarchar(10),Sage datetime,Ssex nvarchar(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('08' , '王菊' , '1990-01-20' , '女'); --科目表 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 nvarchar(10)); insert into Teacher values('01' , '张三'); insert into Teacher values('02' , '李四'); insert into Teacher values('03' , '王五'); --成绩表 SC 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);
- 查询" 01 “课程比” 02 "课程成绩高的学生的信息及课程分数
--同一个学生科目一有成绩可是科目二无成绩的要注意 select s.*, c.score1, c.score2 from student s join (SELECT a.sid as sid, a.score as score1, if(b.score is null,0,b.score) as score2 from (SELECT sid, cid, score from sc where cid='01') a left join (SELECT sid, cid, score from sc where cid='02') b on a.sid=b.sid where a.score>if(b.score is null,0,b.score)) c on c.sid=s.sid
2 查询同时存在" 01 “课程和” 02 "课程的状况code
SELECT a.sid as sid, a.cid as cid1, a.score as score1, b.cid as cid2, b.score as score2 FROM (SELECT * FROM sc where cid='01') a join (SELECT * FROM sc where cid='02') b on a.sid=b.sid
3 查询存在" 01 “课程但可能不存在” 02 "课程的状况(不存在时显示为 null )blog
SELECT a.sid as sid, a.cid as cid1, a.score as score1, b.cid as cid2, b.score as score2 FROM (SELECT * FROM sc where cid='01') a left join (SELECT * FROM sc where cid='02') b on a.sid=b.sid
4 查询不存在" 01 “课程但存在” 02 "课程的状况排序
--答案1 --利用not in select sid, cid, score FROM sc where cid='02' and sid not in (select sid from sc where cid='01') --答案2 --利用group_concat做为分组后的过滤条件 SELECT * FROM sc group by sid having GROUP_CONCAT(cid) not like '%01%'
5.查询平均成绩大于等于 60 分的同窗的学生编号和学生姓名和平均成绩ci
--由于某些同窗只考了两门,总共科目有三门,总成绩除2或除3的写法是彻底不一样的 --除2 直接使用avg select s.*, a.avg_score as avg_score from student s join (select sid, avg(score) as avg_score from sc group by sid having(avg(score)>60)) a on s.sid=a.sid --除3 总分除以总门数 SELECT s.*, a.avg_score as avg_score FROM student s join (select sid, sum(score)/(select count(1) from course) as avg_score from sc group by sid having sum(score)/(select count(1) from course)>60) a on s.sid=a.sid
6.查询在 SC 表存在成绩的学生信息get
select student.* from sc JOIN student on sc.sid=student.sid group by sid
7.查询全部同窗的学生编号、学生姓名、选课总数、全部课程的总成绩(没成绩的显示为 null )
SELECT s.*, a.count_course, a.sum_score from student s left join (SELECT sid, count(1) as count_course, sum(score) as sum_score FROM sc group by sid) a on s.sid=a.sid
8.查有成绩的学生信息
SELECT s.* from student s join (SELECT sid FROM sc group by sid) a on s.sid=a.sid
9.查询「李」姓老师的数量
SELECT count(1) as num FROM teacher WHERE tname like '李%'
10.查询学过「张三」老师授课的同窗的信息
SELECT st.*, t.tname as teacher from sc s join student st join course c join teacher t on c.tid=t.tid and c.cid=s.cid and s.sid=st.sid where t.tname ='张三'
11.查询没有学全全部课程的同窗的信息
--答案1 --使用group_concat分组拼接课程,注意group_concat无序须要组内排序,还要判断null的状况 SELECT s.*, GROUP_CONCAT(cid) as concat_cid from student s left JOIN sc on s.sid=sc.sid group by s.sid having if(GROUP_CONCAT(cid order by cid) is null,'-1',GROUP_CONCAT(cid order by cid))!=(select GROUP_CONCAT(cid) from course) --答案2 --多表join须要注意null值,若是三科并非语文数学英语,这样写并不合适 SELECT student.* FROM student left join sc on sc.sid=student.sid group by student.sid having count(1)<3
11.查询至少有一门课与学号为" 01 "的同窗所学相同的同窗的信息
--答案1 --使用join结果集要排除学号01 SELECT DISTINCT student.* FROM sc join student on sc.sid=student.sid where sc.sid<>'01' and sc.cid in (SELECT cid FROM sc where sid='01') --答案2 --使用in select * from student where sid in (select sid from sc where sid<>'01' and cid in (select cid from sc where sid='01'))
12.查询和" 01 "号的同窗学习的课程彻底相同的其余同窗的信息
--答案1 --使用group_concat(),注意须要排序 SELECT student,* FROM sc join student on sc.sid=student.sid and sc.sid<>'01' group by sc.sid having GROUP_CONCAT(cid order by cid)= (SELECT GROUP_CONCAT(cid) from sc where sid='01') --使用join有些繁琐,要知足跟01的课程数量与课程名称都同样 SELECT student.* from sc join student on sc.sid=student.sid join (SELECT cid from sc where sid='01' ) a on sc.cid=a.cid and sc.sid<>'01' group by sc.sid having count(1)=(select count(1) from sc where sid='01')
13.查询没学过"张三"老师讲授的任一门课程的学生姓名
--答案1 使用in和not in select sname from student where sid not in (select sid from sc where cid in (select cid from course where tid= (select tid from teacher where tname='张三') ) ) --答案2 --使用join SELECT sname from teacher t join course c on t.tid=c.tid and tname='张三' join sc on c.cid=sc.cid RIGHT JOIN student s on sc.sid=s.sid where sc.sid is null