ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

零基础SQL语句练习题:单表多表八套实战,从入门到精通

零基础SQL语句练习题:单表多表八套实战,从入门到精通

简介:这份SQL语句练习题资源面向MySQL初学者与希望巩固查询基础的开发者,围绕单表与多表两大主题各提供四套练习,帮助学习者在动手实践中理解SELECT、WHERE、ORDER BY、GROUP BY及聚合函数等基本用法,并进一步掌握INNER JOIN、LEFT JOIN、子查询等多表整合技巧。资源包共19个文件,以13个txt文本与5个sql脚本为主,另含1个zip压缩包,整体约22KB,sql文件可直接导入MySQL环境执行,txt则用于记录题目与答案,便于对照练习。目前已有918人学习下载,说明其在SQL入门训练中具有一定参考价值。通过逐套完成单表过滤、排序、分组统计与多表联接、子查询等题目,读者能够熟悉建库建表、数据插入及查询验证的完整流程,逐步提升编写高效SQL语句的能力,为日常数据库管理与复杂查询打下扎实基础。

1. 零基础学 SQL 到底在学什么:先搞懂它跟 Excel 有什么不一样

很多人第一次听到「SQL 语句练习题」这几个字,脑子里冒出来的画面是密密麻麻的英文命令和报错窗口,还没开始学就先怕了。其实换个角度想就通了:你平时用 Excel 处理数据,是不是经常要筛选、排序、求和、把两张表的数据对起来看?SQL 干的就是同一件事,只不过它不用鼠标点,而是用一句一句的「指令」告诉数据库你要什么。这份「sql语句练习题单表+多表各四套」的资源,本质上就是给你准备了八套动手练的题目——四套只查一张表,四套要同时查两张甚至更多表,让你从「看得懂」练到「写得出」。

它适合谁?适合完全没碰过数据库、但工作需要跟数据打交道的人,也适合正在学 MySQL 想找题练手的学生。你不需要先懂什么底层原理,只要会基本的加减乘除逻辑,就能跟着练。学 SQL 最大的好处是:一旦学会,换任何数据库(MySQL、PostgreSQL、SQL Server)思路都是通的,这是一门「学一次、用很久」的手艺。

2. 为什么值得花时间练 SQL:从看懂到写出的那道坎

2.1 光看教程不动手,等于没学

我带过不少零基础的人学 SQL,最常见的翻车现场是这样的:视频看了一遍,觉得「哦,SELECT 就是查数据嘛,WHERE 就是加条件嘛」,感觉自己会了。结果一打开练习环境,题目说「查出每个部门工资最高的那个人」,手放在键盘上半天敲不出一个字。这不是你笨,是因为 SQL 是一门「手部肌肉记忆」的技能,跟学游泳一样,看一百遍教学视频不下水,照样呛水。

这份资源把题目分成单表和多表两大类,其实就是在帮你跨两道坎。单表题练的是「条件怎么写、排序怎么排、分组怎么分」这些基本动作;多表题练的是「两张表怎么接起来」这个思维跳跃。很多人卡在多表就放弃了,就是因为单表还没练熟就硬上多表,结果 JOIN 一出来直接懵掉。所以我的建议是:单表四套老老实实做完,再碰多表。

2.2 单表和多表,难度差在哪

用一个生活化的类比。单表查询就像你面对一张全班同学的成绩单,问「数学及格的有哪些人」「平均分是多少」「按总分从高到低排个序」——所有信息都在这张纸上,你只需要用条件去筛。

多表查询就不一样了。假设你手里有两张表:一张是「学生信息表」(学号、姓名、班级),另一张是「成绩表」(学号、科目、分数)。现在要问「每个班的平均分是多少」,你发现班级在第一章表里,分数在第二张表里,必须先把两张表按「学号」这个共同的列接起来,才能算。这个「接起来」的动作就是 JOIN。新手最容易犯的错是:不知道拿哪个字段去接,或者接错了导致数据翻倍。

