0

两张桌子。第一个表包含每个人,另一个表用于指定哪个人是家庭中的孩子:

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

select * from persons join kids using (personID);

(4)条件加入:

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

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

4

1 回答 1

1

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

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

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

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

最终版本准确地说明了您想要的内容,无需解释。

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

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

于 2016-06-15T10:52:22.427 回答