两张桌子。第一张桌子容纳每个人,另一张桌子用于指定哪个人是孩子的家庭成员:
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;
仅仅是可读性吗?在编写查询的时候,我的目标是为了什么 - 它最好的工作 - ?
答案 0 :(得分:1)
在您的情况下,每个版本的查询都会产生相同的基本查询。
逗号语法将尝试根据WHERE子句查找连接。 where persons.personID = kids.personID
变为inner join kids on persons.personID = kids.personID
。请注意,=
会导致内部联接,而*=
会导致左联接。
自然联接看起来要加入具有相同名称的列,即PersonID
。您无需指定特定名称,因为自然连接将为您找到通用名称。默认为内连接。
命名连接using (PersonID)
是连接它们共享的列名PersonID
上的两个表的简写。 JOIN
本身被解释为内连接。
最终版本正在拼写出您想要的内容,而无需进行解释。
我最喜欢的是最终版本,因为它没有任何意外。
话虽如此,JOIN using (personID)
也是明确的 - 它只是最终版本的简写。