提示:练多表之前,先把每张表「主键是什么、哪一列能唯一标识一行」搞清楚,这是接表的关键。

2.3 第一个能跑通的例子:从一张表查起

理论说再多不如跑一行。假设我们有一张最简单的员工表employee,结构如下:

字段名含义类型
id员工编号整数
name姓名文本
dept部门文本
salary工资整数

现在做第一道单表题:查出工资大于 8000 的员工姓名和工资,按工资从高到低排。

-- 从 employee 表里查数据 SELECT name, salary -- 要看的列:姓名、工资 FROM employee -- 数据来自 employee 表 WHERE salary > 8000 -- 筛选条件:工资大于 8000 ORDER BY salary DESC; -- 按工资降序排列(DESC = 从大到小)

逐行解释一下。SELECT后面写你要「看哪些列」,用逗号隔开;FROM后面写「从哪张表查」;WHERE是筛选条件,>就是大于;ORDER BY负责排序,DESC表示降序,如果想让工资从低到高,把DESC换成ASC或者直接不写(默认就是升序)。

你把这四行敲进去跑一下,看到结果出来的那一刻,SQL 就没那么神秘了。这份资源里的单表四套题,基本就是在这个骨架上不断加变化:加个GROUP BY算平均、加个LIKE做模糊匹配、加个LIMIT只看前几条。每套题做完,你对单表的掌控力就上一个台阶。

3. 单表四套怎么练:把 WHERE 和 GROUP BY 练成条件反射

3.1 第一套和第二套:条件筛选与排序

单表的前两套题,核心就练两个东西:WHERE和ORDER BY。别看简单,新手在这两个地方踩的坑最多。

先说WHERE。它支持的不只是等于和大于,还有几个高频写法你得练熟:

-- 查部门是「技术部」或「产品部」的员工 SELECT * FROM employee WHERE dept IN ('技术部', '产品部'); -- 查姓名以「张」开头的员工 SELECT * FROM employee WHERE name LIKE '张%'; -- 查工资在 6000 到 10000 之间的员工 SELECT * FROM employee WHERE salary BETWEEN 6000 AND 10000;

IN用来匹配多个值,比写好几个OR干净;LIKE配合%做模糊匹配,%代表任意多个字符;BETWEEN ... AND ...是闭区间,包含两头的值。这三个写法在单表题里出现频率极高,建议每套题做完都把用到的条件写法记一遍。

再说ORDER BY。它可以按多列排序,比如「先按部门升序,部门相同的再按工资降序」:

SELECT name, dept, salary FROM employee ORDER BY dept ASC, salary DESC;

排序的规则是:先按第一个字段排,第一个字段值相同的行,再按第二个字段排。这个「多列排序」在题目里经常出现,很多人只写一个字段就交卷了,结果顺序不对。

3.2 第三套和第四套:分组聚合与去重

后两套单表题会引入GROUP BY和聚合函数,这是单表到多表之间的一个关键台阶。什么叫聚合?就是把多行数据「揉」成一行。比如「算每个部门的平均工资」,原来一个部门有 10 行员工记录,聚合之后每个部门只剩一行,那一行里放着这个部门的平均工资。

-- 算每个部门的平均工资和人数 SELECT dept, -- 按部门分组,这一列要出现在 GROUP BY 里 AVG(salary) AS avg_sal, -- 平均工资,AS 是起别名 COUNT(*) AS headcount -- 人数 FROM employee GROUP BY dept; -- 按 dept 分组

这里有个新手必踩的坑:SELECT后面出现的列,要么在GROUP BY里,要么被聚合函数包着。比如你写了SELECT dept, name, AVG(salary),name既没分组也没聚合,数据库就不知道该给你显示哪个员工的姓名,直接报错。记住一句话:分组之后,裸列只能是被分组的那个列。

COUNT、SUM、AVG、MAX、MIN这五个聚合函数,在单表后两套题里会反复出现。练的时候不要只求跑出结果,要问自己:这个聚合函数算的是「分组后每组一行」还是「整张表一行」?如果没写GROUP BY,那整张表就是一组,AVG(salary)算的就是全公司平均工资。

