ARTICLE · INTELLIGENCE

战地情报 · 详情页

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

SQL核心语法速查:从SELECT到JOIN的实用指南

SQL核心语法速查:从SELECT到JOIN的实用指南

简介:这份PDF资料是B站Mosh老师三小时SQL入门课程的配套笔记,面向零基础或希望系统梳理SQL语法的开发者与数据分析初学者,帮助其快速建立关系型数据库查询的知识框架。压缩包内共1个PDF文件,约2.43MB,内容以速查手册形式组织,涵盖SELECT子句、WHERE条件筛选、AND/OR/NOT逻辑操作符、IN与BETWEEN范围判断、LIKE模糊匹配、REGEXP正则匹配、IS NULL判空,以及ORDER BY排序、LIMIT限制、内外连接、USING与交叉连接、UNION合并和INSERT插入数据等核心语法,并附有示例语句便于对照查阅。目前已有981人学习下载,适合作为课程复习提纲或日常写查询时的随手参考,帮助读者按主题快速定位语法要点、理解各操作符的适用场景,从而减少翻查文档的时间。

1. 到底什么是 SQL:从一张“点菜清单”说起

如果你第一次听到 SQL 这个词,大概率是在招聘要求里,或者某个数据岗位的面试题里。它读作“sequel”或“S-Q-L”,全称是结构化查询语言。别被“语言”两个字吓到,它跟中文、英文不是一回事——它更像一张写给数据库的点菜清单:你告诉后厨要什么菜、不要放辣、按什么顺序上,后厨照做,把结果端到你面前。你不需要知道厨房里火候怎么控、食材怎么摆,只要把需求说清楚就行。

这份来自 B 站 Mosh 老师三小时课程的笔记,本质上就是把这张“点菜清单”的常用句式整理成了一张速查表。它覆盖了 SELECT、WHERE、逻辑操作符、IN、BETWEEN、LIKE、REGEXP、排序、分页、连接和插入数据这些核心构造。说白了,它不教你成为数据库专家,而是让你在需要跟数据库打交道时,能快速写出“能跑、能看懂、不翻车”的查询语句。搞懂 SQL 的价值在于:无论你做开发、做运营还是做数据分析,只要数据存在表里,你就绕不开它。

2. SQL 查询的骨架:为什么一条语句要分好几段

2.1 SELECT 和 FROM:先决定“看哪列、从哪表”

任何一条查询语句,最核心的两块就是 SELECT 和 FROM。SELECT 决定你要哪些列,FROM 决定你从哪张表里拿。笔记里给了一个很典型的例子:SELECT * FROM customers WHERE state = 'CA' ORDER BY first_name LIMIT 3;。这条语句读起来就像一句话:从 customers 表里,挑出 state 是 CA 的客户,按名字排序,只要前三条。

*是通配符,意思是“所有列”。初学阶段用*很方便,但真实项目里通常不建议——因为你会把不需要的列也拉出来,数据量一大就拖慢速度。更稳妥的写法是把列名写清楚,比如SELECT first_name, points FROM customers。另外笔记里特别提到,SQL 本身不区分大小写,但 MySQL 里每条语句必须以分号结尾。这个细节看着小,实际踩坑的人不少:少一个分号,客户端就一直等你输入下一条,你还以为程序卡死了。

SELECT 里还能直接做运算,比如SELECT (points * 10 + 20) AS discount_factor FROM customers。这里的 AS 是给计算结果起个别名,方便阅读。运算顺序跟小学数学一样:先括号,再乘除,最后加减。这个能力在报表场景里很实用,比如把积分换算成折扣系数,不用把数据取出来再用代码算。

2.2 WHERE 和逻辑操作符:把“全部数据”筛成“我要的那几条”

WHERE 是过滤条件,相当于点菜时说“不要香菜”。笔记里列了比较操作符:大于、大于等于、小于、小于等于、等于、不等于(<>和!=都行)。这些符号本身不难,难的是组合条件时的逻辑。

