SQL练习(1)

SQL练习(1)

  设有一数据库,包括四个表:学生表(Student)、课程表(Course)、成绩表(Score)以及教师信息表(Teacher)。四个表的结构分别如表1-1的表(一)~表(四)所示,数据如表1-2的表(一)~表(四)所示。
  用SQL语句创建四个表并完成相关题目:
  
表1-1数据库的表结构
表(一)Student (学生表)

属性名数据类型可否为空含义
Snovarchar (20)学号(主码)
Snamevarchar (20)学生姓名
Ssexvarchar (20)学生性别
Sbirthdaydatetime学生出生年月
Classvarchar (20)学生所在班级

表(二)Course(课程表)

属性名数据类型可否为空含义
Cnovarchar (20)课程号(主码)
Cnamevarchar (20)课程名称
Tnovarchar (20)教工编号(外码)

表(三)Score(成绩表)

属性名数据类型可否为空含 义
Snovarchar (20)学号(外码)
Cnovarchar (20)课程号(外码)
DegreeDecimal(4,1)成绩
主码:Sno+ Cno

表(四)Teacher(教师表)

属性名数据类型可否为空含 义
Tnovarchar (20)教工编号(主码)
Tnamevarchar (20)教工姓名
Tsexvarchar (20)教工性别
Tbirthdaydatetime教工出生年月
Profvarchar (20)职称
Departvarchar (20)教工所在部门

表1-2数据库中的数据
表(一)Student

SnoSnameSsexSbirthdayclass
108曾华1977-09-0195033
105匡明1975-10-0295031
107王丽1976-01-2395033
101李军1976-02-2095033
109王芳1975-02-1095031
103陆君1974-06-0395031

表(二)Course

CnoCnameTno
3-105计算机导论825
3-245操作系统804
6-166数字电路856
9-888高等数学831

表(三)Score

SnoCnoDegree
1033-24586
1053-24575
1093-24568
1033-10592
1053-10588
1093-10576
1013-10564
1073-10591
1083-10578
1016-16685
1076-16679
1086-16681

表(四)Teacher

TnoTnameTsexTbirthdayProfDepart
804李诚1958-12-02副教授计算机系
856张旭1969-03-12讲师电子工程系
825王萍1972-05-05助教计算机系
831刘冰1977-08-14助教电子工程系

题目及答案

create database lalala;
use lalala;

create table Student (Sno varchar (20), Sname varchar (20) not null, Ssex varchar (20) not null, Sbirthday datetime, Class varchar (20),  primary key (Sno));
create table Course (Cno varchar (20), Cname varchar (20) not null, Tno varchar (20) not null, primary key (Cno)); 
create table Score (Sno varchar (20), Cno varchar (20) not null, Degree Decimal(4,1), primary key(Sno, Cno));
create table Teacher (Tno varchar (20) primary key, Tname varchar (20) not null, Tsex varchar (20) not null, Tbirthday datetime, Prof varchar (20), Depart varchar (20) not null);

alter table Score add constraint fkSno foreign key (Sno) references Student (Sno);
alter table Score add constraint fkCno foreign key (Cno) references Course (Cno);
alter table Course add constraint fkTno foreign key (Tno) references Teacher(Tno);
-- alter table Score drop foreign key fk1;
-- alter table Score drop foreign key fk2;

-- select * from student;

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

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

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

insert into teacher value ('804', '李诚', '男', '1958-12-02', '副教授', '计算机系');
insert into teacher value ('856', '张旭', '男', '1969-03-12', '讲师', '电子工程系');
insert into teacher value ('825', '王萍', '女', '1972-05-05', '助教', '计算机系');
insert into teacher value ('831', '刘冰', '女', '1977-08-14', '助教', '电子工程系');
-- 1、 查询Student表中的所有记录的Sname、Ssex和Class列。
select Sname, Ssex, Class from student;

1

-- 2、 查询教师所有的单位即不重复的Depart列。
select distinct depart from teacher;

