MySQL - UNION 操作符

你好,未来的数据库大师们!今天,我们将深入探讨 MySQL 中最强大的工具之一:UNION 操作符。它就像一根魔法棒,允许我们将多个 SELECT 语句的结果合并为单一的结果集。激动人心吧?让我们一起踏上这个冒险之旅!

MySQL - UNION Operator

MySQL UNION 操作符

UNION 操作符用于合并两个或更多 SELECT 语句的结果集。这就像邀请不同的朋友群体参加同一个派对 - 他们都会聚集在一个地方!

这里的基本语法如下:

SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;

让我们来看一个实际例子。假设我们有两个表:'employees' 和 'customers'。

-- 创建 employees 表
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(50),
email VARCHAR(100)
);

-- 插入一些数据
INSERT INTO employees VALUES
(1, 'John Doe', '[email protected]'),
(2, 'Jane Smith', '[email protected]');

-- 创建 customers 表
CREATE TABLE customers (
id INT PRIMARY KEY,
name VARCHAR(50),
email VARCHAR(100)
);

-- 插入一些数据
INSERT INTO customers VALUES
(1, 'Alice Johnson', '[email protected]'),
(2, 'Bob Wilson', '[email protected]');

-- 现在,让我们使用 UNION
SELECT name, email FROM employees
UNION
SELECT name, email FROM customers;

这个查询将给我们一个来自两个表的名称和电子邮件的合并列表。酷吧?

请记住,UNION 默认会移除重复的行。就像我们派对上的保安,确保没有人能进来两次!

UNION 与 WHERE 子句

我们可以通过添加 WHERE 子句使我们的 UNION 更加强大。这允许我们在合并之前过滤每个 SELECT 语句的结果。

SELECT name, email FROM employees WHERE id > 1
UNION
SELECT name, email FROM customers WHERE name LIKE 'B%';

这个查询将给我们 ID 大于 1 的员工和名字以 'B' 开头的客户。就像在我们的派对上有 VIP 区域!

UNION 与 ORDER BY 子句

想要对合并后的结果进行排序?没问题!我们可以使用 ORDER BY,但它必须位于整个 UNION 语句的末尾。

SELECT name, email FROM employees
UNION
SELECT name, email FROM customers
ORDER BY name ASC;

这将给我们所有名称和电子邮件,按名称字母顺序排序。就像把我们的派对嘉宾按字母顺序排列!

UNION 与别名

有时,我们表中的列名可能有所不同。别担心!我们可以使用别名来使它们匹配。

SELECT name, email AS contact FROM employees
UNION
SELECT customer_name, customer_email AS contact FROM customers;

在这里,我们假设 customers 表有稍微不同的列名。AS 关键字允许我们即时重命名它们!

UNION ALL 操作符

记得我们那位移除重复的保安吗?有时我们希望让所有人进来,包括重复的。这时,UNION ALL 就派上用场了。

SELECT name FROM employees
UNION ALL
SELECT name FROM customers;

这将给我们所有的名称,即使两个表之间存在重复。就像在我们的派对上实行“来者不拒”的政策!

在客户端程序中使用 UNION 操作符

现在,让我们看看如何在客户端程序中使用 UNION 操作符。我将使用 Python 和 mysql-connector 库来展示一个例子。

import mysql.connector

# 连接到数据库
cnx = mysql.connector.connect(user='your_username', password='your_password',
host='127.0.0.1', database='your_database')
cursor = cnx.cursor()

# 执行 UNION 查询
query = """
SELECT name, email FROM employees
UNION
SELECT name, email FROM customers
ORDER BY name
"""
cursor.execute(query)

# 获取并打印结果
for (name, email) in cursor:
print(f"{name}: {email}")

# 关闭连接
cursor.close()
cnx.close()

这个脚本连接到您的 MySQL 数据库,执行一个 UNION 查询,并打印出结果。就像拥有一个个人助理来管理您的派对嘉宾名单!

下面是我们讨论过的 UNION 方法的总结表格:

方法 描述
UNION 合并结果,移除重复
UNION ALL 合并结果,保留重复
UNION 与 WHERE 在合并前过滤结果
UNION 与 ORDER BY 对合并结果进行排序
UNION 与别名 为列重命名以确保兼容性

就是这样,我年轻的数据爱好者们!我们已经穿越了 UNION 操作符的领域,从基本的合并到带有过滤和排序的复杂查询。记住,熟能生巧,所以不要害怕在您自己的数据库上尝试这些查询。谁知道呢?您可能会在镇上举办最好的数据派对!

Credits: Image by storyset