SQL经典试题,自己一一做过(有所改动)

题目

  • 设有一数据库,包括四个表:学生表课程表分数表 以及教师信息表
1.建表
  • 四个表的结构分别如下面表一至表四所示。用SQL语句创建四个表并完成相关题目。
关键字 数据类型 可否为空 含义
s_no VARCHAR() 学号(主键)
s_name VARCHAR() 姓名
s_sex VARCHAR() 性别
s_birthday DATETIME 出生年月日
s_class VARCHAR() 班级

表一:学生表

关键字 数据类型 可否为空 含义
s_no VARCHAR() 学号(主键)
s_name VARCHAR() 姓名
s_sex VARCHAR() 性别
s_birthday DATETIME 出生年月日
s_class VARCHAR() 班级
关键字 数据类型 可否为空 含义
c_no VARCHAR() 课程编号(主键)
c_name VARCHAR() 课程名称
t_no VARCHAR() 授课老师编号

表二:课程表

关键字 数据类型 可否为空 含义
c_no VARCHAR() 课程编号(主键)
c_name VARCHAR() 课程名称
t_no VARCHAR() 授课老师编号
关键字 数据类型 可否为空 含义
s_no VARCHAR() 学号(外键)
c_no VARCHAR() 课程编号(外键)
degree VARCHAR() 分数

表三:分数表

关键字 数据类型 可否为空 含义
s_no VARCHAR() 学号(外键)
c_no VARCHAR() 课程编号(外键)
degree VARCHAR() 分数
关键字 数据类型 可否为空 含义
t_no VARCHAR() 老师编号(主键)
t_name VARCHAR() 姓名
t_sex VARCHAR() 性别
t_birthday DATETIME 出生年月日
t_prof VARCHAR() 职位
depart VARCHAR() 所在部门

表四:教师信息表

关键字 数据类型 可否为空 含义
t_no VARCHAR() 老师编号(主键)
t_name VARCHAR() 姓名
t_sex VARCHAR() 性别
t_birthday DATETIME 出生年月日
t_prof VARCHAR() 职位
depart VARCHAR() 所在部门
  • 建表
-- 学生
CREATE TABLE `学生`(
`s_no` VARCHAR(3) NOT NULL COMMENT '学号',
`s_name` VARCHAR(4) NOT NULL COMMENT '姓名',
`s_sex` VARCHAR(2) NOT NULL COMMENT '性别',
`s_birthday` DATETIME  COMMENT '出生年月日' , 
`s_class` VARCHAR(5) NOT NULL COMMENT '班级'
)ENGINE=MyISAM CHARSET=utf8;
-- 课程
CREATE TABLE `课程`(
`c_no` VARCHAR(5) NOT NULL COMMENT '课程编号',  
`c_name` VARCHAR(10) NOT NULL COMMENT '课程名称', 
`t_no` VARCHAR(10) NOT NULL  COMMENT '授课老师编号'
)ENGINE=MyISAM CHARSET=utf8;
-- 分数
CREATE TABLE `分数`(
`s_no` VARCHAR(3) NOT NULL COMMENT '学号', 
`c_no` VARCHAR(5) NOT NULL COMMENT '课程编号', 
`degree` NUMERIC(10, 1) NOT NULL COMMENT '分数'
)ENGINE=MyISAM CHARSET=utf8;
-- 老师
CREATE TABLE `教师` (
`t_no` VARCHAR(3) NOT NULL COMMENT '老师编号', 
`t_name` VARCHAR(4) NOT NULL COMMENT'姓名',
`t_sex` VARCHAR(2) NOT NULL COMMENT '性别', 
`t_birthday` DATETIME COMMENT '出生年月日', 
`t_prof` VARCHAR(6) COMMENT '职位', 
`depart` VARCHAR(10) NOT NULL COMMENT '所在部门'
)ENGINE=MyISAM CHARSET=utf8;
2.插入数据
INSERT INTO `学生`(s_no,s_name,s_sex,s_birthday,s_class) VALUES(108 ,'曾华' ,'男' ,'1977-09-01',95033);
INSERT INTO `学生` VALUES(105 ,'匡明' ,'男' ,'1975-10-02',95031);
INSERT INTO `学生` VALUES (107 ,'王丽' ,'女' ,'1976-01-23',95033);
INSERT INTO `学生` VALUES (101 ,'李军' ,'男' ,'1976-02-20',95033);
INSERT INTO `学生` VALUES (109 ,'王芳' ,'女' ,'1975-02-10',95031);
INSERT INTO `学生` VALUES (103 ,'陆君' ,'男' ,'1974-06-03',95031);

