MySQL - Union 与 Join:理解它们之间的区别

你好,有抱负的数据库爱好者!今天,我们将踏上一段激动人心的旅程,探索MySQL世界的两个强大的工具:UNION和JOIN。作为你友好邻里的计算机老师,我将用清晰的解释和大量的例子来引导你理解这些概念。所以,拿起你的虚拟记事本,让我们开始吧!

MySQL - Union vs Join

理解基础知识

在我们深入研究UNION和JOIN的具体内容之前,让我们先快速回顾一下这些操作在MySQL中的功能。

什么是UNION?

UNION就像一位烹饪大师,将不同食谱的食材组合成一道美味佳肴。它允许我们将两个或更多SELECT语句的结果集合并成单个结果集。

什么是JOIN?

另一方面,JOIN更像是一位红娘。它帮助我们根据表之间的相关列来组合两个或更多表的行。

现在我们已经有了基本的了解,让我们更详细地探索每一个。

UNION的工作原理

UNION用于合并两个或更多SELECT语句的结果集。以下是基本语法:

SELECT column1, column2, ... FROM table1
UNION
SELECT column1, column2, ... FROM table2;

让我们通过一个例子来分解这一点。假设我们有两个表:fruits(水果)和vegetables(蔬菜)。

-- 创建并填充 fruits 表
CREATE TABLE fruits (
id INT PRIMARY KEY,
name VARCHAR(50),
color VARCHAR(20)
);

INSERT INTO fruits VALUES
(1, '苹果', '红色'),
(2, '香蕉', '黄色'),
(3, '葡萄', '紫色');

-- 创建并填充 vegetables 表
CREATE TABLE vegetables (
id INT PRIMARY KEY,
name VARCHAR(50),
color VARCHAR(20)
);

INSERT INTO vegetables VALUES
(1, '胡萝卜', '橙色'),
(2, '西兰花', '绿色'),
(3, '茄子', '紫色');

-- 现在,让我们使用 UNION 来组合这些表
SELECT name, color FROM fruits
UNION
SELECT name, color FROM vegetables;

这个查询将给我们一个包含所有水果和蔬菜的合并列表。结果可能如下所示:

name color
苹果 红色
香蕉 黄色
葡萄 紫色
胡萝卜 橙色
西兰花 绿色
茄子 紫色

注意,默认情况下UNION会删除重复的行。如果你想要保留重复的行,可以使用UNION ALL。

关于UNION的关键点:

  1. 所有SELECT语句中的列数和顺序必须相同。
  2. 对应列的数据类型应该兼容。
  3. 默认情况下,UNION会删除重复的行。使用UNION ALL来保留重复的行。

JOIN的工作原理

JOIN用于基于表之间的相关列来组合两个或更多表的行。有几种类型的JOIN,但我们只会关注最常见的一种:INNER JOIN(内连接)。

以下是基本语法:

SELECT column1, column2, ...
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;

让我们通过一个例子来说明这一点。假设我们有两个表:customers(客户)和orders(订单)。

-- 创建并填充 customers 表
CREATE TABLE customers (
customer_id INT PRIMARY KEY,
customer_name VARCHAR(50),
city VARCHAR(50)
);

INSERT INTO customers VALUES
(1, 'John Doe', '纽约'),
(2, 'Jane Smith', '洛杉矶'),
(3, 'Bob Johnson', '芝加哥');

-- 创建并填充 orders 表
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
product VARCHAR(50),
amount DECIMAL(10, 2)
);

INSERT INTO orders VALUES
(101, 1, '笔记本电脑', 999.99),
(102, 2, '智能手机', 599.99),
(103, 1, '平板电脑', 299.99);

-- 现在,让我们使用 JOIN 来组合这些表
SELECT c.customer_name, o.product, o.amount
FROM customers c
INNER JOIN orders o
ON c.customer_id = o.customer_id;

这个查询将给我们一个包含客户及其订单的列表。结果可能如下所示:

customer_name product amount
John Doe 笔记本电脑 999.99
John Doe 平板电脑 299.99
Jane Smith 智能手机 599.99

关于JOIN的关键点:

  1. JOIN基于表之间的相关列来组合行。
  2. ON子句指定了连接表的条件。
  3. 有不同类型的JOIN(INNER, LEFT, RIGHT, FULL),每种都有不同的行为。

UNION与JOIN:何时使用哪个?

现在我们已经探索了UNION和JOIN,你可能想知道何时使用哪一个。让我们来分析一下:

使用UNION时:

  1. 当你想要组合类似表或查询的行时。
  2. 表具有相同的结构(列的数量和数据类型)。
  3. 你需要消除重复的行(或者使用UNION ALL来保留它们)。

使用JOIN时:

  1. 当你想要组合不同表的列时。
  2. 表之间存在逻辑关系。
  3. 你需要检索跨多个表的数据。

下面是一个方便的比较表:

特性 UNION JOIN
目的 组合行 组合列
表结构 必须相似 可以不同
结果 垂直组合 水平组合
重复处理 默认删除(UNION ALL保留) 取决于JOIN类型
性能 对大数据集通常更快 对于复杂的JOIN可能较慢

记住,选择UNION还是JOIN取决于你的特定数据结构和你要实现的结果。在不同的场景中练习,以了解何时使用每一个。

总之,UNION和JOIN都是MySQL中的强大工具,各自服务于不同的目的。UNION帮助我们垂直组合相似数据,而JOIN允许我们水平地结合相关数据。在你继续MySQL之旅时,你会发现这些操作在无数情况下都非常有用。继续练习,很快你将成为一个MySQL大师!

祝愉快查询,未来的数据库巫师!

Credits: Image by storyset