经典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;

结果输出:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335