2

-- 3、 查询Student表的所有记录。
select * from student;

3

-- 4、 查询Score表中成绩在60到80之间的所有记录
select * from score where Degree between 60 and 80;

4

-- 5、 查询Score表中成绩为85,86或88的记录。
select * from score where Degree in (85, 86, 88);

5

-- 6、 查询Student表中“95031”班或性别为“女”的同学记录。
select * from student where Class = '95031' or Ssex = '女';

6

-- 7、 以Class降序查询Student表的所有记录。
select * from student order by Class desc;

7

-- 8、 以Cno升序、Degree降序查询Score表的所有记录。
select * from score order by Cno asc, Degree desc;

8

-- 9、 查询“95031”班的学生人数。
select count(*) from student where Class = '95031';

9

-- 10、 查询Score表中的最高分的学生学号和课程号。(子查询或者排序)
select Sno, Cno from score where Degree = (select max(Degree) from score);                                                 

10

-- 11、 查询每门课的平均成绩。
select Cno, avg(Degree) from score group by Cno;

11

-- 12、查询Score表中至少有5名学生选修的并以3开头的课程的平均分数。
select Cno, avg(Degree) from score where Cno like '3%' group by Cno having count(Cno) >= 5;

12

-- 13、查询分数大于70,小于90的Sno列。
select Sno from score group by Sno having min(Degree) > 70 and max(Degree) > 90;

13

-- 14、查询所有学生的Sname、Cno和Degree列。
select Sname, Cno, Degree from student, score where student.Sno = score.Sno;
select Sname, Cno, Degree from student join score on student.Sno = score.Sno;

14

-- 15、查询所有学生的Sno、Cname和Degree列。
select Sno, Cname, Degree from course, score where course.Cno = score.Cno;
select Sno, Cname, Degree from score join course on course.Cno = score.Cno;

15

-- 16、查询所有学生的Sname、Cname和Degree列。
select Sname, Cname, Degree from student, course, score where student.Sno = score.Sno and course.Cno = score.Cno;
select Sname, Cname, Degree from student join score on student.Sno = score.Sno join course on course.Cno = score.Cno;

16

-- 17、 查询“95033”班学生的平均分。
select Class, avg(Degree) from student, score where student.Sno = score.Sno and Class = '95033';

17

-- 18、 假设使用如下命令建立了一个grade表:
/*
    create table grade(low int(3),upp int(3),rank char(1))
    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’)
    现查询所有同学的Sno、Cno和rank列。
*/
create table grade(low int(3),upp int(3),rank char(1));
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');
select Sno, Cno, rank from score, grade where Degree between low and upp order by rank;

18

-- 19、  查询选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录。
select x.Sno, x.Cno, x.Degree from score x, score y where x.Cno = '3-105' and x.Degree > y.Degree and y.Sno = '109' and y.Cno = '3-105';

19

-- 20、查询score中选学多门课程的同学中分数为非最高分成绩的记录。
-- delete from score where Sno = '109' and Cno = '3-105';
select * from score a where Sno in (select Sno from score group by Sno having count(*)>1)
    and(Degree not in(select max(Degree) from score b where a.Cno=b.Cno group by Cno));
select * from score a where Sno in (select Sno from score group by Sno having count(*)>1)
    and Degree < (select max(Degree) from score b where a.Cno = b.Cno group by Cno);

20

-- 21、查询成绩高于学号为“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');

21

-- 22、查询和学号为108的同学同年出生的所有学生的Sno、Sname和Sbirthday列。
select Sno, Sname, Sbirthday from student where year(Sbirthday) = (select year(Sbirthday) from student where Sno = '108');

22

-- 23、查询“张旭“教师任课的学生成绩。
select Degree from score, teacher, course where score.Cno = course.Cno and course.Tno = teacher.Tno and teacher.Tname = '张旭';
select Degree from score where Cno in (select Cno from course where Tno in (select Tno from teacher where Tname = '张旭'));

23