INSERT INTO `课程` VALUES('3-105' ,'计算机导论',825);
INSERT INTO `课程` VALUES('3-245' ,'操作系统' ,804);
INSERT INTO `课程` VALUES('6-166' ,'数据电路' ,856);
INSERT INTO `课程` VALUES('9-888' ,'高等数学' ,100);

INSERT INTO `分数` VALUES(103,'3-245',86);
INSERT INTO `分数` VALUES(105,'3-245',75);
INSERT INTO `分数` VALUES(109,'3-245',68);
INSERT INTO `分数` VALUES(103,'3-105',92);
INSERT INTO `分数` VALUES(105,'3-105',88);
INSERT INTO `分数` VALUES(109,'3-105',76);
INSERT INTO `分数` VALUES(101,'3-105',64);
INSERT INTO `分数` VALUES(107,'3-105',91);
INSERT INTO `分数` VALUES(108,'3-105',78);
INSERT INTO `分数` VALUES(101,'6-166',85);
INSERT INTO `分数` VALUES(107,'6-106',79);
INSERT INTO `分数` VALUES(108,'6-166',81);

INSERT INTO `教师` VALUES(804,'李诚','男','1958-12-02','副教授','计算机系');
INSERT INTO `教师` VALUES(856,'张旭','男','1969-03-12','讲师','电子工程系');
INSERT INTO `教师` VALUES(825,'王萍','女','1972-05-05','助教','计算机系');
INSERT INTO `教师` VALUES(831,'刘冰','女','1977-08-14','助教','电子工程系');
3.查询数据题目

1、 查询学生表中的所有记录的s_name、s_sex和s-class列。
2、 查询教师所有的单位即不重复的depart列(去重后的教师职业)。
3、 查询学生表的所有记录。
4、 查询分数表中成绩在60到80之间的所有记录。
5、 查询分数表中成绩为85,86或88的记录。
6、 查询学生表中“95031”班或性别为“女”的同学记录。
7、 以s_class降序查询学生表的所有记录。
8、 以c_no升序、degree降序查询分数表的所有记录。
9、 查询“95031”班的学生人数。
10、查询分数表中的最高分的学生学号和课程号。
11、查询‘3-105’号课程的平均分。
12、查询Score表中至少有5名学生选修的并以3开头的课程的平均分数。
13、查询最低分大于70,最高分小于90的s_no列。
14.查询分数在70到90之间不包括70和90分的s_no列。
15、查询所有学生的s_name、c_no和degree列。(INNER JOIN 关键字在表中存在至少一个匹配时返回行)
16、查询所有学生的s_name、c_name和degree列。
17、查询“95033”班所选课程的平均分。
18、假设使用如下命令建立了一个分数等级表,并设置分数等级:
CREATE TABLE 等级(
low TINYINT COMMENT '最低分',
upp TINYINT COMMENT '最高分',
rank CHAR(1) COMMENT '等级'
);
INSERT INTO 等级 VALUES(90,100,'A');
INSERT INTO 等级 VALUES(80,89,'B');
INSERT INTO 等级 VALUES(70,79,'C');
INSERT INTO 等级 VALUES(60,69,'D');
INSERT INTO 等级 VALUES(0,59,'E');
现查询所有同学的s_no、c_no和rank列。
19、查询选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录。
20、查询分数中选学一门以上课程的同学中分数为非最高分成绩的记录。
21、查询和学号为101的同学同年出生的所有学生的s_no、s_name和s_birthday列。
22、查询“张旭“教师任课的学生成绩。
23、查询选修某课程的同学人数多于5人的教师姓名。
24、查询95033班和95031班全体学生的记录。
25、查询存在有85分以上成绩的课程c_no.
26、查询出“计算机系“教师所教课程的成绩表。
27、查询“计算机系”与“电子工程系“不同职称的教师的t_name 和 t_prof。
28、查询选修编号为“3-105“课程且成绩至少高于选修编号为“3-245”的同学的c_no、s_no和degree,并按degree从高到低次序排序。
29、查询所有教师和同学的name、sex和birthday.
30、查询所有“女”教师和“女”同学的name、sex和birthday.
31、查询成绩比该课程平均成绩低的同学的成绩表。
32、查询所有任课教师的t_name和depart.
33 查询所有未讲课的教师的t_name和depart.
34、查询至少有2名男生的班号。
35、查询学生表中不姓“王”的同学记录。
36、查询学生表中每个学生的姓名和年龄。
37、查询学生表中最大和最小的s_birthday日期值。
38、以班号和年龄从大到小的顺序查询Student表中的全部记录。
39、查询“男”教师及其所上的课程。
40、查询最高分同学的s_no、c_no和degree列。
41、查询和“李军”同性别的所有同学的s_name。
42、查询和“李军”同性别并同班的同学s_name。
43、查询所有选修“计算机导论”课程的“男”同学的成绩表。

