首页/新闻资讯/正文详情

SQL练习题单表+多表各四套:从基础查询到多表关联实战

发布时间:2026/9/26 1:36:55 来源:云帆数科 栏目:资讯中心
SQL练习题单表+多表各四套:从基础查询到多表关联实战
简介这份SQL练习资源面向MySQL初学者与希望巩固查询基础的开发者围绕单表与多表两大主题各提供四套练习题帮助读者在动手实践中理解SELECT、WHERE、ORDER BY、GROUP BY及聚合函数等基础用法并进一步掌握INNER JOIN、LEFT JOIN、子查询等多表关联技巧。资源包共19个文件以13个txt文本、5个sql脚本和1个zip压缩包为主sql文件可直接导入MySQL环境执行txt则用于记录题目与答案说明整体约22KB轻量便于携带与练习。目前已有915人学习下载说明其在SQL入门训练中具有一定参考价值。通过逐套完成单表过滤、排序、分组统计以及多表联接、嵌套查询等题目读者能够熟悉建库建表、数据插入到复杂查询的完整流程逐步建立编写高效SQL语句的思路适合作为日常刷题与面试前查漏补缺的练习材料。1. 从一份“单表多表各四套”的 SQL 练习单说起很多人学 SQL 卡在同一个地方语法看懂了真给一张业务表却写不出查询。这份“sql语句练习题单表多表各四套”就是冲着这个痛点来的——它把练习拆成单表和多表两个阶段每个阶段四套题从最基础的SELECT、WHERE过滤一路推到GROUP BY聚合、JOIN关联和子查询。适合刚学完 SQL 基础语法、准备刷题巩固的初学者也适合工作里偶尔要写原生 SQL 但总靠搜索引擎拼凑的开发者。它不教你装数据库也不讲索引原理就是让你对着真实表结构反复写查询把“看得懂”变成“写得出”。2. 单表四套题把 WHERE、GROUP BY 和聚合函数练成肌肉记忆单表练习的价值常被低估。实际工作里大部分慢 SQL 和逻辑错误都出在单表过滤和聚合上——条件写错、NULL没处理、GROUP BY和HAVING混用这些坑在多表关联里会被放大。所以拿到这份题单别急着跳到多表先把单表四套按顺序过一遍。2.1 单表题单的结构与难度递进四套单表题通常按这个梯度排第一套考基础查询和条件过滤第二套加排序和限制第三套引入聚合函数第四套上分组和子查询。以常见的员工表emp为例表结构一般包含empno工号、ename姓名、job职位、mgr上级工号、hiredate入职日期、sal工资、comm奖金、deptno部门号。这套结构来自经典的 SCOTT 用户很多练习单表都基于它。先看第一套里最典型的题查询工资大于 2000 的员工姓名和工资。写法很直接-- 基础过滤注意 sal 是数值列直接比较即可 SELECT ename, sal FROM emp WHERE sal 2000;这里的关键不是语法而是理解WHERE在FROM之后、SELECT之前执行。很多人写SELECT ename, sal FROM emp WHERE sal 2000没问题但一旦加上别名条件就容易翻车比如WHERE 年薪 24000会报错因为WHERE阶段SELECT里的别名还没生成。正确做法是重复表达式或套子查询。第二套加排序查询部门 30 的员工按工资降序排列。注意ORDER BY默认升序降序要显式写DESC-- 排序ORDER BY 在 SELECT 之后执行可以用 SELECT 里的别名 SELECT ename, sal FROM emp WHERE deptno 30 ORDER BY sal DESC;第三套上聚合查询全公司最高工资、最低工资和平均工资。这里有个新手常踩的坑——AVG(sal)会自动忽略NULL但sal列一般不为空所以没问题如果换成comm列AVG(comm)算的是有奖金的人的平均值不是全员的。要算全员平均奖金得用AVG(IFNULL(comm, 0))或AVG(COALESCE(comm, 0))。-- 聚合COUNT(*) 统计行数COUNT(comm) 只统计 comm 非空的行 SELECT MAX(sal) AS max_sal, MIN(sal) AS min_sal, AVG(sal) AS avg_sal, COUNT(*) AS total_emp, COUNT(comm) AS comm_emp FROM emp;第四套是分组加子查询查询每个部门的平均工资并只显示平均工资大于 2000 的部门。这里必须用HAVING而不是WHERE因为过滤的是聚合结果-- 分组过滤WHERE 过滤行HAVING 过滤组 SELECT deptno, AVG(sal) AS avg_sal FROM emp GROUP BY deptno HAVING AVG(sal) 2000;如果题目要求同时显示部门名称而部门名称在dept表里那就自然过渡到多表了。单表阶段先把这些写熟多表才不会乱。2.2 单表练习里最该盯住的三个参数写单表查询时有三个地方最容易出问题我一般会重点检查。第一是NULL的比较。WHERE comm NULL永远返回空结果必须写WHERE comm IS NULL或WHERE comm IS NOT NULL。这个坑在单表题里出现频率极高因为comm列经常有大量空值。第二是GROUP BY的列和SELECT的列要匹配。MySQL 在ONLY_FULL_GROUP_BY模式下会报错比如SELECT ename, deptno, AVG(sal) FROM emp GROUP BY deptno就会失败因为ename不在GROUP BY里也不是聚合函数。标准写法是GROUP BY deptno, ename或者用ANY_VALUE(ename)绕过但后者不推荐在生产用。第三是LIMIT和ORDER BY的配合。LIMIT单独用没有意义因为不排序的话返回哪几行是不确定的。题目里凡是出现“前 N 条”“最高 N 个”一定要先ORDER BY再LIMIT。-- 正确先排序再限制否则结果不可预测 SELECT ename, sal FROM emp ORDER BY sal DESC LIMIT 5;单表四套题做完你应该能闭着眼写出带过滤、排序、聚合、分组的查询。这时候再上多表注意力才能放在关联逻辑上而不是被基础语法分散精力。3. 多表四套题JOIN、子查询和集合运算的实战拆解多表查询是 SQL 练习的分水岭。单表写错顶多结果不对多表写错可能直接笛卡尔积把数据库拖垮。这份题单的多表部分通常涉及emp、dept、salgrade三张表四套题从内连接逐步推到外连接、自连接和子查询。3.1 内连接与外连接LEFT JOIN ON 多表关联的边界第一套多表题一般是内连接查询员工姓名、部门名称和工资。标准写法是JOIN ... ON-- 内连接只返回两表都匹配的行 SELECT e.ename, d.dname, e.sal FROM emp e JOIN dept d ON e.deptno d.deptno;这里JOIN默认就是INNER JOIN只返回deptno在两张表里都存在的行。如果某个员工没有部门或者某个部门没有员工这些行不会出现。第二套通常考外连接查询所有部门包括没有员工的部门。这时候必须用LEFT JOIN并且注意WHERE和ON的区别-- 左外连接保留左表所有行右表无匹配则填 NULL SELECT d.dname, e.ename FROM dept d LEFT JOIN emp e ON d.deptno e.deptno;如果把条件写到WHERE里比如WHERE e.sal 1000那没有员工的部门会被过滤掉因为NULL 1000不成立。要保留这些行条件得放在ON里LEFT JOIN emp e ON d.deptno e.deptno AND e.sal 1000。这个区别是多表练习里最经典的坑没有之一。第三套常考自连接查询每个员工的姓名和他的上级姓名。因为上级也是员工存在同一张表里所以要给表起两个别名-- 自连接同一张表用两个别名模拟层级关系 SELECT e.ename AS employee, m.ename AS manager FROM emp e LEFT JOIN emp m ON e.mgr m.mgr;注意这里用LEFT JOIN是为了让没有上级的员工比如老板也能显示出来m.ename会是NULL。如果用JOIN老板就直接消失了。第四套上子查询查询工资高于本部门平均工资的员工。这类题有两种写法一种是相关子查询一种是JOIN派生表。相关子查询更直观-- 相关子查询子查询依赖外层每一行的 deptno SELECT e.ename, e.sal, e.deptno FROM emp e WHERE e.sal ( SELECT AVG(sal) FROM emp WHERE deptno e.deptno );这种写法在数据量大时性能较差因为每行都要执行一次子查询。生产里更常见的是先算出各部门平均工资再关联-- 派生表先聚合再关联性能更好 SELECT e.ename, e.sal, e.deptno FROM emp e JOIN ( SELECT deptno, AVG(sal) AS avg_sal FROM emp GROUP BY deptno ) t ON e.deptno t.deptno WHERE e.sal t.avg_sal;两种写法结果一样但执行计划差别很大。练习时建议两种都写一遍用EXPLAIN看看区别。3.2 多表练习里的执行顺序与性能意识多表查询写多了容易只关注结果对不对忽略执行效率。这份题单虽然以练习为主但正好可以借机建立性能意识。SQL 的逻辑执行顺序是FROM → ON → JOIN → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT。理解这个顺序很多“为什么别名不能用”“为什么LEFT JOIN条件放WHERE会变内连接”的问题就迎刃而解。写多表时我一般会检查三件事。第一关联字段有没有索引。emp.deptno和dept.deptno如果没有索引大表关联会非常慢。第二JOIN的顺序。虽然优化器会重排但小表驱动大表通常更快。第三避免在ON里做函数运算比如ON DATE(e.hiredate) d.date这会导致索引失效。-- 不推荐ON 里用函数索引失效 SELECT * FROM emp e JOIN dept d ON DATE(e.hiredate) d.hiredate; -- 推荐把函数移到常量侧或改用范围查询 SELECT * FROM emp e JOIN dept d ON e.hiredate d.hiredate AND e.hiredate DATE_ADD(d.hiredate, INTERVAL 1 DAY);多表四套题做完你应该能分清JOIN和LEFT JOIN的适用场景能写自连接和子查询并且知道条件放ON还是WHERE的区别。这些在真实业务里天天用。4. 避坑与排查练习 SQL 时最容易翻车的五个地方4.1 现象查询结果比预期少了很多行原因通常是WHERE里用了比较NULL或者JOIN时关联字段类型不一致导致隐式转换失败。比如emp.deptno是INTdept.deptno是VARCHARMySQL 会做隐式转换但可能匹配不上。解决方法是统一字段类型NULL判断一律用IS NULL/IS NOT NULL。4.2 现象GROUP BY报错ONLY_FULL_GROUP_BY原因是在SELECT里写了不在GROUP BY中也不是聚合函数的列。解决方法是把该列加入GROUP BY或者用聚合函数包起来比如MAX(ename)。如果确实需要取任意一行可以用ANY_VALUE()但要知道这不是标准 SQL。4.3 现象LEFT JOIN后右表条件失效原因是把右表的过滤条件写在了WHERE里导致NULL行被过滤外连接退化成内连接。解决方法是把条件移到ON子句里或者用WHERE (e.sal 1000 OR e.sal IS NULL)显式保留空行。4.4 现象子查询返回多行导致报错原因是用了比较子查询结果但子查询返回了多行。解决方法是改用IN、ANY、ALL或者在子查询里加LIMIT 1。如果业务上确实应该只有一行那要检查数据本身是否有重复。4.5 现象多表关联后结果行数暴增原因是关联条件不完整产生了笛卡尔积。比如emp和dept关联时只写了WHERE e.sal 1000忘了写e.deptno d.deptno。解决方法是检查ON或WHERE里是否有完整的关联条件用EXPLAIN看rows列是否异常大。5. 把题单用出最大价值我的刷题习惯和验证方法刷题最怕的是“写完就扔”。我自己的习惯是每套题写完后强制做三件事用EXPLAIN看执行计划、换一种写法对比结果、把题目改一个条件再写一遍。EXPLAIN是 SQL 练习里最被低估的工具。它不只能看索引有没有命中还能看出JOIN顺序、扫描行数、是否用了临时表。比如下面这条查询EXPLAIN SELECT d.dname, COUNT(e.empno) AS emp_count FROM dept d LEFT JOIN emp e ON d.deptno e.deptno GROUP BY d.dname;输出里重点看type列ALL是全表扫描ref或eq_ref是索引查找、rows列预估扫描行数、Extra列出现Using temporary或Using filesort说明有优化空间。练习时数据量小看不出性能差异但养成看执行计划的习惯工作里遇到慢 SQL 就不会慌。换写法对比结果是为了理解不同写法的边界。比如“查询没有员工的部门”可以用LEFT JOIN ... WHERE e.empno IS NULL也可以用NOT EXISTS还可以用NOT IN。三种写法在NULL处理上行为不同NOT IN遇到子查询里有NULL会返回空结果这个坑我踩过不止一次。改条件再写一遍是为了防止背题。比如原题是“工资大于 2000”改成“工资大于本部门平均工资”难度立刻上一个台阶。题单的价值不在于题目本身而在于你能否把解题思路迁移到新问题上。最后说一个具体技巧把每套题的答案整理成一个.sql文件按题号注释用source命令批量执行验证。这样下次复习时不用重新搭环境直接跑一遍就能回忆起来。# 批量执行练习答案并输出到文件对比 mysql -u root -p practice_db answers.sql result.txt从那以后我每次刷完题都会把答案和执行结果一起存档过一周再盲写一遍。能盲写出来的才是真会了。希望这份题单也能帮你把 SQL 从“看得懂”变成“写得出”。本文还有配套的精品资源点击获取

