这些 sql 连接之间的差异(相同的结果,相同的执行计划)

difference between these sql joins (same results, same exec plans)

两个 table。首先 table 包含每个人,另一个 table 用于指定哪个人是孩子作为家庭的一部分:

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)
);

我想 select 每个孩子的所有详细信息。使用以下查询,我得到相同的结果,相同的 相同 执行计划:

(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) 命名连接:

select * from persons join kids using (personID);

(4)条件加入:

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

仅仅是可读性的问题吗?在编写查询时,我应该只针对 -what-it-works-best-?

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

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

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

命名连接 using (PersonID) 是 shorthand 用于在它们共享的列名称 PersonID 上连接两个表。 JOIN 本身被解释为内部联接。

最终版本会准确地拼写出您想要的内容,无需解释。

我更喜欢最终版本,因为它没有惊喜。

话虽如此,JOIN using (personID) 也很明确 - 最终版本只是 shorthand。