为啥带括号和不带括号的 UNION ALL 表现不同?

Posted

技术标签:

【中文标题】为啥带括号和不带括号的 UNION ALL 表现不同?【英文标题】:Why is UNION ALL with and without parenthesis behaving different?为什么带括号和不带括号的 UNION ALL 表现不同? 【发布时间】:2012-04-18 08:26:23 【问题描述】:

我通过两种方式实现了这个查询:

SELECT race1, mode1
FROM organization 
WHERE condition = 1 LIMIT 1

UNION ALL

(SELECT race2, mode2
FROM   organization 
WHERE  condition = 1 LIMIT 1)

UNION ALL

(SELECT race, mode FROM  organization_new
WHERE PK_Id = 1)

还有

SELECT race1, mode1
FROM organization 
WHERE condition = 1 LIMIT 1

UNION ALL

SELECT race2, mode2
FROM   organization 
WHERE  condition = 1 LIMIT 1

UNION ALL

SELECT race, mode FROM  organization_new
WHERE PK_Id = 1

如您所见,区别仅在于第一个查询中的括号。 在第一个查询中,我得到了预期的结果(从所有三个选择中获取所有值,无需解释)。但是,当我继续使用第二个查询 时,我得到了想要的结果,但没有达到预期的结果,这只是第一次选择的值符合WHERE 子句。也就是说,如果在condition = 1 的位置存在race1, mode1,那么我只会得到那个结果。如果没有,那么我得到race2, mode2condition = 1。如果即使第二个 select 语句为空,我也会根据第三个 select 语句获取值。如果没有提供括号,为什么 UNION ALL 的行为类似于 OR

编辑:我使用的是 mysql 5.0.51a

【问题讨论】:

您必须对所有查询使用相同的别名,例如:-race1 作为种族,mode1 作为模式 @sam_13 MySQL 不需要,列名将与第一个查询中的相同。在这种情况下race1mode1.. 【参考方案1】:

那是因为你使用的是 LIMIT。

MySql 参考资料说,如果你想在单个选择上使用 ORDER BY 或 LIMIT,那么你必须用括号括住你的选择。

示例(来自 MySQL 参考):

要将 ORDER BY 或 LIMIT 应用于单个 SELECT,请将子句放在括住 SELECT 的括号内:

(SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10)
UNION
(SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10);

资源可以在这里找到: http://dev.mysql.com/doc/refman/5.0/en/union.html

编辑: 更改了参考链接,因为之前的参考链接适用于 5.5 版。但答案没有改变。

【讨论】:

好的,我明白了,谢谢。我的问题是,如果我不想要所有的联合,但就像它如何处理我的第二个查询(没有括号),比如 OR,我可以安全地继续第二个查询吗? 我的猜测是这不会是真正有效的 MySQL。由于我在我发布的参考资料中找不到这种行为,并且我如何理解您的查询只是因为 LIMIT 的缘故。当解析器解析代码时,它会选择数据并看到 LIMIT。由于 select 不在括号中,因此它被理解为查询的结束(请查看关于所有 UNION 的 LIMIT 和 ORDER BY 的参考文献)。如果 SELECT 为空,它会优化并跳过 SELECT 到下一个。要检查这是否有效,请尝试更改 2. 和 3. SELECT 位置。然后试一下查询是否可以到3.如果1.和2.为空。 @Janis 谢谢.. 是的,它可以工作,没有那么多测试我不会问你 :) 我什至可以这样做:(SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10) UNION (SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10) LIMIT 1; 如原始文档中所述

以上是关于为啥带括号和不带括号的 UNION ALL 表现不同?的主要内容,如果未能解决你的问题,请参考以下文章

带括号和不带括号的python断言

js绑定事件函数带括号和不带括号执行效果有啥不同

Python调用函数带括号和不带括号的区别

JavaScript 函数调用时带括号和不带括号的区别

js中new函数后带括号和不带括号的区别

JavaScript 函数调用时带括号和不带括号的区别