where和嵌套查询之间的区别

时间:2010-04-15 23:21:24

标签: sql

我无法弄清楚这些查询之间的区别。我很确定第一个是equi-join。我不确定第二个与第一个不一样。 #2中的子查询从S中选择所有ID,然后返回所有具有这些ID的R,不是吗?

SELECT R.cname 从R,S, 在哪里R.Id = S.Id

SELECT R.cname 来自R. 在哪里R.Id IN(从S.选择S.Id)

修改:
我从过去的考试中抓住了这个....我引述:
虽然查询似乎产生相同的答案,但他们没有。他们是怎么做的 不同?您可以给出显示R和S的示例实例 这两个查询可以产生不同的答案 R(Id,TourId,cname,caddress,cost)
S(Id,SpecId)

编辑:编辑:
我猜它与重复有关。

3 个答案:

答案 0 :(得分:2)

IMO,两者都是糟糕的选择,因为它们比以下更难阅读:

Select R.Naem 
From R 
    Join S 
        On S.ID = R.ID

除了功能之外,编写代码的首要目标应该是让其他读者明白你的意图。开发人员必须在第一个示例中读取逗号并知道这意味着交叉连接。在第二种情况下,读者必须确定为什么编写子查询而不是简单地编写Join。有性能原因吗?结果有理由吗?

从功能上讲,这两个查询可以根据数据产生不同的结果。假设我们有以下内容:

Create Table S ( Id int null )
Create Table R ( Id int null )

insert S Values(1)
insert S Values(1)
insert S Values(2)

insert R Values(1)
insert R Values(2)
insert R Values(3)

Select * From @R As R, @S As S Where R.Id = S.Id

这导致1,1,2

Select * From @R As R Where R.Id In( Select S.Id From @S As S )

这导致1,2

第二个查询将从R生成一行,在S中有一个或更多值。第一个查询类似于内部联接(即使它使用交叉联接)将返回R和S中每一行匹配的行。由于S中有两行与R中的一行匹配,因此我们得到值为1的两行。

答案 1 :(得分:1)

从应用程序开发人员的角度来看,如果表之间具有良好定义的关系(特别是对于连接查询),则子查询和连接查询都可以为您工作。但通常情况下,equi连接(或DB作为equi连接处理的交叉连接)可以更快,因为DB可以优化连接查询。但是在子查询的情况下,DB必须独立运行两个查询,因此您可能会看到性能稍慢。话虽这么说,如果故事有太多数据,加入可能会很慢,而子查询在这种情况下可能会起作用。一般的经验法则是尽可能使用join。如果你看到一些问题尝试子查询。

答案 2 :(得分:1)

假设这些数据:

R

id   cname
--   --
1    RA
1    RB
2    RC

S
id   cname
--   --
1    SA
1    SB
2    SC
2    SD

,这个查询:

SELECT  R.cname
FROM    R, S
WHERE   R.Id = S.Id

返回

RA
RA
RB
RB
RC
RC

,而这一个:

SELECT  R.cname
FROM    R
WHERE   R.Id IN
        (
        SELECT  S.Id
        FROM S
        )

返回

RA
RB
RC

第一个查询是两个表的JOIN:对于每个匹配的id,它返回两个表中记录的所有可能组合

秒查询是一个带有谓词的表。它最多可以从R返回一次记录。