两张 table 。第一个表保存每个人,另一个表用于指定哪个人是家庭中的 child :
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)
);
我想选择每个 child 的所有详细信息。使用以下查询,我得到相同的结果,相同的相同执行计划:
(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 子句查找连接。 其中,persons.personID = kids.personID
成为 persons.personID = kids.personID 上的内部联接 child
。请注意,=
导致内连接,*=
导致左连接。
自然连接会连接具有相同名称的列,即 PersonID
。您无需指定特定名称,因为自然连接将为您找到常用名称。默认是内部联接。
命名联接using (PersonID)
是根据两个表共享的列名PersonID
连接两个表的简写形式。 JOIN
本身被解释为内部联接。
最终版本准确地阐明了您想要的内容,无需解释。
我更喜欢最终版本,因为它没有什么惊喜。
话虽如此,JOIN using (personID)
也是明确的 - 它只是最终版本的简写。
关于mysql - 这些 sql 连接之间的差异(相同的结果,相同的执行计划),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37832797/