数据分析-SQL练习

参看链接:

2.https://blog.csdn.net/m0_37636884/article/details/82222891(SQL 常见面试题)

3.https://bbs.csdn.net/topics/392337114(难度高)

4.https://blog.csdn.net/qq_41568597/article/details/84309503

5.https://blog.csdn.net/weederss/article/details/78034364

1.SQL 45题

create database  school;
use school;

#学生表
create table `Student`
(
  `Sno` varchar(20) not null COMMENT '人名',
  `Sname` varchar(20) not null COMMENT '姓名',
  `Ssex` varchar(20) not null COMMENT '性别',
  `Sbirthday` datetime COMMENT '出生日期',
  `Class` varchar(20) COMMENT '班级'
);
#课程表
create table `Course`(
  `Cno` varchar(20) not null COMMENT '课程号',
  `Cname` varchar(20) not null COMMENT '课程名称',
  `Tno` varchar(20) not null COMMENT '教工编号'
);
#成绩表
Create table `Score` (
  `Sno` varchar(20) not null COMMENT '学号',
  `Cno` varchar(20) not NULL comment '课程号',
  `Degree` DECIMAL(4,1) null COMMENT '成绩'
);
#教师表
create table `Teacher` (
  `Tno` varchar(20) not null COMMENT '教工编号',
  `Tname` varchar(20) not null COMMENT '教工姓名',
  `Tsex` varchar(20) not null COMMENT '教工性别',
  `Tbirthday` datetime null COMMENT '教工出生日期',
  `Prof` varchar(20) null COMMENT '职称',
  `Depart` varchar(20) null COMMENT '教工所在部门'
);

insert into `Student` value
(108,'曾华','','1977-09-01',95033),
(105,'匡明','','1975-10-02',95031),
(107,'王丽','','1976-01-23',95033),
(101,'李军','','1976-02-20',95033),
(109,'王芳','','1975-02-10',95031),
(103,'陆军','','1974-06-03',95031);

insert into `Course` value
('3-105','计算机导论',825),
('3-245','操作系统',804),
('6-166','数字电路',856),
('9-888','高等数学',831);

insert into `Score` value
(103,'3-245',86),
(105,'3-245',75),
(109,'3-245',68),
(103,'3-105',92),
(105,'3-105',88),
(109,'3-105',76),
(101,'2-105',64),
(107,'3-105',91),
(108,'3-105',78),
(101,'6-166',85),
(107,'6-166',79),
(108,'6-166',81);

insert into `Teacher` value
(804,'李城','','1958-12-02','副教授','计算机系'),
(856,'张旭','','1969-03-12','讲师','电子工程系'),
(825,'王萍','','1972-05-05','助教','计算机系'),
(831,'刘冰','','1977-08-14','助教','电子工程系');

1 查询Student表中的所有记录的Sname、Ssex和Class列

select Sname, Ssex, Class from student;

2 查询教师所有的单位即不重复的Depart列。(多练)

select distinct depart from teacher;

3 查询Student表的所有记录

select * from student;

4 查询Score表中成绩在60到80之间的所有记录

select Sno, Cno, degree from score where degree >= 60 and degree < 80;

5 查询Score表中成绩为85,86或88的记录

select Sno, Cno, degree from score where degree = 85 or degree = 86 or degree = 88;
#或另一种写法
select * from score where degree in (85, 86, 88)

6 查询Student表中“95031”班或性别为“女”的同学记录

select * from student where Class = '95031' or Ssex = '';

7 以Class降序查询Student表的所有记录

select * from student order by Class desc;

8 以Cno升序、Degree降序查询Score表的所有记录

select * from score order by Cno asc, degree desc;
# asc, ascending order(升序排列), desc, descending order(降序排列), 默认按升序排列

9 查询“95031”班的学生人数

select count(Class) as '95031班学生数'  from student where Class = '95031';

10 查询Score表中的最高分的学生学号和课程号。(子查询或者排序)

select * from score where degree = (select max(degree) from score); 
# 直接写 select * from score where degree = max(degree)不行,会报错

11 查询每门课的平均成绩。(group by:根据Cno进行分组)  *

select Cno, avg(degree) as '课程平均分' from score group by Cno ; 

12 查询Score表中至少有4名学生选修的并以3开头的课程的平均分数(*需要细究*)

select cno, avg(degree) from score where cno like '3%' group by cno having count(sno) > 4;
#参考网站是5名学生,则查询不到,应为4名学生
#like '3%' 以3开头,或like '%3' 以3结尾, 或包含'%12%'\
#HAVING增加的原因是WHERE关键字无法与合计函数一起使用

