欢迎来到 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
子句(AND
和 OR
)
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. 混合使用 AND
和 OR
你可以结合 AND
和 OR
来构建更复杂的查询条件。例如,查找所有类型为“小说”且出版年份在 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 |
+---------+-----------------+----------------+--------+-----------------+----------------+
幽默小贴士:
AND
和OR
就像是给数据库发了一套“寻宝指令”,告诉它你要找什么样的宝藏。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
操作符
你还可以将 NOT
与 IN
操作符结合使用,查找不属于指定多个值的记录。例如,查找所有类型不是“小说”或“科幻”的书籍:
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 年之间的书籍,可以使用 IN
和 NOT 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
子句:使用AND
和OR
关键字组合多个条件,构建更复杂的查询。 IN
操作符:使用IN
操作符简化多个OR
条件的写法,查找某一列的值是否属于指定的多个值之一。NOT
操作符:使用NOT
操作符否定某个条件,查找不满足某个条件的记录。- 动手实践:通过几个有趣的高级过滤挑战,巩固了所学的知识。
幽默小贴士:
高级数据过滤就像是给一群调皮的小朋友排队,刚开始可能会有点混乱,但只要你掌握了规则,很快就能让他们站得整整齐齐。继续加油,你一定会成为 SQL 的高手! 🏃♂️
结束语
恭喜你完成了 SQL 训练营的第五章!希望你在这一章中学到了很多关于高级 WHERE
子句的知识,并且通过动手实践加深了对 SQL 的理解。SQL 是一门非常强大的语言,掌握它不仅能提升你的工作效率,还能让你在处理数据时更加自信。