在执行以下两个查询时(关注两个星号之间的部分* ____ *),我真的想知道UNION ALL的位置如何改变输出。我无法理解。
查询1
SELECT 'Jack' AS Name, 100 AS Marks FROM DUAL
*UNION All SELECT 'Jack' AS Name, 100 AS Marks FROM DUAL*
UNION SELECT 'Jack' AS Name, 100 AS Marks FROM DUAL
查询结果
NAME MARKS
Jack 100
查询2
SELECT 'Jack' AS Name, 100 AS Marks FROM DUAL
UNION SELECT 'Jack' AS Name, 100 AS Marks FROM DUAL
*UNION ALL SELECT 'Jack' AS Name, 100 AS Marks FROM DUAL*
查询结果
NAME MARKS
Jack 100
Jack 100
谢谢:)
答案 0 :(得分:3)
如果您没有指定parantheses,select
将一个接一个地执行。所有集合运算符minus
,union
,union all
,intersect
具有相同的优先级。
在第一个查询中,UNION
在最后执行,因此每个查询不会有重复行。在第二步中,UNION ALL
在最后执行,因此每个查询都会有重复行。
答案 1 :(得分:1)
union和union都具有与操作相同的优先级。所以在没有括号的情况下,你的两个工会将从上到下进行评估。您的第一个查询正在按如下方式进行评估:
double
同样的推理适用于您的第二个查询。
答案 2 :(得分:1)
Union和Union all之间的区别在于Union all不会消除重复的行,
第一个查询输出:
第1步:
SELECT 'Jack' AS Name, 100 AS Marks FROM DUAL
UNION All SELECT 'Jack' AS Name, 100 AS Marks FROM DUAL
结果为2行,因为union all允许重复。
第2步:
UNION SELECT 'Jack' AS Name, 100 AS Marks FROM DUAL
此查询将仅选择上述2行及其自身中没有重复的行。 返回1行。
在第二个查询...
第1步
SELECT 'Jack' AS Name, 100 AS Marks FROM DUAL
UNION SELECT 'Jack' AS Name, 100 AS Marks FROM DUAL
返回1行,因为union只选择不同的行。
第2步
UNION ALL SELECT 'Jack' AS Name, 100 AS Marks FROM DUAL
返回2行,因为它允许重复。
答案 3 :(得分:0)
要了解此行为,您需要清楚UNION和UNION ALL之间的区别。
查询1:前两行的输出将返回2行。但是,使用'UNION'运算符的最后一行(sql语句)将删除重复的行,包括它自己的输出。因此,第一个查询总数将仅返回1行。
查询2:现在,UNION在第二行。与第一行合并后,它将仅返回第一行。但是,在带有“ UNION ALL”的第三行,它将返回2行。因为,“ UNION ALL”不会删除重复项。