SQL练习题单表多表各四套:从会写到写对,攻克JOIN与分组查询
简介这份SQL语句练习题集面向MySQL初学者与希望巩固查询能力的开发者通过单表与多表各四套题目帮助系统提升SQL实战水平。单表部分覆盖SELECT、WHERE过滤、ORDER BY排序及GROUP BY分组聚合等基础操作多表部分则围绕INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL OUTER JOIN与子查询展开训练多数据源整合能力。资源包共19个文件以13个txt题目与答案说明、5个sql脚本及1个zip压缩包为主sql脚本可直接导入MySQL环境建库建表并插入示例数据整体约22KB轻量便于携带与练习。目前已有918人学习下载适合边做边查、对照答案复盘逐步掌握高效查询的编写思路与排错方法。1. SQL 练习题到底练什么从“会写”到“写对”的那道坎很多人学 SQL 都有过这种体验语法看了一遍SELECT、WHERE、GROUP BY 好像都懂可真给一张表让你查“每个部门工资最高的那个人”手就停在键盘上了。这就像学游泳岸上动作背得再熟下水还是呛。SQL 练习题要解决的恰恰是“看懂”和“写出来”之间那道坎。这份资源叫“sql语句练习题单表多表各四套”说白了就是八套题四套只涉及一张表四套要跨两张甚至更多表。单表题练的是过滤、排序、聚合、分组这些基本功多表题练的是 JOIN、子查询、关联条件这些真正干活时天天用的东西。它不教你 SQL 是什么而是逼你把已经知道的语法真正用出来。对刚学完基础语法、想找题上手的人来说这种“单表打底、多表进阶”的结构比一上来就扔复杂业务场景友好得多。2. 为什么单表题是绕不过去的基本功2.1 单表题练的是“把话翻译成条件”的能力单表题看起来简单但它的价值不在于表少而在于它把注意力全部集中在“逻辑翻译”上。比如“查出工资高于 8000 且入职时间在 2020 年之后的员工”这句话里藏着两个条件、一个逻辑与、一个日期范围判断。你要做的是把中文准确拆成 WHERE 子句里的表达式而不是被多表关联分散精力。打个比方单表题就像练字时的基本笔画。横平竖直练不好直接写行书只会越写越乱。单表题里高频出现的几类操作其实覆盖了日常查询的大半壁江山条件过滤WHERE 配合比较运算符、BETWEEN、IN、LIKE排序与截断ORDER BY 加 LIMIT取“前 N 条”聚合统计COUNT、SUM、AVG、MAX、MIN分组汇总GROUP BY 配合 HAVING 做组内筛选空值处理IS NULL、IFNULL、COALESCE这些操作单独拎出来都不难但组合在一起就容易翻车。比如 WHERE 和 HAVING 的执行顺序很多人第一次写“筛选分组后平均工资大于 9000 的部门”时会把条件写进 WHERE结果报错或者结果不对。单表题就是让你在低复杂度环境下反复踩这个坑踩到形成肌肉记忆。2.2 一道单表题拆开看考的是三层能力拿一道典型的单表题举例有一张员工表字段包括员工编号、姓名、部门、工资、入职日期要求“查询每个部门的平均工资只显示平均工资大于 9000 的部门并按平均工资从高到低排列”。这道题表面考的是 GROUP BY实际拆开是三层第一层识别出“每个部门”意味着要按部门分组这是 GROUP BY 的信号。第二层“平均工资大于 9000”是对分组结果的筛选必须用 HAVING 而不是 WHERE因为 WHERE 在分组前执行那时还没有“平均工资”这个值。第三层“按平均工资从高到低”是排序ORDER BY 要放在最后。-- 单表分组查询的典型结构 SELECT department, AVG(salary) AS avg_salary FROM employee GROUP BY department HAVING AVG(salary) 9000 ORDER BY avg_salary DESC;这段代码里GROUP BY 指定分组依据HAVING 对分组后的聚合值做过滤ORDER BY 控制输出顺序。三个子句的执行顺序是 FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY写错位置不是语法错误就是逻辑错误。单表题反复练的就是这个顺序感。注意WHERE 里不能直接用聚合函数这是初学者最高频的报错来源之一。记住“WHERE 管行HAVING 管组”这句口诀能省下不少调试时间。2.3 单表题做多少算够四套单表题的量对于刚学完语法的人来说是合理的。太少达不到熟练度太多又会在重复中失去新鲜感。关键不是刷完而是每做完一套回头看看哪些题是卡住的、卡在哪个子句上。如果连续两套题都在 HAVING 上出错那就不是题的问题是执行顺序没吃透。单表题还有一个隐藏价值它是多表题的地基。多表查询里每一张表的过滤逻辑本质上还是单表操作只是多了关联条件。单表不熟多表只会更乱。3. 多表题难在哪关联逻辑才是真正的分水岭3.1 多表题考的是“数据在哪张表、怎么连起来”单表题的所有信息都在一张表里多表题则要求你先搞清楚“我要的数据分散在哪几张表”再想“它们靠什么字段关联”。这就像查一个学生的成绩学生姓名在一张表成绩在另一张表两张表靠学号连起来。你得先知道学号是桥梁才能把信息拼完整。多表题的核心操作是 JOIN。INNER JOIN 取交集LEFT JOIN 保留左表全部RIGHT JOIN 保留右表全部。什么时候用哪种取决于业务问题里“要不要保留没有匹配的行”。比如“查询所有员工及其部门名称没有部门的员工也要显示”那就必须用 LEFT JOIN因为 INNER JOIN 会把没有部门的员工直接丢掉。-- 左连接保留所有员工即使没有对应部门 SELECT e.name, d.department_name FROM employee e LEFT JOIN department d ON e.department_id d.department_id;这里 ON 后面跟的是关联条件e.department_id d.department_id 是两张表的“接头暗号”。如果写成 INNER JOIN没有部门的员工就不会出现在结果里。很多初学者写完发现“怎么少了几个人”八成就是 JOIN 类型选错了。3.2 多表题的常见翻车点笛卡尔积和重复行多表查询最容易翻车的地方有两个。第一个是忘记写关联条件导致笛卡尔积——两张表每一行都和另一张表每一行配对结果行数爆炸。比如员工表 100 行、部门表 10 行不写 ON 条件就会出来 1000 行而且大部分是毫无意义的组合。第二个是关联字段不唯一导致的重复行。比如一张订单表关联一张明细表一个订单对应多条明细用 INNER JOIN 查订单信息时订单号会重复出现多次。这时候要么用 DISTINCT 去重要么用 GROUP BY 聚合要么就得想清楚业务上到底要不要展开明细。提示写多表查询时先单独查每张表的行数和关联字段的唯一性再写 JOIN。这个习惯能帮你提前发现大部分“结果不对”的问题。3.3 子查询和 JOIN 什么时候用哪个多表题里还有一类解法是子查询。比如“查询工资高于公司平均工资的员工”可以用子查询先算出平均工资再在外层筛选。也可以用 JOIN 把平均工资表关联进来。两种写法结果一样但可读性和性能有差异。-- 子查询写法先算平均再筛选 SELECT name, salary FROM employee WHERE salary (SELECT AVG(salary) FROM employee); -- JOIN 写法把聚合结果当成临时表关联 SELECT e.name, e.salary FROM employee e JOIN (SELECT AVG(salary) AS avg_sal FROM employee) t ON e.salary t.avg_sal;子查询更直观适合逻辑简单的场景JOIN 写法在复杂查询里更容易扩展比如还要同时关联部门信息时。没有绝对优劣但多表题会逼你两种都练练到能根据场景选。4. 单表和多表到底有什么区别几个容易混的概念4.1 易混点一WHERE 和 HAVING易混在哪两者都是筛选写的时候容易随手放错位置。为什么混都叫“条件”语法形式也像。怎么区分WHERE 在分组前过滤行不能跟聚合函数HAVING 在分组后过滤组通常跟聚合函数。记住“先有行再有组”WHERE 管行HAVING 管组。4.2 易混点二INNER JOIN 和 LEFT JOIN易混在哪都能把两张表连起来结果看起来差不多。为什么混当两张表数据完全匹配时两者结果一样容易以为可以互换。怎么区分看业务要不要保留“没有匹配”的行。要保留左表全部用 LEFT JOIN只要匹配上的用 INNER JOIN。数据完整时看不出差别数据有缺失时差别巨大。4.3 易混点三ON 和 WHERE 在 JOIN 里的位置易混在哪都是加条件写在 ON 后面还是 WHERE 后面好像都行。为什么混在 INNER JOIN 里ON 和 WHERE 的效果确实一样。怎么区分在 LEFT JOIN 里ON 的条件在连接时生效WHERE 的条件在连接后过滤。如果把左表条件写在 WHERE 里可能把 LEFT JOIN 变成事实上的 INNER JOIN丢掉本该保留的行。4.4 易混点四DISTINCT 和 GROUP BY易混在哪都能去重结果有时一样。为什么混去重效果相似容易觉得可以随便用。怎么区分DISTINCT 是对整行去重GROUP BY 是按字段分组后可以配合聚合函数。只是去重用 DISTINCT要去重还要统计用 GROUP BY。4.5 易混点五单表题简单所以可以跳过易混在哪觉得单表没什么可练的直接上多表。为什么混单表语法少看起来没挑战。怎么区分单表练的是条件翻译和子句顺序这两项在多表里同样核心。单表不熟多表只会把错误放大。四套单表题不是凑数是打地基。5. 什么时候该练、什么时候别硬练这份练习题最适合的场景是你已经看完 SQL 基础语法能看懂 SELECT 语句但自己写的时候经常卡壳或者结果不对。这时候四套单表加四套多表的结构刚好匹配你的阶段单表帮你把条件、排序、分组练成条件反射多表帮你把关联逻辑和 JOIN 选择练成直觉。如果你连 SELECT、FROM、WHERE 的基本写法都还没过一遍直接做这套题会很痛苦每道题都要查语法练的不是逻辑而是记忆。那种情况下先把基础语法过一轮再回来做题效率更高。还有一种情况是你已经工作两三年天天写复杂查询那这套题对你来说可能偏基础。它的定位是“从会到熟”不是“从熟到精”。但如果你发现自己写多表查询时偶尔还会搞错 JOIN 类型或者 HAVING 和 WHERE 还要想一下那回头刷一遍多表题也不丢人。我自己就干过这事有次写一个报表查询LEFT JOIN 后面把条件写进了 WHERE结果数据少了一半排查了半天才发现是 JOIN 类型被自己写成了事实上的 INNER JOIN。从那以后我每次写 LEFT JOIN 都强制检查一遍 ON 和 WHERE 的分工这个习惯就是刷题时养成的。注意练习题的价值在于“做完之后知道为什么对、为什么错”。只对答案不回头看逻辑刷再多套也只是在重复已经会的东西。这份资源把单表和多表分开各四套好处是你可以按自己的薄弱环节选。单表不稳就先做单表多表发怵就集中做多表。每套题做完把卡住的题目标记出来过两天再做一遍比一口气刷完八套更有效。希望帮到你。本文还有配套的精品资源点击获取