经典SQL练习题Ⅰ

一、创建数据表

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;

结果输出:

你可能感兴趣的:(经典SQL练习题Ⅰ)