实操练习手册

实操练习手册

一套贯穿全站的「软件4班」示例库(学生表 / 课程表 / 选课表)+ 20 道练习。每道题都有解题思路、参考答案,以及按同一份数据实算出来的结果。

3 张表31 条数据20 道练习每题带答案与结果
怎么用① 先按下面的建表语句把库和表建好、数据灌进去;② 从第 1 题开始逐题写;③ 写完对照答案与结果;④ 结果对不上说明条件写错了。

一、示例库

表名字段行数说明
学生表学号、姓名、性别、年龄、生日、班级8学生基本信息,学号为主键
课程表课程号、课程名、学分、教师5课程信息,课程号为主键
选课表学号、课程号、成绩18选课与成绩,学号+课程号联合主键

1. 建库建表语句

SQL
-- 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张三男202004-03-15软件4班
002李四女212003-07-02软件4班
003王五男192005-11-20软件4班
004张小敏女202004-05-08软件4班
005赵六男222002-01-30软件4班
006孙七女192005-09-18软件4班
007周八男212003-12-05软件4班
008吴九女202004-08-22软件4班
📄 课程表(5 行)
课程号课程名学分教师
01数据库原理与应用4王老师
02Java程序设计3李老师
03数据结构4张老师
04操作系统3赵老师
05计算机网络2孙老师
📄 选课表(18 行)
学号课程号成绩
0010189
0010276
0010391
0020192
0020288
0030178
0030465
0040158
0040282
0040590
0050371
0050455
0060196
0060384
0070268
0070577
0080162
0080473
说明课件里用的是中文库表名,本站示例库保持一致;如果你更习惯英文名(student/course/score),把表名换掉即可,语法完全一样。

二、20 道练习

第1章 · 基础概念与建库建表

01

用一条 SQL 创建数据库「软件4班」,字符集 utf8mb4。 基础

解题思路create database 后面可以跟字符集与校对规则,这是避免中文乱码的关键一步。
查看参考答案
SQL
CREATE DATABASE IF NOT EXISTS 软件4班
  CHARACTER SET utf8mb4
  COLLATE utf8mb4_general_ci;
02

创建学生表,包含学号(主键)、姓名、性别、年龄、生日、班级。 基础

解题思路字段名 → 类型 → 约束;学号用 char(3) 并设为主键。
查看参考答案
SQL
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 可以插多行,字段顺序与建表一致。
查看参考答案
SQL
INSERT INTO 学生表(学号,姓名,性别,年龄,生日,班级) VALUES
 ('001','张三','男',20,'2004-03-15','软件4班'),
 ('002','李四','女',21,'2003-07-02','软件4班'),
 ('003','王五','男',19,'2005-11-20','软件4班');

第3章 · 查询基础

04

查询所有女生。 基础

解题思路等值条件查询,字符串加单引号。
查看参考答案与结果
SQL
SELECT 学号, 姓名 FROM 学生表 WHERE 性别 = '女';
参考结果(用示例库数据实算,实际 MySQL 输出格式略有差异)
学号姓名
002李四
004张小敏
006孙七
008吴九
05

查询年龄大于 20 的学生姓名与年龄。 基础

解题思路数值型不需要引号,用 ≥ 或 > 比较。
查看参考答案与结果
SQL
SELECT 姓名, 年龄 FROM 学生表 WHERE 年龄 > 20;
参考结果(用示例库数据实算,实际 MySQL 输出格式略有差异)
姓名年龄
李四21
赵六22
周八21
06

查询姓「张」的学生。 基础

解题思路LIKE 配合 % 通配符。
查看参考答案与结果
SQL
SELECT 学号, 姓名 FROM 学生表 WHERE 姓名 LIKE '张%';
参考结果(用示例库数据实算,实际 MySQL 输出格式略有差异)
学号姓名
001张三
004张小敏
07

查询姓名中含「小」字的学生。 基础

解题思路两侧都加 % 表示包含。
查看参考答案与结果
SQL
SELECT 姓名 FROM 学生表 WHERE 姓名 LIKE '%小%';
参考结果(用示例库数据实算,实际 MySQL 输出格式略有差异)
姓名
张小敏
08

查出所有男生,按年龄从大到小排序。 进阶

解题思路WHERE 过滤 + ORDER BY DESC。
查看参考答案与结果
SQL
SELECT 姓名, 年龄 FROM 学生表
WHERE 性别 = '男'
ORDER BY 年龄 DESC;
参考结果(用示例库数据实算,实际 MySQL 输出格式略有差异)
姓名年龄
赵六22
周八21
张三20
王五19
09

找出成绩最高的前 3 条选课记录(显示学号、课程号、成绩)。 进阶