13 查询分数大于70,小于90的Sno列

SELECT SNO FROM SCORE WHERE DEGREE BETWEEN 70 AND 90;

14 查询所有学生的Sname、Cno和Degree列

select student.Sname, score.Cno, score.Degree from student, score where student.Sno = score.Sno;
#另一种inner join 写法
select student.Sname, score.Cno, score.Degree from student inner join score on student.Sno = score.Sno

15 查询所有学生的Sno、Cname和Degree列

select score.Sno, course.Cname, score.Degree from  score, course where course.Cno = score.Cno;
#或另一种inner join写法
select score.Sno, course.Cname, score.Degree from  score INNER JOIN course on course.Cno = score.Cno;

16 查询所有学生的Sname、Cname和Degree列

select student.Sname, course.Cname, score.Degree from student, course, score WHERE student.Sno = score.Sno and score.Cno = course.Cno;

17 查询“95033”班学生的平均分。(子查询or条件查询)

select avg(degree) as '95033班平均分' from score where sno in (select sno from student where Class = '95033');

18 假设使用如下命令建立了一个grade表

create table `grade`(
  `low` int   COMMENT '人名',
  `upp` int not null COMMENT '课长', `weight` varchar(20) not null COMMENT '等级' ); insert into `grade` values(90,100,'A'); insert into `grade` values(80,89,'B'); insert into `grade` values(70,79,'C'); insert into `grade` values(60,69,'D'); insert into `grade` values(0,59,'E');
#网络上的grede,错误, rank关键字不能用,sql存在rank函数,经测试更改为weight可以

19 现查询所有同学的Sno、Cno和weight列。(between选取两个值之间的数据范围)

#select Sno,Cno,Degree,rank from grade join Score on Score.Degree between low and upp;
#select Sno,Cno,Degree,rank from Score, grade where Degree between low and upp;
以上为网络上的答案,在Navicat 11.1.13测试错误,实际也是因为rank关键字的原因

select Sno, Cno, weight from Score, grade where (score.Degree > grade.low and score.Degree < grade.upp);
或者是
select Sno, Cno, weight from Score, grade where Degree between low and upp;
或者是
select Sno, Cno, weight from Score inner join grade where Degree between low and upp

20 查询选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录

select sno from score where score.cno = '3-105' and score.degree>(select Degree from Score where Cno = '3-105' and Sno = '109');
#上面是我的答案,题目要求是查询到所有同学的记录,个人是把所有的同学找出来了,下面是网络上的答案,把满足条件的同学的特征又补全了。
select * from Student,Score where Score.Cno = '3-105' and Student.Sno = Score.Sno
and Score.Degree>(select Degree from Score where Cno = '3-105' and Sno = '109');

21 查询score中选学多门课程的同学中分数为非最高分成绩的记录(***挺难***)

select * from Score a where Degree<(select MAX(Degree)from  Score b
where a.Cno = b.Cno) and Sno in(select Sno from Score group by  Sno having  count(*) > 1);

22 查询成绩高于学号为“109”、课程号为“3-105”的成绩的所有记录

select * from Student,Score where Student.Sno = Score.Sno and Score.Degree>
(select Degree from Score where Cno='3-105' and Sno = '109');
#此为网络上答案,个人感觉不对,第一要求只查询课程号3-105的课程,实际查询少限制条件,第二信息不全
select * from student, course, score where score.sno = student.sno and score.cno = course.cno and score.cno = '3-105' and score.degree >
(select degree from score where cno = '3-105' and sno = '109')

23 查询和学号为107的同学同年出生的所有学生的Sno、Sname和Sbirthday列

select Sno, Sname, Sbirthday from student where YEAR(Sbirthday) = (select year(Sbirthday) from student where sno = '107');
#用到了year()函数

24 查询“张旭“教师任课的学生成绩

select * from student, course, score where student.sno =score.sno and score.cno = course.cno and course.tno = (select tno from teacher where tname = '张旭');
#以上为我的答案,将学生的信息补充的较为完整,以下是网络答案,两个where in 跟score.cno = course.cno student.sno = score.sno 等价,也是另一种写法
select Sno,Cno,Degree from Score where Cno in(select Cno from Course where Tno in(select Tno from Teacher where Tname = '张旭'));

25 查询选修某课程的同学人数多于5人的教师姓名

select DISTINCT tname from teacher where tno in (select tno from course where cno in (select cno from score group by cno having count(sno) > 5));
#之前的联等的写法行不通,因为没想到group by 与having count和where之间的连接方式

