尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
三小时SQL速通笔记:从SELECT到JOIN的实战查询指南
简介这份资源是B站Mosh老师SQL三小时入门课程的配套笔记以PDF形式整理面向零基础或希望系统梳理SQL核心语法的开发者与数据分析初学者。内容围绕关系型数据库的查询基础展开涵盖SELECT子句、WHERE条件筛选、AND/OR/NOT逻辑操作符以及IN、BETWEEN、LIKE、REGEXP等常用操作符的语法与用法并延伸至IS NULL、ORDER BY、LIMIT、各类JOIN与UNION等进阶主题帮助读者建立完整的SQL知识框架。资源包内共1个PDF文件大小约2.43MB便于随时查阅与打印。目前已有976人学习下载适合作为课程复习提纲或日常查询速查手册配合视频教程使用效果更佳。1. 三小时 SQL 速通笔记一份 Cheat Sheet 能扛住多少真实查询刚接手一个后台报表需求产品甩过来一句“按州筛选、按注册时间倒序、取前三条”我下意识打开这份 SQL Cheat Sheet三分钟拼出语句跑通。这份笔记来自一套三小时入门课程的配套速查表覆盖 SELECT、WHERE、逻辑操作符、IN、BETWEEN、LIKE、REGEXP、IS NULL、ORDER BY、LIMIT、各类 JOIN、UNION 和 INSERT基本把日常增删改查的高频语法收全了。它适合刚接触关系型数据库、需要一份能随时翻的语法底稿的人也适合写了几年 SQL 但正则和 JOIN 细节总记混的老手拿来对答案。下面我按“先能跑、再跑对、最后跑稳”的顺序把这份笔记拆成可复现的操作路径。2. 把 Cheat Sheet 跑起来环境、库表与第一条查询2.1 选 MySQL 还是别的笔记的语法边界在哪这份笔记的示例全部基于 MySQL 语法最明显的标志是语句末尾的分号、LIMIT 6, 3这种偏移量写法以及REGEXP操作符。如果你用的是 PostgreSQLLIMIT要换成LIMIT 3 OFFSET 6正则匹配得用~而不是REGEXPSQL Server 则要用TOP和OFFSET ... FETCH。所以第一步不是急着敲代码而是确认你手头的数据库类型。常见做法是本地装一个 MySQL 8.x或者用 Docker 起一个临时实例避免在生产库上练手。# 用 Docker 起一个干净的 MySQL 8 实例端口映射到 3306 docker run --name sql-cheat \ -e MYSQL_ROOT_PASSWORDroot123 \ -e MYSQL_DATABASEsql_store \ -p 3306:3306 \ -d mysql:8.0 # 进入容器内的 mysql 客户端 docker exec -it sql-cheat mysql -uroot -proot123 sql_store这里MYSQL_DATABASEsql_store直接建好了笔记里反复出现的库名省去手动CREATE DATABASE。端口映射用3306:3306如果你本机已经装了 MySQL 占用了这个端口把前面那个数字改成3307即可后面连接时对应改端口。容器方式的好处是练完直接docker rm -f sql-cheat删掉不留残留。2.2 建表与灌数据让示例语句有东西可查笔记里的customers、orders、colors、sizes、clients这几张表不会凭空出现。我一般会先写一段建表和插入脚本把字段类型对齐笔记里的用法——比如birthdate用DATE、points用INT、phone允许NULL否则IS NULL那条示例查不出任何结果。-- 建 customers 表字段类型对齐笔记示例 CREATE TABLE customers ( customer_id INT PRIMARY KEY AUTO_INCREMENT, first_name VARCHAR(50), state VARCHAR(10), birthdate DATE, points INT DEFAULT 0, phone VARCHAR(20) -- 允许 NULL供 IS NULL 示例使用 ); -- 插入几条覆盖不同 state、birthdate、points 的数据 INSERT INTO customers (first_name, state, birthdate, points, phone) VALUES (Bob, CA, 1990-05-01, 1200, 1234), (Alice, VA, 1985-11-20, 800, NULL), (Mosh, NY, 1992-03-15, 1500, NULL), (Carol, CA, 1988-07-08, 300, 5678); -- 建 orders 表用于 JOIN 示例 CREATE TABLE orders ( order_id INT PRIMARY KEY AUTO_INCREMENT, customer_id INT, order_date DATE ); INSERT INTO orders (customer_id, order_date) VALUES (1, 2024-01-10), (1, 2024-02-15), (3, 2024-03-01);AUTO_INCREMENT让主键自动生成插入时不用手写 ID。phone字段故意留了两条NULL这样后面跑WHERE phone IS NULL能返回 Alice 和 Mosh 两条记录验证语句是否写对。orders表里 customer_id 为 1 的有两条、为 3 的有一条、为 2 和 4 的没有这个分布是为了让 INNER JOIN 和 LEFT JOIN 的结果差异一眼可见。2.3 第一条查询从 SELECT 到 LIMIT 的完整链路环境就绪后把笔记开头那段组合查询敲进去它同时用到了WHERE、ORDER BY、LIMIT三个子句是检验环境是否正常的快捷方式。USE sql_store; SELECT * FROM customers WHERE state CA ORDER BY first_name LIMIT 3;USE sql_store切换当前库避免每次写全限定名。WHERE state CA过滤出加州客户按上面插入的数据会命中 Bob 和 Carol 两条。ORDER BY first_name默认升序Bob 排在 Carol 前面。LIMIT 3限制最多返回三条这里实际只有两条不会报错。如果这条语句返回了结果说明库、表、数据、连接四件事都通了可以继续往下拆每个子句的细节。提示SQL 本身不区分大小写SELECT和select等价但字段名和表名在 Linux 下的 MySQL 里默认区分大小写建表时用什么大小写查询时就保持一致省得踩坑。3. 过滤与排序WHERE 家族的参数怎么设才不翻车3.1 比较、逻辑与 IN/BETWEEN条件组合的优先级陷阱WHERE子句是这份笔记着墨最多的部分比较操作符列了、、、、、、!七种逻辑操作符有AND、OR、NOT。看起来简单但AND和OR混用时优先级是AND高于OR不加括号结果会偏离预期。-- 想查1990 年后出生 且 积分大于 1000 的客户 SELECT * FROM customers WHERE birthdate 1990-01-01 AND points 1000; -- 想查1990 年后出生 或 积分大于 1000 的客户 SELECT * FROM customers WHERE birthdate 1990-01-01 OR points 1000; -- 危险写法AND 和 OR 混用不加括号 SELECT * FROM customers WHERE state CA OR state VA AND points 1000;第三条语句的实际执行顺序是先算state VA AND points 1000再和state CA做 OR结果会多出所有 CA 客户哪怕积分很低。正确写法是WHERE (state CA OR state VA) AND points 1000。我一般养成习惯只要WHERE里同时出现AND和OR无条件加括号不靠记忆赌优先级。IN操作符是多个OR的简写WHERE state IN (VA, NY, CA)等价于三个state 用OR连起来但更短、更易读。BETWEEN 100 AND 200是闭区间包含 100 和 200 两个端点这点和某些语言里左闭右开不一样写分页或积分区间时要留意。NOT用来取反WHERE NOT (birthdate 1990-01-01)会返回 1990 年及以前出生的人注意NULL值在逻辑运算里既不等于真也不等于假NOT遇到NULL仍然返回NULL不会命中。3.2 LIKE 与 REGEXP通配符和正则的适用分界LIKE只有两个通配符%匹配任意数量字符_匹配恰好一个字符。WHERE first_name LIKE b%查 b 开头LIKE _ob查三个字符且中间是 ob 的名字。它够用但表达力有限比如“以 ey 或 on 结尾”就写不出来。REGEXP补上了这块笔记里列了^开头、$结尾、|或、[abc]字符集、[a-d]范围。几个组合示例值得抄下来-- 以 ey 或 on 结尾 SELECT * FROM customers WHERE first_name REGEXP ey$|on$; -- 以 my 开头 或 包含 se SELECT * FROM customers WHERE first_name REGEXP ^my|se; -- 包含 b且 b 后面跟 r 或 u SELECT * FROM customers WHERE first_name REGEXP b[ru];REGEXP默认不区分大小写MySQL 8 的默认排序规则下如果你要严格区分得加BINARY关键字比如WHERE first_name REGEXP BINARY ^A。性能上LIKE b%这种前缀匹配能走索引而LIKE %b和大多数REGEXP会全表扫描数据量大时别在 WHERE 里对百万行表随便用正则。3.3 ORDER BY 与 LIMIT排序方向和多字段的写法ORDER BY state, first_name DESC表示先按 state 升序state 相同的再按 first_name 降序。注意DESC只作用于紧挨着它的那个字段如果想让两个字段都降序得写ORDER BY state DESC, first_name DESC。默认是ASC可以省略。LIMIT 6, 3是 MySQL 的偏移量写法意思是跳过前 6 条、返回接下来 3 条等价于LIMIT 3 OFFSET 6。分页场景里这个偏移量越大越慢因为数据库仍要扫描并丢弃前 6 条。常见做法是深分页改用游标比如记住上一页最后一条的 ID用WHERE id last_id LIMIT 3而不是LIMIT 100000, 3。注意ORDER BY的字段如果不在SELECT列表里某些数据库如 PostgreSQL 的DISTINCT场景会报错MySQL 相对宽松但跨库迁移时这是高频翻车点。4. 多表与写入JOIN、UNION、INSERT 的实操细节4.1 INNER JOIN 与 OUTER JOIN结果集差异怎么验证笔记里INNER JOIN和LEFT JOIN的示例只差一个LEFT但结果集完全不同。用前面插入的数据跑一遍就能看清-- INNER JOIN只返回有订单的客户 SELECT * FROM customers c JOIN orders o ON c.customer_id o.customer_id; -- LEFT JOIN返回所有客户没订单的订单字段为 NULL SELECT * FROM customers c LEFT JOIN orders o ON c.customer_id o.customer_id;第一条只返回 customer_id 为 1 和 3 的记录因为只有他们有订单。第二条返回全部四个客户customer_id 为 2 和 4 的订单字段全是NULL。ON后面是连接条件c.customer_id o.customer_id里的c和o是表别名写别名能省去反复敲全表名。如果两个表同名字段完全一致可以用USING (customer_id)简化但USING要求字段名一模一样且SELECT *时该字段只出现一次和ON的行为有细微差别。CROSS JOIN是笛卡尔积colors表 3 行、sizes表 4 行交叉连接后 12 行每种颜色配每个尺码。它一般用于生成组合矩阵实际业务里很少直接对两张大数据表做 CROSS JOIN行数会爆炸。4.2 UNION 与 INSERT去重、列数和默认值UNION把两个结果集上下拼起来要求列数相同、类型兼容。UNION会自动去重UNION ALL保留重复行且更快因为省去了去重排序。笔记里的示例是SELECT name, address FROM customers UNION SELECT name, address FROM clients如果两个表里有同名同地址的记录UNION只留一条。-- 插入单条phone 显式给 NULLpoints 用 DEFAULT INSERT INTO customers (first_name, phone, points) VALUES (Mosh, NULL, DEFAULT); -- 一次插入多条 INSERT INTO customers (first_name, phone, points) VALUES (Bob, 1234, 10), (Alice, NULL, 20);DEFAULT关键字让数据库用建表时定义的默认值这里points默认是 0。NULL是显式插入空值和DEFAULT不是一回事——如果字段有默认值而你写NULL存进去的就是NULL而不是默认值。多行插入比逐条INSERT快得多因为只走一次网络往返和事务开销批量导入时优先用这种写法。4.3 避坑与排查五条血泪经验现象WHERE phone IS NULL查不到任何数据。原因插入时phone写的是空字符串而不是NULLIS NULL只匹配真正的NULL。解决用WHERE phone IS NULL OR phone 或者建表时给phone加约束禁止空字符串。现象LIMIT 6, 3在 PostgreSQL 里报语法错误。原因偏移量写法是 MySQL 特有。解决改成LIMIT 3 OFFSET 6标准 SQL 和 PostgreSQL 都认。现象REGEXP ^a查不到大写 A 开头的名字。原因排序规则或BINARY影响大小写敏感度不同环境行为不一致。解决明确用WHERE first_name REGEXP BINARY ^[aA]或者统一在应用层做大小写归一。现象LEFT JOIN后WHERE里过滤右表字段结果退化成INNER JOIN。原因WHERE o.order_date 2024-01-01会把右表为NULL的行过滤掉。解决把条件放到ON子句里写成LEFT JOIN orders o ON c.customer_id o.customer_id AND o.order_date 2024-01-01。现象INSERT多行时其中一行违反约束整批失败。原因单条INSERT多VALUES是一个原子语句要么全成要么全败。解决确认数据干净再批量插或者拆成多条INSERT配合事务控制按业务容忍度选择。5. 进阶技巧把 Cheat Sheet 变成自己的查询肌肉记忆这份笔记的定位是速查不是教材所以真正让它发挥价值的方式是“用起来”。我的习惯是把它拆成三张自检卡第一张是过滤卡列出WHERE里所有操作符和优先级规则每次写复杂条件前扫一眼第二张是连接卡把INNER、LEFT、RIGHT、CROSS、USING的差异和结果集特征画成对照表第三张是排序分页卡记牢ORDER BY多字段方向和LIMIT两种写法。验证自己是否真的掌握有个简单办法拿一份真实业务的表结构不看笔记手写一条包含JOIN、WHERE多条件、ORDER BY和LIMIT的查询写完再对照笔记检查语法和逻辑。如果一次通过说明肌肉记忆形成了如果卡在某个操作符上回去把那一节重敲三遍。场景推荐写法避免写法多值匹配WHERE state IN (VA,NY)多个OR串联区间过滤WHERE points BETWEEN 100 AND 200 100 AND 200等价但更长前缀搜索WHERE name LIKE b%WHERE name LIKE %b%无法走索引深分页WHERE id last_id LIMIT 3LIMIT 100000, 3左连接过滤右表条件写在ON里条件写在WHERE里从那以后我每次写多表查询都强制先把连接条件写在ON里、过滤条件写在WHERE里再检查一遍LEFT JOIN的右表字段有没有被WHERE误杀。这个习惯帮我省掉了至少三次线上报表数据对不上的排查时间。希望帮到你。本文还有配套的精品资源点击获取
RELATED

