一、创建数据表
1. 创建学生表“students”:
create table students
(sno varchar(3) not null,
sname varchar(4) not null,
ssex varchar(2) not null,
sbirthday datetime,
class varchar(5))
2. 创建课程表“courses”:
create table courses
(cno varchar(5) not null,
cname varchar(10) not null,
tno varchar(10) not null)
3. 创建成绩表“scores”:
create table scores
(sno varchar(3) not null,
cno varchar(5) not null,
degree numeric(10, 1) not null)
4. 创建教师表“teachers”:
create table teachers
(tno varchar(3) not null,
tname varchar(4) not null,
tsex varchar(2) not null,
tbirthday datetime not null,
prof varchar(6),
depart varchar(10) not null)
二、 表中插入数据
1. students表中插入数据:
insert into students(sno,sname,ssex,sbirthday,class) values (108 ,'曾华' ,'男' ,'1977-09-01',95033);
insert into students(sno,sname,ssex,sbirthday,class) values (105 ,'匡明' ,'男' ,'1975-10-02',95031);
insert into students(sno,sname,ssex,sbirthday,class) values (107 ,'王丽' ,'女' ,'1976-01-23',95033);
insert into students(sno,sname,ssex,sbirthday,class) values (101 ,'李军' ,'男' ,'1976-02-20',95033);
insert into students(sno,sname,ssex,sbirthday,class) values (109 ,'王芳' ,'女' ,'1975-02-10',95031);
insert into students(sno,sname,ssex,sbirthday,class) values (103 ,'陆君' ,'男' ,'1974-06-03',95031);
2. courses表中插入数据:
insert into courses(cno,cname,tno) values ('3-105' ,'计算机导论',825);
insert into courses(cno,cname,tno) values ('3-245' ,'操作系统' ,804);
insert into courses(cno,cname,tno) values ('6-166' ,'数据电路' ,856);
insert into courses(cno,cname,tno) values ('9-888' ,'高等数学' ,100);
3. scores表中插入数据:
insert into scores(sno,cno,degree) values (103,'3-245',86);
insert into scores(sno,cno,degree) values (105,'3-245',75);
insert into scores(sno,cno,degree) values (109,'3-245',68);
insert into scores(sno,cno,degree) values (103,'3-105',92);
insert into scores(sno,cno,degree) values (105,'3-105',88);
insert into scores(sno,cno,degree) values (109,'3-105',76);
insert into scores(sno,cno,degree) values (101,'3-105',64);
insert into scores(sno,cno,degree) values (107,'3-105',91);
insert into scores(sno,cno,degree) values (108,'3-105',78);
insert into scores(sno,cno,degree) values (101,'6-166',85);
insert into scores(sno,cno,degree) values (107,'6-106',79);
insert into scores(sno,cno,degree) values (108,'6-166',81);
4. teachers表中插入数据:
insert into teachers(tno,tname,tsex,tbirthday,prof,depart) values (804,'李诚','男','1958-12-02','副教授','计算机系');
insert into teachers(tno,tname,tsex,tbirthday,prof,depart) values (856,'张旭','男','1969-03-12','讲师','电子工程系');
insert into teachers(tno,tname,tsex,tbirthday,prof,depart) values (825,'王萍','女','1972-05-05','助教','计算机系');
insert into teachers(tno,tname,tsex,tbirthday,prof,depart) values (831,'刘冰','女','1977-08-14','助教','电子工程系');
三、开始做题
1. 查询students表中的所有记录的sname、ssex和class列:
select sname,ssex,class
from students;
结果输出:
2. 查询教师所有的单位,即不重复的depart列:
select distinct depart
from teachers;
结果输出:
3. 查询students表的所有记录:
select *
from students;
结果输出:
4. 查询scores表中成绩在60到80之间的所有记录:
select *
from scores
where degree between 60 and 80;
结果输出:
5. 查询score表中成绩为85,86或88的记录:
select *
from scores
where degree in (85,86,88);
结果输出:
6. 查询students表中“95031”班或性别为“女”的同学记录:
select *
from students
where class = '95031' or ssex = '女';
结果输出:
7. 以class降序查询students表的所有记录:
select *
from students
order by class desc;
结果输出:
8. 以cno升序、degree降序查询scores表的所有记录:
select *
from scores
order by cno,degree desc;
结果输出:
9. 查询“95031”班的学生人数:
select class,count(1) as stunum
from students
where class = '95031';
结果输出:
10. 查询scores表中的最高分的学生学号和课程号:
select sno,cno
from scores
order by degree
limit 1;
结果输出:
11. 查询‘3-105’号课程的平均分:
select avg(degree)
from scores
where cno = '3-105';
结果输出:
12. 查询scores表中至少有5名学生选修的并以3开头的课程的平均分数:
select cno,avg(degree)
from scores
where cno like '3%'
group by cno
having count(sno) >= 5;
结果输出:
13. 查询最低分大于70,最高分小于90的sno列:
方法1:
select sno
from scores
group by sno
having min(degree) > 70 and max(degree) < 90;
方法2:
select sno
from scores
group by sno
having degree between '70' and '90';
方法3:
select sno
from scores
group by sno
having max(degree) between '70' and '90' and min(degree) between '70' and '90';
结果输出:
14. 查询所有学生的sname、sno和segree列:
select sname,cno,degree
from students inner join scores
on scores.sno = students.sno
order by sname;
结果输出:
15. 查询所有学生的sno、sname和segree列:
select sno,cname,degree
from scores inner join courses
on scores.cno = courses.cno
order by sno;
结果输出:
16. 查询所有学生的sname、cname和degree列:
select sname,cname,degree
from students inner join scores
on students.sno = scores.sno
inner join courses
on scores.cno = courses.cno
order by sname;
结果输出:
17. 查询“95033”班所选课程的平均分:
select courses.cno,cname,avg(degree)
from students inner join scores
on students.sno = scores.sno
inner join courses
on scores.cno = courses.cno
where class = '95033'
group by courses.cno
order by courses.cno
结果输出:
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');
commit;
现查询所有同学的sno、cno和rank列:
select sno,cno,rank
from scores inner join grade
on (scores.degree >= grade.low and scores.degree <= grade.upp)
order by sno;
结果输出:
19. 查询选修“3-105”课程同学的成绩高于“109”号同学成绩的所有同学的记录:
select s1.sno,s1.degree
from scores as s1 inner join scores as s2
on (s1.cno = s2.cno and s1.degree > s2.degree)
where s1.cno = '3-105' and s2.sno = '109'
order by s1.sno;
结果输出:
20. 查询scores中选学一门以上课程的同学中分数为非最高分成绩的记录:
方法1:
select *
from scores
group by sno
having count(cno)>1 and degree != max (degree);
方法2:
select a.*
from scores a
where a.degree<(select max(degree)
from scores b
where a.sno=b.sno);
结果输出:
21. 查询成绩高于学号为“109”,课程号为“3-105”的成绩的所有记录:
方法1:
select sno,degree
from scores
where degree >
(select max(degree)
from scores
where sno = 109)
and cno = '3-105';
方法2:
select s1.sno,s1.degree
from scores as s1 inner join scores as s2
on (s1.cno = s2. cno and s1.degree > s2.degree)
where s1.cno = '3-105' and s2.sno = '109'
order by s1.sno;
结果输出:
22. 查询和学号为108的同学同年出生的所有学生的sno、sname和sbirthday列:
方法1:
select sno,sname,sbirthday
from students
where year(sbirthday) = (
select year(sbirthday)
from students
where sno = '108'
);
方法2:
select s1.sno,s1.sname,s1.sbirthday
from students s1 join students s2
on year(s1.sbirthday) = year(s2.sbirthday)
where s2.sno = '108';
结果输出:
23. 查询“张旭“教师任课的学生成绩:
select sno,degree
from scores join courses
on scores.cno = courses.cno join teachers
on courses.tno = teachers.tno
where tname = '张旭';
结果输出:
24. 查询选修某课程的同学人数多于5人的教师姓名:
select distinct tname
from scores join courses
on scores.cno = courses.cno join teachers
on courses.tno = teachers.tno
group by scores.cno
having count(scores.sno)>5;
结果输出:
25. 查询95033班和95031班全体学生的记录:
select *
from students
where class in ('95033','95031')
order by class;
结果输出:
26. 查询存在有85分以上成绩的课程cno:
select distinct cno
from scores
where degree > 85;
结果输出:
27. 查询出“计算机系“教师所教课程的成绩表:
select tname,scores.cno,sno,degree
from scores join courses on scores.cno = courses.cno
join teachers on courses.tno = teachers.tno
where depart = '计算机系'
order by tname,scores.cno,sno,degree desc;
结果输出:
28. 查询“计算机系”职称与“电子工程系“职称不同的教师的tname和prof:
select tname,prof
from teachers
where depart = '计算机系' and prof not in (
select distinct prof
from teachers
where depart = '电子工程系'
);
结果输出:
29. 查询选修编号为“3-105“课程且成绩至少高于选修编号为“3-245”的同学的cno、sno和degree,并按degree从高到低次序排序:
select cno,sno,degree
from scores
where cno = '3-105' and degree > any(
select degree
from scores
where cno = '3-245')
order by degree desc;
结果输出:
30. 查询选修编号为“3-105”且成绩高于选修编号为“3-245”课程的同学的cno、sno和degree:
select cno,sno,degree
from scores
where cno = '3-105' and degree > all(
select degree
from scores
where cno = '3-245')
order by degree desc;
结果输出:
31. 查询所有教师和同学的name、sex和birthday:
select sname,ssex,sbirthday
from students
union
select tname,tsex,tbirthday
from teachers;
结果输出:
32. 查询所有“女”教师和“女”同学的name、sex和birthday:
select sname,ssex,sbirthday
from students
where ssex = '女'
union
select tname,tsex,tbirthday
from teachers
where tsex = '女';
结果输出:
33. 查询成绩比该课程平均成绩低的同学的成绩表:
select s1.*
from scores as s1 inner join (
select cno,avg(degree) as adegree
from scores
group by cno) as s2
on (s1.cno = s2.cno and s1.degree < s2.adegree);
结果输出:
34. 查询所有任课教师的tname和depart:
方法1:
select tname,depart
from teachers left join courses
on teachers.tno = courses.tno
where cno is not null;
方法2:
select tname,depart
from teachers
where tno in (
select tno
from courses
);
结果输出:
35. 查询所有未讲课的教师的tname和depart:
方法1:
select tname,depart
from teachers left join courses
on teachers.tno = courses.tno
where cno is null;
方法2:
select tname,depart
from teachers
where tno not in (
select tno
from courses
);
结果输出:
36. 查询至少有2名男生的班号:
select class
from students
group by class
having count(ssex = '男')>=2;
结果输出:
37. 查询students表中不姓“王”的同学记录:
select *
from students
where sname not like '王%';
结果输出:
38. 查询students表中每个学生的姓名和年龄:
select sname,year(now())-year(sbirthday) as sage
from students
order by sage;
结果输出:
39. 查询student表中最大和最小的sbirthday日期值:
select max(sbirthday),min(sbirthday)
from students;
结果输出:
40. 以班号和年龄从大到小的顺序查询students表中的全部记录:
select *
from students
order by class desc, sbirthday asc;
结果输出:
41. 查询“男”教师及其所上的课程:
select tname,cname
from teachers join courses
on teachers.tno = courses.tno
where tsex = '男';
结果输出:
42. 查询最高分同学的sno、cno和degree列:
select *
from scores
group by cno
having degree = max(degree);
结果输出:
43. 查询和“李军”同性别的所有同学的sname:
方法1:
select sname
from students
where ssex =
(select ssex
from students
where sname = '李军');
方法2:
select s1.sname
from students as s1 inner join students as s2
on s1.ssex = s2.ssex
where s2.sname = '李军';
结果输出:
44. 查询和“李军”同性别并同班的同学sname:
select s1.sname
from students s1 join students s2
on s1.ssex = s2.ssex and s1.class = s2.class
where s2.sname = '李军';
结果输出:
45. 查询所有选修“计算机导论”课程的“男”同学的成绩表:
select scores.sno,degree
from students join scores
on students.sno = scores.sno join courses
on scores.cno = courses.cno
where cname = '计算机导论' and ssex = '男'
order by sno;
结果输出: