SQL测试题(注:最佳答案必须能在MySQL下运行)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL测试题(注:最佳答案必须能在MySQL下运行)相关的知识,希望对你有一定的参考价值。
本人所使用的数据库是mysql 6.0,所以需要最佳答案能在MySQL下正确运行!
题目如下:
题目1
问题描述:
为管理岗位业务培训信息,建立3个表:
S (S#,SN,SD,SA) S#,SN,SD,SA 分别代表学号、学员姓名、所属单位、学员年龄
C (C#,CN ) C#,CN 分别代表课程编号、课程名称
SC ( S#,C#,G ) S#,C#,G 分别代表学号、所选修的课程编号、学习成绩
1. 使用标准SQL嵌套语句查询选修课程名称为’税收基础’的学员学号和姓名
2. 使用标准SQL嵌套语句查询选修课程编号为’C2’的学员姓名和所属单位
3. 使用标准SQL嵌套语句查询不选修课程编号为’C5’的学员姓名和所属单位
4. 使用标准SQL嵌套语句查询选修全部课程的学员姓名和所属单位
5. 查询选修了课程的学员人数
6. 查询选修课程超过5门的学员学号和所属单位
题目2
问题描述:
已知关系模式:
S (SNO,SNAME) 学生关系。SNO 为学号,SNAME 为姓名
C (CNO,CNAME,CTEACHER) 课程关系。CNO 为课程号,CNAME 为课程名,CTEACHER 为任课教师
SC(SNO,CNO,SCGRADE) 选课关系。SCGRADE 为成绩
1. 找出没有选修过“李明”老师讲授课程的所有学生姓名
2. 列出有二门以上(含两门)不及格课程的学生姓名及其平均成绩
3. 列出既学过“1”号课程,又学过“2”号课程的所有学生姓名
4. 列出“1”号课成绩比“2”号同学该门课成绩高的所有学生的学号
5. 列出“1”号课成绩比“2”号课成绩高的所有学生的学号及其“1”号课和“2”号课的成绩
这个问题我发了两次,一次是发在在这里“其他编程语言区”,另一个发在“JAVA相关区”,若答对的话也请去“JAVA相关区”解答,那样我全采纳为答案后您所得的分数为(30(这是我给的悬赏分)+20(这是百度给的))*2(因为有两个)=100分,我觉得该问题就值这么多分!
闲着没事,瞅瞅百度上的问题,今天天晚了,先解决一个,另一个明儿个再说了!
第二道题也算已经搞定了!
环境 : mysql Ver 14.12 Distrib 5.0.45, for Win32 (ia32)
参考 :
exist与in 的区别
http://blog.csdn.net/change888/archive/2008/03/31/2232778.aspx
*/
/*********************************问题 1 **************************************/
drop table if exists s;
create table if not exists s (s varchar(32), sn varchar(32), sd varchar(32),
sa int);
insert into s values ('s1', '朱', '开发本部', 23);
insert into s values ('s2', '牛', '人事部', 25);
insert into s values ('s3', '杨', '财务部', 26);
insert into s values ('s4', '马', '开发本部', 22);
insert into s values ('s5', '吕', '人事部', 27);
insert into s values ('s6', '于', '开发本部', 28);
insert into s values ('s7', '侯', '开发本部', 28);
drop table if exists c;
create table if not exists c (c varchar(32), cn varchar(32));
insert into c values ('c1', '软件工程');
insert into c values ('c2', '计算机技术与科学');
insert into c values ('c3', '车辆工程');
drop table if exists sc;
create table if not exists sc (s varchar(32), c varchar(32));
insert into sc values ('s1', 'c1');
insert into sc values ('s1', 'c2');
insert into sc values ('s1', 'c3');
insert into sc values ('s2', 'c1');
insert into sc values ('s2', 'c3');
insert into sc values ('s3', 'c2');
insert into sc values ('s4', 'c2');
insert into sc values ('s4', 'c3');
insert into sc values ('s5', 'c1');
insert into sc values ('s6', 'c3');
/* 1. 查询选修课程名称为 “软件工程” 的学员学号和姓名 */
select s.s '学号', s.sn '姓名' from s where s.s in
(select sc.s from sc where sc.c in
(select c.c from c where c.cn = '软件工程'));
/* 2. 查询选修课程编号为 “C2” 的学员姓名和所属单位 */
select s.sn '姓名', s.sd '所属单位' from s where s.s in
(select sc.s from sc where sc.c = 'C2');
/* 3. 查询选修课程编号 不 为 “C2” 的学员姓名和所属单位 */
select s.sn '姓名', s.sd '所属单位' from s where
s.s not in (select sc.s from sc where sc.c = 'C2')
and
s.s in (select sc.s from sc);
/* 4. 查询选修全部课程的学员姓名和所属单位 */
select s.sn '姓名', s.sd '所属单位' from s where
(select count(DISTINCT sc.c) from sc where sc.s = s.s)
=
(select count(DISTINCT c.c) from c );
/* 5. 查询选修了课程的学员人数 */
select count(DISTINCT sc.s) '人数' from sc;
/* 6. 查询选修课程 >= 2 门的学员学号和所属单位 (不得不用 CASE 语句了)*/
select s.sn '姓名', s.sd '所属单位' from s where s.s in
(select CASE WHEN count(DISTINCT sc.c) >=2 THEN sc.s END from sc group by sc.s );
/* 运行结果
------------------------------------1
+------+------+
| 学号 | 姓名 |
+------+------+
| s1 | 朱 |
| s2 | 牛 |
| s5 | 吕 |
+------+------+
------------------------------------2
+------+----------+
| 姓名 | 所属单位 |
+------+----------+
| 朱 | 开发本部 |
| 杨 | 财务部 |
| 马 | 开发本部 |
+------+----------+
------------------------------------3
+------+----------+
| 姓名 | 所属单位 |
+------+----------+
| 牛 | 人事部 |
| 吕 | 人事部 |
| 于 | 开发本部 |
+------+----------+
------------------------------------4
+------+----------+
| 姓名 | 所属单位 |
+------+----------+
| 朱 | 开发本部 |
+------+----------+
------------------------------------5
+------+
| 人数 |
+------+
| 6 |
+------+
------------------------------------6
+------+----------+
| 姓名 | 所属单位 |
+------+----------+
| 朱 | 开发本部 |
| 牛 | 人事部 |
| 马 | 开发本部 |
+------+----------+
*/
/*********************************问题 2 **************************************/
drop table if exists s ;
create table if not exists s ( sno varchar(32), sname varchar(32));
insert into s values ('s1', '朱');
insert into s values ('s2', '牛');
insert into s values ('s3', '杨');
insert into s values ('s4', '马');
insert into s values ('s5', '吕');
insert into s values ('s6', '于');
insert into s values ('s7', '侯');
drop table if exists c;
create table if not exists c ( cno varchar(32), cname varchar(32),
cteacher varchar(32));
insert into c values ('c1', '数学', '张');
insert into c values ('c2', '日语', '李'); /*假设李老师同时教授日语和英语*/
insert into c values ('c3', '英语', '李');
drop table if exists sc;
create table if not exists sc (sno varchar(32), cno varchar(32),
scgrade double);
insert into sc values ('s1', 'c1', 75);
insert into sc values ('s1', 'c2', 70);
insert into sc values ('s1', 'c3', 80);
insert into sc values ('s2', 'c1', 50);
insert into sc values ('s2', 'c3', 40);
insert into sc values ('s3', 'c1', 50);
insert into sc values ('s3', 'c2', 60);
insert into sc values ('s4', 'c1', 90);
insert into sc values ('s4', 'c2', 40);
insert into sc values ('s4', 'c3', 20);
insert into sc values ('s5', 'c1', 80);
insert into sc values ('s6', 'c1', 85);
/* 1. 没有 选 修过“李”老师讲授课程的所有学生姓名 */
select s.sname '姓名' from s where s.sno not in
(select sc.sno from sc where sc.cno in
(select c.cno from c where c.cteacher = '李'));
/* 2. 列出有二门以上(含两门)不及格课程的学生姓名及其平均成绩 */
select s.sname '姓名', AVG(sc.scgrade) '平均成绩' from s, sc
where s.sno = sc.sno
and
(select count(sc.sno) from sc where sc.sno = s.sno
and sc.scgrade < 60 ) >= 2
group by s.sno;
/* 3. 列出既学过“C1”号课程,又学过“C2”号课程的所有学生姓名 */
select s.sname '姓名' from s where s.sno in
(select t1.sno from sc t1, sc t2
where t1.sno = t2.sno and t1.cno = 'c1' and t2.cno = 'c2');
/*或者*/
select s.sname '姓名' from s where s.sno in
(select sc.sno from sc where sc.cno = 'c1' and sc.sno in
(select t1.sno from sc t1 where t1.cno = 'c2'));
/* 4. 列出“C1”号课成绩比“C2”号同学该门课成绩高的所有学生的学号 */
select t1.sno '学号' from sc t1, sc t2
where t1.sno = t2.sno and t1.cno = 'c1'
and t2.cno = 'c2' and t1.scgrade > t2.scgrade;
/* 5. 列出“C1”成绩比“C2”成绩高的学生的学号及其“C1”和“C2”的成绩 */
select t1.sno '学号', t1.scgrade 'C1成绩', t2.scgrade 'C2成绩' from sc t1, sc t2
where t1.sno = t2.sno and t1.cno = 'c1'
and t2.cno = 'c2' and t1.scgrade > t2.scgrade;
/* 运行结果
------------------------------------1
+------+
| 姓名 |
+------+
| 吕 |
| 于 |
| 侯 |
+------+
------------------------------------2
+------+----------+
| 姓名 | 平均成绩 |
+------+----------+
| 牛 | 45 |
| 马 | 50 |
+------+----------+
------------------------------------3
+------+
| 姓名 |
+------+
| 朱 |
| 杨 |
| 马 |
+------+
------------------------------------4
+------+
| 学号 |
+------+
| s1 |
| s4 |
+------+
------------------------------------5
+------+--------+--------+
| 学号 | C1成绩 | C2成绩 |
+------+--------+--------+
| s1 | 75 | 70 |
| s4 | 90 | 40 |
+------+--------+--------+
*/ 参考技术A 老兄 这些都是基本的语言编写啊 参考技术B 帮你写作业说这不好200分拿来我写 参考技术C 悬赏分值太低! 参考技术D 附议
30道经典SQL试题(MySQL版,附答案)
📢📢📢📣📣📣
哈喽!大家好,我是【莫若心】,一位上进心十足的【大数据领域博主】!😜😜😜
擅长主流数据Oracle、MySQL、PG 运维开发
✨ 如果有对【数据库】感兴趣的【小可爱】,欢迎关注💞💞💞
❤️❤️❤️感谢各位大可爱小可爱!❤️❤️❤️
文章目录
🐴 1.环境准备
🌈1.1 建表
🚀🚀🚀 学生表
create table student(
no VARCHAR(20) primary key COMMENT ‘学号’,
name VARCHAR(20) NOT NULL COMMENT ‘姓名’,
sex char(1) not null COMMENT ‘姓名’,
birthday DATE COMMENT ‘生日’,
class VARCHAR(20) COMMENT ‘班级’
) CHARSET=utf8mb4 comment ‘学生表’
🚀🚀🚀 教师表
CREATE TABLE teacher (
no VARCHAR(20) PRIMARY KEY COMMENT ‘教师编号’,
name VARCHAR(20) NOT NULL COMMENT ‘姓名’,
sex VARCHAR(10) NOT NULL COMMENT ‘性别’,
birthday DATE COMMENT ‘出生日期’,
profession VARCHAR(20) NOT NULL COMMENT ‘职称’,
department VARCHAR(20) NOT NULL COMMENT ‘部门’
) charset=utf8mb4 COMMENT ‘教师表’;
🚀🚀🚀 课程表
CREATE TABLE course (
no VARCHAR(20) PRIMARY KEY,
name VARCHAR(20) NOT NULL,
t_no VARCHAR(20) NOT NULL, – 教师编号
– 表示该 t_no 来自于 teacher 表中的 no 字段值
FOREIGN KEY(t_no) REFERENCES teacher(no)
);
🚀🚀🚀 成绩表
CREATE TABLE score (
s_no VARCHAR(20) NOT NULL, – 学生编号
c_no VARCHAR(20) NOT NULL, – 课程号
degree DECIMAL, – 成绩
– 表示该 s_no, c_no 分别来自于 student, course 表中的 no 字段值
FOREIGN KEY(s_no) REFERENCES student(no),
FOREIGN KEY(c_no) REFERENCES course(no),
– 设置 s_no, c_no 为联合主键
PRIMARY KEY(s_no, c_no)
);
🌈1.2 插入数据
– 添加学生表数据
INSERT INTO student VALUES(‘101’, ‘曾华’, ‘男’, ‘1977-09-01’, ‘95033’);
INSERT INTO student VALUES(‘102’, ‘匡明’, ‘男’, ‘1975-10-02’, ‘95031’);
INSERT INTO student VALUES(‘103’, ‘王丽’, ‘女’, ‘1976-01-23’, ‘95033’);
INSERT INTO student VALUES(‘104’, ‘李军’, ‘男’, ‘1976-02-20’, ‘95033’);
INSERT INTO student VALUES(‘105’, ‘王芳’, ‘女’, ‘1975-02-10’, ‘95031’);
INSERT INTO student VALUES(‘106’, ‘陆军’, ‘男’, ‘1974-06-03’, ‘95031’);
INSERT INTO student VALUES(‘107’, ‘王飘飘’, ‘男’, ‘1976-02-20’, ‘95033’);
INSERT INTO student VALUES(‘108’, ‘张全蛋’, ‘男’, ‘1975-02-10’, ‘95031’);
INSERT INTO student VALUES(‘109’, ‘赵铁柱’, ‘男’, ‘1974-06-03’, ‘95031’);
– 添加教师表数据
INSERT INTO teacher VALUES(‘804’, ‘李诚’, ‘男’, ‘1958-12-02’, ‘副教授’, ‘计算机系’);
INSERT INTO teacher VALUES(‘856’, ‘张旭’, ‘男’, ‘1969-03-12’, ‘讲师’, ‘电子工程系’);
INSERT INTO teacher VALUES(‘825’, ‘王萍’, ‘女’, ‘1972-05-05’, ‘助教’, ‘计算机系’);
INSERT INTO teacher VALUES(‘831’, ‘刘冰’, ‘女’, ‘1977-08-14’, ‘助教’, ‘电子工程系’);
– 添加课程表数据
INSERT INTO course VALUES(‘3-105’, ‘计算机导论’, ‘825’);
INSERT INTO course VALUES(‘3-245’, ‘操作系统’, ‘804’);
INSERT INTO course VALUES(‘6-166’, ‘数字电路’, ‘856’);
INSERT INTO course VALUES(‘9-888’, ‘高等数学’, ‘831’);
– 添加添加成绩表数据
INSERT INTO score VALUES(‘103’, ‘3-105’, ‘92’);
INSERT INTO score VALUES(‘103’, ‘3-245’, ‘86’);
INSERT INTO score VALUES(‘103’, ‘6-166’, ‘85’);
INSERT INTO score VALUES(‘105’, ‘3-105’, ‘88’);
INSERT INTO score VALUES(‘105’, ‘3-245’, ‘75’);
INSERT INTO score VALUES(‘105’, ‘6-166’, ‘79’);
INSERT INTO score VALUES(‘109’, ‘3-105’, ‘76’);
INSERT INTO score VALUES(‘109’, ‘3-245’, ‘68’);
INSERT INTO score VALUES(‘109’, ‘6-166’, ‘81’);
🐴 2.基础查询
🚀 1.查询 student 表的所有行
select * from student
🚀 2.查询 student 表中的 name、sex 和 class 字段的所有行
select name,sex,class from student;
🚀 3.查询 teacher 表中不重复的 department 列
select DISTINCT department from teacher;
🚀 4.查询 score 表中成绩在 50-80 之间的所有行
select * from score where degree BETWEEN 50 and 80;
select * from score where degree >=50 and degree <=80;
🚀 5.查询 score 表中成绩为 85, 86 或 88 的行
select * from score where degree in (85,86,88);
select * from score where degree =85 or degree=86 or degree =88;
🚀 6.查询 student 表中 ‘95033’ 班或性别为 ‘女’ 的所有行
select * from student where class=95033 or sex =‘女’;
🚀 7.以 class 降序的方式查询 student 表的所有行
select * from student order by class desc
🚀 8.查询 “95031” 班的学生人数
select * from student where class=95031
🚀 9.查询 score 表中的最高分的学生学号和课程编号
select s_no,c_no from score where degree = (select max(degree) from score);
select s_no,c_no from score order by degree desc LIMIT 1;
🐴 3.分组计算
🚀 1. 查询每门课的成绩平均成绩
select c_no,avg(degree) as avg from score group by c_no
🚀 2. 查询 score 表中至少有 2 名学生选修,并以 3 开头的课程的平均分数
select c_no,avg(degree) avg from score group by c_no
having count(c_no) >=2
and c_no like ‘3%’
select c_no,avg(degree) avg from score where c_no like ‘3%’
group by c_no having count(*) >2
🚀 3. 查询student表中至少有3名男生的class
select class from student where sex = ‘男’
GROUP BY class
having count(*) >3
🐴 4.多表关联
🚀 1.查询所有学生的 name,以及该学生在 score 表中对应的 c_no 和 degree
select b.c_no,b.degree from student a,score b
where a.no
= b.s_no
🚀 2.查询所有任课 ( 在 course 表里有课程 ) 教师的 name 和 department
select m.
name
,m.department from teacher m,course n
where m.no = n.t_no
🚀 3.查询所有学生的 name 、课程名 ( course 表中的 name ) 和 degree
select a.
name
,b.name as kecheng,c.degree from student a,course b,score c
where a.no = c.s_no
and b.no = c.c_no
🚀 4.查询所有学生的 no 、课程名称 ( course 表中的 name ) 和成绩 ( score 表中的 degree ) 列
select a.
no
,b.name as kecheng,c.degree from student a,course b,score c
where a.no = c.s_no
and b.no = c.c_no
🐴 5.子查询
🚀 1.查询95031班的学生每门课程的平均成绩
select c_no,avg(degree) avg from score
where s_no in (select no from student where class=95031)
group by c_no
🚀 2.查询所有成绩高于 109 号同学的 3-105 课程成绩记录
select * from score where degree > (
select degree from score where c_no = ‘3-105’ and s_no =‘109’)
🚀 3.查询 “计算机系” 课程的成绩表
select * from score where c_no in (
select no from course where t_no in (
select no from teacher where department =‘计算机系’
)
)
🚀 4.查询某选修课程多于 5 个同学的教师姓名
select name from teacher where no in
(
select t_no from course where no in (
select c_no from score group by c_no HAVING count(*)>5
)
🐴 6.ANY/ALL用法
🚀 1.查询课程3-105且成绩至少高3-245的score信息,成绩降序
SELECT * FROM score
WHERE c_no = ‘3-105’
AND degree >
ANY ( SELECT degree FROM score WHERE c_no = ‘3-245’ ) order by degree desc
any:表示至少一个,子查询的最小值
🚀 2.查询课程3-105且成绩高于3-345的score信息
SELECT * FROM score
WHERE c_no = ‘3-105’
AND degree > ALL ( SELECT degree FROM score WHERE c_no = ‘3-245’ )
ALL:所有值,子查询最大值
🐴 7.自连接
🚀 查询某课程成绩比该课程平均成绩低的score信息
select * from score a where a.degree <
(
select avg(degree) from score b where a.c_no = b.c_no
)
🐴 8.自连接
🚀 1 查询studnet表中年龄最大的和年龄最小
select max(birthday),min(birthday) from student
🚀 2 查询student表中每个学生的姓名和年龄
select name,year(now())-YEAR(birthday) as age from student
🚀 3 查询最高分同学的成绩
select * from score where
degree = (select max(degree) from score)
🚀 4 时间函数
select DAYOFWEEK(now())
select DAYOFYEAR(now()); ##返回当年第多少天
select HOUR(now()); ##返回时间本周第几天
select DAYOFWEEK(now())
select DAYOFYEAR(now()); ##返回当年第多少天
select HOUR(now()); ##返回时间本周第几天
🐴 9.排名统计
注:开窗函数只在mysql8.0以上才有
🚀 1.scores_tb根据成绩从高到低排序,row_number
select a.xuehao,a.score,
row_number() over(order by a.score desc) as row_id
from scores_tb a
🚀 2.scores_tb根据成绩从高到低排序,dense_rank无间隔
select a.xuehao,a.score,
row_number() over(order by a.score desc) as row_id
from scores_tb a
🚀 3.scores_tb根据成绩从高到低排序,RANK有间隔
select a.xuehao,a.score,
RANK() over(order by a.score desc) as row_id
from scores_tb a
🚀🚀🚀🚀 体系化掌握SQL,关注以下博客
https://blog.csdn.net/weixin_41645135/category_11653817.html
大家点赞、收藏、关注、评论啦 👇🏻👇🏻👇🏻
以上是关于SQL测试题(注:最佳答案必须能在MySQL下运行)的主要内容,如果未能解决你的问题,请参考以下文章