首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

mysql查询union

基础概念

UNION 是 MySQL 中的一个 SQL 操作符,用于合并两个或多个 SELECT 语句的结果集,并且会自动去除重复的记录。它要求每个 SELECT 语句必须具有相同数量的列,并且对应的列必须具有相似的数据类型。

优势

  1. 简化查询:当需要从多个表中获取数据时,使用 UNION 可以避免编写复杂的连接查询。
  2. 去重功能:默认情况下,UNION 会自动去除结果集中的重复记录。
  3. 性能优化:在某些情况下,使用 UNION 可能比复杂的连接查询更高效。

类型

  1. UNION:默认情况下,UNION 会去除重复的记录。
  2. UNION ALL:不会去除重复的记录,只是简单地将多个 SELECT 语句的结果集合并在一起。

应用场景

假设你有两个表,一个是 employees 表,另一个是 contractors 表,它们都包含员工的信息,但一个是正式员工,另一个是合同工。如果你想获取所有员工的信息,并且去除重复的记录,可以使用 UNION

代码语言:txt
复制
SELECT id, name, role FROM employees
UNION
SELECT id, name, role FROM contractors;

可能遇到的问题及解决方法

问题:为什么 UNION 查询结果不正确?

原因

  1. 列数不匹配:每个 SELECT 语句中的列数必须相同。
  2. 数据类型不匹配:对应的列必须具有相似的数据类型。
  3. 排序问题UNION 默认会去除重复记录,可能会影响结果的顺序。

解决方法

  1. 检查每个 SELECT 语句中的列数是否相同。
  2. 确保对应的列具有相似的数据类型。
  3. 如果需要保持结果顺序,可以使用 ORDER BY 子句,但需要在每个 SELECT 语句中都使用。
代码语言:txt
复制
(SELECT id, name, role FROM employees ORDER BY id)
UNION
(SELECT id, name, role FROM contractors ORDER BY id);

问题:为什么 UNION ALL 查询结果包含重复记录?

原因UNION ALL 不会去除重复记录,只是简单地将多个 SELECT 语句的结果集合并在一起。

解决方法: 如果不需要去重,可以使用 UNION ALL,否则使用 UNION

示例代码

假设有两个表 employeescontractors

代码语言:txt
复制
-- employees 表
CREATE TABLE employees (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    role VARCHAR(50)
);

-- contractors 表
CREATE TABLE contractors (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    role VARCHAR(50)
);

-- 插入示例数据
INSERT INTO employees (id, name, role) VALUES (1, 'Alice', 'Developer');
INSERT INTO employees (id, name, role) VALUES (2, 'Bob', 'Manager');
INSERT INTO contractors (id, name, role) VALUES (2, 'Bob', 'Contractor');
INSERT INTO contractors (id, name, role) VALUES (3, 'Charlie', 'Tester');

查询所有员工信息并去重:

代码语言:txt
复制
SELECT id, name, role FROM employees
UNION
SELECT id, name, role FROM contractors;

查询所有员工信息但不去重:

代码语言:txt
复制
SELECT id, name, role FROM employees
UNION ALL
SELECT id, name, role FROM contractors;

参考链接

MySQL UNION 和 UNION ALL

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • Explain使用心得

    首先我们要了解mysql查询优化器的执行效率,大约有10个,重点几个主要就是const,ref,range ,index,all。Const效率是最块的,成本可以忽略不计,主要通过主键或者唯一值查询的sql。还有比const更快的system,这种时候必须是mysql优化器内部精确计算查询成本,所以system不适用于innoDB,只适用于myISAM。Ref代表用的是索引b+tree查询的时候,比如用连接查询的时候,连接查询的条件是索引唯一值,这时候还分为eq-ref,er-ef是当被驱动表查询的是主键或者唯一二级索引的时候,这时候就是显示eq-ref。当连接表的条件是普通索引查询的时候,这时候显示就是ref,range顾名思义就是索引区间查询的时候,index代表查询覆盖索引的时候,all就是放弃索引全盘扫描了。

    02
    领券