源本科技 | 码上会

MySQL 基础练习

2026/03/14
33
0

引言

在本章节中,我们将综合运用之前学习的 DDL (数据定义)DML (数据操作)DQL (数据查询) 知识,构建一个完整的“学生信息管理”场景。

我们将执行以下步骤:

  1. 建表 (DDL):创建一个包含多种数据类型和约束条件的 students 表。

  2. 造数 (DML):插入 20 条模拟数据,角色涵盖不同性别、状态和分数段。

  3. 查询 (DQL):针对具体的业务需求,编写精准的 SQL 查询语句。


数据环境

创建数据表

我们设计一张 students 表,包含以下关键设计点:

  • 主键student_id 唯一标识学生。

  • 约束检查

    • 确保性别只能是 '男' 或 '女'。

    • 确保状态码只能是 1 (正常), 2 (休学), 3 (毕业)。

    • 确保姓名长度不超过 10 个字符。

  • 数据类型

    • 成绩使用 DECIMAL 保证精度。

    • 电话使用 VARCHAR 以兼容格式。

CREATE TABLE students (
    student_id INT PRIMARY KEY COMMENT '学号',
    student_name VARCHAR(10) NOT NULL COMMENT '姓名',
    gender CHAR(1) CHECK(gender IN ('男', '女')) COMMENT '性别',
    birthday DATE COMMENT '出生日期',
    entrance_score DECIMAL(5, 2) COMMENT '入学成绩',
    email VARCHAR(64) COMMENT '邮箱',
    contact_phone VARCHAR(20) COMMENT '联系电话',
    student_status TINYINT CHECK(student_status IN (1, 2, 3)) COMMENT '状态:1-正常,2-休学,3-毕业',
    CONSTRAINT chk_name_len CHECK (CHAR_LENGTH(student_name) <= 10)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='学生信息表';

插入模拟数据

-- 先清空表以防冲突(可选)
TRUNCATE TABLE students;

INSERT INTO students (student_id, student_name, gender, birthday, entrance_score, email, contact_phone, student_status)
VALUES
  -- 正常状态的男生
  (1, '提莫', '男', '1995-03-15', 85.50, 'teemo@example.com', '13800138001', 1),
  (12, '马可波罗', '男', '2000-07-20', 76.75, 'marco@example.com', '13800138012', 1),
  (14, '李白', '男', '1992-02-10', 91.20, 'libai@example.com', '13800138014', 1),
  (16, '孙悟空', '男', '1991-09-12', 89.30, 'wukong@example.com', '13800138016', 1),
  (18, '马里奥', '男', '1999-12-08', 85.75, 'mario@example.com', '13800138018', 1),
  (20, '铠', '男', '1997-01-05', 90.20, 'kai@example.com', '13800138020', 1),
  
  -- 正常状态的女生
  (2, '阿狸', '女', '1998-07-20', 92.75, 'ahri@example.com', '13800138002', 1),
  (4, '瑶', '女', '2000-02-10', 88.20, 'yao@example.com', '13800138004', 1),
  (6, '貂蝉', '女', '1992-09-12', 89.30, 'diaochan@example.com', '13800138006', 1),
  (8, '蒂法', '女', '1999-12-08', 94.75, 'tifa@example.com', '13800138008', 1),
  (10, '露娜', '女', '1991-01-05', 91.20, 'luna@example.com', '13800138010', 1),
  (11, '温迪', '女', '1998-03-15', 88.50, 'venti@example.com', '13800138011', 1),
  
  -- 休学状态 (Status = 2)
  (3, '盖伦', '男', '1993-11-05', 78.00, 'garen@example.com', '13800138003', 2),
  (7, '劫', '男', '1996-06-30', 76.50, 'zed@example.com', '13800138007', 2), -- 替换了原佐伊以保持男性角色设定
  (13, '不知火舞', '女', '1995-11-05', 82.00, 'mai@example.com', '13800138013', 2),
  (17, '雷电将军', '女', '1994-06-30', 94.50, 'raiden@example.com', '13800138017', 2),
  
  -- 毕业状态 (Status = 3) 及其他
  (5, '亚索', '男', '1997-04-25', 95.80, 'yasuo@example.com', '13800138005', 3),
  (9, '路飞', '男', '1994-08-18', 82.40, 'luffy@example.com', '13800138009', 3),
  (15, '小乔', '女', '1996-04-25', 78.80, 'xiaoqiao@example.com', '13800138015', 3),
  (19, '春丽', '女', '1993-08-18', 79.40, 'chunli@example.com', '13800138019', 3);

业务查询

任务 1:基础信息检索

业务需求
教务处需要打印一份简单的学生通讯录,只需要知道学生的姓名性别联系电话

解题思路

  • 使用 SELECT 指定需要的三个列。

  • 不需要条件过滤,查询全表。

点击查看答案
SELECT 
    student_name AS 姓名, 
    gender AS 性别, 
    contact_phone AS 联系电话
FROM students;

预期结果片段

姓名

性别

联系电话

提莫

13800138001

阿狸

13800138002

盖伦

13800138003

...

...

...


任务 2:特定状态学生筛选

业务需求
辅导员需要联系所有在校正常学习(状态为 1)的学生,核对他们的出生日期和入学成绩,以便安排奖学金评定。

解题思路

  • 目标列:姓名、出生日期、入学成绩。

  • 过滤条件student_status = 1

  • 逻辑:使用 WHERE 子句进行等值匹配。

点击查看答案
SELECT 
    student_name, 
    birthday, 
    entrance_score
FROM students
WHERE student_status = 1;

任务 3:多条件组合查询

业务需求
学校女子学院计划选拔优秀女生参加夏令营。选拔标准是:

  1. 必须是女生 (gender = '女')。

  2. 入学成绩必须在 80 分以上 (entrance_score > 80)。

解题思路

  • 目标列:姓名、出生日期、联系电话。

  • 条件组合:两个条件必须同时满足,使用 AND 连接。

点击查看答案
SELECT 
    student_name, 
    birthday, 
    contact_phone
FROM students
WHERE gender = '女' 
  AND entrance_score > 80;

最终结果集

student_name

birthday

contact_phone

阿狸

1998-07-20

13800138002

2000-02-10

13800138004

貂蝉

1992-09-12

13800138006

蒂法

1999-12-08

13800138008

露娜

1991-01-05

13800138010

温迪

1998-03-15

13800138011

不知火舞

1995-11-05

13800138013

雷电将军

1994-06-30

13800138017