相关推荐

中财ACCESS数据库复习题解析:SQL语句与数据库增删改查实战
中财ACCESS数据库复习题解析:SQL语句与数据库增删改查实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 1:36:55

EOS开发环境搭建:从本地链出块失败到稳定运行的实操指南
EOS开发环境搭建:从本地链出块失败到稳定运行的实操指南

1. 为什么EOS开发环境搭建总让人卡在第一步?——从“跑不起来”到“本地链稳定出块”的真实路径很多人第一次接触EOS时,看到官方文档里那句“Install the EOSIO development environment”就直接点开终端敲命令,结果不到十分钟就陷入循环&… · 2026/9/26 1:36:43

从零手写 LLM 推理引擎:H100 上 CUDA 踩坑与 TaoToken 配置骨架
从零手写 LLM 推理引擎:H100 上 CUDA 踩坑与 TaoToken 配置骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 1:36:37

为什么图纸问题总到施工时才暴露?
为什么图纸问题总到施工时才暴露?

标高冲突、预留洞口对不上、节点做法现场现编——这些问题几乎从不在图纸阶段冒头,专挑施工时炸。是图纸质量真没问题吗?不是。是发现它们的时机被推后了。问题其实一直都在,只是三个环节没人兜住。 环节一:会前没人真看图。 会审… · 2026/9/26 2:17:17

