【问题标题】:Associativity and commutativity of inner joins sql内连接sql的结合性和交换性
【发布时间】:2015-01-05 01:17:58
【问题描述】:

假设我有这个架构。

Boats
_____
bid
bname

Reserves
________
sid
bid
date

Sailors
_______
sid
sname

我知道内连接应该是关联的和可交换的,但我无法真正理解为什么。

给定查询:

SELECT sname, bname
FROM (Sailors NATURAL INNER JOIN Boats) NATURAL INNER JOIN Reserves

我认为这应该返回 null,因为 Sailors 和 Boats 没有公共字段,而:

SELECT sname, bname
FROM (Sailors NATURAL INNER JOIN Reserves) NATURAL INNER JOIN Boats

应该返回水手的名字和他们预订的船的名字。

请告诉我为什么内部连接应该是可交换的和关联的。

谢谢!

【问题讨论】:

    标签: postgresql inner-join associativity commutativity


    【解决方案1】:
    SELECT sname, bname
    FROM (Sailors NATURAL INNER JOIN Boats) NATURAL INNER JOIN Reserves
    

    我认为这应该返回 null,因为 Sailors and Boats 没有公共字段, . . .

    在 PostgreSQL 中,两个没有公共列的表之间的 natural join 的行为类似于交叉连接。

    create table boats (
      bid integer primary key,
      bname varchar(15)
    );
    
    create table sailors (
      sid integer primary key,
      sname varchar(15) 
    );
    
    insert into boats values (1, 'One'), (2, 'Two'), (3, 'Three');
    insert into sailors values (1, 'One'), (2, 'Two'), (3, 'Three');
    
    SELECT sname, bname
    FROM (Sailors NATURAL INNER JOIN Boats);
    
    名字 bname -- 一一 一二 一三 二一 二 二 二三 三一 三二 三三

    【讨论】:

    • 那么,内部连接中排序或分组的变化只会影响查询的速度?
    • 我不知道,但我怀疑速度会有所不同。我希望查询计划器为两个查询选择几乎相同的执行计划。您可以通过将一些随机(ish)数据填充到表中来进行测试,然后使用EXPLAIN
    • @user3903214 但是,如果您正在选择和分组(也许是聚合),那么这对应于其他操作的组合,那么这些运算符的组合如何起作用,而不仅仅是连接的组合。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-13
    • 2011-07-20
    相关资源
    最近更新 更多