SQL练习(1)
设有一数据库,包括四个表:学生表(Student)、课程表(Course)、成绩表(Score)以及教师信息表(Teacher)。四个表的结构分别如表1-1的表(一)~表(四)所示,数据如表1-2的表(一)~表(四)所示。
用SQL语句创建四个表并完成相关题目:
表1-1数据库的表结构
表(一)Student (学生表)
属性名 | 数据类型 | 可否为空 | 含义 |
---|---|---|---|
Sno | varchar (20) | 否 | 学号(主码) |
Sname | varchar (20) | 否 | 学生姓名 |
Ssex | varchar (20) | 否 | 学生性别 |
Sbirthday | datetime | 可 | 学生出生年月 |
Class | varchar (20) | 可 | 学生所在班级 |
表(二)Course(课程表)
属性名 | 数据类型 | 可否为空 | 含义 |
---|---|---|---|
Cno | varchar (20) | 否 | 课程号(主码) |
Cname | varchar (20) | 否 | 课程名称 |
Tno | varchar (20) | 否 | 教工编号(外码) |
表(三)Score(成绩表)
属性名 | 数据类型 | 可否为空 | 含 义 |
---|---|---|---|
Sno | varchar (20) | 否 | 学号(外码) |
Cno | varchar (20) | 否 | 课程号(外码) |
Degree | Decimal(4,1) | 可 | 成绩 |
主码:Sno+ Cno |
表(四)Teacher(教师表)
属性名 | 数据类型 | 可否为空 | 含 义 |
---|---|---|---|
Tno | varchar (20) | 否 | 教工编号(主码) |
Tname | varchar (20) | 否 | 教工姓名 |
Tsex | varchar (20) | 否 | 教工性别 |
Tbirthday | datetime | 可 | 教工出生年月 |
Prof | varchar (20) | 可 | 职称 |
Depart | varchar (20) | 否 | 教工所在部门 |
表1-2数据库中的数据
表(一)Student
Sno | Sname | Ssex | Sbirthday | class |
---|---|---|---|---|
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 |
表(二)Course
Cno | Cname | Tno |
---|---|---|
3-105 | 计算机导论 | 825 |
3-245 | 操作系统 | 804 |
6-166 | 数字电路 | 856 |
9-888 | 高等数学 | 831 |
表(三)Score
Sno | Cno | Degree |
---|---|---|
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 | 3-105 | 64 |
107 | 3-105 | 91 |
108 | 3-105 | 78 |
101 | 6-166 | 85 |
107 | 6-166 | 79 |
108 | 6-166 | 81 |
表(四)Teacher
Tno | Tname | Tsex | Tbirthday | Prof | Depart |
---|---|---|---|---|---|
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;
-- 2、 查询教师所有的单位即不重复的Depart列。
select distinct depart from teacher;
-- 3、 查询Student表的所有记录。
select * from student;
-- 4、 查询Score表中成绩在60到80之间的所有记录
select * from score where Degree between 60 and 80;
-- 5、 查询Score表中成绩为85,86或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;
-- 9、 查询“95031”班的学生人数。
select count(*) from student where Class = '95031';
-- 10、 查询Score表中的最高分的学生学号和课程号。(子查询或者排序)
select Sno, Cno from score where Degree = (select max(Degree) from score);
-- 11、 查询每门课的平均成绩。
select Cno, avg(Degree) from score group by Cno;
-- 12、查询Score表中至少有5名学生选修的并以3开头的课程的平均分数。
select Cno, avg(Degree) from score where Cno like '3%' group by Cno having count(Cno) >= 5;
-- 13、查询分数大于70,小于90的Sno列。
select Sno from score group by Sno having min(Degree) > 70 and max(Degree) > 90;
-- 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;
-- 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;
-- 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;
-- 17、 查询“95033”班学生的平均分。
select Class, avg(Degree) from student, score where student.Sno = score.Sno and Class = '95033';
-- 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;
-- 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';
-- 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);
-- 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');
-- 22、查询和学号为108的同学同年出生的所有学生的Sno、Sname和Sbirthday列。
select Sno, Sname, Sbirthday from student where year(Sbirthday) = (select year(Sbirthday) from student where Sno = '108');
-- 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 = '张旭'));
-- 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) );
-- 25、查询95033班和95031班全体学生的记录。
select * from student where Class = '95033' or Class = '95031';
-- 26、 查询存在有85分以上成绩的课程Cno.
select Cno from score where Degree > 85 group by Cno;
select distinct Cno from score where Degree > 85;
-- 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 = '计算机系'));
-- 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);
-- 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;
-- 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);
-- 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;
-- 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 = '女';
-- 33、 查询成绩比该课程平均成绩低的同学的成绩表。
select Sno, Cno, Degree from score a where a.Degree < (select avg(Degree) from score b where a.Cno = b.Cno);
-- 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);
-- 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);
-- 36、查询至少有2名男生的班号。
select Class from student where Ssex = '男' group by Class having count(*) >= 2;
-- 37、查询Student表中不姓“王”的同学记录。
select * from student where Sname not like '王%';
-- 38、查询Student表中每个学生的姓名和年龄。
select Sname, year(now())-year(Sbirthday) as Sage from student;
-- 39、查询Student表中最大和最小的Sbirthday日期值。
select max(Sbirthday), min(Sbirthday) from student;
-- 40、以班号和年龄从大到小的顺序查询Student表中的全部记录。
select * from student order by Class desc, Sbirthday asc;
-- 41、查询“男”教师及其所上的课程。
select Tname, Cname from teacher, course where Tsex = '男' and teacher.Tno = course.Tno;
-- 42、查询最高分同学的Sno、Cno和Degree列。
select Sno, Cno, Degree from score where Degree = (select max(Degree) from score);
-- 43、查询和“李军”同性别的所有同学的Sname.
select Sname from student where Ssex = (select Ssex from student where Sname = '李军') and Sname != '李军';
-- 44、查询和“李军”同性别并同班的同学Sname.
select Sname from student where Ssex = (select Ssex from student where Sname = '李军')
and Class = (select Class from student where Sname = '李军') and Sname != '李军';
-- 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 = '计算机导论');