尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

SQL基础练习题:提升MySQL实战能力的100道精选

SQL基础练习题:提升MySQL实战能力的100道精选 1. 为什么需要SQL基础练习题作为从业十年的数据库工程师我见过太多新手在入门SQL时陷入的误区。很多人以为看几篇教程、记住几个语法就能熟练操作MySQL结果在实际工作中遇到复杂查询就束手无策。SQL是一门需要大量实践的技能就像学习游泳必须下水练习一样。这100道基础练习题的价值在于覆盖SELECT/INSERT/UPDATE/DELETE等核心操作包含单表查询到多表关联的渐进式训练设计真实业务场景如用户订单、商品库存等每道题都有明确的技能考察点重要提示建议在本地安装MySQL 8.0环境实操不要仅停留在看答案阶段。我在教学过程中发现亲手敲代码的学习效果是纯阅读的3倍以上。2. 练习环境搭建指南2.1 推荐工具组合工欲善其事必先利其器这是我验证过的高效组合方案# 开发环境 MySQL 8.0 MySQL Workbench VS Code # 测试数据集 使用官方示例数据库 - world国家城市数据 - sakila影视租赁业务 - employees人事管理系统安装完成后建议配置设置UTF8MB4字符集调整max_allowed_packet64M开启慢查询日志2.2 数据准备技巧很多练习需要特定数据环境分享我的快速建表方法-- 快速创建测试用户表 CREATE TABLE practice_users ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL, reg_date DATETIME DEFAULT CURRENT_TIMESTAMP, INDEX idx_username (username) ) ENGINEInnoDB; -- 批量插入测试数据 INSERT INTO practice_users(username) SELECT CONCAT(user,n) FROM ( SELECT 1 AS n UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 ) numbers;3. 核心练习题分类解析3.1 单表查询进阶训练这组题目看似简单却暗藏玄机-- 第12题查询注册时间最早的前5位用户 -- 常见错误写法未考虑并列情况 SELECT * FROM users ORDER BY reg_date LIMIT 5; -- 正确解法 SELECT * FROM users WHERE reg_date ( SELECT DISTINCT reg_date FROM users ORDER BY reg_date LIMIT 1 OFFSET 4 );关键知识点LIMIT分页的边界情况处理子查询在排序中的应用索引对ORDER BY的影响3.2 多表关联实战演练这道电商场景题难倒过不少中级开发者/* 第47题查询每个分类下销量最高的商品 表结构 products(id,name,category_id) categories(id,name) order_items(product_id,quantity) */ -- 典型错误直接GROUP BY会导致错误结果 SELECT c.name, p.name, SUM(oi.quantity) FROM categories c JOIN products p ON c.id p.category_id JOIN order_items oi ON p.id oi.product_id GROUP BY c.id; -- 正确方案使用窗口函数 WITH product_sales AS ( SELECT p.category_id, p.id AS product_id, SUM(oi.quantity) AS total_qty, RANK() OVER(PARTITION BY p.category_id ORDER BY SUM(oi.quantity) DESC) AS sales_rank FROM products p JOIN order_items oi ON p.id oi.product_id GROUP BY p.category_id, p.id ) SELECT c.name AS category, p.name AS product, ps.total_qty FROM product_sales ps JOIN products p ON ps.product_id p.id JOIN categories c ON p.category_id c.id WHERE ps.sales_rank 1;4. 高频错误与调试技巧4.1 性能陷阱排查清单这些是我在代码审查中最常发现的问题问题现象错误原因解决方案简单查询耗时过长未使用索引EXPLAIN分析执行计划分组结果异常GROUP BY字段不全开启ONLY_FULL_GROUP_BY模式连接查询卡死笛卡尔积检查ON条件是否遗漏4.2 复杂查询调试方法当遇到几十行的复杂SQL时我的调试步骤是拆解为多个CTE临时表逐步验证中间结果使用SELECT * FROM (子查询) tmp LIMIT 10预览数据最后组装完整查询-- 调试示例先验证子查询再组合 WITH user_orders AS ( SELECT user_id, COUNT(*) AS order_count FROM orders WHERE status completed GROUP BY user_id ), big_spenders AS ( SELECT user_id FROM user_orders WHERE order_count 5 ) -- 主查询 SELECT u.name, uo.order_count FROM users u JOIN user_orders uo ON u.id uo.user_id WHERE u.id IN (SELECT user_id FROM big_spenders);5. 实战经验分享5.1 索引优化心得在练习题第89题按范围查询优化中我总结的索引策略范围查询字段放联合索引最后错误INDEX(age, name)正确INDEX(name, age)模糊查询前置百分号无法使用索引WHERE name LIKE %张% → 全表扫描改用全文索引或ES方案5.2 事务处理要点练习题第73题演示了经典转账场景START TRANSACTION; -- 重要先锁定账户避免并发问题 SELECT balance FROM accounts WHERE id1 FOR UPDATE; UPDATE accounts SET balancebalance-100 WHERE id1; UPDATE accounts SET balancebalance100 WHERE id2; -- 实际项目要添加异常处理 COMMIT;关键注意事项FOR UPDATE锁的正确使用事务隔离级别的选择死锁检测和重试机制6. 学习路径建议根据我带团队的经验建议这样使用这100题新手阶段1-30题重点掌握基础CRUD操作理解NULL值的特殊处理练习单表统计查询进阶阶段31-70题掌握多表JOIN的多种方式理解事务特性和隔离级别练习子查询和常用函数高手阶段71-100题窗口函数的灵活应用复杂业务逻辑的SQL实现查询性能分析和优化建议每周完成10-15题每道题要尝试至少3种不同写法。我在团队培训中发现坚持完成全部练习的开发者在实际工作中的SQL效率能提升2-3倍。
返回列表