首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL -使用UNION连接??UNION使用JOIN?

SQL -使用UNION连接??UNION使用JOIN?
EN

Stack Overflow用户
提问于 2011-07-06 06:45:41
回答 4查看 10.7K关注 0票数 7

在我的一次面试中,有人问我这个问题。您可以使用UNION关键字进行连接吗?你能使用JOIN关键字做UNION吗?

不使用JOIN关键字,但使用UNION关键字? 2.不使用UNION关键字,但使用JOIN关键字?

如果可能,你能给我一个如何做到这一点的例子吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-07-06 17:37:52

面试是你展示你的产品的框架。记住:不要回答问题;)

想一想新闻发布会:发言人并不想回答记者们提出的棘手问题来让自己脱颖而出。相反,他们正在寻找他们已经有答案的问题,这些问题是他们想要发布的信息(仅此而已!)

如果我在面试中遇到这个问题,我会用它来证明我的关系代数知识,因为这就是我在面试中打算做的事情;我要警惕“在这里谈论关系代数”这个问题,这就是我要做的。

不严格地说,JOIN相当于逻辑AND,而UNION则相当于逻辑OR。因此,使用约定逻辑的类似问题可能是,“您可以使用AND使用OR吗?”和“你能用and做OR吗?”答案将取决于你还可以使用什么,例如,NOT可能会派上用场;)

我还想讨论一下基本运算符集、计算完整性所需的运算符集和实际用途所需的运算符和速记之间的区别。

试图直接回答这个问题会带来更多的问题。JOIN在关系代数中意味着'natural join‘,而在SQL中则意味着INNER JOIN。如果问题特别与SQL相关,您是否必须回答所有JOIN类型的问题?那UNION JOIN呢?

举个例子,众所周知,SQL的外部连接就是一个UNION。Chris Date比我希望的表达得更好:

外部联接明确地设计为在其结果中生成空值,因此通常应避免使用。从关系上讲,这是一种鸟枪式的婚姻:它迫使表成为一种联盟-是的,我指的是联盟,而不是连接-即使有问题的表不符合通常的联盟要求(参见第6章)。实际上,它通过在进行联合之前用空值填充一个或两个表来实现这一点,从而使它们最终符合这些通常的要求。但是,没有理由不使用适当的值而不是空值进行填充

SQL and Relational Theory, 1st Edition by C.J. Date

如果“我讨厌空值”是你在面试中想要表达的东西,那么这将是一个很好的讨论点!

这些只是脑海中浮现的几个想法。关键的一点是,通过问这些问题,面试官给你提供了一个分支。你会把什么挂在上面?;)

票数 9
EN

Stack Overflow用户

发布于 2011-07-06 08:46:46

由于这是一个面试问题,他们正在测试你对这两个功能的理解。

他们可能期望的答案是“通常不能这样做,因为它们执行不同的操作”,您可以通过说明联合将行附加到结果集的末尾来更详细地解释这一点,而as连接则会添加更多的列。

您可以使用Join和Union work的唯一方法是,行只包含来自这两个源中的一个的数据:

代码语言:javascript
复制
SELECT A.AA, '' AS BB FROM A
UNION ALL 
SELECT '' AS AA, B.BB FROM B

与以下内容相同:

代码语言:javascript
复制
SELECT ISNULL(A.AA, '') AS AA, ISNULL(B.BB, '') AS BB FROM A
FULL OUTER JOIN B ON 1=0

或者只使用一列类型匹配的列来执行此操作:

代码语言:javascript
复制
SELECT A.AA AS TT FROM A
UNION ALL 
SELECT B.BB AS TT FROM B

与以下内容相同:

代码语言:javascript
复制
SELECT ISNULL(A.AA, B.AA) AS TT
FROM A
FULL OUTER JOIN B ON 1=0

这样做的一种情况是,如果您在多个表上生成了数据,但您希望看到所有的数据,但是我建议在这种情况下使用UNION而不是完整的外连接,因为查询所做的正是您所期望的。

票数 9
EN

Stack Overflow用户

发布于 2011-07-06 07:02:37

你是说像这样的东西吗?

代码语言:javascript
复制
create table Test1 (TextField nvarchar(50), NumField int)
create table Test2 (NumField int)
create table Test3 (TextField nvarchar(50), NumField int)

insert into Test1 values ('test1a', 1)
insert into Test1 values ('test1b', 2)
insert into Test2 values (1)
insert into Test3 values ('test3a', 4)
insert into Test3 values ('test3b', 5)

select Test1.*
from Test1 inner join Test2 on Test1.NumField = Test2.NumField
union
select * from Test3

(在SQL Server 2008上编写)

当两个SELECT语句具有相同的列数,并且这些列具有相同(或至少相似)的数据类型时,UNION才起作用。

UNION并不关心两个SELECT语句是否只从一个表中选择数据,或者它们中的一个或两个是否已经是多个表上的JOIN

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6589695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档