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

标签 mysql sql join inner-join natural-join

两张 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/

相关文章:

MySQL:如何转换为 EAV - 第 3 部分?

MySQL匹配行值集

php - SQLSTATE[42S01] : Base table or view already exists: 1050 Table 'payments' already exists (SQL: create table `payments`

sql - 创建具有自动递增字段和引用完整性约束的 volatile 表

php - SQL - 在单个查询中计算多个列并加入

mysql - 选择行作为 MySQL 中的列?

正则表达式中的php变量?

mysql - 真实世界总销售额 SQL 查询

mysql - 1 天前和 1 周前的行之间的 SQL 差异

java - 使用jdbc计算sql表的行数