我认为以下两个查询之间没有区别:
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 :(得分: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)
使用左外连接的连接查询将从数据库中引入甚至不匹配的记录。
您的第二个查询只会带来匹配的结果。