资讯动态

零基础学SQL:单表与多表练习题单实战指南

发布时间:2026/10/18 9:27:40 来源:尧图企业网站定制
简介这份SQL语句练习题资源面向MySQL初学者与希望巩固查询基础的开发者围绕单表与多表两大主题各提供四套练习帮助读者在动手实践中理解SELECT、WHERE、ORDER BY、GROUP BY及各类JOIN、子查询的用法。资源共19个文件以13个txt文本与5个sql脚本为主另含1个zip压缩包整体约22KBsql脚本可直接导入MySQL环境执行txt则用于记录题目与答案方便对照练习。内容覆盖单表过滤、排序、聚合统计以及INNER JOIN、LEFT JOIN、RIGHT JOIN与嵌套子查询等核心场景并配有示例数据库便于建库建表、插入数据后即时验证结果。目前已有918人学习下载适合作为课堂练习、面试复习或日常查漏补缺的题库通过反复演练可逐步提升编写高效查询与整合多数据源的能力。1. 零基础学 SQL为什么你该从练习题单开始上手很多人第一次打开数据库教程看到满屏的 SELECT、FROM、WHERE脑子直接懵了。这玩意儿跟 Excel 到底有啥区别我学它干嘛其实你可以把 SQL 想成一种“跟数据对话的语言”——Excel 是你自己动手一行行翻、一列列筛而 SQL 是你写一句话让数据库帮你把想要的数据捞出来。数据量小的时候感觉不出来一旦表里塞了几万行、几十万行Excel 卡到转圈SQL 一秒钟就给你结果。这就是为什么做运营、做产品、做开发、做数据分析几乎都绕不开它。而这份“sql语句练习题单表多表各四套”的资源就是给零基础的人准备的一条练习路径先拿单表练手感再用多表练思维每套题都围绕真实场景设计让你不是背语法而是用语法解决问题。2. 先搞懂 SQL 到底在干什么从一张表说起2.1 数据库、表、行、列用一张通讯录就能理解别被“关系型数据库”“MySQL”这些词吓到。你手机里的通讯录就是一个活生生的表每一行是一个联系人每一列是姓名、电话、备注。数据库就是把这些表存起来、管起来的一个仓库MySQL 是其中一种常见的仓库类型。SQL 则是你向这个仓库管理员提要求的语言。你说“把电话以 138 开头的联系人给我”管理员就去翻表把符合条件的行拎出来给你。你不需要知道它怎么翻的只需要把要求说清楚。这就是 SQL 最核心的价值描述你要什么而不是指挥它怎么做。入门阶段你只要记住四个最基本的动作——查SELECT、增INSERT、改UPDATE、删DELETE其中查用得最多也最值得先练。2.2 为什么单表练完必须练多表单表查询就像在一个抽屉里找东西条件写对就行。但真实世界的数据是拆开存的用户信息在一张表订单信息在另一张表商品信息又在第三张表。你要回答“谁买了什么”这种问题就得把多张表拼起来看。这个“拼”的动作就是 JOIN。很多新手单表写得很顺一遇到多表就翻车根本原因是没理解“表与表之间靠什么字段关联”。比如用户表里有 user_id订单表里也有 user_id这个共同的字段就是桥梁。练习题单里专门拆出“单表四套”和“多表四套”就是让你先把一个抽屉翻熟再学怎么把几个抽屉对照着翻。这个顺序不能跳跳了就容易在 JOIN 那里卡死。2.3 第一个能跑的查询从一张模拟用户表开始下面这段代码你可以直接复制到任何 MySQL 环境里跑。它建了一张极简的用户表插了几条数据然后查出了所有来自“北京”的用户。别怕一行行看注释。-- 创建一个模拟用户表只保留最基础的字段 CREATE TABLE mock_users ( user_id INT PRIMARY KEY, -- 用户编号主键不能重复 user_name VARCHAR(50), -- 用户昵称 city VARCHAR(50), -- 所在城市 age INT -- 年龄 ); -- 插入四条模拟数据 INSERT INTO mock_users (user_id, user_name, city, age) VALUES (1, A同学, 北京, 22), (2, B同学, 上海, 25), (3, C同学, 北京, 28), (4, D同学, 广州, 24); -- 查询所有来自北京的用户 SELECT user_name, age FROM mock_users WHERE city 北京;第一段 CREATE TABLE 是建一张空表括号里定义了四个列每个列后面跟的是数据类型INT 存整数VARCHAR(50) 存最多 50 个字符的文本。第二段 INSERT 是往表里塞数据VALUES 后面按顺序对应列。第三段 SELECT 是查询*表示所有列但这里我指定了只要 user_name 和 ageWHERE 是筛选条件。跑完你会看到 A同学 和 C同学 两行。这就是单表查询的完整闭环建表、插数据、查数据。练习题单里的单表四套无非是在这个基础上换条件、换排序、换聚合把 WHERE、ORDER BY、GROUP BY 这些逐个练熟。3. 单表四套怎么练把 WHERE 和聚合函数吃透3.1 第一套练筛选WHERE 后面能写多少种条件单表练习的第一关就是把 WHERE 玩熟。除了等于号你还能用大于、小于、不等于、BETWEEN、IN、LIKE、IS NULL。比如“找出年龄在 23 到 27 之间的用户”写WHERE age BETWEEN 23 AND 27“找出北京或上海的用户”写WHERE city IN (北京, 上海)“找出名字里带‘同学’的”写WHERE user_name LIKE %同学%。这里有个新手常踩的坑LIKE 里的%代表任意多个字符_代表一个字符别搞混。还有 NULL 的判断必须用IS NULL或IS NOT NULL不能用 NULL因为 NULL 在 SQL 里表示“未知”跟任何值比较都返回未知不是真也不是假。练习题单里会反复用这些条件组合让你形成肌肉记忆。3.2 第二套练排序和限制ORDER BY 与 LIMIT 配合查出来的数据顺序是乱的你想按年龄从大到小排就用ORDER BY age DESCDESC 是降序ASC 是升序默认。如果只想看前三条加LIMIT 3。这两个经常一起用比如“年龄最大的三个用户”就是ORDER BY age DESC LIMIT 3。注意一个细节ORDER BY 可以跟多个列比如ORDER BY city ASC, age DESC意思是先按城市升序排同一个城市里再按年龄降序排。LIMIT 还可以写成LIMIT 2, 3表示跳过前 2 条取接下来的 3 条这个在分页场景里很常见。单表第二套就是专门练这个组合让你能精确控制“要哪些行、按什么顺序、取多少条”。3.3 第三套练聚合COUNT、SUM、AVG、MAX、MIN聚合函数是把多行数据“捏”成一个结果。比如SELECT COUNT(*) FROM mock_users返回总行数SELECT AVG(age) FROM mock_users返回平均年龄SELECT city, COUNT(*) FROM mock_users GROUP BY city返回每个城市各有多少人。这里的关键是 GROUP BY它把数据按某个列分组然后对每组做聚合。新手最容易犯的错是 SELECT 后面写了非聚合列但没放进 GROUP BY比如SELECT city, user_name, COUNT(*) FROM mock_users GROUP BY city这在某些 SQL 模式下会报错因为 user_name 没有分组依据。练习题单会逼你养成“SELECT 里的非聚合列必须出现在 GROUP BY 里”的习惯。另外 HAVING 是给分组后筛选用WHERE 是分组前筛选别搞反。3.4 第四套练综合把前面三套串起来第四套通常是综合题比如“找出每个城市年龄大于 23 的用户数量按数量降序只取前两名”。这种题拆开就是WHERE 筛年龄、GROUP BY 按城市分组、COUNT 计数、ORDER BY 降序、LIMIT 取前二。写出来是这样SELECT city, COUNT(*) AS user_count FROM mock_users WHERE age 23 GROUP BY city ORDER BY user_count DESC LIMIT 2;注意AS user_count是给聚合结果起个别名方便后面 ORDER BY 引用。执行顺序上SQL 先跑 FROM 找到表再跑 WHERE 筛行然后 GROUP BY 分组接着 COUNT 聚合再 ORDER BY 排序最后 LIMIT 截取。这个顺序跟书写顺序不一样但理解它对你排查错误很有帮助。单表四套练完你基本能独立回答“这张表里符合某些条件的统计结果是什么”这类问题。4. 多表四套怎么上手JOIN 不是玄学是搭桥4.1 先理解“关联字段”这个桥梁多表查询的核心就一句话用两个表里都有的那个字段把行对起来。比如用户表有 user_id订单表也有 user_id那么“用户 A 的订单”就是拿 A 的 user_id 去订单表里找相同 user_id 的行。这个 user_id 就是关联字段。没有关联字段两张表就是孤岛JOIN 也无从下手。练习题单里的多表题第一件事就是让你找出关联字段。通常关联字段在一张表里是主键唯一标识一行在另一张表里是外键指向主键的值。你不需要背外键约束的语法但要看懂“这个字段的值跟那个字段的值对应”。4.2 INNER JOIN只保留两边都匹配上的行INNER JOIN 是最常用的连接方式。假设有一张模拟订单表CREATE TABLE mock_orders ( order_id INT PRIMARY KEY, user_id INT, product_name VARCHAR(50), amount DECIMAL(10,2) ); INSERT INTO mock_orders VALUES (101, 1, 键盘, 199.00), (102, 1, 鼠标, 89.00), (103, 3, 显示器, 899.00), (104, 5, 耳机, 299.00);现在要查“每个订单对应的用户名和商品名”SELECT u.user_name, o.product_name, o.amount FROM mock_users u INNER JOIN mock_orders o ON u.user_id o.user_id;FROM mock_users u给表起了个别名 uINNER JOIN mock_orders o给订单表起了别名 oON u.user_id o.user_id就是搭桥条件。结果只会出现 user_id 在两张表里都能对上的行。注意订单表里 user_id 为 5 的那条用户表里没有 5 号用户所以不会出现在结果里。这就是 INNER JOIN 的特点只保留匹配成功的。4.3 LEFT JOIN保留左表所有行右表没匹配就填 NULL如果你想看“所有用户包括没下过单的”就要用 LEFT JOINSELECT u.user_name, o.product_name FROM mock_users u LEFT JOIN mock_orders o ON u.user_id o.user_id;左表是 mock_users它的每一行都会保留。如果某个用户在订单表里没有对应记录product_name 就显示 NULL。这个在统计“哪些用户没下过单”时特别有用加个WHERE o.order_id IS NULL就能筛出来。新手常犯的错是把 LEFT JOIN 的过滤条件写在 WHERE 里而不是 ON 里导致左表行被意外过滤掉。比如你想看“用户及其金额大于 100 的订单”条件o.amount 100应该放在 ON 后面放在 WHERE 里会把没匹配上的左表行也滤掉LEFT JOIN 就退化成 INNER JOIN 了。4.4 多表四套的递进节奏多表四套通常这样安排第一套练两个表的 INNER JOIN第二套练 LEFT JOIN 和 NULL 判断第三套练三个表串联比如用户、订单、商品三张表第四套练 JOIN 加聚合比如“每个用户的订单总金额”。三表串联时JOIN 可以接着写SELECT u.user_name, p.category, SUM(o.amount) AS total FROM mock_users u INNER JOIN mock_orders o ON u.user_id o.user_id INNER JOIN mock_products p ON o.product_id p.product_id GROUP BY u.user_name, p.category;这里假设还有一张商品表通过 product_id 关联。写多表 JOIN 时建议一个 JOIN 一个 JOIN 地加每加一个就跑一次看结果对不对别一口气写完再调试那样出错很难定位。这是血泪经验多表查询的 bug 往往藏在某一个 ON 条件写错分步验证能省你半小时。5. 新手避坑这五个错误几乎每个人都会犯5.1 现象查询报错“Unknown column”原因列名拼错或表别名用错解决逐列核对新手写 SQL 经常把 user_name 写成 username或者给表起了别名 u但引用列时忘了加 u. 前缀。MySQL 报错会直接告诉你哪个列不认识你回去看 SELECT 和 WHERE 里的列名跟建表语句里的列名逐个对。如果用了别名确认每个列前面都带了正确的别名前缀。别嫌麻烦这是最常见的低级错误检查一遍就能解决。5.2 现象GROUP BY 报错“not in GROUP BY”原因SELECT 里有非聚合列没分组解决补进 GROUP BY 或去掉比如SELECT city, user_name, COUNT(*) FROM mock_users GROUP BY cityuser_name 既不是聚合函数也没在 GROUP BY 里数据库不知道每个城市该显示哪个 user_name。要么把 user_name 加进 GROUP BY要么从 SELECT 里删掉。入门阶段建议SELECT 里除了聚合函数其他列都放进 GROUP BY养成习惯就不会错。5.3 现象LEFT JOIN 结果跟 INNER JOIN 一样原因WHERE 里过滤了右表字段解决把条件挪到 ON 后面前面提过LEFT JOIN 后如果在 WHERE 里写o.amount 100那些右表为 NULL 的行会被过滤掉左表行就丢了。正确做法是把o.amount 100写在 ON 子句里这样左表所有行仍然保留只是右表不满足条件的显示 NULL。这个坑非常隐蔽因为 SQL 不报错只是结果少了行你不仔细对数据根本发现不了。5.4 现象NULL 判断失效原因用了 NULL或! NULL解决改用 IS NULL / IS NOT NULLNULL 在 SQL 里代表“未知”任何值与 NULL 做等于比较结果都是未知不会返回真。所以WHERE city NULL永远查不到东西。必须写WHERE city IS NULL。同理判断非空用IS NOT NULL。这个规则适用于所有数据类型别想着用 NULL绕过去绕不过的。5.5 现象聚合函数算出来不对原因WHERE 和 HAVING 用混解决分组前筛选用 WHERE分组后筛选用 HAVING比如“找出订单总金额大于 500 的用户”总金额是聚合结果不能用 WHERE 筛必须用 HAVINGSELECT user_id, SUM(amount) AS total FROM mock_orders GROUP BY user_id HAVING total 500;WHERE 在 GROUP BY 之前执行HAVING 在 GROUP BY 之后执行。搞清这个顺序你就知道什么时候该用哪个。练习题单里会反复出现这两种筛选做多了自然就分清了。6. 下一步学什么从练习题单走向真实场景单表和多表各四套练完你算是把 SQL 查询的骨架搭起来了。接下来别急着啃高级特性先把这四套题反复做三遍第一遍照着答案写第二遍合上答案自己写第三遍改条件自己出题自己写。这个过程能帮你把语法变成手感。然后你可以往三个方向走一是学子查询把一条查询的结果当成另一条查询的条件二是学窗口函数解决“组内排名”“累计求和”这类问题三是学索引和 EXPLAIN让你写的查询跑得更快。但这些都是后话入门阶段最忌讳贪多。我自己刚开始学的时候总想一口气把 JOIN、子查询、窗口函数全看完结果每个都似懂非懂一写就错。后来老老实实把单表四套刷了三遍多表四套刷了三遍突然有一天写 JOIN 就不卡了。从那以后我每次学新东西都强制自己先找一套练习题单刷透再去看原理。这个习惯帮我省了很多“以为自己会了”的幻觉时间。希望这份练习题单也能帮你把 SQL 从“看着发怵”变成“随手就写”。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