SQL 学习记录
SQL 学习记录
许步鸢第一章:认识 SQL
本章目标:理解 SQL、RDBMS、表/行/列等基本概念,并掌握最常见的 SQL 语句结构。
1. SQL 是什么?
SQL(Structured Query Language,结构化查询语言)是一种用于管理和操作关系型数据库的标准语言。
SQL 主要可以完成以下操作:
- 查询数据
- 插入数据
- 更新数据
- 删除数据
- 创建或修改数据库结构
- 创建表、视图、索引等数据库对象
- 设置部分数据库对象的访问权限
SQL 使用大量接近英语的关键字,因此语句通常具有较好的可读性。
2. SQL 能做什么?
常见能力包括:
- 使用
SELECT从数据库中查询数据 - 使用
INSERT INTO插入新数据 - 使用
UPDATE修改已有数据 - 使用
DELETE删除数据 - 使用
CREATE DATABASE创建数据库 - 使用
CREATE TABLE创建数据表 - 使用
ALTER TABLE修改表结构 - 使用
DROP TABLE删除表 - 创建视图(View)
- 创建索引(Index)
- 创建存储过程(Stored Procedure)
- 管理部分数据库对象的权限
3. RDBMS
RDBMS(Relational Database Management System)指关系型数据库管理系统。
常见的关系型数据库包括:
- MySQL
- PostgreSQL
- Oracle Database
- Microsoft SQL Server
- IBM Db2
- SQLite
3.1 表、行、列
关系型数据库通常使用“表(Table)”保存数据。
一个表由以下两部分组成:
- 行(Row / Record):一条完整的数据记录
- 列(Column / Field):数据的某一种属性
例如:
| id | name | url | alexa | country |
|---|---|---|---|---|
| 1 | https://www.google.com/ | 1 | USA | |
| 2 | 淘宝 | https://www.taobao.com/ | 13 | CN |
| 3 | 菜鸟教程 | https://www.runoob.com/ | 4689 | CN |
| 4 | 微博 | https://weibo.com/ | 20 | CN |
| 5 | https://www.facebook.com/ | 3 | USA |
可以把它理解为:
- 表名:
Websites - 每一行:一个网站
name、url、country:不同字段
第二章:SQL 基础语法
1. 选择数据库
MySQL 中可以使用:
1 | USE RUNOOB; |
作用:选择接下来要操作的数据库。
2. 设置字符集
旧版 MySQL 示例中经常看到:
1 | SET NAMES utf8; |
它表示设置当前客户端连接使用的字符集。
实际项目中通常建议统一使用
utf8mb4,以获得更完整的 Unicode 支持。
3. 查询整张表
1 | SELECT * |
说明:
SELECT:查询*:所有列FROM:指定数据来源Websites:表名
4. SQL 是否区分大小写?
SQL 关键字通常不区分大小写,所以下面两种写法通常都可以执行:
1 | SELECT * FROM Websites; |
1 | select * from Websites; |
为了提高可读性,建议:
- SQL 关键字使用大写
- 数据库名、表名、字段名根据团队规范书写
例如:
1 | SELECT name, country |
注意:不同操作系统和数据库配置下,数据库名、表名是否区分大小写可能存在差异。
5. SQL 语句末尾的分号
SQL 通常使用分号 ; 表示一条语句结束。
1 | SELECT * |
在命令行、SQL 脚本或一次执行多条 SQL 时,养成写分号的习惯会更稳妥。
第三章:常见 SQL 命令速查
| SQL 命令 | 作用 |
|---|---|
SELECT |
查询数据 |
INSERT INTO |
插入数据 |
UPDATE |
更新数据 |
DELETE |
删除数据 |
CREATE DATABASE |
创建数据库 |
ALTER DATABASE |
修改数据库 |
CREATE TABLE |
创建数据表 |
ALTER TABLE |
修改表结构 |
DROP TABLE |
删除数据表 |
CREATE INDEX |
创建索引 |
DROP INDEX |
删除索引 |
可以简单记成四大数据操作:
增:INSERT 删:DELETE 改:UPDATE 查:SELECT
第四章:CRUD 基础语法
CRUD 是数据库最常见的四类操作:
- Create:新增
- Read:查询
- Update:修改
- Delete:删除
1. SELECT:查询数据
基本语法:
1 | SELECT column_name |
查询多个字段:
1 | SELECT column1, column2 |
查询所有字段:
1 | SELECT * |
带条件查询:
1 | SELECT column1, column2 |
排序:
1 | SELECT column1, column2 |
其中:
ASC:升序DESC:降序
2. INSERT INTO:插入数据
1 | INSERT INTO table_name (column1, column2) |
例如:
1 | INSERT INTO Websites (name, url, country) |
字段和值必须按照对应顺序填写。
3. UPDATE:更新数据
1 | UPDATE table_name |
例如:
1 | UPDATE Websites |
⚠️ 易错点
如果忘记 WHERE:
1 | UPDATE Websites |
可能会修改表中的所有记录。
4. DELETE:删除数据
1 | DELETE FROM table_name |
例如:
1 | DELETE FROM Websites |
⚠️ 易错点
下面的 SQL:
1 | DELETE FROM Websites; |
会删除表中的所有数据,但表结构仍然存在。
第五章:表结构操作
1. CREATE TABLE:创建表
标准结构:
1 | CREATE TABLE table_name ( |
例如:
1 | CREATE TABLE Student ( |
其中:
id、name、age:字段名INT、VARCHAR(50):数据类型PRIMARY KEY、NOT NULL:约束
2. ALTER TABLE:修改表结构
添加字段:
1 | ALTER TABLE table_name |
例如:
1 | ALTER TABLE Student |
删除字段:
1 | ALTER TABLE table_name |
例如:
1 | ALTER TABLE Student |
3. DROP TABLE:删除表
1 | DROP TABLE table_name; |
⚠️ 注意
DROP TABLE 会同时删除:
- 表中的数据
- 表本身的结构
因此它与 DELETE FROM table_name; 不同。
第六章:查询结果处理
1. WHERE:条件筛选
1 | SELECT column_name |
例如:
1 | SELECT name |
2. ORDER BY:结果排序
1 | SELECT column_name |
降序:
1 | SELECT column_name |
3. DISTINCT:去除重复值
1 | SELECT DISTINCT column_name |
例如:
1 | SELECT DISTINCT country |
如果 country 中存在多个 CN,结果中只会保留一个。
4. HAVING:筛选分组后的结果
HAVING 一般与 GROUP BY 配合使用。
1 | SELECT country, COUNT(*) AS total |
理解:
WHERE:分组前过滤数据HAVING:分组后过滤结果
第七章:JOIN 基础
JOIN 用于根据关联条件组合多个表的数据。
基本结构:
1 | SELECT table1.column_name, table2.column_name |
例如:
1 | SELECT Student.name, Score.score |
第八章:SELECT 语句重点
1. 基本语法
1 | SELECT column1, column2 |
注意多个字段之间应该使用逗号分隔,而不是点号。
正确:
1 | SELECT name, country |
错误:
1 | SELECT name.country |
2. 查询所有字段
1 | SELECT * |
* 是通配符,表示选择所有字段。
实际开发中,如果只需要部分字段,通常建议明确写出字段名:
1 | SELECT id, name |
这样可以:
- 让 SQL 的目的更清晰
- 减少不必要的数据读取
- 避免表结构变化后影响代码
第九章:易错点整理
拼写易错
| 错误写法 | 正确写法 |
|---|---|
RDNMS |
RDBMS |
INSEERT INTO |
INSERT INTO |
ceate index |
CREATE INDEX |
colum |
column |
colum_mane |
column_name |
confition |
condition |
vlue |
value |
data_tpe |
data_type |
contraint |
constraint |
语法易错
多字段查询
1 | SELECT column1, column2 |
字段之间使用 ,。
UPDATE / DELETE 不要随便省略 WHERE
执行修改或删除前,可以先执行:
1 | SELECT * |
确认命中的数据没有问题后,再执行 UPDATE 或 DELETE。
第十章:一页速查
1 | -- 查询 |
本章自测
- SQL 的四个基本数据操作分别是什么?
DELETE和DROP TABLE有什么区别?WHERE和HAVING的区别是什么?SELECT *中的*表示什么?UPDATE不写WHERE会发生什么?- 查询多个字段时,字段之间使用什么符号分隔?
ASC和DESC分别表示什么?- RDBMS 的全称和含义是什么?
第二章:SQL 条件查询与数据筛选
本章目标:掌握 SQL 中最常用的数据筛选方式,能够根据条件从数据表中准确查询目标数据。
1. WHERE 条件查询
WHERE 用于指定查询条件,只返回满足条件的数据。
基本语法:
1 | SELECT column1, column2 |
例如:
1 | SELECT name, country |
含义:
从
Websites表中查询country等于CN的记录。
2. 常见比较运算符
SQL 中常见的比较运算符:
| 运算符 | 含义 |
|---|---|
= |
等于 |
<> |
不等于 |
!= |
不等于 |
> |
大于 |
< |
小于 |
>= |
大于等于 |
<= |
小于等于 |
例如:
1 | SELECT * |
表示查询 Alexa 排名小于 100 的网站。
3. 字符串条件
字符串通常使用单引号包裹:
1 | SELECT * |
数字一般不需要引号:
1 | SELECT * |
推荐养成习惯:
- 字符串:
'CN' - 数字:
20 - 日期:通常也使用字符串形式,例如
'2026-08-18'
4. AND:同时满足多个条件
AND 表示多个条件必须同时成立。
1 | SELECT * |
含义:
查询国家为 CN,并且 Alexa 排名小于 100 的网站。
逻辑理解:
1 | 条件 A AND 条件 B |
只有:
1 | A = true |
结果才是 true。
5. OR:满足任意一个条件
OR 表示只要其中一个条件成立即可。
1 | SELECT * |
含义:
查询来自中国或美国的网站。
6. NOT:条件取反
NOT 用于对条件进行取反。
1 | SELECT * |
表示:
查询
country不等于CN的数据。
也可以写成:
1 | SELECT * |
7. AND 和 OR 混合使用
当 AND 和 OR 一起出现时,建议使用括号明确逻辑关系。
例如:
1 | SELECT * |
括号可以让 SQL 更容易阅读,也能避免逻辑优先级造成错误。
⚠️ 易错点
下面两条 SQL 的含义可能不同:
1 | WHERE country = 'CN' |
1 | WHERE country = 'CN' |
复杂条件中建议主动写括号。
8. IN:匹配多个可能值
当同一个字段需要匹配多个值时,可以使用 IN。
普通写法:
1 | SELECT * |
使用 IN:
1 | SELECT * |
第二种写法更加简洁。
8.1 NOT IN
排除多个值:
1 | SELECT * |
表示:
查询国家既不是 CN,也不是 USA 的数据。
9. BETWEEN:范围查询
BETWEEN 用于查询某个范围内的数据。
1 | SELECT * |
表示:
查询 Alexa 排名在 10 到 100 之间的数据。
BETWEEN 默认包含边界值。
也就是:
1 | alexa >= 10 |
9.1 NOT BETWEEN
查询不在范围内的数据:
1 | SELECT * |
10. LIKE:模糊查询
LIKE 用于字符串模糊匹配。
常见通配符:
| 通配符 | 作用 |
|---|---|
% |
匹配任意数量字符 |
_ |
匹配单个字符 |
10.1 查询以某个字符开头
1 | SELECT * |
表示:
查询名称以
G开头的网站。
例如可能匹配:
1 |
|
10.2 查询以某个字符结尾
1 | SELECT * |
表示查询名称以 e 结尾的数据。
10.3 查询包含某个字符串
1 | SELECT * |
例如:
1 |
可能被匹配到。
10.4 下划线 _
_ 只匹配一个字符。
例如:
1 | SELECT * |
可以匹配:
1 |
因为 _ 正好对应一个字符。
11. NOT LIKE
排除符合模糊匹配条件的数据:
1 | SELECT * |
表示:
查询名称不是以 G 开头的数据。
12. NULL
NULL 表示:
当前字段没有值,或者值未知。
它和以下内容不同:
1 | 0 |
12.1 查询 NULL
不能这样写:
1 | WHERE column_name = NULL; |
正确写法:
1 | SELECT * |
12.2 查询非 NULL
1 | SELECT * |
⚠️ 易错点
错误:
1 | WHERE url != NULL; |
正确:
1 | WHERE url IS NOT NULL; |
13. DISTINCT:去除重复值
如果数据中存在重复值,可以使用 DISTINCT。
1 | SELECT DISTINCT country |
例如原数据:
1 | CN |
查询结果:
1 | CN |
14. ORDER BY:排序
ORDER BY 用于对结果进行排序。
升序:
1 | SELECT * |
降序:
1 | SELECT * |
其中:
ASC:Ascending,升序DESC:Descending,降序
默认情况下通常是升序。
14.1 多字段排序
1 | SELECT * |
含义:
- 先按照
country排序 - 如果
country相同,再按照alexa排序
15. LIMIT:限制查询数量
MySQL 中可以使用 LIMIT 限制返回记录数量。
1 | SELECT * |
表示:
只返回前 3 条记录。
15.1 LIMIT + ORDER BY
查询 Alexa 排名最靠前的 3 个网站:
1 | SELECT * |
这种组合非常常见。
16. LIMIT 偏移量
MySQL 可以使用:
1 | LIMIT offset, count; |
例如:
1 | SELECT * |
表示:
- 跳过前 5 条
- 再取 10 条数据
也可以写成:
1 | SELECT * |
这也是分页查询的基础。
17. 查询语句的基本执行结构
一个稍完整的 SQL 查询:
1 | SELECT column1, column2 |
可以先按照下面的顺序记忆:
1 | SELECT |
例如:
1 | SELECT name, alexa |
含义:
从 Websites 表中查询中国网站,只返回 name 和 alexa 字段,根据 alexa 升序排列,最多返回 5 条。
18. 综合案例
假设存在学生表:
1 | Student |
数据:
| id | name | age | city | score |
|---|---|---|---|---|
| 1 | 小明 | 18 | 北京 | 85 |
| 2 | 小红 | 19 | 上海 | 92 |
| 3 | 小刚 | 20 | 北京 | 78 |
| 4 | 小李 | 18 | 广州 | 96 |
| 5 | 小王 | 21 | 上海 | 88 |
案例 1:查询北京学生
1 | SELECT * |
案例 2:查询成绩大于 90 分的学生
1 | SELECT name, score |
案例 3:查询年龄在 18~20 岁之间的学生
1 | SELECT * |
案例 4:查询来自北京或上海的学生
1 | SELECT * |
案例 5:查询姓“小”的学生
1 | SELECT * |
案例 6:查询成绩最高的 3 名学生
1 | SELECT name, score |
案例 7:北京学生中成绩高于 80 分的人
1 | SELECT name, score |
19. 易错点总结
错误 1:字符串没有加引号
错误:
1 | WHERE country = CN; |
正确:
1 | WHERE country = 'CN'; |
错误 2:NULL 使用等号比较
错误:
1 | WHERE url = NULL; |
正确:
1 | WHERE url IS NULL; |
错误 3:AND / OR 逻辑混乱
推荐:
1 | WHERE condition1 |
错误 4:LIKE 通配符位置写错
1 | LIKE 'A%' |
表示以 A 开头。
1 | LIKE '%A' |
表示以 A 结尾。
1 | LIKE '%A%' |
表示包含 A。
错误 5:ORDER BY 方向记反
1 | ASC |
升序,小 → 大。
1 | DESC |
降序,大 → 小。
20. 本章速查表
1 | -- 等于 |
21. 本章记忆口诀
条件查询可以先记:
WHERE 定条件,AND 要同时,OR 选一个,NOT 来取反。
模糊查询:
前
%查结尾,后%查开头,两边%查包含。
空值:
NULL 不用等号,用 IS NULL。
排序:
ASC 小到大,DESC 大到小。
22. 本章自测
基础题
WHERE的作用是什么?AND和OR有什么区别?IN适合解决什么问题?BETWEEN 10 AND 20是否包含 10 和 20?LIKE '%abc%'表示什么?- SQL 中应该如何判断
NULL? ASC和DESC分别表示什么?LIMIT 5表示什么?
SQL 编写题
假设存在表:
1 | Student(id, name, age, city, score) |
题目 1
查询年龄大于 18 岁的学生。
1 | SELECT * |
题目 2
查询来自北京或上海的学生。
1 | SELECT * |
题目 3
查询成绩在 80~90 分之间的学生。
1 | SELECT * |
题目 4
查询成绩最高的 5 名学生。
1 | SELECT * |
题目 5
查询名字中包含“明”的学生。
1 | SELECT * |
23. 本章重点
学完本章后,至少应该熟练写出:
1 | SELECT * |
以及:
1 | SELECT column1, column2 |
如果这两种结构已经可以不看笔记直接写出来,就说明这一章基本掌握了。
