SQL - UNION 与 JOIN:初学者的全面指南

你好,有抱负的SQL爱好者们!我很高兴能成为你在这个激动人心的SQL世界中的向导。今天,我们将揭开 UNION 和 JOIN 这两个强大的SQL操作的神秘面纱,它们一开始可能看起来有点令人困惑,但很快就会成为你数据操作的最佳伙伴。所以,来一杯咖啡,舒服地坐下来,让我们一起深入探讨吧!

SQL - Union vs Join

理解基础

在我们深入探讨 UNION 和 JOIN 的复杂性之前,让我们从一个简单的类比开始。想象你正在组织一个聚会,你有两份宾客名单:一份是你的朋友名单,另一份是你的家人名单。现在,你有两个选择:

  1. 将两个名单合并成一个大的名单(这就是 UNION)
  2. 弄清楚你的哪些朋友也和你是亲戚(这就是 JOIN)

听起来很有趣吗?太好了!让我们详细探讨每个操作。

UNION 的工作原理

什么是 UNION?

UNION 在SQL中就像一个列表制作大师。它接受两个或更多的 SELECT 语句,并将它们的结果合并到一个单一的结果集中。当你想要合并具有相似结构的不同表中的数据时,它非常完美。

UNION 的实际应用

假设我们有两个表:employees_usaemployees_uk。我们想要得到一份所有员工的名单,不管他们在哪里。

SELECT first_name, last_name, country
FROM employees_usa
UNION
SELECT first_name, last_name, country
FROM employees_uk;

这个查询会给我们一个来自美国和英国办公室的所有员工的合并名单。酷吧?

UNION ALL:包容性更强的表亲

现在,如果我们想要包含重复的条目呢?这时 UNION ALL 就派上用场了。

SELECT product_name, category
FROM products_2021
UNION ALL
SELECT product_name, category
FROM products_2022;

这个查询将列出2021年和2022年的所有产品,如果某个产品在两年中都可用,则会包括重复项。

需要记住的关键点

  1. UNION 默认移除重复行
  2. UNION ALL 包含所有行,包括重复行
  3. 所有 SELECT 语句中的列数和顺序必须相同
  4. 对应列的数据类型应该兼容

JOIN 的工作原理

什么是 JOIN?

如果 UNION 是一个列表制作师,那么 JOIN 就像一个配对师。它基于两个或多个表之间的相关列来合并行。当你想要检索分布在多个表中的数据时,它非常完美。

JOIN 的类型

让我们用一个有趣的类比来分解不同类型的 JOIN。想象你在一个舞会上:

  1. INNER JOIN:只配对那些知道同一种舞蹈的舞者
  2. LEFT JOIN:配对左侧的所有舞者,即使他们没有舞伴
  3. RIGHT JOIN:配对右侧的所有舞者,即使他们没有舞伴
  4. FULL JOIN:配对所有舞者,即使有些最终会独自跳舞

JOIN 的实际应用

让我们看看这些 JOIN 在真实的 SQL 查询中是如何工作的:

INNER JOIN

SELECT customers.name, orders.order_date
FROM customers
INNER JOIN orders ON customers.id = orders.customer_id;

这个查询将显示所有下订单的客户及其订单日期。

LEFT JOIN

SELECT employees.name, departments.dept_name
FROM employees
LEFT JOIN departments ON employees.dept_id = departments.id;

这个查询将列出所有员工,即使他们没有被分配到任何部门。

RIGHT JOIN

SELECT products.name, categories.category_name
FROM products
RIGHT JOIN categories ON products.category_id = categories.id;

这个查询将显示所有类别,即使某些类别没有产品。

FULL JOIN

SELECT students.name, courses.course_name
FROM students
FULL JOIN enrollments ON students.id = enrollments.student_id
FULL JOIN courses ON enrollments.course_id = courses.id;

这个查询将列出所有学生和所有课程,即使有些学生没有选修任何课程或有些课程没有学生。

UNION 与 JOIN:对决

现在我们已经探讨了 UNION 和 JOIN,让我们将它们并排放在一起比较:

方面 UNION JOIN
目的 将类似表中的行合并 将相关表中的列合并
结果 垂直组合(更多行) 水平组合(更多列)
表结构 必须有相同数量的列 可以有不同的列数
重复处理 移除重复(除非 UNION ALL) 保留所有匹配的行
性能 通常在大型数据集上更快 在复杂连接上可能更慢
用例 从不同来源合并类似数据 跨表检索相关数据

结论:选择 UNION 还是 JOIN

那么,你什么时候应该使用 UNION,什么时候应该选择 JOIN 呢?这里有一个简单的经验法则:

  • 当你想将来自不同表中的类似数据合并成一个单一列表时,使用 UNION。
  • 当你想检索分布在多个表中的相关数据时,使用 JOIN。

记住,就像选择正确的工具来工作一样,选择 UNION 还是 JOIN 取决于你的具体数据需求。随着练习,你会对在不同场景下使用哪一个培养出直觉。

我希望这个指南已经帮助你揭开了 UNION 和 JOIN 的神秘面纱。继续练习,保持好奇心,在你意识到之前,你将像专业人士一样轻松地跳过SQL查询!快乐编码!

Credits: Image by storyset