SQL 训练营:第五章 - 高级数据过滤

欢迎来到 SQL 训练营的第五章!在这一章中,我们将深入学习如何使用更复杂的 WHERE 子句进行高级数据过滤。我们将介绍如何组合多个条件、使用 IN 操作符和 NOT 操作符来构建更灵活的查询。别担心,我们会用幽默的方式让你轻松理解每一个知识点。准备好了吗?让我们开始吧!


第一节:准备基础表和数据

为了方便我们练习高级数据过滤,我们将创建一个新的表格,并插入一些与前几章不同的数据。假设我们有一个图书馆管理系统,需要记录书籍的信息。我们将创建一个名为 books 的表格,并插入几条书籍记录。

1. 创建表格
-- 创建 "books" 表格,包含书籍的基本信息
CREATE TABLE books (
    book_id INT PRIMARY KEY AUTO_INCREMENT,  -- 书籍编号,自动递增
    title VARCHAR(255),                      -- 书名
    author VARCHAR(100),                     -- 作者
    genre VARCHAR(50),                       -- 类型(如 '小说'、'科幻'、'历史')
    publication_year INT,                    -- 出版年份
    available_copies INT                     -- 可借阅的副本数量
);
2. 插入数据
-- 插入五条书籍记录
INSERT INTO books (title, author, genre, publication_year, available_copies) 
VALUES ('哈利波特与魔法石', 'J.K.罗琳', '小说', 1997, 5);

INSERT INTO books (title, author, genre, publication_year, available_copies) 
VALUES ('三体', '刘慈欣', '科幻', 2008, 3);

INSERT INTO books (title, author, genre, publication_year, available_copies) 
VALUES ('百年孤独', '加西亚·马尔克斯', '小说', 1967, 2);

INSERT INTO books (title, author, genre, publication_year, available_copies) 
VALUES ('人类简史', '尤瓦尔·赫拉利', '历史', 2011, 4);

INSERT INTO books (title, author, genre, publication_year, available_copies) 
VALUES ('银河帝国', '艾萨克·阿西莫夫', '科幻', 1951, 6);

现在,我们的 books 表格已经准备好了,里面有一些书籍的信息。接下来,我们将学习如何使用更复杂的 WHERE 子句对这些数据进行高级过滤。

幽默小贴士:

数据库就像是一个装满宝藏的宝箱,而高级 WHERE 子句就是帮你找到特定宝藏的“超级指南针”。只要你掌握了这根超级指南针,就能快速找到你需要的数据! 🧭✨