-- 24、查询选修某课程的同学人数多于5人的教师姓名。
select Tname from teacher, course where teacher.Tno = course.Tno and course.Cno in (select Cno from score group by Cno having count(Cno) > 5);
select Tname from teacher where Tno in (select Tno from course where Cno in (select Cno from score group by Cno having count(*)>5) );

24

-- 25、查询95033班和95031班全体学生的记录。
select * from student where Class = '95033' or Class = '95031';

25

-- 26、  查询存在有85分以上成绩的课程Cno.
select Cno from score where Degree > 85 group by Cno;
select distinct Cno from score where Degree > 85;

26

-- 27、查询出“计算机系“教师所教课程的成绩表。
select score.Sno, score.Cno, score.Degree from score, course, teacher where score.Cno = course.Cno and course.Tno = teacher.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 = '计算机系'));

27

-- 28、查询“计算机系”与“电子工程系“不同职称的教师的Tname和Prof。
select Tname, Prof from teacher where Depart = '计算机系' and Prof not in (select Prof from teacher where Depart = '电子工程系') 
    union (select Tname, Prof from teacher where Depart = '电子工程系' and Prof not in (select Prof from teacher where Depart = '计算机系'));
select Tname, Prof from teacher a where Prof not in (select Prof from teacher b where a.Depart != b.Depart);

28

-- 29、查询选修编号为“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 a.Sno = b.Sno) 
    >= (select Degree from score c where Cno = '3-245' and a.Sno = c.Sno) order by Degree desc;

29

-- 30、查询选修编号为“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 a.Sno = b.Sno) 
    > (select Degree from score c where Cno = '3-245' and a.Sno = c.Sno);

30

-- 31、 查询所有教师和同学的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;

31

-- 32、查询所有“女”教师和“女”同学的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 = '女'; 

32

-- 33、 查询成绩比该课程平均成绩低的同学的成绩表。
select Sno, Cno, Degree from score a where a.Degree < (select avg(Degree) from score b where a.Cno = b.Cno);

33

-- 34、 查询所有任课教师的Tname和Depart.
select Tname, Depart from teacher where Tno in (select Tno from course where Cno in (select Cno from score));
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);

34

-- 35 、 查询所有未讲课的教师的Tname和Depart.
select Tname, Depart from teacher where Tno not in (select Tno from course where Cno in (select Cno from score));
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);

35

-- 36、查询至少有2名男生的班号。
select Class from student where Ssex = '男' group by Class having count(*) >= 2;

36

-- 37、查询Student表中不姓“王”的同学记录。
select * from student where Sname not like '王%';

37

-- 38、查询Student表中每个学生的姓名和年龄。
select Sname, year(now())-year(Sbirthday) as Sage from student;

38

-- 39、查询Student表中最大和最小的Sbirthday日期值。
select max(Sbirthday), min(Sbirthday) from student;

39

-- 40、以班号和年龄从大到小的顺序查询Student表中的全部记录。
select * from student order by Class desc, Sbirthday asc;

40

-- 41、查询“男”教师及其所上的课程。
select Tname, Cname from teacher, course where Tsex = '男' and teacher.Tno = course.Tno;

41

-- 42、查询最高分同学的Sno、Cno和Degree列。
select Sno, Cno, Degree from score where Degree = (select max(Degree) from score);

42

-- 43、查询和“李军”同性别的所有同学的Sname.
select Sname from student where Ssex = (select Ssex from student where Sname = '李军') and Sname != '李军';

43

-- 44、查询和“李军”同性别并同班的同学Sname.
select Sname from student where Ssex = (select Ssex from student where Sname = '李军') 
    and Class = (select Class from student where Sname = '李军') and Sname != '李军';

44

-- 45、查询所有选修“计算机导论”课程的“男”同学的成绩表。
select Sno, Cno, Degree from score where Sno in (select Sno from student where Ssex = '男') 
    and Cno in (select Cno from course where Cname = '计算机导论');

45

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值