4.答案

1、 查询学生表中的所有记录的s_name、s_sex和s-class列。

SELECT s_name,s_sex,s_class FROM 学生;

2、 查询教师所有的单位即不重复的depart列(去重后的教师职业)。

SELECT DISTINCT depart FROM 教师;

3、 查询学生表的所有记录。

SELECT * FROM 学生;

4、 查询分数表中成绩在60到80之间的所有记录。

SELECT * FROM 分数  WHERE degree BETWEEN 60 AND 80;

5、 查询分数表中成绩为85,86或88的记录。

SELECT * FROM 分数 WHERE degree IN(85,86,88);

6、 查询学生表中“95031”班或性别为“女”的同学记录。

SELECT * FROM 学生 WHERE s_class = 95031 OR s_sex = '女';

7、 以s_class降序查询学生表的所有记录。

SELECT * FROM 学生 ORDER BY `s_class` DESC;

8、 以c_no升序、degree降序查询分数表的所有记录。

SELECT * FROM 分数  ORDER BY c_no ,degree DESC; /*默认升序*/

9、 查询“95031”班的学生人数。

SELECT  COUNT(1) AS StnNum FROM 学生 WHERE s_class = '95031';

10、查询分数表中的最高分的学生学号和课程号。

SELECT s_no,c_no FROM 分数 ORDER BY degree DESC LIMIT 1; 

11、查询‘3-105’号课程的平均分。

SELECT AVG(degree) FROM 分数 WHERE c_no = '3-105';

12、查询Score表中至少有5名学生选修的并以3开头的课程的平均分数。

SELECT c_no, AVG(degree) FROM 分数 WHERE c_no LIKE '3%' GROUP BY c_no HAVING COUNT(s_no) >= 5;

13、查询最低分大于70,最高分小于90的s_no列。

SELECT s_no FROM 分数 GROUP BY s_no HAVING max(degree) < 90 AND min(degree)>70;

14.查询分数在70到90之间不包括70和90分的s_no列。

SELECT s_no FROM 分数 WHERE degree > 70 AND degree < 90;

15、查询所有学生的s_name、c_no和degree列。(INNER JOIN 关键字在表中存在至少一个匹配时返回行)

SELECT s_name,c_no,degree FROM 学生 INNER JOIN 分数 ON 学生.s_no = 分数.s_no ORDER BY s_name;

16、查询所有学生的s_name、c_name和degree列。

SELECT s_name,c_name,degree FROM 学生 INNER JOIN 分数 ON(学生.s_no = 分数.s_no) INNER JOIN 课程 ON(分数.c_no = 课程.c_no) ORDER BY c_name;

17、查询“95033”班所选课程的平均分。