ElastAlert 规则过滤器(filter)编写指南:从 Query DSL 到 Kibana 导入的完整实战
ElastAlert 规则过滤器(filter)编写指南:从 Query DSL 到 Kibana 导入的完整实战

告警异常检测 【免费下载链接】elastalert Easy & Flexible Alerting With ElasticSearch 项目地址: https://gitcode.com/gh_mirrors/el/elastalert 点击查看 免费下载 ElastAlert 的每条规则都通过 filter 字段定义"什么样的日志事件需要被处理"&a… · 2026/9/26 2:17:11

蘑菇检测数据集与YOLO训练实战:从标注到部署避坑指南
蘑菇检测数据集与YOLO训练实战:从标注到部署避坑指南

简介:面向深度学习目标检测任务的蘑菇检测数据集,适合正在学习YOLO系列模型或需要目标检测训练数据的开发者使用。数据已按YOLO格式整理,包含训练集与验证集、对应标签文件以及类别说明class文件,标签由labelme标注完成&#xff0… · 2026/9/26 2:17:11

使用AI生成C/C++头文件(.h)函数注释的方法和步骤:TaoToken统一API接入与配置骨架
使用AI生成C/C++头文件(.h)函数注释的方法和步骤:TaoToken统一API接入与配置骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 2:17:05

ESP32双模智能家居DIY:WiFi与BLE协同开发实战指南
ESP32双模智能家居DIY:WiFi与BLE协同开发实战指南

1. 为什么ESP32成了智能家居DIY的甜点级芯片如果你最近在折腾智能家居,大概率绕不开ESP32这颗芯片。它火到什么程度?随便打开一个创客社区,ESP32相关的项目帖能占掉半壁江山。原因其实不复杂:一颗十几块钱的芯片,同时集… · 2026/9/26 2:16:59

Word Shift+F3快捷键深度解析:文本大小写原子级控制
Word Shift+F3快捷键深度解析:文本大小写原子级控制

1. 这个快捷键不是“按一下就完事”,而是Word里最被低估的文本格式切换开关很多人在Word里遇到大小写混杂的英文段落,第一反应是手动选中、右键、点“更改大小写”——这动作看似简单,但每天重复十几次,一年下来就是近两万次鼠标悬… · 2026/9/26 2:16:59

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21

OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40

向下兼容与向上兼容:接口设计中的兼容性策略与工程实践
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践

一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码