SQL经典45题解答

题目出自网络。
作为自己学习的总结也是记录,如果有错误,欢迎指正。

CREATE TABLE STUDENT(
	SNO VARCHAR(3) NOT NULL, 
	SNAME VARCHAR(4) NOT NULL,
	SSEX VARCHAR(2) NOT NULL, 
	SBIRTHDAY DATETIME,
	CLASS VARCHAR(5)
);
CREATE TABLE COURSE(
	CNO VARCHAR(5) NOT NULL, 
	CNAME VARCHAR(10) NOT NULL, 
	TNO VARCHAR(10) NOT NULL
);
CREATE TABLE SCORE(
	SNO VARCHAR(3) NOT NULL, 
	CNO VARCHAR(5) NOT NULL, 
	DEGREE NUMERIC(10, 1) NOT NULL
);
CREATE TABLE TEACHER(
	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
);

INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (108 ,'曾华' ,'男' ,'1977-09-01',95033);
INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (105 ,'匡明' ,'男' ,'1975-10-02',95031);
INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (107 ,'王丽' ,'女' ,'1976-01-23',95033);
INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (101 ,'李军' ,'男' ,'1976-02-20',95033);
INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (109 ,'王芳' ,'女' ,'1975-02-10',95031);
INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (103 ,'陆君' ,'男' ,'1974-06-03',95031);

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

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

INSERT INTO TEACHER(TNO,TNAME,TSEX,TBIRTHDAY,PROF,DEPART) VALUES (804,'李诚','男','1958-12-02','副教授','计算机系');
INSERT INTO TEACHER(TNO,TNAME,TSEX,TBIRTHDAY,PROF,DEPART) VALUES (856,'张旭','男','1969-03-12','讲师','电子工程系');
INSERT INTO TEACHER(TNO,TNAME,TSEX,TBIRTHDAY,PROF,DEPART)VALUES (825,'王萍','女','1972-05-05','助教','计算机系');
INSERT INTO TEACHER(TNO,TNAME,TSEX,TBIRTHDAY,PROF,DEPART) VALUES (831,'刘冰','女','1977-08-14','助教','电子工程系');

表之间的结构如图:
在这里插入图片描述
1、 查询Student表中的所有记录的Sname、Ssex和Class列。
2、 查询教师所有的单位即不重复的Depart列。
3、 查询Student表的所有记录。
4、 查询Score表中成绩在60到80之间的所有记录。
5、 查询Score表中成绩为85,86或88的记录。
6、 查询Student表中“95031”班或性别为“女”的同学记录。
7、 以Class降序查询Student表的所有记录。
8、 以Cno升序、Degree降序查询Score表的所有记录。
9、 查询“95031”班的学生人数。
10、查询Score表中的最高分的学生学号和课程号。
11、查询‘3-105’号课程的平均分。
12、查询Score表中至少有5名学生选修的并以3开头的课程的平均分数。
13、查询最低分大于70,最高分小于90的Sno列。
14、查询所有学生的Sname、Cno和Degree列。
15、查询所有学生的Sno、Cname和Degree列。
16、查询所有学生的Sname、Cname和Degree列。
17、查询“95033”班所选课程的平均分。
18、假设使用如下命令建立了一个grade表:

create table grade(low   number(3,0),upp   number(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列。
19、查询选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录。
20、查询score中选学一门以上课程的同学中分数为非最高分成绩的记录。
21、查询成绩高于学号为“109”、课程号为“3-105”的成绩的所有记录。
22、查询和学号为108的同学同年出生的所有学生的Sno、Sname和Sbirthday列。
23、查询“张旭“教师任课的学生成绩。
24、查询选修某课程的同学人数多于5人的教师姓名。
25、查询95033班和95031班全体学生的记录。
26、查询存在有85分以上成绩的课程Cno.
27、查询出“计算机系“教师所教课程的成绩表。
28、查询“计算机系”与“电子工程系“不同职称的教师的Tname和Prof。
29、查询选修编号为“3-105“课程且成绩至少高于选修编号为“3-245”的同学的Cno、Sno和Degree,并按Degree从高到低次序排序。
30、查询选修编号为“3-105”且成绩高于选修编号为“3-245”课程的同学的Cno、Sno和Degree.
31、查询所有教师和同学的name、sex和birthday.
32、查询所有“女”教师和“女”同学的name、sex和birthday.
33、查询成绩比该课程平均成绩低的同学的成绩表。
34、查询所有任课教师的Tname和Depart.
35 查询所有未讲课的教师的Tname和Depart.
36、查询至少有2名男生的班号。
37、查询Student表中不姓“王”的同学记录。
38、查询Student表中每个学生的姓名和年龄。
39、查询Student表中最大和最小的Sbirthday日期值。
40、以班号和年龄从大到小的顺序查询Student表中的全部记录。
41、查询“男”教师及其所上的课程。
42、查询最高分同学的Sno、Cno和Degree列。
43、查询和“李军”同性别的所有同学的Sname.
44、查询和“李军”同性别并同班的同学Sname.
45、查询所有选修“计算机导论”课程的“男”同学的成绩表

参考答案:

-- 1、 查询Student表中的所有记录的Sname、Ssex和Class列。
SELECT
	stu.`SNAME`,
	stu.`SSEX`,
	stu.`CLASS`
FROM
	student stu;
-- 2、 查询教师所有的单位即不重复的Depart列。
SELECT
DISTINCT
	tea.`DEPART`
FROM
	TEACHER tea;
-- 3、 查询Student表的所有记录。
SELECT
	*
FROM
	student;
-- 4、 查询Score表中成绩在60到80之间的所有记录。
SELECT
	*
FROM
	SCORE sco
WHERE
	sco.`DEGREE` BETWEEN 60 AND 80;
-- 5、 查询Score表中成绩为85,86或88的记录。
SELECT
	*
FROM
	SCORE sco
WHERE
	sco.`DEGREE` IN (85, 86, 88);
-- 6、 查询Student表中“95031”班或性别为“女”的同学记录。
SELECT
	*
FROM
	STUDENT stu
WHERE
	stu.`CLASS`='95031' OR stu.`SSEX`='女';
-- 7、 以Class降序查询Student表的所有记录。
SELECT
	*
FROM
	STUDENT stu
ORDER BY
	stu.`CLASS` DESC;
-- 8、 以Cno升序、Degree降序查询Score表的所有记录。
-- 涉及到多个条件的排序,中间用逗号,而不是AND
SELECT
	*
FROM
	SCORE sco
ORDER BY
	sco.`CNO` ASC, sco.`DEGREE` DESC;
-- 9、 查询“95031”班的学生人数。
SELECT
	COUNT(stu.`SNO`)
FROM
	STUDENT stu
WHERE
	stu.`CLASS`='95031';
-- 10、查询Score表中的最高分的学生学号和课程号。

-- 1) 查询出score表中的最高分
SELECT
	MAX(score.`DEGREE`)
FROM
	score;

-- 2) 将1)的结果作为2)的条件
SELECT
	score.`SNO`,
	score.`CNO`