SELECT c_name ,avg(degree) FROM 学生 INNER JOIN 分数 ON(学生.s_no = 分数.s_no) INNER JOIN 课程 ON(分数.c_no = 课程.c_no) WHERE s_class = '95033' GROUP BY 课程.c_no ORDER BY c_name;

18、假设使用如下命令建立了一个分数等级表,并设置分数等级:
CREATE TABLE 等级(
low TINYINT COMMENT '最低分',
upp TINYINT COMMENT '最高分',
rank CHAR(1) COMMENT '等级'
);
INSERT INTO 等级 VALUES(90,100,'A');
INSERT INTO 等级 VALUES(80,89,'B');
INSERT INTO 等级 VALUES(70,79,'C');
INSERT INTO 等级 VALUES(60,69,'D');
INSERT INTO 等级 VALUES(0,59,'E');
现查询所有同学的s_no、c_no和rank列。

SELECT s_no,c_no,rank FROM 分数 INNER JOIN 等级 ON(分数.degree >= 等级.low AND 分数.degree <= 等级.upp) ORDER BY s_no; 

19、查询选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录。

SELECT s1.s_no,s1.degree FROM 分数 AS s1 INNER JOIN 分数 AS s2 ON(s1.c_no = s2.c_no AND s1.degree > s2.degree) WHERE s1.c_no ='3-105' AND s2.s_no = '109' ORDER BY s1.s_no;

20、查询分数中选学一门以上课程的同学中分数为非最高分成绩的记录。

SELECT * FROM 分数 GROUP BY s_no HAVING count(c_no)>1 AND degree != max(degree);

21、查询和学号为101的同学同年出生的所有学生的s_no、s_name和s_birthday列。

SELECT s1.s_no,s1.s_name,s1.s_birthday FROM 学生 AS s1 INNER JOIN 学生 AS s2 ON(YEAR(s1.s_birthday) = YEAR(s2.s_birthday)) WHERE s2.s_no = '101';

22、查询“张旭“教师任课的学生成绩。

SELECT 学生.s_no, s_name,c_name,degree 
FROM 教师 
INNER JOIN 课程 ON(教师.t_no = 课程.t_no) 
INNER JOIN 分数 ON(课程.c_no = 分数.c_no) 
INNER JOIN 学生 ON(分数.s_no = 学生.s_no) 
WHERE 教师.t_name = '张旭' 
ORDER BY degree; 

23、查询选修某课程的同学人数多于5人的教师姓名。

SELECT t_name 
FROM 教师 
INNER JOIN 课程 ON(.教师.t_no = 课程.t_no) 
INNER JOIN 分数 ON(课程.c_no = 分数.c_no)
WHERE 课程.c_no IN (SELECT c_no FROM 分数 GROUP BY(c_no) HAVING count(分数.s_no) > 5)
ORDER BY 教师.t_no;

24、查询95033班和95031班全体学生的记录。

SELECT *
FROM 学生
WHERE s_class = '95033' OR s_class = '95031'
ORDER BY s_class;
或者
SELECT *
FROM 学生
WHERE s_class IN('95033','95031') 
ORDER BY s_class;

25、查询存在有85分以上成绩的课程c_no.

SELECT c_no
FROM 分数
WHERE degree > '85';

26、查询出“计算机系“教师所教课程的成绩表。

SELECT t_name,c_name ,s_name ,degree
FROM 教师
INNER JOIN 课程 ON(教师.t_no = 课程.t_no) 
INNER JOIN 分数 ON(课程.c_no = 分数.c_no)
INNER JOIN 学生 ON(学生.s_no = 分数.s_no)
WHERE depart = '计算机系' 
ORDER BY  t_name;

27、查询“计算机系”与“电子工程系“不同职称的教师的t_name 和 t_prof。

