实操练习手册
一套贯穿全站的「软件4班」示例库(学生表 / 课程表 / 选课表)+ 20 道练习。每道题都有解题思路、参考答案,以及按同一份数据实算出来的结果。
怎么用① 先按下面的建表语句把库和表建好、数据灌进去;② 从第 1 题开始逐题写;③ 写完对照答案与结果;④ 结果对不上说明条件写错了。
一、示例库
| 表名 | 字段 | 行数 | 说明 |
|---|---|---|---|
| 学生表 | 学号、姓名、性别、年龄、生日、班级 | 8 | 学生基本信息,学号为主键 |
| 课程表 | 课程号、课程名、学分、教师 | 5 | 课程信息,课程号为主键 |
| 选课表 | 学号、课程号、成绩 | 18 | 选课与成绩,学号+课程号联合主键 |
1. 建库建表语句
-- 1) 建库(指定字符集,避免中文乱码)
CREATE DATABASE IF NOT EXISTS 软件4班
CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
USE 软件4班;
-- 2) 学生表:学号主键,成绩用 decimal 保证精确
CREATE TABLE IF NOT EXISTS 学生表(
学号 char(3) NOT NULL PRIMARY KEY,
姓名 varchar(10) NOT NULL,
性别 char(1),
年龄 int,
生日 date,
班级 varchar(20)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 3) 课程表
CREATE TABLE IF NOT EXISTS 课程表(
课程号 char(2) NOT NULL PRIMARY KEY,
课程名 varchar(30) NOT NULL,
学分 int,
教师 varchar(10)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 4) 选课表:学号 + 课程号 联合主键,关联两张表
CREATE TABLE IF NOT EXISTS 选课表(
学号 char(3) NOT NULL,
课程号 char(2) NOT NULL,
成绩 decimal(4,1),
PRIMARY KEY (学号, 课程号),
CONSTRAINT fk_stu FOREIGN KEY (学号) REFERENCES 学生表(学号),
CONSTRAINT fk_cou FOREIGN KEY (课程号) REFERENCES 课程表(课程号)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;2. 示例数据
📄 学生表(8 行)
| 学号 | 姓名 | 性别 | 年龄 | 生日 | 班级 |
|---|---|---|---|---|---|
| 001 | 张三 | 男 | 20 | 2004-03-15 | 软件4班 |
| 002 | 李四 | 女 | 21 | 2003-07-02 | 软件4班 |
| 003 | 王五 | 男 | 19 | 2005-11-20 | 软件4班 |
| 004 | 张小敏 | 女 | 20 | 2004-05-08 | 软件4班 |
| 005 | 赵六 | 男 | 22 | 2002-01-30 | 软件4班 |
| 006 | 孙七 | 女 | 19 | 2005-09-18 | 软件4班 |
| 007 | 周八 | 男 | 21 | 2003-12-05 | 软件4班 |
| 008 | 吴九 | 女 | 20 | 2004-08-22 | 软件4班 |
📄 课程表(5 行)
| 课程号 | 课程名 | 学分 | 教师 |
|---|---|---|---|
| 01 | 数据库原理与应用 | 4 | 王老师 |
| 02 | Java程序设计 | 3 | 李老师 |
| 03 | 数据结构 | 4 | 张老师 |
| 04 | 操作系统 | 3 | 赵老师 |
| 05 | 计算机网络 | 2 | 孙老师 |
📄 选课表(18 行)
| 学号 | 课程号 | 成绩 |
|---|---|---|
| 001 | 01 | 89 |
| 001 | 02 | 76 |
| 001 | 03 | 91 |
| 002 | 01 | 92 |
| 002 | 02 | 88 |
| 003 | 01 | 78 |
| 003 | 04 | 65 |
| 004 | 01 | 58 |
| 004 | 02 | 82 |
| 004 | 05 | 90 |
| 005 | 03 | 71 |
| 005 | 04 | 55 |
| 006 | 01 | 96 |
| 006 | 03 | 84 |
| 007 | 02 | 68 |
| 007 | 05 | 77 |
| 008 | 01 | 62 |
| 008 | 04 | 73 |
说明课件里用的是中文库表名,本站示例库保持一致;如果你更习惯英文名(student/course/score),把表名换掉即可,语法完全一样。
二、20 道练习
第1章 · 基础概念与建库建表
01
用一条 SQL 创建数据库「软件4班」,字符集 utf8mb4。 基础
解题思路
create database 后面可以跟字符集与校对规则,这是避免中文乱码的关键一步。查看参考答案
CREATE DATABASE IF NOT EXISTS 软件4班
CHARACTER SET utf8mb4
COLLATE utf8mb4_general_ci;02
创建学生表,包含学号(主键)、姓名、性别、年龄、生日、班级。 基础
解题思路字段名 → 类型 → 约束;学号用
char(3) 并设为主键。查看参考答案
CREATE TABLE 学生表(
学号 char(3) NOT NULL PRIMARY KEY,
姓名 varchar(10) NOT NULL,
性别 char(1),
年龄 int,
生日 date,
班级 varchar(20)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;第4章 · SQL 操作
03
往学生表插入 3 条记录(自拟)。 基础
解题思路一条 INSERT 可以插多行,字段顺序与建表一致。
查看参考答案
INSERT INTO 学生表(学号,姓名,性别,年龄,生日,班级) VALUES
('001','张三','男',20,'2004-03-15','软件4班'),
('002','李四','女',21,'2003-07-02','软件4班'),
('003','王五','男',19,'2005-11-20','软件4班');第3章 · 查询基础
04
查询所有女生。 基础
解题思路等值条件查询,字符串加单引号。
查看参考答案与结果
SELECT 学号, 姓名 FROM 学生表 WHERE 性别 = '女';参考结果(用示例库数据实算,实际 MySQL 输出格式略有差异)
| 学号 | 姓名 |
|---|---|
| 002 | 李四 |
| 004 | 张小敏 |
| 006 | 孙七 |
| 008 | 吴九 |
05
查询年龄大于 20 的学生姓名与年龄。 基础
解题思路数值型不需要引号,用 ≥ 或
> 比较。查看参考答案与结果
SELECT 姓名, 年龄 FROM 学生表 WHERE 年龄 > 20;参考结果(用示例库数据实算,实际 MySQL 输出格式略有差异)
| 姓名 | 年龄 |
|---|---|
| 李四 | 21 |
| 赵六 | 22 |
| 周八 | 21 |
06
查询姓「张」的学生。 基础
解题思路LIKE 配合 % 通配符。
查看参考答案与结果
SELECT 学号, 姓名 FROM 学生表 WHERE 姓名 LIKE '张%';参考结果(用示例库数据实算,实际 MySQL 输出格式略有差异)
| 学号 | 姓名 |
|---|---|
| 001 | 张三 |
| 004 | 张小敏 |
07
查询姓名中含「小」字的学生。 基础
解题思路两侧都加 % 表示包含。
查看参考答案与结果
SELECT 姓名 FROM 学生表 WHERE 姓名 LIKE '%小%';参考结果(用示例库数据实算,实际 MySQL 输出格式略有差异)
| 姓名 |
|---|
| 张小敏 |
08
查出所有男生,按年龄从大到小排序。 进阶
解题思路WHERE 过滤 + ORDER BY DESC。
查看参考答案与结果
SELECT 姓名, 年龄 FROM 学生表
WHERE 性别 = '男'
ORDER BY 年龄 DESC;参考结果(用示例库数据实算,实际 MySQL 输出格式略有差异)
| 姓名 | 年龄 |
|---|---|
| 赵六 | 22 |
| 周八 | 21 |
| 张三 | 20 |
| 王五 | 19 |
09
找出成绩最高的前 3 条选课记录(显示学号、课程号、成绩)。 进阶
解题思路ORDER BY 成绩 DESC 再 LIMIT 3。
查看参考答案与结果
SELECT 学号, 课程号, 成绩 FROM 选课表
ORDER BY 成绩 DESC
LIMIT 3;参考结果(用示例库数据实算,实际 MySQL 输出格式略有差异)
| 学号 | 课程号 | 成绩 |
|---|---|---|
| 006 | 01 | 96 |
| 002 | 01 | 92 |
| 001 | 03 | 91 |
第5章 · 内置函数
10
统计男、女学生各有多少人。 进阶
解题思路GROUP BY 性别 + count(*)。
查看参考答案与结果
SELECT 性别, COUNT(*) AS 人数 FROM 学生表 GROUP BY 性别;参考结果(用示例库数据实算,实际 MySQL 输出格式略有差异)
| 性别 | 人数 |
|---|---|
| 女 | 4 |
| 男 | 4 |
11
求所有选课成绩的平均分、最高分、最低分。 进阶
解题思路聚合函数 avg / max / min,可搭配 round 保留小数。
查看参考答案与结果
SELECT ROUND(AVG(成绩),1) AS 平均分, MAX(成绩) AS 最高分, MIN(成绩) AS 最低分
FROM 选课表;参考结果(用示例库数据实算,实际 MySQL 输出格式略有差异)
| 平均分 | 最高分 | 最低分 |
|---|---|---|
| 77.5 | 96 | 55 |
第4章 · SQL 操作
12
查询每个学生的姓名、所选课程名和成绩(三表连接)。 进阶
解题思路选课表是中间表:它连学生表(学号)也连课程表(课程号),两次 JOIN。
查看参考答案与结果
SELECT s.姓名, c.课程名, sc.成绩
FROM 选课表 sc
JOIN 学生表 s ON sc.学号 = s.学号
JOIN 课程表 c ON sc.课程号 = c.课程号
ORDER BY s.学号, c.课程号;参考结果(用示例库数据实算,实际 MySQL 输出格式略有差异)
| 姓名 | 课程名 | 成绩 |
|---|---|---|
| 张三 | 数据库原理与应用 | 89 |
| 张三 | Java程序设计 | 76 |
| 张三 | 数据结构 | 91 |
| 李四 | 数据库原理与应用 | 92 |
| 李四 | Java程序设计 | 88 |
| 王五 | 数据库原理与应用 | 78 |
| 王五 | 操作系统 | 65 |
| 张小敏 | 数据库原理与应用 | 58 |
| 张小敏 | Java程序设计 | 82 |
| 张小敏 | 计算机网络 | 90 |
| 赵六 | 数据结构 | 71 |
| 赵六 | 操作系统 | 55 |
13
找出没有选任何课程的学生。 高阶
解题思路左连接 + IS NULL 求差集:以学生表为主,连不上的就是没选课。
查看参考答案与结果
SELECT s.学号, s.姓名
FROM 学生表 s
LEFT JOIN 选课表 sc ON s.学号 = sc.学号
WHERE sc.学号 IS NULL;参考结果(用示例库数据实算,实际 MySQL 输出格式略有差异)
| 学号 | 姓名 |
|---|
第5章 · 内置函数
14
统计每门课程的选课人数与平均分,按平均分降序。 高阶
解题思路按课程号分组,聚合计数与平均,再 JOIN 课程表取课程名。
查看参考答案与结果
SELECT c.课程名, COUNT(*) AS 人数, ROUND(AVG(sc.成绩),1) AS 平均分
FROM 选课表 sc
JOIN 课程表 c ON sc.课程号 = c.课程号
GROUP BY c.课程号, c.课程名
ORDER BY 平均分 DESC;参考结果(用示例库数据实算,实际 MySQL 输出格式略有差异)
| 课程名 | 人数 | 平均分 |
|---|---|---|
| 计算机网络 | 2 | 83.5 |
| 数据结构 | 3 | 82.0 |
| 数据库原理与应用 | 6 | 79.2 |
| Java程序设计 | 4 | 78.5 |
| 操作系统 | 3 | 64.3 |
第4章 · SQL 操作
15
把学号 001 的数据库课程成绩改为 95 分。 进阶
解题思路UPDATE 一定要带 WHERE,先查再改。
查看参考答案
UPDATE 选课表 SET 成绩 = 95
WHERE 学号 = '001' AND 课程号 = '01';16
删除成绩低于 60 分的选课记录。 进阶
解题思路DELETE + WHERE 条件。
查看参考答案
DELETE FROM 选课表 WHERE 成绩 < 60;17
给学生表增加一个「联系电话」字段。 进阶
解题思路ALTER TABLE … ADD 加字段,默认加在最后。
查看参考答案
ALTER TABLE 学生表 ADD 联系电话 varchar(20);第5章 · 内置函数
18
把学生姓名和性别拼成「张三(男)」的形式,并转大写。 进阶
解题思路concat 拼接、upper 转大写。
查看参考答案与结果
SELECT CONCAT(姓名,'(',性别,')') AS 标签, UPPER(学号) AS 大写学号
FROM 学生表 LIMIT 3;参考结果(用示例库数据实算,实际 MySQL 输出格式略有差异)
| 标签 | 大写学号 |
|---|---|
| 张三(男) | 001 |
| 李四(女) | 002 |
| 王五(男) | 003 |
19
用生日算出每个学生的年龄,并按年龄降序。 高阶
解题思路年份相减即可近似:
year(now()) - year(生日)。查看参考答案与结果
SELECT 姓名, 生日, YEAR(NOW()) - YEAR(生日) AS 年龄
FROM 学生表
ORDER BY 年龄 DESC;参考结果(用示例库数据实算,实际 MySQL 输出格式略有差异)
| 姓名 | 生日 | 年龄 |
|---|---|---|
| 赵六 | 2002-01-30 | 23 |
| 李四 | 2003-07-02 | 22 |
| 周八 | 2003-12-05 | 22 |
| 张三 | 2004-03-15 | 21 |
| 张小敏 | 2004-05-08 | 21 |
| 吴九 | 2004-08-22 | 21 |
| 王五 | 2005-11-20 | 20 |
| 孙七 | 2005-09-18 | 20 |
20
把平均分四舍五入保留 1 位小数。 基础
解题思路round(数值, 位数)。
查看参考答案与结果
SELECT ROUND(AVG(成绩), 1) AS 平均分 FROM 选课表;参考结果(用示例库数据实算,实际 MySQL 输出格式略有差异)
| 平均分 |
|---|
| 77.5 |