数据库经典50道题

这是一系列关于SQL查询的实战题目,涵盖了学生、课程、教师和成绩表的多种查询场景,包括成绩对比、平均分计算、课程选修情况、教师授课统计等多个方面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

-- 建表
-- 学生表
CREATE TABLE `Student`(
 `s_id` VARCHAR(20),
 `s_name` VARCHAR(20) NOT NULL DEFAULT '',
 `s_birth` VARCHAR(20) NOT NULL DEFAULT '',
 `s_sex` VARCHAR(10) NOT NULL DEFAULT '',
 PRIMARY KEY(`s_id`)
);
-- 课程表
CREATE TABLE `Course`(
 `c_id` VARCHAR(20),
 `c_name` VARCHAR(20) NOT NULL DEFAULT '',
 `t_id` VARCHAR(20) NOT NULL,
 PRIMARY KEY(`c_id`)
);
-- 教师表
CREATE TABLE `Teacher`(
 `t_id` VARCHAR(20),
 `t_name` VARCHAR(20) NOT NULL DEFAULT '',
 PRIMARY KEY(`t_id`)
);
-- 成绩表
CREATE TABLE `Score`(
 `s_id` VARCHAR(20),
 `c_id` VARCHAR(20),
 `s_score` INT(3),
 PRIMARY KEY(`s_id`,`c_id`)
);

-- 学生表测试数据
INSERT INTO Student VALUES('01' , '赵雷' , '1990-01-01' , '男');
INSERT INTO Student VALUES('02' , '钱电' , '1990-12-21' , '男');
INSERT INTO Student VALUES('03' , '孙风' , '1990-05-20' , '男');
INSERT INTO Student VALUES('04' , '李云' , '1990-08-06' , '男');
INSERT INTO Student VALUES('05' , '周梅' , '1991-12-01' , '女');
INSERT INTO Student VALUES('06' , '吴兰' , '1992-03-01' , '女');
INSERT INTO Student VALUES('07' , '郑竹' , '1989-07-01' , '女');
INSERT INTO Student VALUES('08' , '王菊' , '1990-01-20' , '女');

SELECT * FROM Student

-- 课程表测试数据
INSERT INTO Course VALUES('01' , '语文' , '02');
INSERT INTO Course VALUES('02' , '数学' , '01');
INSERT INTO Course VALUES('03' , '英语' , '03');

SELECT * FROM Course

-- 教师表测试数据
INSERT INTO Teacher VALUES('01' , '张三');
INSERT INTO Teacher VALUES('02' , '李四');
INSERT INTO Teacher VALUES('03' , '王五');

SELECT * FROM Teacher

-- 成绩表测试数据
INSERT INTO Score VALUES('01' , '01' , 80);
INSERT INTO Score VALUES('01' , '02' , 90);
INSERT INTO Score VALUES('01' , '03' , 99);
INSERT INTO Score VALUES('02' , '01' , 70);
INSERT INTO Score VALUES('02' , '02' , 60);
INSERT INTO Score VALUES('02' , '03' , 80);
INSERT INTO Score VALUES('03' , '01' , 80);
INSERT INTO Score VALUES('03' , '02' , 80);
INSERT INTO Score VALUES('03' , '03' , 80);
INSERT INTO Score VALUES('04' , '01' , 50);
INSERT INTO Score VALUES('04' , '02' , 30);
INSERT INTO Score VALUES('04' , '03' , 20);
INSERT INTO Score VALUES('05' , '01' , 76);
INSERT INTO Score VALUES('05' , '02' , 87);
INSERT INTO Score VALUES('06' , '01' , 31);
INSERT INTO Score VALUES('06' , '03' , 34);
INSERT INTO Score VALUES('07' , '02' , 89);
INSERT INTO Score VALUES('07' , '03' , 98);

SELECT * FROM Score

四张表关系图

学生表

+------+--------+-----------+-------+
| s_id | s_name |  s_brith  | s_sex |
+------+--------+-----------+-------+
| 01   | 赵雷   | 1990-01-01 ||
| 02   | 钱电   | 1990-12-21 ||
| 03   | 孙风   | 1990-05-20 ||
| 04   | 李云   | 1990-08-06 ||
| 05   | 周梅   | 1991-12-01 ||
| 06   | 吴兰   | 1992-03-01 ||
| 07   | 郑竹   | 1989-07-01 ||
| 08   | 王菊   | 1990-01-20 ||
+------+--------+-----------+-------+

课程表

+------+--------+-------+
| c_id | c_name |  t_id |
+------+--------+-------+
| 01   |  语文  |  02   |
| 02   |  数学  |  01   |
| 03   |  英语  |  03   |
+------+--------+-------+

教师表

+------+--------+
| t_id | t_name |
+------+--------+
| 01   |  张三  |
| 02   |  李四  |
| 03   |  王五  | 
+------+--------+

成绩表

+------+------+-------+
| s_id | c_id |s_score|
+------+------+-------+
|  01  |  01  |   80  |
|  01  |  02  |   90  |
|  01  |  03  |   99  |
|  02  |  01  |   70  |
|  02  |  02  |   60  |
|  02  |  03  |   80  |
|  03  |  01  |   80  |
|  03  |  02  |   80  |
|  03  |  03  |   80  |
|  04  |  01  |   50  |
|  04  |  02  |   30  |
|  04  |  03  |   20  |
|  05  |  01  |   76  |
|  05  |  02  |   87  |
|  06  |  01  |   31  |
|  06  |  03  |   34  |
|  07  |  02  |   89  |
|  07  |  03  |   98  |
+------+------+-------+

题目索引

1. 查询"01"课程比"02"课程成绩高的学生的信息及课程分数

SELECT st.*, sc.s_score AS `01分数`, sc2.s_score AS `02分数`
FROM student st
	JOIN score sc
	ON st.s_id = sc.s_id
		AND sc.c_id = '01'
	LEFT JOIN score sc2
	ON st.s_id = sc2.s_id
		AND sc2.c_id = '02'
WHERE sc.s_score > sc2.s_score
+------+--------+-----------+-------+--------+--------+
| s_id | s_name |  s_brith  | s_sex | 01分数  | 02分数 |
+------+--------+-----------+-------+--------+--------+
| 02   | 钱电   | 1990-12-21 ||  70    |   60   |
| 04   | 李云   | 1990-08-06 ||  50    |   30   |
+------+--------+-----------+-------+--------+--------+

2. 查询"01"课程比"02"课程成绩低的学生的信息及课程分数

SELECT st.*, sc.s_score AS `01分数`, sc2.s_score AS `02分数`
FROM student st
	JOIN score sc
	ON st.s_id = sc.s_id
		AND sc.c_id = '01'
	LEFT JOIN score sc2
	ON st.s_id = sc2.s_id
		AND sc2.c_id = '02'
WHERE sc.s_score < sc2.s_score
+------+--------+-----------+-------+--------+--------+
| s_id | s_name |  s_brith  | s_sex | 01分数  | 02分数 |
+------+--------+-----------+-------+--------+--------+
| 01   | 赵雷   | 1990-01-01 ||  80    |   90   |
| 05   | 周梅   | 1991-12-01 ||  76    |   87   |
+------+--------+-----------+-------+--------+--------+

3. 查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩

SELECT st.s_id
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值