SQL - IN 与 EXISTS:初学者的全面指南

你好,未来的SQL大师们!我很高兴能成为你们在这激动人心的SQL世界旅程中的向导。今天,我们将探索SQL工具箱中的两个强大工具:IN和EXISTS操作符。如果你是编程新手,不用担心——我会一步步带你了解所有内容,就像我多年来在课堂上为无数学生所做的那样。

SQL - IN vs EXISTS

SQL IN 操作符

让我们从IN操作符开始。想象你正在计划一个聚会,你有一个想要邀请的朋友名单。IN操作符的工作方式与此类似——它允许你在WHERE子句中指定多个值。就像是说:“我想找到与这些值中的任意一个匹配的所有数据。”

基本语法

SELECT 列名(s)
FROM 表名
WHERE 列名 IN (值1, 值2, ...);

示例 1:查找特定水果

假设我们有一个名为'fruits'的表,其中包含' id '和' name '列。我们想要找到所有是苹果、香蕉或橙子的水果。

SELECT * FROM fruits
WHERE name IN ('apple', 'banana', 'orange');

这个查询将返回所有水果名称为苹果、香蕉或橙子的行。就像是问:“我可以拥有这个列表中的所有水果吗?”

示例 2:使用带有子查询的 IN

当与子查询结合使用时,IN操作符变得更加强大。假设我们有一个名为'favorite_fruits'的表,列出了人们的最爱水果。

SELECT * FROM fruits
WHERE name IN (SELECT fruit_name FROM favorite_fruits);

这个查询找到所有被某个人喜爱的水果。就像是说:“给我展示所有在任何人喜爱列表上的水果。”

SQL EXISTS 操作符

现在,让我们转向EXISTS操作符。如果IN像是检查列表上的项目,那么EXISTS更像是问一个是非问题。它检查是否存在满足特定条件的行。

基本语法

SELECT 列名(s)
FROM 表名
WHERE EXISTS (子查询);

示例 3:查找有订单的水果

假设我们有一个记录水果订单的'orders'表。我们想要找到至少被订购过一次的所有水果。

SELECT * FROM fruits
WHERE EXISTS (
SELECT 1 FROM orders
WHERE orders.fruit_id = fruits.id
);

这个查询返回至少有一个订单的所有水果。就像是问:“这种水果有订单吗?如果有,展示给我。”

示例 4:查找没有订单的客户

我们也可以使用NOT EXISTS来查找相反的情况。让我们找到没有下订单的客户。

SELECT * FROM customers
WHERE NOT EXISTS (
SELECT 1 FROM orders
WHERE orders.customer_id = customers.id
);

这个查询找到所有没有订单的客户。就像是问:“有没有没有下单的客户?展示给我那些客户。”

IN 与 EXISTS:应该使用哪一个?

现在我们已经看到了IN和EXISTS的实际应用,你可能想知道:“我应该什么时候使用哪一个?”这是个好问题!让我们来分析一下。

性能考虑

一般来说:

  • 当子查询结果较小时,IN通常更快
  • 对于大型数据集,EXISTS可能更高效

但请记住,数据库性能可能会有所不同,所以最好用你的具体数据来测试。

可读性和意图

  • 当你有一个特定的值列表来检查时,使用IN
  • 当你在检查相关数据的 presence 或 absence 时,使用EXISTS

空值处理

  • IN 处理 NULL 值的方式不同(它不会返回包含 NULL 的行)
  • EXISTS 没有这个限制

下面是一个方便的表格,总结何时使用每一个:

场景 推荐操作符
检查一组已知的小列表 IN
检查相关记录的存在 EXISTS
处理大型数据集 EXISTS
当 NULL 值应该包含在结果中时 EXISTS
当你需要检查多个条件时 EXISTS

结论

就这样,我的SQL学徒们!我们已经穿越了IN和EXISTS的土地,探索了它们的优点和使用案例。记住,就像选择正确的工作工具一样,在IN和EXISTS之间选择取决于你的具体情况。

在你继续你的SQL冒险之旅时,不要害怕尝试这两个操作符。尝试它们,看看它们在你的数据上表现如何,很快你将培养出对每个操作符使用时机的直觉。

在我让你离开之前,这里有一点SQL幽默:数据库管理员为什么离开他的妻子?因为她有太多的视图,而且他无法处理她的不专一!

继续练习,保持好奇心,查询愉快!

Credits: Image by storyset