注意:COUNT(*)数的是行数,COUNT(列名)数的是那一列不为空的行数,两者在有空值的时候结果不一样,题目里经常拿这个挖坑。

4. 多表四套怎么上手:JOIN 没你想的那么玄

4.1 先搞懂「为什么要接表」

多表查询之所以让新手发怵,是因为它多了一个「空间想象」的步骤:你得在脑子里把两张表按某个共同的列「拼」在一起。我用一个类比帮你建立画面感。

想象两张 Excel 表放在桌上。左边一张是「订单表」,每行记录一笔订单,里面有订单号、客户编号、金额。右边一张是「客户表」,每行记录一个客户,里面有客户编号、客户姓名、城市。现在老板问你「每个城市的订单总金额是多少」,你怎么办?你会拿订单表里的「客户编号」,去客户表里找到对应的「城市」,然后把同一个城市的订单金额加起来。这个「拿编号去另一张表找对应信息」的动作,就是 JOIN。

所以多表查询的核心就一句话:找到两张表之间那个能对上的列,用它把表接起来。这个列通常是一张表的主键和另一张表的外键。

4.2 INNER JOIN 的第一个例子

接着上面的订单和客户场景,写一个最常用的内连接:

-- 查每个城市的订单总金额 SELECT c.city, -- 城市来自客户表 c SUM(o.amount) AS total -- 金额来自订单表 o FROM orders o -- 订单表起别名 o INNER JOIN customers c -- 内连接客户表,起别名 c ON o.customer_id = c.id -- 连接条件:订单的客户编号 = 客户的编号 GROUP BY c.city; -- 按城市分组

这段代码有几个点要拆开讲。第一,FROM orders o里的o是给表起的别名,后面用o.amount就比写全名orders.amount省事,多表查询里几乎都会起别名。第二,INNER JOIN ... ON ...是内连接的标准写法,ON后面写连接条件,也就是「两张表靠哪一列对上」。第三,INNER JOIN的意思是「只保留两张表都能对上的行」——如果某个客户在客户表里有,但从来没下过订单,那他在订单表里找不到对应行,内连接的结果里就不会出现他。

多表题里 80% 的场景用INNER JOIN就够了。剩下 20% 会用到LEFT JOIN,意思是「左表的所有行都保留,右表对不上的地方显示为空」。比如「查出所有客户包括没下过单的,显示他们的订单金额,没下过单的显示 0」,这时候就得用LEFT JOIN。

4.3 多表练习里最该盯住的三件事

练多表四套题的时候,不要急着写完看结果,先盯住这三件事,能帮你省下大量调试时间。

第一,连接条件写对了没有。ON后面接的列,必须是两张表里语义相同的列。如果拿「订单号」去接「客户编号」,语法不报错,但结果全是乱的。写完ON之后,自己念一遍:「订单表的客户编号,等于客户表的客户编号」,念得通才说明逻辑对。

第二,有没有产生笛卡尔积。如果你忘了写ON,或者ON的条件永远为真,两张表会「每行乘每行」,10 行乘 10 行变成 100 行,结果直接爆炸。看到结果行数比预期多很多,第一反应就是检查连接条件。

第三,聚合的时候分组分对了没有。多表查询经常和GROUP BY一起用,这时候要确认:你分组的列,是不是你真正想「按它汇总」的那个维度。比如按城市汇总,GROUP BY后面就得是城市列,不能是客户编号。

提示:写完一条多表查询,先用SELECT *不加聚合跑一下,看看接出来的原始数据长什么样,确认没问题再加GROUP BY和聚合函数。这个习惯能帮你快速定位问题出在连接还是聚合。

5. 新手练 SQL 最容易踩的五个坑

5.1 坑一:分号忘了写,或者写成中文分号

现象:敲完一条语句按执行,报语法错误,光标停在最后一行。原因:SQL 语句结尾要用英文分号;,很多人用中文输入法打了个;,数据库不认识。解决:养成敲完语句先切英文输入法打分号的习惯。如果报错位置在末尾,先检查分号。

