1. MySQL SQL基础练习的必要性
对于任何想从事数据库相关工作或提升数据分析能力的人来说,MySQL SQL基础练习都是必经之路。我见过太多人一上来就想学高级优化技巧,结果连基本的SELECT查询都写不利索。SQL作为与数据库交互的标准语言,其基础语法掌握程度直接决定了你后续的学习效率和工作产出质量。
100道基础练习题的价值在于:它能系统性地覆盖SELECT、INSERT、UPDATE、DELETE、JOIN、GROUP BY等核心语法点,通过反复练习形成肌肉记忆。我自己带新人时发现,做过完整基础练习的开发者,后续遇到复杂业务场景时,解决问题的思路明显更清晰。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与测试数据搭建
2.1 MySQL安装配置
建议使用MySQL 8.0+版本进行练习。官网提供了社区版下载,安装时注意:
- Windows用户推荐使用MSI安装包
- Linux用户可通过apt/yum安装
- 务必记住root密码
- 安装后验证服务是否启动:
sudo systemctl status mysql
注意:生产环境不要使用root账户操作,但练习阶段可以简化权限管理
2.2 创建练习数据库
执行以下SQL创建测试数据库和表:
sql复制CREATE DATABASE practice_db;
USE practice_db;
CREATE TABLE students (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
gender ENUM('M','F'),
age INT,
class_id INT,
score DECIMAL(5,2)
);
CREATE TABLE classes (
id INT PRIMARY KEY,
name VARCHAR(50),
teacher VARCHAR(50)
);
2.3 插入测试数据
sql复制INSERT INTO classes VALUES
(1, 'Class A', 'Mr. Zhang'),
(2, 'Class B', 'Mrs. Li');
INSERT INTO students VALUES
(NULL, 'Alice', 'F', 18, 1, 85.5),
(NULL, 'Bob', 'M', 19, 1, 92.0),
(NULL, 'Charlie', 'M', 17, 2, 78.5),
(NULL, 'David', 'M', 18, 2, 88.0),
(NULL, 'Eve', 'F', 19, 1, 95.5);
3. 基础查询练习(1-30题)
3.1 简单SELECT查询
- 查询所有学生信息:
sql复制SELECT * FROM students;
- 查询学生姓名和年龄:
sql复制SELECT name, age FROM students;
- 查询年龄大于18的学生:
sql复制SELECT * FROM students WHERE age > 18;
3.2 条件查询与运算符
- 查询班级1且成绩大于90的学生:
sql复制SELECT * FROM students
WHERE class_id = 1 AND score > 90;
- 查询年龄在17到19之间的学生:
sql复制SELECT * FROM students
WHERE age BETWEEN 17 AND 19;
- 查询姓名为Alice或Eve的学生:
sql复制SELECT * FROM students
WHERE name IN ('Alice', 'Eve');
3.3 排序与分页
- 按成绩降序排列学生:
sql复制SELECT * FROM students
ORDER BY score DESC;
- 查询成绩前3名的学生:
sql复制SELECT * FROM students
ORDER BY score DESC
LIMIT 3;
- 分页查询(每页2条,第2页):
sql复制SELECT * FROM students
LIMIT 2 OFFSET 2;
4. 高级查询练习(31-60题)
4.1 聚合函数
- 计算学生平均成绩:
sql复制SELECT AVG(score) FROM students;
- 统计男女学生人数:
sql复制SELECT gender, COUNT(*)
FROM students
GROUP BY gender;
- 查询每个班级的最高分:
sql复制SELECT class_id, MAX(score)
FROM students
GROUP BY class_id;
4.2 多表连接
- 查询学生及其班级信息:
sql复制SELECT s.name, c.name AS class_name
FROM students s
JOIN classes c ON s.class_id = c.id;
- 左连接查询(包含无班级学生):
sql复制SELECT s.name, c.name
FROM students s
LEFT JOIN classes c ON s.class_id = c.id;
- 查询班主任带的学生人数:
sql复制SELECT c.teacher, COUNT(*)
FROM classes c
JOIN students s ON c.id = s.class_id
GROUP BY c.teacher;
4.3 子查询
- 查询高于平均分的学生:
sql复制SELECT * FROM students
WHERE score > (SELECT AVG(score) FROM students);
- 使用EXISTS查询有学生的班级:
sql复制SELECT * FROM classes c
WHERE EXISTS (
SELECT 1 FROM students s
WHERE s.class_id = c.id
);
5. 数据操作练习(61-80题)
5.1 插入数据
- 插入新学生记录:
sql复制INSERT INTO students VALUES
(NULL, 'Frank', 'M', 20, 2, 82.5);
- 批量插入多条记录:
sql复制INSERT INTO students (name, gender, age, class_id, score) VALUES
('Grace', 'F', 18, 1, 91.0),
('Henry', 'M', 19, 2, 87.5);
5.2 更新数据
- 将所有学生年龄加1:
sql复制UPDATE students SET age = age + 1;
- 修改Alice的成绩:
sql复制UPDATE students SET score = 90.0
WHERE name = 'Alice';
5.3 删除数据
- 删除成绩低于80的学生:
sql复制DELETE FROM students
WHERE score < 80;
- 清空表数据(保留结构):
sql复制TRUNCATE TABLE students;
6. 进阶功能练习(81-100题)
6.1 视图与索引
- 创建优秀学生视图:
sql复制CREATE VIEW top_students AS
SELECT * FROM students
WHERE score > 90;
- 为姓名字段创建索引:
sql复制CREATE INDEX idx_name ON students(name);
6.2 存储过程
- 创建年龄统计存储过程:
sql复制DELIMITER //
CREATE PROCEDURE count_by_age(IN min_age INT)
BEGIN
SELECT COUNT(*) FROM students
WHERE age >= min_age;
END //
DELIMITER ;
CALL count_by_age(18);
6.3 事务处理
- 转账事务示例(伪代码):
sql复制START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;
7. 实战技巧与常见问题
7.1 性能优化建议
- 避免使用SELECT *,只查询需要的列
- 为常用查询条件创建索引
- 大数据量表避免全表扫描
- 复杂查询考虑使用临时表
7.2 常见错误排查
- 语法错误:检查引号、括号是否匹配
- 表不存在:确认表名拼写和数据库选择
- 权限问题:检查用户是否有操作权限
- 外键约束:删除数据前检查关联关系
7.3 练习建议
- 每道题先自己尝试写SQL
- 对比参考答案理解差异
- 尝试用不同方法实现相同需求
- 记录遇到的错误和解决方法
我建议将这些练习题保存为SQL脚本文件,方便随时复习。对于想深入学习的同学,可以尝试扩展这些题目:
- 增加更多测试数据
- 设计更复杂的查询场景
- 尝试在百万级数据量下优化查询性能
通过这100道基础练习,你应该能够熟练掌握80%的日常SQL操作。记住,SQL能力的提升没有捷径,唯有多写多练。当这些基础语法成为你的本能反应时,你会发现处理复杂数据需求变得轻松许多。