相关推荐

摄像头驱动起不来?从错误代码到事件日志全流程排查指南

摄像头驱动起不来?从错误代码到事件日志全流程排查指南

1. 问题现象与影响范围:摄像头驱动起不来的几种典型表现 摄像头驱动起不来,这个事几乎每个搞过电脑维护、做过嵌入式开发、甚至只是在家开视频会议的人都碰到过。别觉得这是个小事,它能把人卡到怀疑人生——明明设备管理器里能看到设备&#…

📅 2026/10/17 14:44:53
基于Hadoop+Spark+Hive的空气质量预测系统毕业设计实战指南

基于Hadoop+Spark+Hive的空气质量预测系统毕业设计实战指南

又到了做毕业设计的季节,很多同学在选题和实际开发之间反复纠结。如果你问我要不要选大数据方向,我一般会反问一句:你是想选题的时候舒服,还是答辩的时候舒服?如果两者都想要,那像“基于HadoopSparkHive的空…

📅 2026/10/17 14:39:52
AI脱口秀诊疗:让答辩稿从书面念经变成口语表达

AI脱口秀诊疗:让答辩稿从书面念经变成口语表达

刚把答辩稿念给室友听的时候,他低头刷了五分钟手机,突然抬头问我:“你刚才是不是在说同一个东西?”那一刻我就明白,问题不在我紧张,也不在室友没耐心,而是那篇稿子本身就是按“给人看”的论文逻…

