加入和无加入选择之间的区别?

时间:2009-11-19 10:31:25

标签: sql join

我认为以下两个查询之间没有区别:

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最好的情况感到满意吗?

7 个答案:

答案 0 :(得分:4)

第一个是OUTER加入。即使表B中没有匹配的行,也会显示表A中的行。假设表包含以下数据:

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

(注意,没有id为3的tb_sector行。)

外连接仍然返回表A中的所有行,对于应该来自表B的值,返回NULL:

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

另一个查询(INNER联接)错过了不匹配的行:

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关键字,则连接是内连接。

答案 1 :(得分:2)

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

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

第二个本质上是内连接,因此除非两个表都有匹配的条目,否则不会返回行。

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

答案 2 :(得分:0)

当你想要从你选择的表中检索所有结果时,你可以使用连接,当有匹配时,你可以使用左表或右表中的值(LEFT JOIN,RIGHT JOIN)。

如果需要显式匹配,请使用查询条件样式。

希望它有所帮助! w3schools有一些简单而基本的例子。

答案 3 :(得分:0)

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

不推荐使用* =语法,并在较新的RDBMS中逐步淘汰。

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

Left Outer Join与普通加入不同。

  

表A和B的左外连接(或简称左连接)的结果始终包含“左”表(A)的所有记录,即使连接条件未在“”中找到任何匹配记录右“表(B)。

答案 6 :(得分:0)

使用左外连接的连接查询将从数据库中引入甚至不匹配的记录。

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