掀起你的盖头来之《数据库揭秘》-3-SQL 核心技能速成笔记-查询、过滤、排序、分组等

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;

  • 示例:

    sql 复制代码
    START 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;
相关推荐
召摇2 小时前
如何避免写垃圾代码:Java篇
java·后端·代码规范
无限大62 小时前
HTTP 1.0去哪了?揭开Web协议版本误解的真相
后端·面试
程序员蜗牛2 小时前
![图片](https://p0-xtjj-private.juejin.cn/tos-cn-i-73owjymdk6/62105da0f2c54b3497b0
后端
他日若遂凌云志2 小时前
深入拆解 Linux Socket 五大 I/O 模型:从底层机制到性能适配
后端
expect7g2 小时前
COW、MOR、MOW
大数据·数据库·后端
程序员小假2 小时前
我们来说说当一个线程两次调用 start() 方法会出现什么情况?
java·后端
bobz9652 小时前
I/O复用 select、poll、epoll
后端
无限大62 小时前
一文读懂HTTP 1.1/2.0/3.0:从原理到应用的通俗解析
后端·面试
SimonKing3 小时前
Archery:开源、一站式的数据库 SQL 审核与运维平台
java·后端·程序员