1. MySQL SQL基础练习的价值与定位
作为关系型数据库的标杆产品,MySQL在全球开发者中保持着压倒性的使用率。根据2023年Stack Overflow开发者调查报告,MySQL在专业开发者中的使用率达到45.6%,远超第二名PostgreSQL的26.5%。这种广泛的应用场景使得掌握MySQL成为后端开发、数据分析等岗位的基础技能要求。
SQL基础练习题的价值主要体现在三个维度:
- 语法熟练度:通过重复练习建立条件反射式的语法记忆
- 思维模式培养:训练将业务需求转化为SQL逻辑的能力
- 面试准备:覆盖80%以上初级岗位的技术考察点
我精选的这100道题目经过多年教学实践验证,按照难度梯度划分为四个层级:
- 单表基础操作(20题)
- 多表连接查询(30题)
- 聚合函数与分组(25题)
- 子查询与复杂逻辑(25题)
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与数据集构建
2.1 推荐安装配置
建议使用MySQL 8.0社区版,其窗口函数等新特性更符合现代SQL标准。Windows平台推荐采用MySQL Installer一键安装,Linux用户可通过apt/yum源安装:
bash复制# Ubuntu/Debian
sudo apt update
sudo apt install mysql-server
# CentOS/RHEL
sudo yum install mysql-community-server
重要提示:安装完成后务必运行
mysql_secure_installation进行安全配置,包括设置root密码、移除匿名用户等。
2.2 练习数据库设计
我们设计了一个电商业务模型作为练习基础,包含以下核心表:
sql复制CREATE DATABASE practice_db;
USE practice_db;
-- 用户表
CREATE TABLE users (
user_id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
register_date DATE,
vip_level ENUM('普通','白银','黄金','钻石')
);
-- 商品表
CREATE TABLE products (
product_id INT PRIMARY KEY,
product_name VARCHAR(100),
category VARCHAR(50),
price DECIMAL(10,2),
stock INT
);
-- 订单表
CREATE TABLE orders (
order_id VARCHAR(20) PRIMARY KEY,
user_id INT,
order_date DATETIME,
total_amount DECIMAL(12,2),
FOREIGN KEY (user_id) REFERENCES users(user_id)
);
-- 订单明细
CREATE TABLE order_details (
detail_id INT AUTO_INCREMENT PRIMARY KEY,
order_id VARCHAR(20),
product_id INT,
quantity INT,
subtotal DECIMAL(10,2),
FOREIGN KEY (order_id) REFERENCES orders(order_id),
FOREIGN KEY (product_id) REFERENCES products(product_id)
);
配套的测试数据生成脚本包含:
- 1000个模拟用户数据
- 50个商品信息
- 3000条订单记录
- 约10000条订单明细
3. 核心练习题分类解析
3.1 单表基础操作(20题精选)
典型题目示例:
sql复制-- 题目1:查询价格超过100元且库存大于10的商品
SELECT product_name, price, stock
FROM products
WHERE price > 100 AND stock > 10;
-- 题目5:按注册日期降序显示VIP等级为'黄金'的用户
SELECT username, register_date
FROM users
WHERE vip_level = '黄金'
ORDER BY register_date DESC;
关键知识点:
- WHERE条件的各种运算符(=, <>, >, <, BETWEEN, IN等)
- ORDER BY的多字段排序规则
- LIMIT分页的两种写法:
sql复制-- 写法1 SELECT * FROM products LIMIT 10 OFFSET 20; -- 写法2 SELECT * FROM products LIMIT 20, 10;
3.2 多表连接查询(30题进阶)
表连接类型对比:
| 连接类型 | 关键字 | 特点 | 使用场景 |
|---|---|---|---|
| 内连接 | INNER JOIN | 只返回匹配行 | 精确关联查询 |
| 左连接 | LEFT JOIN | 保留左表全部记录 | 主从表查询 |
| 右连接 | RIGHT JOIN | 保留右表全部记录 | 特殊场景使用 |
| 全连接 | FULL JOIN | 返回所有记录 | MySQL不支持 |
典型题目:
sql复制-- 题目25:查询每个订单的商品总数量
SELECT o.order_id, SUM(od.quantity) AS total_quantity
FROM orders o
JOIN order_details od ON o.order_id = od.order_id
GROUP BY o.order_id;
-- 题目33:查找从未下单的VIP用户
SELECT u.user_id, u.username
FROM users u
LEFT JOIN orders o ON u.user_id = o.user_id
WHERE o.order_id IS NULL AND u.vip_level IN ('黄金','钻石');
3.3 聚合函数深度应用(25题)
常见问题解决方案:
-
COUNT去重统计:
sql复制-- 统计有订单的用户数(去重) SELECT COUNT(DISTINCT user_id) FROM orders; -
GROUP BY多字段分组:
sql复制-- 按商品类别和价格区间统计库存 SELECT category, CASE WHEN price < 50 THEN '低价' WHEN price < 200 THEN '中价' ELSE '高价' END AS price_range, SUM(stock) AS total_stock FROM products GROUP BY category, price_range; -
HAVING筛选分组:
sql复制-- 查询总消费超过5000元的用户 SELECT user_id, SUM(total_amount) AS total_spent FROM orders GROUP BY user_id HAVING total_spent > 5000;
3.4 子查询与高级特性(25题)
典型应用场景:
-
EXISTS优化:
sql复制-- 查询购买过'手机'类商品的用户 SELECT u.user_id, u.username FROM users u WHERE EXISTS ( SELECT 1 FROM orders o JOIN order_details od ON o.order_id = od.order_id JOIN products p ON od.product_id = p.product_id WHERE o.user_id = u.user_id AND p.category = '手机' ); -
窗口函数实战:
sql复制-- 计算每个用户的消费排名 SELECT user_id, SUM(total_amount) AS total_spent, RANK() OVER (ORDER BY SUM(total_amount) DESC) AS rank FROM orders GROUP BY user_id; -
CTE递归查询:
sql复制-- 查找同一订单中购买数量最多的商品 WITH MaxQuantities AS ( SELECT order_id, MAX(quantity) AS max_qty FROM order_details GROUP BY order_id ) SELECT od.order_id, p.product_name, od.quantity FROM order_details od JOIN products p ON od.product_id = p.product_id JOIN MaxQuantities mq ON od.order_id = mq.order_id AND od.quantity = mq.max_qty;
4. 实战优化技巧与避坑指南
4.1 性能优化要点
-
索引使用原则:
- WHERE条件列必须建立索引
- JOIN关联字段需要索引
- ORDER BY/GROUP BY字段建议索引
- 避免在索引列上使用函数
-
EXPLAIN执行计划解读:
sql复制EXPLAIN SELECT * FROM users WHERE username LIKE '张%';关键指标关注:
- type:最好达到ref或range级别
- possible_keys:可能使用的索引
- rows:预估扫描行数
4.2 常见错误排查
-
GROUP BY陷阱:
sql复制-- 错误写法(MySQL 5.7以下不会报错) SELECT product_id, product_name, AVG(price) FROM products GROUP BY product_id; -- 正确写法 SELECT product_id, product_name, AVG(price) FROM products GROUP BY product_id, product_name; -
NULL值处理:
sql复制-- 错误统计(COUNT(*)会包含NULL) SELECT COUNT(*) FROM users WHERE vip_level IS NULL; -- 精确统计 SELECT COUNT(1) FROM users WHERE vip_level IS NULL; -
日期范围查询优化:
sql复制-- 低效写法 SELECT * FROM orders WHERE DATE(order_date) = '2023-01-01'; -- 高效写法 SELECT * FROM orders WHERE order_date >= '2023-01-01' AND order_date < '2023-01-02';
5. 学习路径与资源推荐
5.1 渐进式学习路线
-
基础阶段(1-2周):
- 完成前50道基础题
- 掌握SELECT各个子句的执行顺序
- 理解各种JOIN的区别
-
进阶阶段(2-3周):
- 完成后30道中级题
- 熟练使用GROUP BY进行数据聚合
- 掌握子查询的多种写法
-
高手阶段(3-4周):
- 完成最后20道高级题
- 学习窗口函数和CTE
- 研究执行计划优化
5.2 推荐扩展资源
-
官方文档:
-
实战平台:
- LeetCode数据库题库
- HackerRank SQL挑战
- SQLZoo交互式教程
-
性能工具:
- Percona Toolkit
- MySQL Workbench性能仪表盘
- pt-query-digest日志分析
这套练习题经过三年迭代优化,累计帮助超过2000名学员通过技术面试。建议每天完成5-10题,配合实际业务场景思考,逐步培养SQL思维模式。遇到复杂问题时,可以先用伪代码描述逻辑,再转化为SQL语句。