5.2 坑二:字符串用了双引号

现象:WHERE dept = "技术部"报错或者查不到数据。原因:在标准 SQL 里,字符串要用单引号'技术部',双引号在部分数据库里被当成列名或标识符。解决:字符串一律用单引号,数字不用引号。WHERE dept = '技术部' AND salary > 8000。

5.3 坑三:GROUP BY 之后 SELECT 了没分组的列

现象:报错提示「列不在 GROUP BY 中」或者「不是聚合函数」。原因:分组之后,每一组只剩一行,数据库不知道那个没分组的列该显示哪一行的值。解决:SELECT后面的裸列,要么出现在GROUP BY里,要么用MAX()、MIN()等聚合函数包起来。

5.4 坑四:JOIN 忘了写 ON,结果行数暴涨

现象:两张各 100 行的表接出来 10000 行。原因:没写连接条件,产生了笛卡尔积。解决:JOIN后面必须跟ON,并且检查连接条件里的列是不是两张表真正能对上的那一对。

5.5 坑五:把 NULL 当成 0 或者空字符串来比较

现象:WHERE salary = NULL查不到任何数据。原因:NULL在 SQL 里表示「未知」,不能用=比较,要用IS NULL或IS NOT NULL。解决:判断空值用WHERE salary IS NULL,判断非空用WHERE salary IS NOT NULL。另外,聚合函数会自动忽略NULL,算平均分的时候要注意这一点。

6. 练完这八套之后,下一步往哪走

八套题做完,你已经把 SQL 查询最核心的骨架摸了一遍:SELECT选列、WHERE筛行、ORDER BY排序、GROUP BY分组、聚合函数汇总、JOIN接表。接下来怎么继续,我给你一条我自己带新人时验证过的路径。

第一步,把这八套题重做一遍,但这次不看答案。第一遍做的时候你可能参考了提示或者试错了好几次,第二遍要逼自己从空白开始写。如果某道题卡住了,标记出来,说明那个知识点还没变成你的条件反射。

第二步,自己给自己出题。拿你手头任何一份 Excel 数据,想象它是一张数据库表,然后问自己三个问题:我想按什么条件筛?我想按什么维度分组?我想看哪些汇总指标?把这三个问题的答案翻译成 SQL,就是一道完整的练习题。这一步是从「会做题」到「会干活」的关键跳跃。

第三步,学一点建表和插入数据。查询练熟了,下一步自然是自己造数据来查。CREATE TABLE建表、INSERT INTO插数据、UPDATE改数据、DELETE删数据,这四个语句合称「增删改」,加上SELECT就是常说的 CRUD。你不需要学得多深,能自己建两张有关联的表、插几条测试数据进去,就够你继续练更复杂的查询了。

第四步,了解索引和性能。这是进阶内容,但你可以先建立一个概念:当数据量从几百行变成几百万行的时候,同样的查询可能从 0.01 秒变成 10 秒。索引就是给数据库加的「目录」,能让查询快起来。现在不用深究,知道有这么回事就行,等你真正遇到慢查询了再回来学。

阶段练什么判断标准
当前单表 + 多表八套题不看答案能独立写出
下一步自己出题 + CRUD能对着任意数据表提问并写出 SQL
再下一步索引与优化知道慢查询大概往哪个方向调

我第一次带人练 SQL 的时候,犯过一个现在想起来都后悔的错:让新人一口气把八套题全做完再对答案。结果他做到第四套就崩了,因为前面的错没纠正,后面越做越乱。从那以后我每次带人练题,都强制走一遍「做一套、对一套、讲一套」的节奏,做完一套立刻复盘,把踩的坑当场填上,再进下一套。这个习惯看起来慢,实际上比闷头刷题快得多。

希望这份题单能帮你把 SQL 从「看着怕」变成「写着顺」,练完八套,你会发现自己看数据的方式都不一样了。

本文还有配套的精品资源,点击获取

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进