SQL 核心技能速成笔记
1. 基础查询 (SELECT
Statement)
这是所有操作的起点,用于从表格中检索数据。
-
关键字 :
SELECT
,FROM
-
核心语法:
SELECT * FROM 表格名称;
(返回所有字段)SELECT 字段1, 字段2 FROM 表格名称;
(返回指定字段)
-
示例:
sql-- 从 students 表格中选取姓名、班级、成绩三个字段 SELECT 姓名, 班级, 成绩 FROM students;
2. 数据过滤 (WHERE
Clause)
用于筛选出满足特定条件的记录行。
-
关键字 :
WHERE
,AND
,OR
,NOT
,<>
,=
,>
,<
,BETWEEN
,IN
,LIKE
,IS NULL
-
核心语法:
- 精确/比较 :
WHERE 字段 = '值'
或WHERE 字段 > 数字
- 范围 :
WHERE 字段 BETWEEN 值1 AND 值2
- 多选一 :
WHERE 字段 IN ('值A', '值B')
- 模糊匹配 :
WHERE 字段 LIKE '模式'
(%
代表任意多个字符,_
代表一个字符)
- 精确/比较 :
-
示例:
sql-- 查询出成绩在 80 到 90 之间,且班级是「1 年 1 班」或「1 年 2 班」的学生 SELECT 姓名, 班级, 成绩 FROM students WHERE 成绩 BETWEEN 80 AND 90 AND 班级 IN ('1 年 1 班', '1 年 2 班'); -- 查询所有姓「张」的同学 SELECT 姓名, 班级, 成绩 FROM students WHERE 姓名 LIKE '张%';
3. 结果排序与分页 (Sorting & Pagination)
用于对查询结果进行排序,并限制返回的数据条数。
-
关键字 :
ORDER BY
,ASC
(升序,默认),DESC
(降序),LIMIT
,OFFSET
-
核心语法:
ORDER BY 字段1 DESC, 字段2 ASC;
(可依多个字段排序)LIMIT 条数 OFFSET 跳过条数;
(常用于分页功能)
-
示例:
sql-- 使用班级名称和成绩来进行排序 (成绩由高排到低) SELECT 姓名, 班级, 成绩 FROM students WHERE 班级 <> '1 年 2 班' ORDER BY 班级, 成绩 DESC; -- 每次显示 5 条数据,跳过前面 10 条 (即显示第 11-15 条) SELECT 姓名, 班级, 成绩 FROM students LIMIT 5 OFFSET 10;
4. 数据聚合与分组 (Aggregation & Grouping)
用于进行统计计算,是数据分析的基础。
-
关键字 :
GROUP BY
,HAVING
-
聚合函数 :
COUNT()
,SUM()
,AVG()
,MAX()
,MIN()
-
重要观念 :
WHERE
是在分组前 过滤原始数据;HAVING
是在分组后过滤聚合结果。 -
示例:
sql-- 查询成绩平均大于等于 80 的班级,并将分数由高至低排序 SELECT 班级, ROUND(AVG(成绩)) AS 成绩平均 FROM students GROUP BY 班级 HAVING 成绩平均 >= 80 ORDER BY 成绩平均 DESC;
5. 去重与计数 (Uniqueness & Counting)
-
关键字 :
DISTINCT
-
核心语法:
COUNT(*)
: 计算总行数。COUNT(字段)
: 计算指定字段中非空值的数量。COUNT(DISTINCT 字段)
: 计算不重复的种类数量。
-
示例:
sql-- 计算有多少种不同的社团 (不含 NULL) SELECT COUNT(DISTINCT 社团) FROM students;
6. 多表查询 (JOIN
Clause)
这是关系型数据库的精髓,能将不同表格的数据关联起来。
-
关键字 :
INNER JOIN
,LEFT JOIN
,RIGHT JOIN
,ON
-
核心观念:
INNER JOIN
: 只返回两个表格中有关联的数据 (交集)。LEFT JOIN
: 返回左边表格的所有数据,以及右边表格中能匹配上的数据 (若无匹配则为 NULL)。
-
示例:
vbnet-- 查询学生报名的社团名称 (即使有学生没参加社团,也要列出学生姓名) SELECT s.姓名, c.社团名称 FROM students AS s LEFT JOIN clubs AS c ON s.社团 = c.社团编号;
7. 数据操作 (Data Manipulation Language - DML)
用于新增、修改、删除数据。
-
关键字 :
INSERT INTO
,UPDATE
,DELETE
-
示例:
sql-- 插入数据 INSERT INTO clubs (社团编号, 社团名称) VALUES (101, '吉他社'); -- 更新数据 UPDATE clubs SET 社团名称 = '舞蹈社' WHERE 社团编号 = 104; -- 删除数据 DELETE FROM clubs WHERE 社团编号 = 104;
8. 表格操作 (Data Definition Language - DDL)
用于创建和删除表格结构。
-
关键字 :
CREATE TABLE
,DROP TABLE
,ALTER TABLE
-
示例:
sql-- 创建名为 clubs 的表格,包含社团编号 (主键) 和社团名称两个字段 CREATE TABLE clubs ( 社团编号 INT PRIMARY KEY, 社团名称 VARCHAR(15) );
进阶技能(后端开发必备)
9. 事务控制 (Transaction Control Language - TCL)
这是后端开发的生命线,保证一系列操作要么全部成功,要么全部失败(原子性)。
-
关键字 :
START TRANSACTION;
,COMMIT;
,ROLLBACK;
-
示例:
sqlSTART TRANSACTION; -- 操作1: 从 A 账户减去 100 元 UPDATE accounts SET balance = balance - 100 WHERE user_id = 'A'; -- 操作2: 向 B 账户增加 100 元 UPDATE accounts SET balance = balance + 100 WHERE user_id = 'B'; -- 确认以上操作无误,提交事务 COMMIT; -- 如果中间发生任何错误,则执行 ROLLBACK; 来回滚所有操作
10. 子查询 (Subquery)
将一个查询语句嵌套在另一个查询语句中,用于构建更复杂的查询逻辑。
-
示例:
sql-- 查询成绩高于平均分的学生 SELECT 姓名, 成绩 FROM students WHERE 成绩 > (SELECT AVG(成绩) FROM students);
11. 通用表表达式 (Common Table Expressions - CTEs)
使用 WITH
关键字创建临时的、命名的结果集,能让复杂的查询逻辑变得非常清晰。
-
关键字 :
WITH
-
示例:
sql-- 查询出哪些班级的平均分高于全校总平均分 WITH class_avg AS ( SELECT 班级, AVG(成绩) AS avg_score FROM students GROUP BY 班级 ) SELECT 班级, avg_score FROM class_avg WHERE avg_score > (SELECT AVG(成绩) FROM students);
12. 索引管理 (Index Management)
直接关系到查询性能的生死。你已经了解底层原理,这是它的上层应用。
-
关键字 :
CREATE INDEX
,DROP INDEX
,EXPLAIN
-
示例:
sql-- 为 students 表的姓名创建一个索引以加速查询 CREATE INDEX idx_name ON students (姓名); -- 检查 SQL 查询是否使用了索引 EXPLAIN SELECT * FROM students WHERE 姓名 = '张小婷';
13. 窗口函数 (Window Functions)
用于进行复杂的分析,如分组排名、计算移动平均值等,是区分 SQL 新手和高手的"分水岭"。
-
关键字 :
OVER()
,PARTITION BY
,RANK()
,ROW_NUMBER()
-
示例 :
sql-- 计算每个学生在自己班级内的成绩排名 SELECT 姓名, 班级, 成绩, RANK() OVER (PARTITION BY 班级 ORDER BY 成绩 DESC) AS 班级排名 FROM students;