返回顶部
首页 > 资讯 > 数据库 >MySQL 中的 UNION 语句
  • 936
分享到

MySQL 中的 UNION 语句

mysql数据库sql 2023-08-23 13:08:04 936人浏览 泡泡鱼
摘要

文章目录 一、数据准备一、UNION 和 UNION ALL二、UNION 的执行顺序(UNION 和其他语句一同出现)三、MySQL 使用 UNION(ALL) + ORDER 导致排序失效

一、数据准备

-- 创建表CREATE TABLE test_user ( ID int(11) NOT NULL AUTO_INCREMENT, USER_ID int(11) DEFAULT NULL COMMENT '用户账号', USER_NAME varchar(255) DEFAULT NULL COMMENT '用户名', AGE int(5) DEFAULT NULL COMMENT '年龄', COMMENT varchar(255) DEFAULT NULL COMMENT '简介', PRIMARY KEY (ID)) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8; -- 数据插入语句INSERT INTO test_user (ID, USER_ID, USER_NAME, AGE, COMMENT) VALUES ('1', '111', '开心菜鸟', '18', '今天很开心');INSERT INTO test_user (ID, USER_ID, USER_NAME, AGE, COMMENT) VALUES ('2', '222', '悲伤菜鸟', '21', '今天很悲伤');INSERT INTO test_user (ID, USER_ID, USER_NAME, AGE, COMMENT) VALUES ('3', '333', '认真菜鸟', '30', '今天很认真');INSERT INTO test_user (ID, USER_ID, USER_NAME, AGE, COMMENT) VALUES ('4', '444', '高兴菜鸟', '18', '今天很高兴');INSERT INTO test_user (ID, USER_ID, USER_NAME, AGE, COMMENT) VALUES ('5', '555', '严肃菜鸟', '21', '今天很严肃');
SELECT * FROM test_user u;

在这里插入图片描述

一、UNION 和 UNioN ALL

UNION

连接数据集关键字,可以将两个查询结果集拼接为一个,会过滤掉相同的记录

UNION ALL

连接数据集关键字,可以将两个查询结果集拼接为一个,不会过滤掉相同的记录

-- 使用UNIONSELECT * FROM test_user uUNIONSELECT * FROM test_user u;

在这里插入图片描述
使用 UNION ,可以看到查询结果只有 5 条数据。

-- 使用UNION ALLSELECT * FROM test_user uUNION ALLSELECT * FROM test_user u;

在这里插入图片描述
使用 UNION ALL,可以看到查询结果有 10 条数据。

二、UNION 的执行顺序(UNION 和其他语句一同出现)

from—>on—>join—>where—>group by—>having+(聚合函数)—>select—>distinct—>UNION—>order by—>limit

UNION 的执行顺序在 ORDER BY 之前

请记住这个执行顺序,便可以知道 UNION 和其他语句一同出现的结果。

  1. UNION 和 WHERE 语句
-- 1、第二个子句中的 where 语句不能同时作用于两个select语句-- 5 + 1,共计 6 条SELECT *, 'table1' FROM test_user u UNION ALLSELECT *, 'table2' FROM test_user u WHERE AGE = 30;

UNION 在 where 之后,所以第二个表的WHERE先筛选后进行数据集拼接;
在这里插入图片描述
如果想要把 where 作用所有结果集,可以通过再嵌套一个 select 。

-- 1、第二个子句中的 where 语句不能同时作用于两个select语句-- 1 + 1,共计 2 条-- 写法 1SELECT * FROM (SELECT *, 'table1' FROM test_user u UNION ALLSELECT *, 'table2' FROM test_user u) a WHERE AGE = 30;-- 或者使用写法 2SELECT *, 'table1' FROM test_user u WHERE AGE = 30UNION ALLSELECT *, 'table2' FROM test_user u WHERE AGE = 30;

在这里插入图片描述

  1. UNION 和 GROUP 语句
-- 2、第二个子句中的 group by 语句不能同时作用于两个select语句-- 5 + 3,共计 8 条SELECT *, 'table1' FROM test_user u UNION ALLSELECT *, 'table2' FROM test_user u GROUP BY AGE;

UNION 在 GROUP BY 之后,所以 table2 的 GROUP BY 先分组后进行数据集拼接;
在这里插入图片描述
2. UNION 和 HAVING 语句

-- 3、第二个子句中的 HAVING 语句不能同时作用于两个 select 语句-- 5 + 1,共计 6 条SELECT *, 'table1' FROM test_user u UNION ALLSELECT *, 'table2' FROM test_user u HAVING AGE = 30 ;

UNION 在 HAVING 之后,所以 table2 的 HAVING 先过滤后进行数据集拼接;
在这里插入图片描述
3. UNION 和 ORDER BY 语句

-- 4、第二个子句中的 order by 语句可以同时作用于两个select语句 -- 查询结果整体按照 age 进行了排序SELECT *, 'table1' FROM test_user u UNION ALLSELECT *, 'table2' FROM test_user u ORDER BY AGE;

