在SQL中使用AND vs WHERE子句

时间:2013-05-06 14:11:34

标签: sql oracle

我正在处理与PHP page相关联的Oracle。我遇到了这个SQL,我不确定它是在做什么,所以我想我会问这里。有问题的SQL是这样的:

select tableA.id, tableA.name, tableB.details 
from tableA
left join tableB on
tableB.id = tableA.id
and 
tableB.logId = '<logged_in_user>'

现在当我以tableB中没有条目的用户身份登录时,我仍然在运行此查询时获取记录。我的假设是,'and'而不是'where'该条款应该是left join tableB on tableB.id = tableA.id where tableB.logId = '<logged_in_user>'

'and'

所以我的两个问题是。

  1. 我是对的吗?
  2. 如果是,那么为什么查询返回结果?什么是{{1}}子句检查?
  3. 在上述查询中使用AND vs WHERE时,有人可以解释一下这个区别吗?

    提前致谢!

3 个答案:

答案 0 :(得分:7)

  

我是对的吗?

没有。这个查询:

select tableA.id, tableA.name, tableB.details 
from tableA
left join tableB
on tableB.id = tableA.id
and tableB.logId = '<logged_in_user>'

与以下内容截然不同:

select tableA.id, tableA.name, tableB.details 
from tableA
left join tableB
on tableB.id = tableA.id
where tableB.logId = '<logged_in_user>'

这是加入的标准。

在第一种情况下,您从A获取,然后在匹配ID为为logId时与B联接,否则将详细信息保留为空。

在第二个中,你从A获取,然后在有匹配的id时加入B,否则将详细信息保留为null,然后只保留A中的行,其中有一个B匹配的logId - 在过程中消除A中的行,并事实上将其转换为内部联接。

答案 1 :(得分:2)

如果您只希望两个表中包含值的结果,您真正想要的是内部联接。一旦你有了这个,那么过滤结果并不重要。

答案 2 :(得分:2)

  

现在,当我以tableB中没有条目的用户身份登录时,我仍然在此查询运行时获取记录。

只需更改查询即可使用inner join,如下所示:

select tableA.id, tableA.name, tableB.details 
from tableA
inner join tableB ...

以下是来自Oracle的left join的定义:

  

LEFT JOIN(也称为LEFT OUTER JOIN)关键字返回左表(table_name1)中的所有行,即使右表(table_name2)中没有匹配项也是如此。

inner join的定义是:

  

当两个表中至少有一个匹配时,INNER JOIN关键字返回行。