UNION和UNION ALL之间的区别是什么?
当前回答
重要的Oracle和Mysql之间的区别:假设t1和t2之间没有重复的行,但它们各自有重复的行。示例:t1从2017年开始销售,t2从2018年开始销售
SELECT T1.YEAR, T1.PRODUCT FROM T1
UNION ALL
SELECT T2.YEAR, T2.PRODUCT FROM T2
在ORACLE UNION ALL中,从两个表中获取所有行。MySQL中也会发生同样的情况。
然而:
SELECT T1.YEAR, T1.PRODUCT FROM T1
UNION
SELECT T2.YEAR, T2.PRODUCT FROM T2
在ORACLE中,UNION从两个表中提取所有行,因为t1和t2之间没有重复的值。另一方面,在MySQL中,结果集的行数将更少,因为表t1和表t2中都有重复的行!
其他回答
在这里的讨论中添加我的两分钱:可以将UNION运算符理解为纯的、面向SET的UNION-例如,集合a={2,4,6,8},集合B={1,2,3,4},UNION B={1,2,4,6,8}
在处理集合时,您不希望数字2和4出现两次,因为元素在集合中或不在集合中。
然而,在SQL世界中,您可能希望将两个集合中的所有元素放在一个“包”中{2,4,6,8,1,2,3,4}。为此,T-SQL提供了运算符UNION ALL。
不确定哪个数据库很重要
UNION和UNION ALL应适用于所有SQL Server。
您应该避免不必要的UNION,它们是巨大的性能泄漏。根据经验,如果您不确定要使用哪个,请使用UNION ALL。
UNION删除重复的记录(结果中的所有列都相同),UNION all不删除。
当使用UNION而不是UNION ALL时,性能会受到影响,因为数据库服务器必须做额外的工作来删除重复的行,但通常您不希望重复的行(尤其是在开发报表时)。
要识别重复项,记录必须是可比较类型以及兼容类型。这取决于SQL系统。例如,系统可以截断所有长文本字段以生成短文本字段进行比较(MS Jet),或者可以拒绝比较二进制字段(ORACLE)
UNION示例:
SELECT 'foo' AS bar UNION SELECT 'foo' AS bar
结果:
+-----+
| bar |
+-----+
| foo |
+-----+
1 row in set (0.00 sec)
UNION ALL示例:
SELECT 'foo' AS bar UNION ALL SELECT 'foo' AS bar
结果:
+-----+
| bar |
+-----+
| foo |
| foo |
+-----+
2 rows in set (0.00 sec)
重要的Oracle和Mysql之间的区别:假设t1和t2之间没有重复的行,但它们各自有重复的行。示例:t1从2017年开始销售,t2从2018年开始销售
SELECT T1.YEAR, T1.PRODUCT FROM T1
UNION ALL
SELECT T2.YEAR, T2.PRODUCT FROM T2
在ORACLE UNION ALL中,从两个表中获取所有行。MySQL中也会发生同样的情况。
然而:
SELECT T1.YEAR, T1.PRODUCT FROM T1
UNION
SELECT T2.YEAR, T2.PRODUCT FROM T2
在ORACLE中,UNION从两个表中提取所有行,因为t1和t2之间没有重复的值。另一方面,在MySQL中,结果集的行数将更少,因为表t1和表t2中都有重复的行!
在ORACLE:UNION不支持BLOB(或CLOB)列类型,UNION ALL支持。
推荐文章
- 如何在Ruby On Rails中使用NuoDB手动执行SQL命令
- 查询JSON类型内的数组元素
- 确定记录是否存在的最快方法
- 获得PostgreSQL数据库中当前连接数的正确查询
- 在SQL选择语句Order By 1的目的是什么?
- 我如何循环通过一组记录在SQL Server?
- 如何从命令行通过mysql运行一个查询?
- 外键约束可能导致循环或多条级联路径?
- 使用LIMIT/OFFSET运行查询,还可以获得总行数
- 当恢复sql时,psql无效命令\N
- 货币应该使用哪种数据类型?
- 如何选择每一行的列值不是独特的
- 如何改变字符集(和排序)在整个数据库?
- mySQL:: insert到表,数据从另一个表?
- 如何在Postgres中获得两个字段的MIN() ?