解题思路ORDER BY 成绩 DESC 再 LIMIT 3。
查看参考答案与结果
SQL
SELECT 学号, 课程号, 成绩 FROM 选课表
ORDER BY 成绩 DESC
LIMIT 3;
参考结果(用示例库数据实算,实际 MySQL 输出格式略有差异)
学号课程号成绩
0060196
0020192
0010391

第5章 · 内置函数

10

统计男、女学生各有多少人。 进阶

解题思路GROUP BY 性别 + count(*)。
查看参考答案与结果
SQL
SELECT 性别, COUNT(*) AS 人数 FROM 学生表 GROUP BY 性别;
参考结果(用示例库数据实算,实际 MySQL 输出格式略有差异)
性别人数
女4
男4
11

求所有选课成绩的平均分、最高分、最低分。 进阶

解题思路聚合函数 avg / max / min,可搭配 round 保留小数。
查看参考答案与结果
SQL
SELECT ROUND(AVG(成绩),1) AS 平均分, MAX(成绩) AS 最高分, MIN(成绩) AS 最低分
FROM 选课表;
参考结果(用示例库数据实算,实际 MySQL 输出格式略有差异)
平均分最高分最低分
77.59655

第4章 · SQL 操作

12

查询每个学生的姓名、所选课程名和成绩(三表连接)。 进阶

解题思路选课表是中间表:它连学生表(学号)也连课程表(课程号),两次 JOIN。
查看参考答案与结果
SQL
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 求差集:以学生表为主,连不上的就是没选课。
查看参考答案与结果
SQL
SELECT s.学号, s.姓名
FROM 学生表 s
LEFT JOIN 选课表 sc ON s.学号 = sc.学号
WHERE sc.学号 IS NULL;
参考结果(用示例库数据实算,实际 MySQL 输出格式略有差异)
学号姓名

第5章 · 内置函数

14

统计每门课程的选课人数与平均分,按平均分降序。 高阶

解题思路按课程号分组,聚合计数与平均,再 JOIN 课程表取课程名。
查看参考答案与结果
SQL
SELECT c.课程名, COUNT(*) AS 人数, ROUND(AVG(sc.成绩),1) AS 平均分
FROM 选课表 sc
JOIN 课程表 c ON sc.课程号 = c.课程号
GROUP BY c.课程号, c.课程名
ORDER BY 平均分 DESC;
参考结果(用示例库数据实算,实际 MySQL 输出格式略有差异)
课程名人数平均分
计算机网络283.5
数据结构382.0
数据库原理与应用679.2
Java程序设计478.5
操作系统364.3

第4章 · SQL 操作

15

把学号 001 的数据库课程成绩改为 95 分。 进阶

解题思路UPDATE 一定要带 WHERE,先查再改。
查看参考答案
SQL
UPDATE 选课表 SET 成绩 = 95
WHERE 学号 = '001' AND 课程号 = '01';
16

删除成绩低于 60 分的选课记录。 进阶

解题思路DELETE + WHERE 条件。
查看参考答案
SQL
DELETE FROM 选课表 WHERE 成绩 < 60;
17

给学生表增加一个「联系电话」字段。 进阶

解题思路ALTER TABLE … ADD 加字段,默认加在最后。
查看参考答案
SQL
ALTER TABLE 学生表 ADD 联系电话 varchar(20);

第5章 · 内置函数

18

把学生姓名和性别拼成「张三(男)」的形式,并转大写。 进阶

解题思路concat 拼接、upper 转大写。
查看参考答案与结果
SQL
SELECT CONCAT(姓名,'(',性别,')') AS 标签, UPPER(学号) AS 大写学号
FROM 学生表 LIMIT 3;
参考结果(用示例库数据实算,实际 MySQL 输出格式略有差异)
标签大写学号
张三(男)001
李四(女)002
王五(男)003
19

用生日算出每个学生的年龄,并按年龄降序。 高阶

解题思路年份相减即可近似:year(now()) - year(生日)。
查看参考答案与结果
SQL
SELECT 姓名, 生日, YEAR(NOW()) - YEAR(生日) AS 年龄
FROM 学生表
ORDER BY 年龄 DESC;
参考结果(用示例库数据实算,实际 MySQL 输出格式略有差异)
姓名生日年龄
赵六2002-01-3023
李四2003-07-0222
周八2003-12-0522
张三2004-03-1521
张小敏2004-05-0821
吴九2004-08-2221
王五2005-11-2020
孙七2005-09-1820
20

把平均分四舍五入保留 1 位小数。 基础

解题思路round(数值, 位数)。
查看参考答案与结果
SQL
SELECT ROUND(AVG(成绩), 1) AS 平均分 FROM 选课表;
参考结果(用示例库数据实算,实际 MySQL 输出格式略有差异)
平均分
77.5

三、练完之后