这些sql连接之间的区别(相同的结果,相同的exec计划)

时间:2016-06-15 10:27:51

标签: mysql sql join inner-join natural-join

两张桌子。第一张桌子容纳每个人,另一张桌子用于指定哪个人是孩子的家庭成员:

create table persons(
    personID bigint primary key auto_increment,
    firstName varchar(30) not null,
    lastName varchar(30) not null
);

create table kids(
    personID bigint not null,
    familyID bigint not null,
    grade bigint,

    constraint kidReference foreign key (personID) references persons (personID),
    constraint familyReference foreign key (familyID) references families (familyID)
);

我想为每个孩子选择所有细节。使用以下查询,我得到相同的结果,相同的相同的执行计划:

(1)以逗号分隔加入:

select persons.personID, persons.firstName, persons.lastName, kids.familyID, kids.grade from persons, kids where persons.personID = kids.personID;

(2)自然加入:

select * from persons natural join kids;

(3)命名为join:

select * from persons join kids using (personID);

(4)条件加入:

select * from persons inner join kids on persons.personID = kids.personID;

仅仅是可读性吗?在编写查询的时候,我的目标是为了什么 - 它最好的工作 - ?

1 个答案:

答案 0 :(得分:1)

在您的情况下,每个版本的查询都会产生相同的基本查询。

逗号语法将尝试根据WHERE子句查找连接。 where persons.personID = kids.personID变为inner join kids on persons.personID = kids.personID。请注意,=会导致内部联接,而*=会导致左联接。

自然联接看起来要加入具有相同名称的列,即PersonID。您无需指定特定名称,因为自然连接将为您找到通用名称。默认为内连接。

命名连接using (PersonID)是连接它们共享的列名PersonID上的两个表的简写。 JOIN本身被解释为内连接。

最终版本正在拼写出您想要的内容,而无需进行解释。

我最喜欢的是最终版本,因为它没有任何意外。

话虽如此,JOIN using (personID)也是明确的 - 它只是最终版本的简写。