FROM
	score
WHERE
	score.`DEGREE`=(
		SELECT
			MAX(score.`DEGREE`)
		FROM
			score
	);
-- 11、查询‘3-105’号课程的平均分。
SELECT
	AVG(sco.`DEGREE`)
FROM
	COURSE cou,
	SCORE sco
WHERE
	cou.`CNO`=sco.`CNO` AND cou.`CNO`='3-105';
-- 12、查询Score表中至少有5名学生选修的并 以3开头的课程 的平均分数。	
SELECT
	AVG(sco.`DEGREE`)
FROM
	SCORE sco,
	COURSE cou
WHERE
	sco.`CNO` LIKE '3%' AND sco.`CNO`=cou.`CNO`
HAVING
	COUNT(sco.`SNO`)>5;
-- 13、查询最低分大于70,最高分小于90的Sno列。(存疑)
SELECT
	sco.`SNO`,
	sco.`DEGREE`
FROM
	score sco
WHERE
	sco.`DEGREE` BETWEEN 70 AND 90;
	
SELECT Sno
FROM Score
GROUP BY Sno
HAVING MAX(Degree)<90 AND MIN(Degree)>70;
-- 14、查询所有学生的Sname、Cno和Degree列。
SELECT
	stu.`SNAME`,
	cou.`CNO`,
	sco.`DEGREE`
FROM
	STUDENT stu,
	COURSE cou,
	SCORE sco;
-- 15、查询所有学生的Sno、Cname和Degree列。
SELECT
	stu.`SNO`,
	cou.`CNAME`,
	sco.`DEGREE`
FROM
	STUDENT stu,
	COURSE cou,
	SCORE sco;
-- 16、查询所有学生的Sname、Cname和Degree列。
SELECT
	stu.`SNAME`,
	cou.`CNAME`,
	sco.`DEGREE`
FROM
	STUDENT stu,
	COURSE cou,
	SCORE sco;
-- 17、查询“95033”班所选课程的平均分。
SELECT
	AVG(sco.`DEGREE`)
FROM
	STUDENT stu,
	SCORE sco
WHERE
	stu.`SNO`=sco.`SNO` AND CLASS='95033';

/*
18、假设使用如下命令建立了一个grade表:
create table grade(
	low number(3,0),
	upp number(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列。
*/
-- 准备表
CREATE TABLE grade(
	low NUMERIC(10, 1),
	upp NUMERIC(10, 1),
	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 * FROM grade;
DESC grade;

SELECT
	sco.`SNO`,
	sco.`CNO`,
	gra.`rank`
FROM
	SCORE sco,
	grade gra
WHERE
	sco.`DEGREE` BETWEEN gra.`low` AND gra.`upp`;
-- 19、查询 选修“3-105”课程的成绩中高于 “109”号同学成绩 的所有同学的记录。
-- 1)作为2)的查询子表
-- 1)查询选修‘3-105’课程的‘109’号同学的成绩
SELECT
	sco.`DEGREE`
FROM
	score sco
WHERE
	sco.`CNO`='3-105' AND sco.`SNO`='109';

-- 2) 查询 选修“3-105”课程的成绩中高于 “109”号同学成绩 的所有同学的记录
SELECT
	*
FROM
	score sco
WHERE
	sco.`DEGREE`>(
		SELECT
			sco.`DEGREE`
		FROM
			score sco
		WHERE
			sco.`CNO`='3-105' AND sco.`SNO`='109'
	) AND sco.`CNO`='3-105';
-- 20、查询score中选学一门以上课程的同学中分数为非最高分成绩的记录。
-- 1)查询出最高分,作为2)的条件	
SELECT
	MAX(score.`DEGREE`)
FROM
	score;

-- 2)查询score中选学一门以上课程的同学中分数为非最高分成绩的记录
SELECT
	*
FROM
	score
WHERE
	score.`DEGREE`<>(
		SELECT
			MAX(score.`DEGREE`)
		FROM
			score
	)
HAVING
	COUNT(score.`CNO`)>1;

后补充

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值