第二节:组合 WHERE 子句(ANDOR

1. 使用 AND 组合多个条件

有时候,你可能需要同时满足多个条件才能返回符合条件的记录。这时可以使用 AND 关键字将多个条件组合在一起。例如,查找所有类型为“科幻”且出版年份在 2000 年之后的书籍:

SELECT * FROM books WHERE genre = '科幻' AND publication_year > 2000;

结果

+---------+-----------------+-----------+--------+-----------------+----------------+
| book_id | title           | author    | genre  | publication_year | available_copies |
+---------+-----------------+-----------+--------+-----------------+----------------+
|       2 | 三体            | 刘慈欣     | 科幻   | 2008            |               3 |
+---------+-----------------+-----------+--------+-----------------+----------------+
2. 使用 OR 组合多个条件

如果你希望只要满足其中一个条件即可返回记录,可以使用 OR 关键字。例如,查找所有类型为“小说”或“科幻”的书籍:

SELECT * FROM books WHERE genre = '小说' OR genre = '科幻';

结果

+---------+-----------------+----------------+--------+-----------------+----------------+
| book_id | title           | author         | genre  | publication_year | available_copies |
+---------+-----------------+----------------+--------+-----------------+----------------+
|       1 | 哈利波特与魔法石 | J.K.罗琳       | 小说   | 1997            |               5 |
|       2 | 三体            | 刘慈欣         | 科幻   | 2008            |               3 |
|       3 | 百年孤独        | 加西亚·马尔克斯 | 小说   | 1967            |               2 |
|       5 | 银河帝国        | 艾萨克·阿西莫夫 | 科幻   | 1951            |               6 |
+---------+-----------------+----------------+--------+-----------------+----------------+
3. 混合使用 ANDOR

你可以结合 ANDOR 来构建更复杂的查询条件。例如,查找所有类型为“小说”且出版年份在 1990 年之后的书籍,或者类型为“科幻”的书籍:

SELECT * FROM books WHERE (genre = '小说' AND publication_year > 1990) OR genre = '科幻';

结果

+---------+-----------------+----------------+--------+-----------------+----------------+
| book_id | title           | author         | genre  | publication_year | available_copies |
+---------+-----------------+----------------+--------+-----------------+----------------+
|       1 | 哈利波特与魔法石 | J.K.罗琳       | 小说   | 1997            |               5 |
|       2 | 三体            | 刘慈欣         | 科幻   | 2008            |               3 |
|       5 | 银河帝国        | 艾萨克·阿西莫夫 | 科幻   | 1951            |               6 |
+---------+-----------------+----------------+--------+-----------------+----------------+
幽默小贴士:

ANDOR 就像是给数据库发了一套“寻宝指令”,告诉它你要找什么样的宝藏。AND 是“既要这个,又要那个”,而 OR 是“这个或者那个都可以”。通过组合它们,你可以找到更加精确的数据! 🌟


第三节:IN 操作符

1. 使用 IN 操作符

IN 操作符用于查找某一列的值是否属于指定的多个值之一。它可以简化多个 OR 条件的写法。例如,查找所有类型为“小说”或“科幻”或“历史”的书籍:

SELECT * FROM books WHERE genre IN ('小说', '科幻', '历史');

结果

+---------+-----------------+----------------+--------+-----------------+----------------+
| book_id | title           | author         | genre  | publication_year | available_copies |
+---------+-----------------+----------------+--------+-----------------+----------------+
|       1 | 哈利波特与魔法石 | J.K.罗琳       | 小说   | 1997            |               5 |
|       2 | 三体            | 刘慈欣         | 科幻   | 2008            |               3 |
|       3 | 百年孤独        | 加西亚·马尔克斯 | 小说   | 1967            |               2 |
|       4 | 人类简史        | 尤瓦尔·赫拉利  | 历史   | 2011            |               4 |
|       5 | 银河帝国        | 艾萨克·阿西莫夫 | 科幻   | 1951            |               6 |
+---------+-----------------+----------------+--------+-----------------+----------------+
2. IN 操作符的优势

IN 操作符不仅可以简化查询语句,还能提高可读性。尤其是当你要检查多个值时,使用 IN 比多个 OR 更加简洁明了。

幽默小贴士:

IN 操作符就像是给数据库发了一份“愿望清单”,告诉它你要找哪些类型的书籍。数据库会根据你的清单,把符合条件的书籍都找出来给你! 📝


第四节:NOT 操作符

1. 使用 NOT 操作符

NOT 操作符用于否定某个条件,即查找不满足某个条件的记录。例如,查找所有类型不是“科幻”的书籍:

SELECT * FROM books WHERE NOT genre = '科幻';

结果

+---------+-----------------+----------------+--------+-----------------+----------------+
| book_id | title           | author         | genre  | publication_year | available_copies |
+---------+-----------------+----------------+--------+-----------------+----------------+
|       1 | 哈利波特与魔法石 | J.K.罗琳       | 小说   | 1997            |               5 |
|       3 | 百年孤独        | 加西亚·马尔克斯 | 小说   | 1967            |               2 |
|       4 | 人类简史        | 尤瓦尔·赫拉利  | 历史   | 2011            |               4 |
+---------+-----------------+----------------+--------+-----------------+----------------+
2. NOT IN 操作符

你还可以将 NOTIN 操作符结合使用,查找不属于指定多个值的记录。例如,查找所有类型不是“小说”或“科幻”的书籍:

SELECT * FROM books WHERE genre NOT IN ('小说', '科幻');

结果

+---------+-----------------+----------------+--------+-----------------+----------------+
| book_id | title           | author         | genre  | publication_year | available_copies |
+---------+-----------------+----------------+--------+-----------------+----------------+
|       4 | 人类简史        | 尤瓦尔·赫拉利  | 历史   | 2011            |               4 |
+---------+-----------------+----------------+--------+-----------------+----------------+
3. NOT 操作符的灵活性

NOT 操作符可以与其他操作符(如 =>< 等)结合使用,帮助你构建更复杂的查询条件。例如,查找所有出版年份不在 1990 到 2000 年之间的书籍:

SELECT * FROM books WHERE publication_year NOT BETWEEN 1990 AND 2000;

结果

+---------+-----------------+----------------+--------+-----------------+----------------+
| book_id | title           | author         | genre  | publication_year | available_copies |
+---------+-----------------+----------------+--------+-----------------+----------------+
|       3 | 百年孤独        | 加西亚·马尔克斯 | 小说   | 1967            |               2 |
|       4 | 人类简史        | 尤瓦尔·赫拉利  | 历史   | 2011            |               4 |
|       5 | 银河帝国        | 艾萨克·阿西莫夫 | 科幻   | 1951            |               6 |
+---------+-----------------+----------------+--------+-----------------+----------------+
幽默小贴士:

NOT 操作符就像是给数据库发了一份“排除清单”,告诉它你不想找哪些类型的书籍。数据库会根据你的要求,把不符合条件的书籍都排除掉,只留下你需要的! ❌


 

-- 请在这里编写查询语句

第五节:过滤数据挑战

1. 挑战 1:查找所有类型为“小说”且出版年份在 1990 年之后的书籍

要查找所有类型为“小说”且出版年份在 1990 年之后的书籍,可以直接在 WHERE 子句中使用 AND 组合条件:

SELECT * FROM books WHERE genre = '小说' AND publication_year > 1990;

结果

+---------+-----------------+-----------+--------+-----------------+----------------+
| book_id | title           | author    | genre  | publication_year | available_copies |
+---------+-----------------+-----------+--------+-----------------+----------------+
|       1 | 哈利波特与魔法石 | J.K.罗琳  | 小说   | 1997            |               5 |
+---------+-----------------+-----------+--------+-----------------+----------------+
2. 挑战 2:查找所有类型为“科幻”或“历史”的书籍

要查找所有类型为“科幻”或“历史”的书籍,可以使用 IN 操作符:

SELECT * FROM books WHERE genre IN ('科幻', '历史');

结果

+---------+-----------------+----------------+--------+-----------------+----------------+
| book_id | title           | author         | genre  | publication_year | available_copies |
+---------+-----------------+----------------+--------+-----------------+----------------+
|       2 | 三体            | 刘慈欣         | 科幻   | 2008            |               3 |
|       4 | 人类简史        | 尤瓦尔·赫拉利  | 历史   | 2011            |               4 |
|       5 | 银河帝国        | 艾萨克·阿西莫夫 | 科幻   | 1951            |               6 |
+---------+-----------------+----------------+--------+-----------------+----------------+
3. 挑战 3:查找所有类型不是“科幻”的书籍

要查找所有类型不是“科幻”的书籍,可以使用 NOT 操作符:

SELECT * FROM books WHERE NOT genre = '科幻';

结果

+---------+-----------------+----------------+--------+-----------------+----------------+
| book_id | title           | author         | genre  | publication_year | available_copies |
+---------+-----------------+----------------+--------+-----------------+----------------+
|       1 | 哈利波特与魔法石 | J.K.罗琳       | 小说   | 1997            |               5 |
|       3 | 百年孤独        | 加西亚·马尔克斯 | 小说   | 1967            |               2 |
|       4 | 人类简史        | 尤瓦尔·赫拉利  | 历史   | 2011            |               4 |
+---------+-----------------+----------------+--------+-----------------+----------------+
4. 挑战 4:查找所有出版年份在 1980 到 2000 年之间且可借阅副本数量大于 3 的书籍

要查找所有出版年份在 1980 到 2000 年之间且可借阅副本数量大于 3 的书籍,可以使用 BETWEEN ... AND ...AND 组合条件:

SELECT * FROM books WHERE publication_year BETWEEN 1980 AND 2000 AND available_copies > 3;

结果

+---------+-----------------+-----------+--------+-----------------+----------------+
| book_id | title           | author    | genre  | publication_year | available_copies |
+---------+-----------------+-----------+--------+-----------------+----------------+
|       1 | 哈利波特与魔法石 | J.K.罗琳  | 小说   | 1997            |               5 |
|       2 | 三体            | 刘慈欣    | 科幻   | 2008            |               3 |
+---------+-----------------+-----------+--------+-----------------+----------------+
5. 挑战 5:查找所有类型为“小说”或“科幻”,但出版年份不在 1990 到 2000 年之间的书籍

要查找所有类型为“小说”或“科幻”,但出版年份不在 1990 到 2000 年之间的书籍,可以使用 INNOT BETWEEN 组合条件:

SELECT * FROM books WHERE genre IN ('小说', '科幻') AND publication_year NOT BETWEEN 1990 AND 2000;

结果

+---------+-----------------+----------------+--------+-----------------+----------------+
| book_id | title           | author         | genre  | publication_year | available_copies |
+---------+-----------------+----------------+--------+-----------------+----------------+
|       3 | 百年孤独        | 加西亚·马尔克斯 | 小说   | 1967            |               2 |
|       5 | 银河帝国        | 艾萨克·阿西莫夫 | 科幻   | 1951            |               6 |
+---------+-----------------+----------------+--------+-----------------+----------------+
幽默小贴士:

挑战就像是编程中的“小游戏”,虽然有时候你会遇到困难,但只要坚持尝试,最终一定能找到正确的答案。每一次挑战都是通向成功的一步! 🎮


本章总结

通过这一章的学习,我们掌握了以下技能:

  • 组合 WHERE 子句:使用 ANDOR 关键字组合多个条件,构建更复杂的查询。
  • IN 操作符:使用 IN 操作符简化多个 OR 条件的写法,查找某一列的值是否属于指定的多个值之一。
  • NOT 操作符:使用 NOT 操作符否定某个条件,查找不满足某个条件的记录。
  • 动手实践:通过几个有趣的高级过滤挑战,巩固了所学的知识。
幽默小贴士:

高级数据过滤就像是给一群调皮的小朋友排队,刚开始可能会有点混乱,但只要你掌握了规则,很快就能让他们站得整整齐齐。继续加油,你一定会成为 SQL 的高手! 🏃‍♂️


结束语

恭喜你完成了 SQL 训练营的第五章!希望你在这一章中学到了很多关于高级 WHERE 子句的知识,并且通过动手实践加深了对 SQL 的理解。SQL 是一门非常强大的语言,掌握它不仅能提升你的工作效率,还能让你在处理数据时更加自信。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

caifox菜狐狸

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值