这些 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。
两个 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。