📅 2026/10/17 14:39:52
MORE NEWS

更多资讯

📰

27B 等九款本地模型测试结果:用 TaoToken 统一 Key 跑通多模型对比

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

📰

数据库原理实验入门:从安装GreatSQL到掌握SQL查询

简介:《数据库系统原理》课程实验报告完整呈现了郑州大学计算机与人工智能学院数据库原理实验的核心内容,适合正在学习DBMS概念、需要完成同类实验报告的本校学生或数据库初学者。报告以万里数据库GreatSQL为操作对象,完整记录了从虚拟机Cent…

📰

在VMware-Ubuntu18中轻松安装oneAPI和oneDNN:用TaoToken统一Key跑通icx编译验证

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

📰

ArcGIS空间分析本质:从画图到地理问题数学求解

简介:本资源是一份系统讲解ArcGIS空间分析核心功能的PPT教学课件,面向地理信息科学、测绘工程、城乡规划等专业的本科生及GIS初学者,旨在帮助学习者掌握空间分析的基本原理、工具模块与典型应用场景。课件内容覆盖矢量与栅格数据的空间分析方…

📰

MCP Server官网入口与TaoToken统一API通道配置指南

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

📰

DSP实现主动降噪的工程落地:采样率、定点LMS与实时闭环设计

简介:本资源是一份面向嵌入式音频处理与自适应信号处理方向学习者的完整项目实践资料,聚焦发动机等设备产生的周期性噪声问题,提供基于DSP的主动降噪系统从算法设计到硬件落地的全流程实现方案。内容涵盖反馈滤波-X-最小均方(FXLM…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