因为当 UNION(ALL)语句和 ORDER BY语句同时出现,UNION(ALL)语句先执行。
在这里插入图片描述
4. UNION 和 LIMIT 语句

-- 只有1条数据,因为LIMIT在UNION之后执行SELECT *, 'table1' FROM test_user u UNION ALLSELECT *, 'table2' FROM test_user u limit 0,1;

只有1条数据,因为 LIMIT 在 UNION 之后执行。
在这里插入图片描述

  1. UNION 、 ORDER BY 和 LIMIT 语句
-- 5、第二个子句中的 order by ,LIMIT 语句同时作用于两个 select 语句 *********-- 只有1条数据,age=30 UNION--->ORDER BY--->LIMITSELECT *, 'table1' FROM test_user u UNION ALLSELECT *, 'table2' FROM test_user u order by age desc limit 0,1;

先拼接数据集,在按照 age 排序,最后使用 LIMIT 。
在这里插入图片描述

三、Mysql 使用 UNION(ALL) + ORDER 导致排序失效

通过以下两种方式解决:

  • 添加 LIMIT 字段
  • 额外增加排序字段
  1. SQL 1 如下
SELECT * FROM test_user u ORDER BY AGE;

在这里插入图片描述
2. SQL 2 如下

SELECT * FROM test_user u ORDER BY AGE DESC;

在这里插入图片描述
3. 查询结果集

(SELECT *, 'table1' FROM test_user u ORDER BY AGE) UNION ALL (SELECT *, 'table2' FROM test_user u ORDER BY AGE DESC);

可以看到此时 ORDER BY 语句失效了。

在这里插入图片描述
原因:UNION(ALL) + 会使 ORDER 失效

  1. 解决办法(1): 添加 LIMIT
-- 都加上 LIMIT( SELECT *, 'table1' FROM test_user u ORDER BY AGE limit 10) UNION ALL ( SELECT *, 'table2' FROM test_user u ORDER BY AGE DESC limit 10) 

在这里插入图片描述
最好的解决方案就是先查询后排序,避免上述情况发生。

  1. 解决办法(2) :添加额外的排序字段
select * from (( SELECT *, 'table1' AS name, row_number() over(ORDER BY AGE ) AS rn FROM test_user u ) UNION ALL ( SELECT *, 'table2' AS name, row_number() over(ORDER BY AGE DESC) AS rn FROM test_user u ) ) aorder by name, rn;

额外需要两个字段,通过 row_number() over(order by column)进行表内排序,再通过 name 字段进行表排序。

在这里插入图片描述

四、UNION 报错语法

1. ORDER BY 语法报错

-- 语法错误SELECT *, 'table1' FROM test_user u ORDER BY AGEUNION ALLSELECT *, 'table2' FROM test_user u ORDER BY AGE DESC;

第一个 SELECT 语句也使用了 ORDER BY ,导致报错。
在这里插入图片描述
解决方案:第一个 SELECT 语句加上括号。

-- 语法正确(SELECT *, 'table1' FROM test_user u ORDER BY AGE)UNION ALLSELECT *, 'table2' FROM test_user u ORDER BY AGE DESC;

加上括号后,虽然不再报错,但是第一个 SELECT 语句的排序失效。

在这里插入图片描述
那要是上下两个都加上括号呢?

-- 语法正确(SELECT *, 'table1' FROM test_user u ORDER BY AGE)UNION ALL(SELECT *, 'table2' FROM test_user u ORDER BY AGE DESC);

语法不报错,但是两个排序都失效了。

原因大家也清楚,前面第三小节已经讲过了,UNION 在 ORDER BY 语句之前。

在这里插入图片描述
2. LIMIT 语法报错

同样对于 LIMIT 语句也是一样的。

-- 语法错误SELECT *, 'table1' FROM test_user u limit 0,1UNION ALLSELECT *, 'table2' FROM test_user u limit 0,1;

在这里插入图片描述

解决方案:同样也是第一个 SELECT 语句加上括号。

-- 语法正确,1 条记录(SELECT *, 'table1' FROM test_user u limit 0,1)UNION ALLSELECT *, 'table2' FROM test_user u limit 0,1;

此时语法正确,但只返回一行记录。
在这里插入图片描述
如果想要返回两条记录,就给第二个 SELECT 语句也加上括号。

-- 语法正确,2 条记录(SELECT *, 'table1' FROM test_user u limit 0,1)UNION ALL(SELECT *, 'table2' FROM test_user u limit 0,1);

在这里插入图片描述

总结: UNION 后面执行的 ORDER BY,LIMIT 语句注意使用时要加括号,否则报错。

来源地址:https://blog.csdn.net/Lianjiabin/article/details/129527261

您可能感兴趣的文档:

--结束END--

本文标题: MySQL 中的 UNION 语句