AND 要求两个条件同时成立,OR 只要一个成立就行,NOT 则是否定整个条件。举个笔记里的例子:WHERE birthdate > '1990-01-01' AND points > 1000,意思是 1990 年以后出生且积分超过 1000 的客户。如果把 AND 换成 OR,范围立刻变大——只要满足其中一个就算。这里有个血泪经验:当 AND 和 OR 混用时,一定要用括号把意图写清楚,否则数据库按自己的优先级执行,结果可能跟你脑子里想的完全不一样。

IN 操作符是多个 OR 的简写。WHERE state IN ('VA', 'NY', 'CA')比写三个 OR 干净得多,可读性也更好。BETWEEN 则是闭区间,WHERE points BETWEEN 100 AND 200包含 100 和 200 本身,这一点跟某些编程语言的范围函数不一样,别搞混。

2.3 LIKE 和 REGEXP:模糊匹配的两把不同尺子

LIKE 用于简单的模式匹配,只有两个通配符:%代表任意多个字符,_代表恰好一个字符。WHERE first_name LIKE 'b%'就是找所有以 b 开头的名字。它够用、好懂,但表达能力有限。

REGEXP 是正则表达式匹配,能力更强。笔记里给了几个例子:^a表示以 a 开头,ey$|on$表示以 ey 或 on 结尾,b[ru]表示 b 后面跟 r 或 u。正则的好处是一次能表达复杂的模式,坏处是写错了很难排查。初学阶段建议先用 LIKE 解决大部分需求,确实需要复杂模式再上 REGEXP。另外注意,IS NULL是专门用来判断空值的,不能用= NULL——空值在 SQL 里不等于任何东西,包括它自己,这是个经典误区。

3. 排序、分页与连接:让结果“按你要的顺序、按你要的规模”出现

3.1 ORDER BY 和 LIMIT:控制顺序和条数

ORDER BY 决定结果怎么排,默认是升序,加 DESC 就是降序。笔记里的例子是ORDER BY state, first_name DESC,意思是先按 state 升序排,state 相同的再按 first_name 降序排。多列排序在实际场景里很常见,比如先按部门排、再按入职时间排。

LIMIT 控制返回多少条。LIMIT 3就是只要前三条。更实用的写法是LIMIT 6, 3,意思是跳过前 6 条,取 3 条——这就是分页的基础。很多后端接口的“第几页、每页几条”最终都会翻译成这种形式。需要注意的是,LIMIT 如果不配合 ORDER BY,返回的顺序是不确定的,每次查可能都不一样。做分页时一定要有稳定的排序字段,否则用户翻页时会看到重复或遗漏的数据。

3.2 JOIN:把分散在多张表里的信息拼起来

真实数据库很少把所有信息塞在一张表里。客户信息在 customers 表,订单信息在 orders 表,靠 customer_id 关联。JOIN 就是把这些表按关联字段拼在一起。

内连接(JOIN 或 INNER JOIN)只返回两边都匹配上的记录。笔记里的写法是FROM customers c JOIN orders o ON c.customer_id = o.customer_id,其中 c 和 o 是表的别名,让语句更短。外连接分左外和右外,LEFT JOIN会保留左表所有记录,即使右表没有匹配——笔记里的例子是“返回所有客户,不管他们有没有订单”。这个区别很关键:内连接会丢掉没有订单的客户,左连接不会。

如果两张表的关联列名完全一样,可以用 USING 简化:JOIN orders o USING (customer_id)。CROSS JOIN 则是笛卡尔积,把两张表的每一行都两两组合,笔记里用“每种颜色配每种尺寸”来解释,很直观。UNION 用于把两个查询结果上下拼在一起,要求列数和类型对得上。

3.3 INSERT:数据是怎么进去的

查询之外,笔记也覆盖了插入数据。单条插入的写法是INSERT INTO customers(first_name, phone, points) VALUES ('Mosh', NULL, DEFAULT)。这里有几个细节:列名要跟值的顺序对应;NULL 表示空值;DEFAULT 表示用表定义的默认值。多条插入可以在 VALUES 后面跟多组括号,用逗号隔开,比一条条执行效率高。

提示:插入时如果省略列名,就必须按表定义的顺序提供所有列的值,这种写法很脆弱,表结构一变就容易出错。显式写列名是更稳妥的习惯。

4. 常见误区与易混概念:这几组东西名字像,用法差很远

4.1 WHERE 和 HAVING 不是一回事

