sql - Union 在 SQL 查询中的行为方式(就优先级而言)
问题描述
我们知道在 SQL 中代码执行的顺序是:
FROM
WHERE
GROUP
SELECT
现在,我可以在 SQL 中编写(Example1):
SELECT colA, colB
FROM tableA
UNION
SELECT colA, colB
FROM tableB
WHERE colA > 1
我也可以写(Example2):
SELECT *
FROM (
SELECT colA, colB
FROM tableA
UNION
SELECT colX, colA
FROM tableB
)
WHERE colA > 1
我的问题是关于Example1 :条件WHERE
是 ontableB
还是 on theUNION
和?与非常清楚的Example2不同,在Example1中它不是 (?)。tableA
tableB
我在任何数据库中都没有找到任何解释这个关于UNION
.
解决方案
第一条语句中所写的WHERE
子句属于 UNION 的第二部分。您可以通过在两个表中使用不同的列名来测试它:
create table t1 (c1 int, c2 int);
create table t2 (c3 int, c4 int);
然后是以下查询:
select c1, c2
from t1
union all
select c3, c4
from t2
where c1 > 1
将导致错误声明该列c1
不存在(或不能在该上下文中使用 - 取决于 DBMS 产品)。
相同的规则适用于 a GROUP BY
or HAVING
,但不适用于 a possible ORDER BY
- 它总是对联合的结果进行排序。
推荐阅读
- performance - Redis 备份影响读取性能
- reactjs - 反应 setState 改变状态中的不同对象
- tinymce - 在插入/编辑链接对话框上插入自定义按钮?
- sql - 使用 ecto 预加载所有链接的记录
- google-maps - 如何使用(React Native,Geolocation)实时更新经纬度
- android - VideoView 无法播放视频
- excel - 如何使用 VBA for Excel for MacOS 创建文本文件
- java - 春季启动 RESTapi
- php - 我已经使用 laravel 护照创建了 API 身份验证。当授权令牌出错时,它会向我发送一个错误“Route [login] not defined”
- json-server - 如何在 json-server 查询中排除几个单独的值