Bohr-L Bohr-L
首页
技术
常见面试题
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

刘博

I'm a slow walker, But I never walk backwards.
首页
技术
常见面试题
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 数据处理与存储类

  • Spring 生态类

  • 缓存问题类

  • 多线程类

  • JVM 类

  • MySQL 类

    • MySQL 为什么一定要有一个主键
    • MySQL 中的 RR 隔离级别,到底有没有解决幻读问题
    • MySQL 的行级锁到底锁的是什么东西?
    • 存储 MD5 值应该用 VARCHAR 还是用 CHAR?
    • 数据库的三范式是什么?
    • 说说 InnoDB 与 MyISAM 的区别
    • drop、truncate、delete 的区别
    • 聊一聊数据库事务机制
    • 聊一聊 MySQL 中的关联查询
    • 事务隔离级别有哪些?MySQL 的默认隔离级别是什么
    • 分库分表之后,id 主键如何处理?
    • 说说在 MySQL 中一条查询 SQL 是如何执行的?
    • 讲解下 DDL、DML、DCL
    • 存储过程和触发器的作用
    • MySQL 如何行转列和列转行
    • 如何查看 SQL 的执行计划
    • union 和 unionAll 的区别
      • having 和 where 的区别
      • 常见的索引原则
      • MySQL 中的 IN 和 EXISTS 子句有什么区别?
      • MySQL 如何处理 NULL 值,对性能有什么影响?
      • 如何在 MySQL 中处理和避免全表扫描?
      • MySQL 中的表空间是什么,它的作用是什么?
      • 在 MySQL 中,如何优化 ORDER BY 查询?
    • Java 8 + 特性类

    • 其他技术类

    • 常见面试题
    • MySQL 类
    刘博
    2025-12-29
    目录

    union 和 unionAll 的区别

    union和unionAll均用于 “合并多个 SELECT 语句的结果集”,核心区别在于 “是否去重” 和 “性能”,具体对比如下:

    # 1. 核心区别

    对比维度 union unionAll
    去重功能 自动去除结果集中的重复行 不去除重复行,保留所有行
    排序功能 自动对结果集按第一列升序排序(可通过 ORDER BY 指定排序) 不排序,结果集顺序与各 SELECT 语句执行顺序一致
    性能 较低(需额外执行去重和排序操作) 较高(直接合并结果,无额外操作)
    适用场景 需合并且去重的场景(如合并两个无重复数据的表) 无需去重的场景(如合并日志表、统计结果表)

    # 2. 语法示例与结果对比

    # 测试数据:
    -- 表A
    CREATE TABLE table_a (id INT, name VARCHAR(20));
    INSERT INTO table_a VALUES (1, '张三'), (2, '李四');
    
    -- 表B(包含与表A的重复数据)
    CREATE TABLE table_b (id INT, name VARCHAR(20));
    INSERT INTO table_b VALUES (2, '李四'), (3, '王五');
    
    1
    2
    3
    4
    5
    6
    7
    # (1)union 示例(去重 + 排序)
    SELECT id, name FROM table_a
    UNION
    SELECT id, name FROM table_b;
    
    1
    2
    3
    # 结果(去重 + 按 id 升序排序):
    id name
    1 张三
    2 李四
    3 王五
    # (2)unionAll 示例(不去重 + 不排序)
    SELECT id, name FROM table_a
    UNION ALL
    SELECT id, name FROM table_b;
    
    1
    2
    3
    # 结果(保留重复行,顺序与 SELECT 顺序一致):
    id name
    1 张三
    2 李四
    2 李四
    3 王五

    # 3. 关键注意事项

    • 结果集结构一致:两个 SELECT 语句的字段数必须相同,字段类型需兼容(如 INT 和 VARCHAR 可兼容,DATE 和 INT 不兼容);

    • 排序位置:union 的 ORDER BY 需写在最后一个 SELECT 语句后(作用于整个结果集),unionAll 的 ORDER BY 需写在每个 SELECT 语句后(作用于单个结果集);

      -- union 排序整个结果集
      SELECT id, name FROM table_a
      UNION
      SELECT id, name FROM table_b
      ORDER BY id DESC; -- 按id降序排序
      
      -- unionAll 排序单个结果集
      SELECT id, name FROM table_a ORDER BY id DESC
      UNION ALL
      SELECT id, name FROM table_b ORDER BY id DESC;
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
    • 性能优化:若确定两个结果集无重复数据,优先使用 unionAll(性能比 union 高 30%-50%);若需去重,再使用 union。


    上次更新: 12/30/2025
    如何查看 SQL 的执行计划
    having 和 where 的区别

    ← 如何查看 SQL 的执行计划 having 和 where 的区别→

    最近更新
    01
    CPU 使用率较高排查和解决
    12-29
    02
    JVM OOM 问题如何排查和解决
    12-29
    03
    接口防刷怎么实现?
    12-29
    更多文章>
    Theme by Vdoing | Copyright © 2025-2026 Bohr-L's note
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式