易混点:两者都用来过滤,看起来可以互换。为什么混:初学阶段只接触 WHERE,遇到聚合结果需要过滤时,第一反应还是写 WHERE。怎么区分:WHERE 在分组之前过滤原始行,HAVING 在分组之后过滤聚合结果。如果你要过滤的是“每个组的统计值”,比如“订单总额超过 1000 的客户”,那就得用 HAVING,WHERE 在这里会报错或逻辑不对。

4.2 NULL 不等于空字符串,也不等于 0

易混点:看到 NULL 就以为它是“空的”,拿= ''或= 0去判断。为什么混:日常语言里“空”和“没有”是一个意思,但 SQL 里 NULL 表示“未知”,它跟任何值比较的结果都是未知,不是真也不是假。怎么区分:判断空值只能用IS NULL或IS NOT NULL。笔记里WHERE phone IS NULL就是标准写法。用= NULL永远查不到东西,这是新手最常见的翻车点之一。

4.3 LIKE 的%和正则的*别搞混

易混点:两个都表示“多个”,容易随手混用。为什么混:不同工具里通配符的约定不一样,写多了容易串。怎么区分:在 SQL 的 LIKE 里,%是任意多个字符,_是恰好一个;而正则里的*表示前一个字符重复零次或多次,含义完全不同。用 LIKE 时别写正则语法,用 REGEXP 时别拿%当通配符。

4.4 内连接和左连接的结果集大小可能差很多

易混点:觉得 JOIN 就是“把表连起来”,用什么连接都一样。为什么混:语法只差一个 LEFT,看起来是小事。怎么区分:内连接只保留两边都匹配的行,左连接保留左表全部行、右表没匹配的补空。如果你要统计“所有客户包括没下单的”,用内连接会悄悄丢掉一部分人,数字对不上还很难查。

4.5 DISTINCT 和 GROUP BY 都能去重,但目的不同

易混点:两者都能让结果看起来“不重复”,于是随便选一个。为什么混:在小数据量、单列场景下,结果确实一样。怎么区分:DISTINCT 是对最终结果去重,GROUP BY 是为了分组做聚合计算。如果你只是想去重看有哪些州,用 DISTINCT;如果你要算每个州的客户数,用 GROUP BY 配合聚合函数。笔记里SELECT DISTINCT state FROM customers就是前者的典型用法。

5. 什么时候该翻这份笔记,什么时候别指望它

这份三小时课程笔记的定位很清晰:它是一张核心语法的速查表,不是完整手册。笔记开头自己也说了,它覆盖的是核心语言构造,“并不完整”。所以判断标准很简单:当你需要快速回忆某条语句怎么写、某个操作符什么含义、连接和分页的语法长什么样,翻它很高效;当你需要处理复杂的事务、索引优化、存储过程、权限管理,或者面对特定数据库的方言差异,这份笔记就不够用了,得去查对应数据库的官方文档。

具体来说,几种典型适用场景:刚学完课程需要复习,拿它当提纲过一遍;写查询时忘了 BETWEEN 是否包含边界,扫一眼确认;面试前快速过一遍 JOIN 和 UNION 的区别。不适用的场景也要说清楚:生产环境里做性能调优,光知道语法远远不够,得看执行计划;数据量上千万时,SELECT *和缺索引的写法会直接拖垮查询,这些不在速查表的能力范围内。

场景适合翻这份笔记需要另找资料
回忆 SELECT / WHERE 基本写法是否
确认 LIKE 与 REGEXP 的通配符是否
写多表连接但忘了 USING 语法是否
查询慢需要优化否是,看执行计划与索引
跨数据库方言差异部分参考是,查对应官方文档
事务与并发控制否是

我自己的习惯是:每次写稍微复杂一点的查询之前,先把过滤条件、排序、分页这三块在纸上列清楚,再对照速查表确认语法,最后才往编辑器里敲。这个习惯帮我省掉了很多“语法没错但结果不对”的排查时间。数据库不会猜你的意图,你写什么它就执行什么,所以把意图写明确,比记住更多花哨语法更重要。希望这份整理能帮你在下次遇到 SQL 时,少一点懵、多一点底气。

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

RELATED READING

延伸阅读

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