简介:这份PDF笔记整理自B站Mosh老师的SQL三小时入门课程,面向零基础或希望系统梳理SQL语法的开发者与数据分析初学者,帮助读者在短时间内建立关系型数据库查询的完整知识框架。内容覆盖SQL基础知识、SELECT子句、WHERE条件筛选、AND/OR/NOT逻辑操作符,以及IN、BETWEEN、LIKE、REGEXP等常用操作符的语法与用法,并延伸至IS NULL、ORDER BY、LIMIT、内外连接、USING与交叉连接、UNION及数据插入等主题,配有清晰的代码示例与速查表结构,便于边学边查、快速回顾。资源包共1个PDF文件,大小约2.43MB,单文件即涵盖全部笔记内容,适合打印或本地留存。目前已有979人学习下载,可作为课程配套速查手册,也可用于面试前复习与日常查询语句编写参考。
1. 到底什么是 SQL:一份三小时课程笔记能讲清多少东西
很多人第一次听到 SQL,脑子里浮现的是一堆大写字母和分号,像某种神秘的咒语。其实你可以把它想成一种“点菜语言”:数据库是后厨,里面堆满了食材(数据),你不需要进厨房翻箱倒柜,只要用一套固定的句式告诉服务员——我要哪张桌的、什么口味、按什么顺序上——后厨就会把结果端出来。SQL 就是这套点菜句式,全称是结构化查询语言,专门用来和关系型数据库打交道。
值得搞懂它的原因很朴素:只要你的工作里出现过“表格”两个字,SQL 就迟早会和你打照面。查用户、算订单、导报表、核对数据,背后几乎都是它在干活。而这份流传很广的三小时课程笔记,把入门阶段最常打交道的那些句式浓缩成了一张速查表,从取数据、筛条件到连表、插记录,一条主线走完。搞懂它,你就拿到了和数据库对话的第一把钥匙,而不是永远等别人帮你导数据。
2. 为什么 SQL 长这样:从一句查询拆开看设计逻辑
2.1 一条语句的骨架:SELECT 和 FROM 在干什么
几乎所有 SQL 查询都从同一个骨架长出来:先说要哪些列,再说从哪张表拿。笔记里给出的最基础写法是SELECT * FROM customers,星号代表“所有列”,customers 是表名。这句话翻译成人话就是:把 customers 这张表里的全部内容原样端上来。
但真实场景很少要“全部”。更多时候你只关心某几列,于是写成SELECT first_name, points FROM customers。这里有个容易被忽略的细节:SELECT 后面不仅能写列名,还能写表达式。笔记里有一个典型例子,把积分乘以 10 再加 20,并起个别名:
-- 用表达式算出折扣系数,AS 给结果列起个可读的名字 SELECT (points * 10 + 20) AS discount_factor FROM customers;这段代码的关键在于运算顺序:先算括号,再算乘除,最后算加减,和小学数学一致。AS 后面的名字不是必须的,但起了名字,结果表里那一列才有可读的表头,否则会显示成一长串表达式。参数上,points 是数值列,乘加运算只对数值有意义;如果对文本列做乘法,数据库会直接报错,这也是新手最常见的翻车点之一。
还有一个常被低估的关键词 DISTINCT。SELECT DISTINCT state FROM customers会把重复的州名去掉,只留唯一值。它解决的是“我只要知道有哪些类别,不要每个客户都列一遍”的需求。注意 DISTINCT 作用于整行选出的组合,选了两列时,是两列的组合去重,不是各自去重。
2.2 WHERE 是筛子:比较、逻辑与三种特殊判断
SELECT 决定“拿哪些列”,WHERE 决定“拿哪些行”。笔记把 WHERE 比作过滤器非常贴切:数据像一筐豆子,WHERE 就是那个筛孔,符合条件的留下,不符合的漏掉。最基础的比较运算符有六个:大于、大于等于、小于、小于等于、等于、不等于。这里有个小坑,SQL 里的“等于”是一个等号=,不是编程里常见的两个等号;不等于则有两种写法<>和!=,效果一样。
单个条件不够用时,就用逻辑运算符把条件串起来。AND 要求两边都成立,OR 只要一边成立,NOT 则把条件反过来。笔记里的例子很直观:生日在 1990 年之后“并且”积分大于 1000,用 AND;把“并且”换成“或者”,就是 OR。这里有个血泪经验:AND 和 OR 混用时,AND 的优先级更高,如果不确定,就用括号把意图写死,别指望数据库猜你的心思。
除了比较,笔记还整理了三种“特殊判断”。IN 用来判断某个值是否落在一个列表里,比如州名是 VA、NY、CA 之一,比连写三个 OR 清爽得多。BETWEEN 判断是否落在闭区间内,points BETWEEN 100 AND 200包含 100 和 200 两个端点,这点和某些语言的范围语法不同,容易记反。IS NULL 则是专门对付空值的,判断“没有电话号码”的客户要写phone IS NULL,而不能写phone = NULL,因为空值不等于任何东西,连它自己都不等于。
2.3 模糊匹配的两套工具:LIKE 与 REGEXP 的分工
精确条件搞定了,现实里还有大量“大概长这样”的需求,比如找所有姓张的、所有以 b 开头的名字。笔记给了两套工具,分工很清楚。
LIKE 是简单模式匹配,只有两个通配符:百分号%代表任意多个字符(包括零个),下划线_代表恰好一个字符。所以first_name LIKE 'b%'是“以 b 开头”,LIKE '%son'是“以 son 结尾”,LIKE '_o%'是“第二个字母是 o”。它够用、好记,但表达能力有限。
REGEXP 则是正则表达式,能力强得多。笔记列了几个常用符号:^表示开头,$表示结尾,|表示或者,[abc]匹配其中任意一个字符,[a-d]匹配 a 到 d 范围内的字符。于是“以 ey 或 on 结尾”写成'ey$|on$',“以 my 开头或包含 se”写成'^my|se',“包含 b 且后面跟 r 或 u”写成'b[ru]'。对比一下就能看出边界:能用 LIKE 说清的需求别上正则,正则写起来快,读起来慢,维护的人容易懵。
2.4 排序、截断与去重:ORDER BY 和 LIMIT 的配合
查出来的数据顺序是数据库说了算,想要稳定顺序就得显式排序。ORDER BY 默认升序,加 DESC 变降序,还能多列排序:先按州升序,州相同再按名字降序,写成ORDER BY state, first_name DESC。注意 DESC 只作用于紧挨着它的那一列,不是整句生效,这是初学者常踩的坑。
LIMIT 负责截断结果,LIMIT 3只返回三行。它还有一个双参数写法LIMIT 6, 3,意思是跳过前 6 行,再取 3 行。这个“偏移量在前、数量在后”的顺序和很多人的直觉相反,记不住就想想“先跳过、再拿”。ORDER BY 和 LIMIT 经常搭配使用,比如“积分最高的前三名”,必须先排序再截断,顺序反了结果就完全不是你要的。
3. 表不止一张:连接与合并到底在解决什么问题
3.1 内连接与外连接:一张图看懂“留谁”的差别
真实数据库很少只有一张表,客户和订单分开放,想同时看两边信息就得连接。笔记里的内连接写法是FROM customers c JOIN orders o ON c.customer_id = o.customer_id,其中 c 和 o 是表的别名,ON 后面是连接条件。内连接的含义是:只保留两边都能对上的行。没有下过单的客户,在内连接结果里直接消失。
外连接则解决“我不想丢人”的问题。LEFT JOIN保留左表全部行,右表对不上的地方填空值。笔记的例子是“返回所有客户,不管他们有没有订单”,用的就是左连接。这里有个易混点:LEFT 指的是写在 JOIN 左边的那张表,不是“左边的列”。把表顺序调换,LEFT JOIN 的含义就跟着变,写之前先想清楚“我要保住哪张表的全部记录”。
3.2 USING 与 CROSS JOIN:两种特殊连接
当两张表用来连接的列名完全一样时,可以用 USING 简化写法:JOIN orders o USING (customer_id),省掉 ON 那一长串等值判断。它只是语法糖,语义和内连接一致,但要求列名严格相同,名字对不上就用不了。
CROSS JOIN 则是另一种极端:不做任何匹配,把左表每一行和右表每一行两两组合。笔记的例子是颜色和尺码,三种颜色配四种尺码,结果就是十二行。它看起来有点“暴力”,但在生成组合清单、构造测试数据时非常实用。要提醒的是,两张表行数一大,结果会爆炸式增长,用之前先估算一下量级。
3.3 UNION 与插入数据:结果集的拼接和写入
UNION 把两个查询的结果上下拼起来,笔记里是把客户和另一类人群的姓名、地址合并成一张清单。它要求两边的列数和类型对得上,默认还会去重;如果想去重关掉、保留全部,得用 UNION ALL。这个差别在统计总数时影响很大,别默认以为它只是简单拼接。
写入方向,笔记给了 INSERT 的基本形态:指定列名,再给对应的值。单条插入写一组 VALUES,多条插入用逗号隔开多组。例子里的DEFAULT表示“这一列用表定义的默认值”,配合 NULL 使用,能避免手动填一堆占位值。列名和值的顺序必须一一对应,少写一个值就会报错,这是插入语句最常见的失败原因。
4. 几个最容易搞混的地方:新手常踩的概念坑
4.1 易混点一:NULL 和空字符串不是一回事
很多人以为“没有电话号码”就是存了个空字符串,于是写phone = ''。但 NULL 表示“未知、未填写”,空字符串表示“填了,但内容是空的”,两者在数据库里完全不同。判断 NULL 只能用 IS NULL 或 IS NOT NULL,用等号永远匹配不到。区分方法很简单:想表达“这格没填过”用 NULL,想表达“填了个空内容”才用空字符串。
4.2 易混点二:WHERE 和 HAVING 的分工
刚学 SQL 的人容易把这两个过滤条件混为一谈。WHERE 在分组之前筛行,HAVING 在分组之后筛组。笔记的入门范围里主要用 WHERE,但一旦涉及聚合统计,就得靠 HAVING。判断标准是:条件里出现聚合函数(比如计数、求和),基本就该用 HAVING;只是对原始行做判断,用 WHERE。用错位置,数据库会直接报错,不会悄悄给你错结果。
4.3 易混点三:内连接和外连接的结果差异
这两个连接写起来只差一个 LEFT,结果却可能差出一大批行。内连接只留匹配上的,外连接保留一侧全部。混淆的根源是很多人默认“连接就是匹配”,忘了还有“保留”这层语义。区分办法:先问自己“对不上的那些行,我要不要”,要就外连接,不要就内连接。拿客户和订单举例,做客户名单用左连接,做成交分析用内连接。
4.4 易混点四:LIKE 的通配符和正则的符号别串用
LIKE 里%和_是通配符,正则里^、$、|、[]才是元字符。有人把%写进正则,或者把^写进 LIKE,结果匹配不到还找不到原因。区分方法:先看用的哪个运算符,LIKE 只认那两个符号,REGEXP 才认正则那一套。需求简单用 LIKE,需求复杂再上 REGEXP,别为了炫技把简单问题写复杂。
4.5 易混点五:LIMIT 的双参数顺序
LIMIT 6, 3是跳过 6 行取 3 行,不是取第 6 到第 3 行,也不是先取 3 再跳 6。这个顺序反直觉,翻车率很高。记法:把它读成“偏移量, 数量”,偏移量是“扔掉前面多少行”。如果只写一个数字,那就是数量,偏移量默认为零。分页场景里这两个参数会频繁出现,写之前默念一遍顺序能省不少调试时间。
5. 什么时候该翻这份笔记,什么时候别指望它
这份三小时课程笔记的定位非常清楚:它是入门阶段的速查表,不是参考手册。适合用的场景有这么几类。第一,你刚接触数据库,需要把 SELECT、WHERE、ORDER BY、LIMIT 这条主线快速串一遍,建立“一句查询由哪几块组成”的整体感。第二,你已经在写查询,但某个运算符的写法记不清了,比如 BETWEEN 是否含端点、LIMIT 两个参数谁在前,翻一眼就能确认。第三,你需要给同事或新人讲清楚内连接和外连接的区别,笔记里的客户订单例子足够直观,拿来当讲解素材很合适。
不适合用的场景同样明确。笔记自己就写明了,它覆盖的是核心语言构造,远不完整。如果你要做的是复杂报表、多表聚合、窗口函数、性能调优,这份材料帮不上忙,硬套只会写出又慢又难维护的语句。另外,它面向的是入门教学,示例表结构简单,真实业务里的字段命名、索引设计、事务处理都不在覆盖范围内。把它当成“第一块垫脚石”而不是“终点站”,心态就对了。
我自己的习惯是:每次写稍微复杂一点的查询之前,先把要用的运算符在草稿上过一遍,尤其是 NULL 判断和 LIMIT 的参数顺序,这两处翻车成本最低也最冤。那份笔记我留在手边,不是因为记不住语法,而是因为它把“为什么这样写”讲得足够短,短到愿意在动手前再看一眼。希望帮到你。
本文还有配套的精品资源,点击获取