UNION意外结果?

时间:2019-04-15 19:15:10

标签: mysql sql union

让我们说:

表1

a (int) | b (int)
--------|--------
1       | 4
2       | 4

表2

c (text)   d (text) 
---------|---------
hoi      | hi

查询:

SELECT * FROM table1 
UNION 
SELECT * FROM table2 

收益

a     | b 
------|--------
1     | 4
2     | 4
hoi   | hi

至少,从查询中我只是在mysql上运行

我希望有(1, 4, NULL, NULL)。为什么这没有给出错误?

2 个答案:

答案 0 :(得分:1)

UNION只是将一个查询的行追加到另一个查询的行。只要两个查询返回相同数量的列,就不会出错。列名称始终来自第一查询。如果数据类型不同,它将找到可以将它们全部转换为的通用类型。在您的示例中,它将int列转换为text(MySQL对此很宽松,其他一些数据库要求您使用显式CAST()调用才能将所有内容都转换为相同类型)。 / p>

由于每个查询都返回两列,因此结果中包含两列,并使用table1中的列名。

答案 1 :(得分:0)

发表评论的时间有点长。

我刚刚在MySQL 8.0和SQLite上进行了测试,它返回:

a   b
1   4
2   4
hoi hi

我觉得这很奇怪。我希望这些列被赋予整数类型,并且第三行会出现类型转换错误或0。嗯,实际上SQLite的结果并不奇怪,因为类型在SQLite中更具可替代性。

SQL Server和Postgres会出现我期望的错误-导致查询失败的类型转换错误。