2009-11-19 63 views
1

我看到下面的两个查询之间没有区别:连接和不连接选择之间的区别?

query_join = select a.id, b.name, a.telephone, a.description from tb_industry a left outer join tb_sector b on a.sector_id = b.id 
query_select = select a.id, b.name, a.telephone, a.description from tb_industry a , tb_sector b WHERE a.sector_id = b.id 

结果是完全一样的。 现在我猜这可能会发生,但我想获得启发只有query_join最好的情况以及query_condition最好的情况是什么?

回答

0

当您想要从所选表格中检索所有结果时,使用连接以及在匹配时从左侧或右侧表格(左连接,右连接)中的值。

当您想要显式匹配时,使用查询条件样式。

希望它有帮助! w3schools有这方面的一些简单和基本的例子。

0

如果他们为您返回相同的结果,那么tb_industry中的每个项目都有一个tb_sector中的项目。你的第二个查询对于左连接的等价物是不正确的,它将是a.sector_id * = b.sector_id。

* =语法已弃用,并在较新的RDBMS中逐步淘汰。

2

它们不尽相同,尽管它们可能会根据您的数据返回相同的结果。

第一个是左外连接,所以如果相应的表没有匹配的条目,将返回行。

第二个本质上是一个内部联接,所以不会返回行,除非两个表都有匹配的条目。

这取决于您的偏好,但查询复杂时,第一种语法更容易阅读。

0

联接是在查询中表达关系的新语法。它们提供了外部连接的好处,这在where子句中是不可能的(Oracle通过在过滤器中添加(+)来扩展语言,但它非常有限且不容易理解)。在使用内部连接时,无关紧要,结果是一样的。

这是主观的,但在我看来,连接更容易阅读。

0

A Left Outer Join与普通Join不一样。

左外连接的结果(或只是左连接)为表A和B总是包含了“左”表(A)的所有记录,即使加盟条件未找到任何匹配的记录在“右”表(B)中。

0

使用左外连接的连接查询会引入来自数据库的甚至不匹配的记录。

您的第二个查询只会带来匹配的结果。

4

第一个是外部连接。这说明从表格中的行即使表B中没有匹配的行假设表包含以下数据:

select a.name, a.sector_id from tb_industry a; 

name sector_id 
---- --------- 
A  1 
B  2 
C  3 

Select b.id, b.name from tb_sector b; 

id name 
-- ---- 
1 X 
2 Y 

(注意,没有tb_sector一行ID 3。)

外连接仍返回从表格中的所有行,与值空值应该有来自表B:

select a.name, a.sector_id, b.name as sector_name 
from tb_industry a left outer join tb_sector b on a.sector_id = b.id; 

name sector_id sector_name 
---- --------- ----------- 
A  1   X 
B  2   Y 
C  3 

其他查询(内部连接)忽略了不匹配的行:

select a.name, a.sector_id, b.name as sector_name 
from tb_industry , tb_sector b where a.sector_id = b.id; 

name sector_id sector_name 
---- --------- ----------- 
A  1   X 
B  2   Y 

以下查询也是一个内连接,使用较新的ANSI联接语法:

select a.name, a.sector_id, b.name as sector_name 
from tb_industry a 
join tb_sector b on a.sector_id = b.id; 

name sector_id sector_name 
---- --------- ----------- 
A  1   X 
B  2   Y 

如果没有OUTER关键字,则联接是内部联接。

相关问题