资讯动态

三小时SQL入门笔记:一张图看清基础查询骨架与易错点

发布时间:2026/10/17 20:09:08 来源:尧图企业网站定制
简介这份资源是B站Mosh老师SQL三小时入门课程的配套笔记面向零基础或希望系统梳理SQL核心语法的开发者与数据分析初学者帮助解决查询语句记不牢、操作符用法混淆等常见问题。压缩包内共1个PDF文件约2.43MB内容以图文笔记形式整理便于打印或随时查阅。笔记完整覆盖SQL基础知识、SELECT子句、WHERE条件筛选、AND/OR/NOT逻辑操作符以及IN、BETWEEN、LIKE、REGEXP等常用操作符的语法与示例并延伸至IS NULL、ORDER BY、LIMIT、内外连接、USING、交叉连接、UNION与数据插入等进阶主题形成从查询到写入的完整知识脉络。目前已有976人学习下载适合作为课程复习提纲或日常开发速查手册帮助读者在短时间内建立系统的SQL语法框架。1. 三小时 SQL 入门笔记一张图看清基础查询的骨架很多人学 SQL 的路径是打开教程跟着敲SELECT * FROM 表敲完觉得会了一合上电脑遇到「查最近三个月下单但没付尾款的用户」这种需求脑子里只剩一个SELECT后面全凭感觉拼。问题不在语法难而在于没有一张能挂住所有知识点的骨架。这份三小时课程笔记的价值就是把入门阶段真正要用的东西压缩成一条主线从一张表里取数 → 加条件筛 → 排序限量 → 多表拼起来 → 把结果塞回去。它覆盖的是 SQL 的核心语言构造不是完整手册但对刚上手关系型数据库、准备面试或要写业务查询的人来说这条主线就是最该先长出来的那根骨头。下面按模块把这份笔记拆开顺带补上复习时最容易翻车的地方。2. 单表查询四件套SELECT、WHERE、ORDER BY、LIMIT2.1 SELECT 子句取列、算表达式、去重SELECT决定结果集里出现哪些列。最基础的写法是列出列名但笔记里特意强调了两个容易被忽略的用法。第一个是表达式。列不只是原样取出还能参与运算并起别名-- 用表达式计算折扣因子并起别名方便阅读 SELECT (points * 10 20) AS discount_factor FROM customers;这里要记住运算优先级括号 乘除 加减。写复杂表达式时宁可多加括号也不要赌自己的记忆。别名用AS虽然省略AS也能跑但保留它可读性更好。第二个是去重。当某一列有大量重复值时用DISTINCT只保留唯一值-- 查看客户分布在哪些州去掉重复 SELECT DISTINCT state FROM customers;DISTINCT作用于整行结果不是只作用于紧跟它的那一列。如果写SELECT DISTINCT state, city去重的是「州城市」的组合这点在复习时经常被记混。提示SQL 本身不区分大小写select和SELECT等价但在 MySQL 里每条语句必须以分号结尾漏分号是新手最常见的报错来源。2.2 WHERE 子句比较运算符与逻辑组合WHERE负责过滤行是查询里出现频率最高的子句。它的核心是一组比较运算符运算符含义示例大于points 1000大于等于points 1000小于points 500小于等于points 500等于state CA不等于state CA!不等于state ! CA注意等于号是单个不是这是从编程语言转过来的人最容易写错的地方。不等于有两种写法和!效果一样看团队习惯统一即可。多个条件用逻辑运算符连接-- AND两个条件都为真才保留 SELECT * FROM customers WHERE birthdate 1990-01-01 AND points 1000; -- OR至少一个条件为真就保留 SELECT * FROM customers WHERE birthdate 1990-01-01 OR points 1000; -- NOT对条件取反 SELECT * FROM customers WHERE NOT (birthdate 1990-01-01);AND、OR、NOT混用时优先级是NOTANDOR。也就是说A OR B AND C会被理解成A OR (B AND C)。如果你想要的是(A OR B) AND C必须显式加括号。这个优先级问题是复习时的重点也是实际写查询时最隐蔽的 bug 来源。2.3 ORDER BY 与 LIMIT排序和截断ORDER BY控制结果顺序默认升序ASC要降序就加DESC。它支持多列排序先按第一列排第一列相同再按第二列排-- 先按州升序同一州内按名字降序 SELECT * FROM customers ORDER BY state, first_name DESC;LIMIT用来限制返回行数常和ORDER BY搭配做「Top N」查询-- 只返回 3 条 SELECT * FROM customers LIMIT 3; -- 跳过前 6 条再返回 3 条常用于分页 SELECT * FROM customers LIMIT 6, 3;LIMIT 6, 3的语义是「偏移 6 行取 3 行」。分页场景里偏移量 (页码 - 1) × 每页条数。这里有个性能上的坑偏移量很大时数据库仍然要扫描并丢弃前面所有行翻到很后面的页会明显变慢。入门阶段先记住语义进阶时再考虑用游标或基于索引的翻页替代。3. 条件进阶IN、BETWEEN、LIKE、REGEXP、IS NULL3.1 IN 与 BETWEEN范围判断的两种写法IN用来判断某个值是否落在一个列表里比写一长串OR清爽得多-- 等价于 state VA OR state NY OR state CA SELECT * FROM customers WHERE state IN (VA, NY, CA);BETWEEN判断值是否落在闭区间内两端都包含-- 包含 100 和 200 SELECT * FROM customers WHERE points BETWEEN 100 AND 200;BETWEEN 100 AND 200等价于points 100 AND points 200。复习时要注意如果字段是日期时间类型BETWEEN 2024-01-01 AND 2024-01-31可能漏掉 1 月 31 日当天带时分秒的记录因为上界被当成2024-01-31 00:00:00。稳妥写法是用 开始 AND 次日。3.2 LIKE 与 REGEXP模糊匹配的两档工具LIKE是最常用的模糊匹配只有两个通配符%匹配任意数量字符包括零个_匹配恰好一个字符-- 名字以 b 开头 SELECT * FROM customers WHERE first_name LIKE b%; -- 名字第二个字母是 a SELECT * FROM customers WHERE first_name LIKE _a%;REGEXP支持正则表达式能力更强适合LIKE表达不了的模式-- 以 a 开头 WHERE first_name REGEXP ^a; -- 以 ey 或 on 结尾 WHERE first_name REGEXP ey$|on$; -- 以 my 开头或包含 se WHERE first_name REGEXP ^my|se; -- 包含 b且 b 后面紧跟 r 或 u WHERE first_name REGEXP b[ru];常用元字符^表示字符串开头$表示结尾|表示逻辑或[abc]匹配其中任意单个字符[a-d]匹配 a 到 d 范围内的字符。复习时最容易混的是LIKE的%和正则的.*不是一回事LIKE里没有正则的^、$语义别把两套语法串着写。3.3 IS NULL空值不能用等号判断空值在 SQL 里是特殊存在它不等于任何值也不等于另一个空值。判断空值必须用IS NULL或IS NOT NULL-- 找出没有留电话的客户 SELECT * FROM customers WHERE phone IS NULL;写成WHERE phone NULL不会报错但永远返回空结果因为NULL NULL的结果不是真而是未知。这是复习时的高频易错点也是实际排查「为什么查不到数据」时第一个该检查的地方。4. 多表与写回JOIN、USING、CROSS JOIN、UNION、INSERT4.1 INNER JOIN 与 OUTER JOIN连接的核心区别多表查询靠JOIN把两张表按关联列拼起来。内连接只保留两边都匹配上的行SELECT * FROM customers c JOIN orders o ON c.customer_id o.customer_id;外连接则保留某一侧的全部行另一侧没有匹配就填空值。左连接保留左表全部-- 返回所有客户包括没有下过单的 SELECT * FROM customers c LEFT JOIN orders o ON c.customer_id o.customer_id;复习时的判断口诀要哪张表的全部行就把哪张表放左边用 LEFT JOIN。内连接和外连接的结果差异往往就是「统计用户总数」和「统计下过单的用户数」的区别业务里选错会直接导致数字对不上。4.2 USING 子句与 CROSS JOIN当两张表的关联列名完全相同时可以用USING简化ONSELECT * FROM customers c JOIN orders o USING (customer_id);USING (customer_id)等价于ON c.customer_id o.customer_id但结果里该列只出现一次。列名不一致时只能用ON。CROSS JOIN是笛卡尔积把左表每一行和右表每一行两两组合-- 每种颜色配每种尺寸 SELECT * FROM colors CROSS JOIN sizes;结果行数 左表行数 × 右表行数。它本身很少单独用但在生成组合矩阵、日期维度补齐这类场景里是基础操作。复习时要意识到漏写连接条件的JOIN会退化成笛卡尔积这是「查询突然返回几万行」的常见原因。4.3 UNION 与 INSERT合并结果与写入数据UNION把两个结果集上下拼起来要求列数和类型对应SELECT name, address FROM customers UNION SELECT name, address FROM clients;UNION会去重UNION ALL保留全部重复行。数据量大且确定无重复时用UNION ALL更快。写入数据用INSERT INTO-- 插入单条NULL 显式写DEFAULT 用默认值 INSERT INTO customers(first_name, phone, points) VALUES (Mosh, NULL, DEFAULT); -- 一次插入多条 INSERT INTO customers(first_name, phone, points) VALUES (Mosh, NULL, DEFAULT), (Bob, 1234, 10);多行插入比逐条插入效率高因为减少了往返次数。列名列表和值列表的顺序必须一一对应数量不一致会直接报错。5. 易错点排查这五个地方复习时最容易翻车5.1 易错点一把和IS NULL混用为什么漏直觉上「等于空」就该用等号编程语言里也常这么写。但 SQL 的三值逻辑里NULL NULL返回的是未知不是真。怎么补看到字段可能为空条件一律用IS NULL/IS NOT NULL。写完查询先问自己一句这个字段有没有可能没值5.2 易错点二AND 和 OR 不加括号为什么漏AND优先级高于OR但人读句子时习惯从左到右理解写的时候也容易顺着思路写。怎么补只要AND和OR同时出现就给每个逻辑单元加括号。多打两个括号不会错少打一定会在某个数据分布下出错。5.3 易错点三JOIN 漏写 ON 条件为什么漏语法上JOIN后面不写ON在某些写法下能通过或者复制粘贴时把条件行删掉了。怎么补写完多表查询先看结果行数。如果行数等于两表行数之积基本就是漏了连接条件。养成「JOIN 必跟 ON 或 USING」的肌肉记忆。5.4 易错点四LIKE 和 REGEXP 语法串用为什么漏两套都是模式匹配记混了%和.*、_和.。怎么补记住LIKE只有%和_两个通配符需要^、$、|、字符集这些能力时直接换REGEXP不要试图在LIKE里凑。5.5 易错点五LIMIT 分页偏移量算错为什么漏LIMIT 6, 3的两个数字顺序容易记反误以为是「取 6 到 3」。怎么补记死格式是LIMIT 偏移量, 条数。第 n 页、每页 m 条时偏移量 (n-1) × m。写完拿第一页验证一下偏移量应该是 0。6. 复习清单把这份笔记变成自己的查询肌肉复习 SQL 基础最有效的方式不是重读而是默写 对照。下面这份清单可以当自查表用每一项都对应上面某个模块能不看笔记写出来才算过。复习项达标标准对应模块基本查询骨架能默写SELECT ... FROM ... WHERE ... ORDER BY ... LIMIT完整顺序第 2 章表达式与别名能写出带运算和AS的 SELECT2.1去重说清DISTINCT作用于整行2.1比较运算符能列出全部 7 个知道等于号是2.2逻辑优先级能说出NOT AND OR并会加括号2.2范围判断能区分IN和BETWEEN知道 BETWEEN 是闭区间3.1模糊匹配能默写LIKE两个通配符和REGEXP五个常用元字符3.2空值条件反射用IS NULL3.3连接能说清 INNER 和 LEFT 的结果差异4.1合并与写入能写UNION和批量INSERT4.3具体怎么练找一张自己熟悉的表比如订单表围绕它写 10 条查询——查全部、查某状态、按金额排序取前 5、查金额在区间内的、查名字以某字母开头的、查某字段为空的、和另一张表连接、合并两个结果集、插入一条、插入多条。写完逐条对照上面的易错点检查一遍。我自己的习惯是每次写完多表查询先不看结果先数一遍预期行数再跑。对不上就回头查连接条件。这个动作帮我拦下过不少笛卡尔积的翻车现场。从那以后我每次碰JOIN和NULL都强制走一遍检查清单希望这份梳理也能帮到你。本文还有配套的精品资源点击获取

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

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

免费获取报价 →
↑