26 查询95033班和95031班全体学生的记录

select * from student where Class='95033' or Class='95031'

27 查询存在有85分以上成绩的课程Cno

select cno from score where degree >= 85;

28 查询出“计算机系“教师所教课程的成绩表

select * from teacher, student, course, score where score. sno = student.sno and score.cno = course.cno and teacher.tno =course.tno and teacher.depart = '计算机系';
#此处有歧义的是成绩表到底包含哪些内容,通常学生姓名、性别、学号包含,所以这里我把信息特征补的较为齐全
select sno,Cno ,Degree from Score where Cno in (select Cno from Course where Tno in (select tno from Teacher where Depart='计算机系'))
#以上为网络答案

29 查询“计算机系”与“电子工程系“不同职称的教师的Tname和Prof。使用相关子查询

select Tname,Prof from Teacher a where Prof not in(select Prof from Teacher b where a.Depart!=b.Depart);

30 查询选修编号为“3-105“课程且成绩至少高于选修编号为“3-245”课程的同学的Cno、Sno和Degree,并按Degree从高到低次序排序

select Cno,Sno,Degree from Score a where (select Degree from Score b where Cno='3-105' and
b.Sno = a.Sno)>=(select Degree from Score c where Cno='3-245' and c.Sno = a.Sno)order by
Degree desc ;

31 查询选修编号为“3-105”课程且成绩高于选修编号为“3-245”课程的同学的Cno、Sno和Degree.

select Cno,Sno,Degree from Score a where (select Degree from Score b where Cno='3-105' and
b.Sno=a.Sno)>(select Degree from Score c where Cno='3-245' and c.Sno=a.Sno);

32 查询所有教师和同学的name、sex和birthday

select distinct Sname as name,Ssex as sex,Sbirthday as birthday from student
union
select distinct Tname as name,Tsex as sex,Tbirthday as birthday from Teacher;

33 查询所有“女”教师和“女”同学的name、sex和birthday.

select distinct Sname as name,Ssex as sex,Sbirthday as birthday from student where Ssex = ''
union
select distinct Tname as name,Tsex as sex,Tbirthday as birthday from Teacher where Tsex = '';

34 查询成绩比该课程平均成绩低的同学的成绩表

select Sno,Cno,Degree from Score a where  a.Degree<(select AVG(Degree) from Score b where a.Cno = b.Cno);

35 查询所有任课教师的Tname和Depart

select Tname,Depart from Teacher where Tname in(select distinct Tname from Teacher,
Course,Score where Teacher.Tno = Course.Tno and Course.Cno = Score.Cno);
#有点奇怪

36 查询所有未讲课的教师的Tname和Depart

select Tname,Depart from Teacher where Tname not in(select distinct Tname from Teacher,Course,Score where Teacher.Tno=Course.Tno and Course.Cno = Score.Cno);

37 查询至少有2名男生的班号

select Class from student where Ssex='' group by Class having count(*)>1;

38 查询Student表中不姓“王”的同学记录

select * from Student where Sname not like ('王%');

39 查询Student表中每个学生的姓名和年龄(暂有问题)

select Sname,YEAR(GETDATE())-year(Sbirthday) from student;
#getdate函数不可用

40 查询Student表中最大和最小的Sbirthday日期值

select MAX(Sbirthday) as 最大,MIN(Sbirthday) as 最小 from student;

41 以班号和年龄从大到小的顺序查询Student表中的全部记录

select * from Student order by Class desc ,Sbirthday asc;

42 查询“男”教师及其所上的课程

select Tname,Cname from Teacher,Course where teacher.Tsex='' and Teacher.Tno = Course.Tno;

43 查询最高分同学的Sno、Cno和Degree列

select Sno,Cno,Degree from Score where Degree=(select MAX(Degree) FROM score);

44 查询和“李军”同性别的所有同学的Sname.

select SName from Student where Ssex=(select Ssex from Student where Sname='李军')and Sname
not in ('李军');

45 查询和“李军”同性别并同班的同学Sname

select Sname from Student where Ssex=(select Ssex from Student where Sname='李军')and Sname not in
('李军')and Class=(select Class from Student where Sname='李军');

46 查询所有选修“计算机导论”课程的“男”同学的成绩表

select Sno,Degree from Score where Sno in(select Sno from Student where Ssex='')and Cno in
(select Cno from Course where Cname='计算机导论');

猜你喜欢

转载自www.cnblogs.com/Jacon-hunt/p/11380508.html