题目
查询每条成绩对应的学生姓名、课程名称与分数,按学号、课程号排序。
知识点:INNER JOIN 多表连接
运行环境:本站提供在线 SQL 运行环境。
思路
姓名在学生表,课名在课程表,分数在成绩表。从 score 出发,用学号连 student,用课程号连 course。
内连接:对不上学生或课程的成绩行不会出现。按学号、课程号排,同一人的课挨在一起。
解法
-- 第21题:查询学生姓名、课程名称与成绩
-- 样例数据:学生选课 + 员工部门。最后一条 SELECT 为本题查询。
DROP TABLE IF EXISTS score;
DROP TABLE IF EXISTS course;
DROP TABLE IF EXISTS student;
DROP TABLE IF EXISTS teacher;
DROP TABLE IF EXISTS emp;
DROP TABLE IF EXISTS dept;
CREATE TABLE teacher (
tid TEXT PRIMARY KEY,
tname TEXT NOT NULL
);
CREATE TABLE student (
sid TEXT PRIMARY KEY,
sname TEXT NOT NULL,
ssex TEXT,
birthday TEXT,
city TEXT,
email TEXT
);
CREATE TABLE course (
cid TEXT PRIMARY KEY,
cname TEXT NOT NULL,
tid TEXT,
credit INTEGER
);
CREATE TABLE score (
sid TEXT,
cid TEXT,
score REAL,
exam_on TEXT
);
CREATE TABLE dept (
did TEXT PRIMARY KEY,
dname TEXT NOT NULL
);
CREATE TABLE emp (
eid TEXT PRIMARY KEY,
ename TEXT NOT NULL,
did TEXT,
manager_id TEXT,
salary INTEGER,
hired_on TEXT
);
INSERT INTO teacher(tid, tname) VALUES
('T01', '何启明'),
('T02', '陆知秋'),
('T03', '裴南'),
('T04', '江衡');
INSERT INTO student(sid, sname, ssex, birthday, city, email) VALUES
('S01', '林晓', '女', '2003-03-12', '杭州', 'linxiao@campus.test'),
('S02', '周衡', '男', '2002-11-08', '宁波', 'zhouheng@campus.test'),
('S03', '沈予', '女', '2003-06-21', '杭州', 'shenyu@campus.test'),
('S04', '韩牧', '男', '2002-07-09', '温州', 'hanmu@campus.test'),
('S05', '叶安', '女', '2004-01-30', '杭州', 'yean@campus.test'),
('S06', '方迟', '男', '2001-12-19', '嘉兴', 'fangchi@campus.test'),
('S07', '苏晚', '女', '2003-09-04', '宁波', 'suwan@campus.test'),
('S08', '程远', '男', '2004-05-17', '杭州', 'chengyuan@campus.test'),
('S09', '顾星', '女', '2002-10-28', '绍兴', 'guxing@campus.test'),
('S10', '梁野', '男', '2001-02-08', '温州', 'liangye@campus.test'),
('S11', '夏禾', '女', '2003-08-16', '杭州', 'xiahe@campus.test'),
('S12', '许川', '男', '2002-04-25', '宁波', 'xuchuan@campus.test'),
('S13', '丁南', '女', '2004-04-18', '杭州', 'dingnan@campus.test'),
('S14', '蔡河', '男', '2001-06-03', '嘉兴', 'caihe@campus.test'),
('S15', '闻青', '女', '2002-08-22', '绍兴', 'wenqing@campus.test'),
('S16', '邱石', '男', '2003-12-01', '宁波', 'qiushi@campus.test');
INSERT INTO course(cid, cname, tid, credit) VALUES
('C01', '数据库原理', 'T02', 4),
('C02', '离散数学', 'T01', 3),
('C03', '操作系统', 'T03', 4),
('C04', '计算机网络', 'T02', 3),
('C05', '编译原理', 'T01', 4),
('C06', '线性代数', 'T03', 3),
('C07', '软件工程', 'T04', 2),
('C08', '人工智能', 'T04', 3),
('C09', '毕业实习', 'T03', 1);
INSERT INTO score(sid, cid, score, exam_on) VALUES
('S01', 'C01', 88, '2025-01-08'),
('S01', 'C02', 76, '2025-01-10'),
('S01', 'C03', 91, '2025-01-12'),
('S01', 'C04', 85, '2025-01-09'),
('S01', 'C05', 72, '2025-01-11'),
('S01', 'C06', 90, '2025-01-13'),
('S01', 'C07', 68, '2025-01-08'),
('S01', 'C08', 80, '2025-02-15'),
('S02', 'C01', 70, '2025-01-08'),
('S02', 'C02', 82, '2025-01-10'),
('S02', 'C03', 64, '2025-01-12'),
('S02', 'C04', 55, '2025-01-09'),
('S03', 'C01', 90, '2025-01-08'),
('S03', 'C02', 90, '2025-01-10'),
('S03', 'C03', 85, '2025-01-12'),
('S03', 'C05', 78, '2025-01-11'),
('S04', 'C01', 45, '2025-01-08'),
('S04', 'C02', 52, '2025-01-10'),
('S04', 'C03', 40, '2025-01-12'),
('S04', 'C04', 0, '2025-01-09'),
('S05', 'C01', 79, '2025-01-08'),
('S05', 'C02', 88, '2025-01-10'),
('S05', 'C03', 70, '2025-01-09'),
('S06', 'C01', 0, '2025-01-08'),
('S06', 'C03', 58, '2025-01-12'),
('S06', 'C06', 41, '2025-01-13'),
('S07', 'C02', 94, '2025-01-10'),
('S07', 'C03', 90, '2025-01-12'),
('S07', 'C07', 88, '2025-01-11'),
('S08', 'C01', 86, '2025-01-08'),
('S08', 'C02', 61, '2025-01-10'),
('S08', 'C03', 73, '2025-01-12'),
('S08', 'C08', 69, '2025-02-15'),
('S09', 'C01', 92, '2025-01-08'),
('S09', 'C03', 81, '2025-01-12'),
('S09', 'C04', 77, '2025-01-09'),
('S10', 'C02', 55, '2025-01-10'),
('S10', 'C03', 47, '2025-01-12'),
('S11', 'C01', 77, '2025-01-08'),
('S11', 'C02', 80, '2025-01-10'),
('S11', 'C03', 79, '2025-01-12'),
('S11', 'C05', 66, '2025-01-11'),
('S12', 'C01', 60, '2025-01-08'),
('S13', 'C02', 84, '2025-01-10'),
('S13', 'C07', 91, '2025-01-11'),
('S14', 'C01', 58, '2025-01-08'),
('S14', 'C06', 73, '2025-01-13'),
('S15', 'C03', 62, '2025-01-12'),
('S15', 'C08', 0, '2025-02-15');
INSERT INTO dept(did, dname) VALUES
('D01', '研发部'),
('D02', '教学部'),
('D03', '市场部');
INSERT INTO emp(eid, ename, did, manager_id, salary, hired_on) VALUES
('E01', '陈省', 'D01', NULL, 18000, '2020-03-01'),
('E02', '吴舟', 'D01', 'E01', 12000, '2022-05-12'),
('E03', '唐宁', 'D01', 'E01', 19000, '2021-08-20'),
('E04', '沈泊', 'D02', 'E01', 15000, '2021-11-04'),
('E05', '齐末', 'D02', 'E04', 9000, '2024-04-01'),
('E06', '米白', 'D03', 'E01', 11000, '2023-02-18'),
('E07', '蓝秋', 'D03', 'E06', 8000, '2024-09-01'),
('E08', '贺川', 'D03', 'E06', 21000, '2022-12-10');
-- 本题查询
SELECT st.sid, st.sname, c.cname, sc.score
FROM score sc
JOIN student st ON st.sid = sc.sid
JOIN course c ON c.cid = sc.cid
ORDER BY st.sid, c.cid;
运行示例
sid | sname | cname | score
----+-------+-------+------
S01 | 林晓 | 数据库原理 | 88.0
S01 | 林晓 | 离散数学 | 76.0
S01 | 林晓 | 操作系统 | 91.0
S01 | 林晓 | 计算机网络 | 85.0
S01 | 林晓 | 编译原理 | 72.0
S01 | 林晓 | 线性代数 | 90.0
S01 | 林晓 | 软件工程 | 68.0
S01 | 林晓 | 人工智能 | 80.0
S02 | 周衡 | 数据库原理 | 70.0
S02 | 周衡 | 离散数学 | 82.0
S02 | 周衡 | 操作系统 | 64.0
S02 | 周衡 | 计算机网络 | 55.0
S03 | 沈予 | 数据库原理 | 90.0
S03 | 沈予 | 离散数学 | 90.0
S03 | 沈予 | 操作系统 | 85.0
S03 | 沈予 | 编译原理 | 78.0
S04 | 韩牧 | 数据库原理 | 45.0
S04 | 韩牧 | 离散数学 | 52.0
S04 | 韩牧 | 操作系统 | 40.0
S04 | 韩牧 | 计算机网络 | 0.0
S05 | 叶安 | 数据库原理 | 79.0
S05 | 叶安 | 离散数学 | 88.0
S05 | 叶安 | 操作系统 | 70.0
S06 | 方迟 | 数据库原理 | 0.0
S06 | 方迟 | 操作系统 | 58.0
S06 | 方迟 | 线性代数 | 41.0
S07 | 苏晚 | 离散数学 | 94.0
S07 | 苏晚 | 操作系统 | 90.0
S07 | 苏晚 | 软件工程 | 88.0
S08 | 程远 | 数据库原理 | 86.0
S08 | 程远 | 离散数学 | 61.0
S08 | 程远 | 操作系统 | 73.0
S08 | 程远 | 人工智能 | 69.0
S09 | 顾星 | 数据库原理 | 92.0
S09 | 顾星 | 操作系统 | 81.0
S09 | 顾星 | 计算机网络 | 77.0
S10 | 梁野 | 离散数学 | 55.0
S10 | 梁野 | 操作系统 | 47.0
S11 | 夏禾 | 数据库原理 | 77.0
S11 | 夏禾 | 离散数学 | 80.0
S11 | 夏禾 | 操作系统 | 79.0
S11 | 夏禾 | 编译原理 | 66.0
S12 | 许川 | 数据库原理 | 60.0
S13 | 丁南 | 离散数学 | 84.0
S13 | 丁南 | 软件工程 | 91.0
S14 | 蔡河 | 数据库原理 | 58.0
S14 | 蔡河 | 线性代数 | 73.0
S15 | 闻青 | 操作系统 | 62.0
S15 | 闻青 | 人工智能 | 0.0