请考虑以下几点:
我们知道,inner join
返回定义了连接条件的重复列。
我们知道natural join
会删除重复项。
我知道我们可以使用等分联接:
select * from table1, table2 where id1=id2
或
select * from table1 join table2 on id1 = id2
我对第三点感到困惑。我想知道等值联接中返回的情况是什么?它是否返回重复的列,在该列中我们已经定义了连接条件,例如inner join
。
答案 0 :(得分:1)
回答标题问题:是,如果您的查询使用SELECT *
。当您专注于JOIN
子句时,您会忘记有关SQL中SELECT
子句的基础知识。
您的#3(您对 equi join 的定义)的方式等同于#1(inner join
)。在#3中,使用WHERE
的前者是较旧的,不加强调(ANSI-89)的隐式联接样式,而使用JOIN
的后者是当前的标准(ANSI-92)显式联接。两者都返回相同的结果,应提供相同的性能,但可读性可能有所不同。 请参见 Explicit vs implicit SQL joins。
在这些 equi-join 情况下收到重复列的原因是对{em> all 的 all 列的SELECT
子句请求联接表,因为您没有限定星号,*
:
select * from table1 join table2 on id1 = id2
但是,仅使用星号是一种简便的缩写方法,但是建议的方法是通过选择特定的列来显式控制结果集。这对于需要列顺序和存在性的应用程序构建至关重要,并有助于提高代码的可读性和可维护性。 请参见 Why is SELECT * considered harmful?
下面是可用于避免重复列的示例:限定星号,子集/省略列,甚至使用别名对列进行重命名/重新排序。
-- ONLY table1 COLUMNS
select table1.* from table1 join table2 on id1 = id2
-- ONLY table2 COLUMNS
select table2.* from table1 join table2 on id1 = id2
-- SUBSET OF table1 AND table2 COLUMNS
select table1.Col1, table1.Col2, table1.Col3
, table2.Col4, table2.Col5, table2.Col6
from table1
join table2 on id1 = id2
-- RENAMED COLUMNS
select table1.Col1 as t1_col1, table1.Col2 as t1_col2, table1.Col3 as t1_col3
, table2.Col3 as t2_col3, table2.Col2 as t2_col2, table2.Col1 as t2_col1
from table1
join table2 on id1 = id2