本文链接: https://lsjlt.com/news/378618.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • MySQL 中的 UNION 语句
    文章目录 一、数据准备一、UNION 和 UNION ALL二、UNION 的执行顺序(UNION 和其他语句一同出现)三、MySQL 使用 UNION(ALL) + ORDER 导致排序失效...
    99+
    2023-08-23
    mysql 数据库 sql
  • UNION和UNION ALL怎么在MySQL中使用
    本篇文章为大家展示了UNION和UNION ALL怎么在MySQL中使用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。MySQL中的UNION...
    99+
    2024-04-02
  • mysql中UNION和UNION ALL有什么区别
    这篇文章给大家分享的是有关mysql中UNION和UNION ALL有什么区别的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在mysql中如何想要对两个结果集进行合并操作,可以使用UNION...
    99+
    2023-06-14
  • MySQL UNION 操作符
    MySQL UNION 操作符本教程为大家介绍 MySQL UNION 操作符的语法和实例。描述MySQL UNION 操作符用于连接两个以上的 SELECT 语句的结果组合...
    99+
    2024-04-02
  • LINQ基础之Join和UNION子句
    Join子句 一、简介 使用join子句可以将来自不同源序列并且在对象模型中没有直接关系的元素相关联,唯一的要求是每个源中的元素需要共享某个可以进行比较以判断是否相等的值,join子...
    99+
    2024-04-02
  • 【MySQL】多表查询(JOIN / UNION)
    文章目录 多表查询1. 笛卡尔积错误2. 等值连接 WHERE3. 非等值连接4. 自连接5. 内连接 INNER JOIN6. 外连接 LEFT JOIN7. 合并查询 UNIO&#...
    99+
    2023-09-04
    mysql 数据库 sql
  • MySQL中UNION操作符有什么用
    这篇文章给大家介绍MySQL中UNION操作符有什么用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。MySQL UNION 操作符用于连接两个以上的 SELECT...
    99+
    2024-04-02
  • mysql中UNION操作符的作用是什么
    本篇文章给大家分享的是有关mysql中UNION操作符的作用是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。mysql中UNION操作符是什么MySQL U...
    99+
    2023-06-14
  • MySQL中的count()、union()和group by语句的用法
    本篇内容介绍了“MySQL中的count()、union()和group by语句的用法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情...
    99+
    2024-04-02
  • SQL中MINUS的用法与UNION的用法
    在SQL中,MINUS和UNION都是用于合并查询结果的操作符。1. MINUS操作符:MINUS操作符用于从第一个查询结果...
    99+
    2023-09-12
    SQL
  • MySQL中怎么用Union优化Like语句
    这篇文章主要介绍了MySQL中怎么用Union优化Like语句,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。用Union...
    99+
    2024-04-02
  • SQL中UNION关键字怎么用
    小编给大家分享一下SQL中UNION关键字怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!SQL中的UNION...
    99+
    2024-04-02
  • sql语句union怎么用
    union操作用于合并多表记录至新结果集中,语法为:select column_list from table1 union [select co...
    99+
    2024-06-03
    sql语句
  • sql语句中union的用法与踩坑记录
    目录sql语句union的用法补充:SQLUNION踩过的坑总结sql语句union的用法  union联合的结果集不会有重复值,如果...
    99+
    2024-04-02
  • 在 SAP HANA 中执行 UNION 时出现内存错误
    SQL UNION 子句/运算符用于组合两个或多个 SELECT 语句的结果,而不返回任何重复行。要使用此 UNION 子句,每个 SELECT 语句必须具有选择相同数量的列相同数量的列表达式相同的数据类型并且拥有它们以相同...
    99+
    2023-10-22
  • MySQL利用UNION连接2个查询排序失效详解
    概述 UNION 连接数据集关键字,可以将两个查询结果集拼接为一个,会过滤掉相同的记录 UNION ALL 连接数据集关键字,可以将两个查询结果集拼接为一个,不会过滤掉相同的记录 今天在接...
    99+
    2024-04-02
  • mysql中union与union all的区别
    UNION用的比较多union all是直接连接,取到得是所有值,记录可能有重复 union 是取唯一值,记录没有重复 1、UNION 的语法如下: [SQL 语句 1] ...
    99+
    2018-11-29
    mysql中union与union all的区别 数据库入门 数据库基础教程 数据库 mysql
  • Mysql中的LIMIT 语句
    1. LIMIT 语句简介 LIMIT 语句是 MySQL 中常用的语句之一,它主要用于从关系型数据库中读取数据时,指定需要读取的行数。可以利用该语句实现分页功能,或者限制结果集返回的行数。其中最常用的语法格式如下: SELECT...
    99+
    2023-09-09
    数据库 sql mysql
  • mysql中的union和union all的区别
    mysql中的union和union all集合操作符之间的差异:union返回唯一行,而union all返回所有行,包括重复行。unio...
    99+
    2024-04-26
    mysql
  • mysql的union和union all
    1. sql中 union 和 union all 的用法 如果我们需要将两个 select 语句的结果作为一个整体显示出来,我们就需要用到 union 或者 uni...
    99+
    2023-08-23
    mysql 数据库
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作