在本章节中,我们将综合运用之前学习的 DDL (数据定义)、DML (数据操作) 和 DQL (数据查询) 知识,构建一个完整的“学生信息管理”场景。
我们将执行以下步骤:
建表 (DDL):创建一个包含多种数据类型和约束条件的 students 表。
造数 (DML):插入 20 条模拟数据,角色涵盖不同性别、状态和分数段。
查询 (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);业务需求:
教务处需要打印一份简单的学生通讯录,只需要知道学生的姓名、性别和联系电话。
解题思路:
使用 SELECT 指定需要的三个列。
不需要条件过滤,查询全表。
SELECT
student_name AS 姓名,
gender AS 性别,
contact_phone AS 联系电话
FROM students;预期结果片段
业务需求:
辅导员需要联系所有在校正常学习(状态为 1)的学生,核对他们的出生日期和入学成绩,以便安排奖学金评定。
解题思路:
目标列:姓名、出生日期、入学成绩。
过滤条件:student_status = 1。
逻辑:使用 WHERE 子句进行等值匹配。
SELECT
student_name,
birthday,
entrance_score
FROM students
WHERE student_status = 1;业务需求:
学校女子学院计划选拔优秀女生参加夏令营。选拔标准是:
必须是女生 (gender = '女')。
入学成绩必须在 80 分以上 (entrance_score > 80)。
解题思路:
目标列:姓名、出生日期、联系电话。
条件组合:两个条件必须同时满足,使用 AND 连接。
SELECT
student_name,
birthday,
contact_phone
FROM students
WHERE gender = '女'
AND entrance_score > 80;最终结果集