SELECT t_name,t_prof
FROM 教师
WHERE depart = '计算机系'
AND t_prof NOT IN (
SELECT t_prof
FROM 教师
WHERE depart = '电子工程系'
)
UNION
SELECT t_name,t_prof
FROM 教师
WHERE depart = '电子工程系'
AND t_prof NOT IN (
SELECT t_prof
FROM 教师
WHERE depart = '计算机系'
);
或者
SELECT t_name,t_prof 
FROM 教师 a 
WHERE t_prof NOT IN(
SELECT t_prof 
FROM 教师 b 
WHERE a.depart!=b.depart
);

28、查询选修编号为“3-105“课程且成绩至少高于选修编号为“3-245”的同学的c_no、s_no和degree,并按degree从高到低次序排序。

SELECT c_no,s_no,degree 
FROM 分数
WHERE c_no = '3-105' AND degree > ANY(
SELECT degree 
FROM 分数
WHERE c_no = '3-245'
)
ORDER BY degree DESC;

29、查询所有教师和同学的name、sex和birthday.

SELECT s_name,s_sex,s_birthday
FROM 学生
UNION
SELECT t_name,t_sex,t_birthday
FROM 教师;

30、查询所有“女”教师和“女”同学的name、sex和birthday.

SELECT s_name,s_sex,s_birthday
FROM 学生
WHERE s_sex = '女'
UNION
SELECT t_name,t_sex,t_birthday
FROM 教师
WHERE t_sex = '女';

31、查询成绩比该课程平均成绩低的同学的成绩表。

SELECT * 
FROM 分数 AS s1
WHERE s1.degree < (
SELECT avg(degree) 
FROM  分数 AS s2 
)
ORDER BY degree;
或
SELECT * 
FROM 分数 AS s1
WHERE s1.degree BETWEEN 0 AND (
SELECT avg(degree) 
FROM  分数 AS s2 
)
ORDER BY degree;

32、查询所有任课教师的t_name和depart.

SELECT t_name,depart 
FROM 教师
WHERE t_no IN(
SELECT t_no
FROM 课程
);

33 查询所有未讲课的教师的t_name和depart.

SELECT t_name,depart 
FROM 教师
WHERE t_no NOT IN(
SELECT t_no
FROM 课程
);

34、查询至少有2名男生的班号。

SELECT s_class
FROM 学生
WHERE s_sex = '男'
GROUP BY s_class 
HAVING count(s_no) > 1;

35、查询学生表中不姓“王”的同学记录。

SELECT * 
FROM 学生
WHERE s_name NOT LIKE('王%');

36、查询学生表中每个学生的姓名和年龄。

SELECT s_name,YEAR(now()) - YEAR(s_birthday) AS s_age 
FROM 学生;

37、查询学生表中最大和最小的s_birthday日期值。

SELECT max(s_birthday) AS maxb, min(s_birthday) AS minb
FROM 学生;

38、以班号和年龄从大到小的顺序查询Student表中的全部记录。

SELECT * FROM 学生 ORDER BY s_class DESC, s_birthday ASC;

39、查询“男”教师及其所上的课程。

SELECT t_name,c_name
FROM 课程
INNER JOIN 教师 ON (教师.t_no = 课程.t_no)
WHERE t_sex = '男';

40、查询最高分同学的s_no、c_no和degree列。

SELECT s_no,c_no,degree
FROM 分数
GROUP BY c_no
HAVING degree = max(degree);

41、查询和“李军”同性别的所有同学的s_name.

SELECT s1.s_name
FROM 学生 s1
INNER JOIN 学生 s2 ON(s1.s_sex = s2.s_sex)
WHERE s2.s_name = '李军';

42、查询和“李军”同性别并同班的同学s_name.

SELECT s1.s_name
FROM 学生 s1
INNER JOIN 学生 s2 ON(s1.s_sex = s2.s_sex AND s1.s_class = s2.s_class)
WHERE s2.s_name = '李军';

43、查询所有选修“计算机导论”课程的“男”同学的成绩表

SELECT * 
FROM 分数
WHERE s_no IN(
SELECT s_no 
FROM 学生
WHERE s_sex = '男')
AND c_no IN(
SELECT c_no 
FROM 课程
WHERE c_name = '计算机导论'
);

你可能感兴趣的:(SQL经典试题,自己一一做过(有所改动))