1. MySQL SQL练习环境搭建与基础准备
在开始SQL练习之前,我们需要先搭建一个完整的练习环境。我推荐使用MySQL 8.0版本,这是目前最稳定的版本之一,支持大多数现代SQL特性。
1.1 MySQL安装与配置
对于本地开发环境,我建议使用以下两种方式之一:
- Docker方式(推荐):
bash复制docker run --name mysql-practice -e MYSQL_ROOT_PASSWORD=yourpassword -p 3306:3306 -d mysql:8.0
- 原生安装:
- Windows用户可以从MySQL官网下载安装包
- Mac用户可以使用Homebrew:
brew install mysql - Linux用户(以Ubuntu为例):
bash复制sudo apt update
sudo apt install mysql-server
提示:无论选择哪种安装方式,安装完成后都建议运行
mysql_secure_installation进行基本安全配置。
1.2 练习数据库创建
连接MySQL后,我们先创建一个专用的练习数据库:
sql复制CREATE DATABASE sql_practice CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE sql_practice;
选择utf8mb4字符集是为了完整支持所有Unicode字符(包括emoji),这在现代应用中很常见。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基础表结构设计与数据填充
2.1 学生信息管理系统表设计
我们先创建三个核心表:学生表、课程表和选课表。在设计表结构时,我通常会考虑以下几点:
- 主键选择:自增整数是最简单的主键选择
- 字段类型:根据实际需求选择最合适的类型
- 外键约束:确保数据完整性
- 默认值和约束:防止不合理数据
sql复制-- 学生表
CREATE TABLE students (
student_id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL COMMENT '学生姓名',
gender ENUM('男','女') NOT NULL COMMENT '性别',
age TINYINT UNSIGNED COMMENT '年龄',
class VARCHAR(50) COMMENT '班级',
enrollment_date DATE NOT NULL COMMENT '入学日期',
INDEX idx_class (class),
INDEX idx_name (name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 课程表
CREATE TABLE courses (
course_id INT PRIMARY KEY AUTO_INCREMENT,
course_name VARCHAR(100) NOT NULL COMMENT '课程名称',
credit TINYINT UNSIGNED NOT NULL COMMENT '学分',
teacher VARCHAR(50) COMMENT '授课教师',
INDEX idx_course_name (course_name),
INDEX idx_teacher (teacher)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 选课表
CREATE TABLE enrollments (
enrollment_id INT PRIMARY KEY AUTO_INCREMENT,
student_id INT NOT NULL COMMENT '学生ID',
course_id INT NOT NULL COMMENT '课程ID',
score DECIMAL(5,2) COMMENT '成绩',
enroll_date DATE NOT NULL COMMENT '选课日期',
FOREIGN KEY (student_id) REFERENCES students(student_id) ON DELETE CASCADE,
FOREIGN KEY (course_id) REFERENCES courses(course_id) ON DELETE CASCADE,
UNIQUE KEY uk_student_course (student_id, course_id),
INDEX idx_score (score)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
2.2 示例数据插入
为了练习效果,我们需要插入足够多的示例数据。在实际项目中,我通常会准备至少20-30条学生记录和10-15门课程记录,这样能更好地模拟真实场景。
sql复制-- 插入学生数据
INSERT INTO students (name, gender, age, class, enrollment_date) VALUES
('张三', '男', 20, '计算机1班', '2023-09-01'),
('李四', '女', 19, '计算机1班', '2023-09-01'),
('王五', '男', 21, '计算机2班', '2023-09-01'),
('赵六', '女', 20, '计算机2班', '2023-09-01'),
('钱七', '男', 22, '计算机3班', '2023-09-01'),
('孙八', '女', 19, '计算机3班', '2023-09-01'),
('周九', '男', 20, '计算机1班', '2023-09-01'),
('吴十', '女', 21, '计算机2班', '2023-09-01'),
('郑十一', '男', 20, '计算机3班', '2023-09-01'),
('王十二', '女', 19, '计算机1班', '2023-09-01');
-- 插入课
