鉴于:
postgres=# \d foo
Table "public.foo"
Column | Type | Collation | Nullable | Default
--------+---------+-----------+----------+---------
a | integer | | not null |
b | text | | not null |
Indexes:
"foo_pkey" PRIMARY KEY, btree (a)
postgres=# \d bar
Table "public.bar"
Column | Type | Collation | Nullable | Default
--------+---------+-----------+----------+---------
a | integer | | not null |
b | text | | not null |
Indexes:
"bar_pkey" PRIMARY KEY, btree (a)
postgres=# select * from foo;
a | b
---+-----
1 | one
(1 row)
postgres=# select * from bar;
a | b
---+-----
2 | two
(1 row)
然后我会join
使用以下 JOIN 语法:
postgres=# select * from foo, bar;
a | b | a | b
---+-----+---+-----
1 | one | 2 | two
(1 row)
然后,我将其与full outer join
:
postgres=# select * from foo full outer join bar using (a);
a | b | b
---+-----+-----
1 | one |
2 | | two
(2 rows)
和cross join
:
postgres=# select * from foo cross join bar;
a | b | a | b
---+-----+---+-----
1 | one | 2 | two
(1 row)
from a, b, c
意志产生 a总是真的cross join
吗?
就像@Akina 在他的评论中所说,“,”和 CROSS JOIN 是等价的:
这也称为笛卡尔积。结果的基数(大小)为:
| 甲,乙| = | 一个 | * | 乙|
我们可以限制结果,使其成为 CROSS JOIN 的子集,例如:
对应的操作变成
INNER 可以省略:
OUTER JOIN 在集合方面解释起来有点复杂,但让我们从 LEFT OUTER JOIN 开始:
这表示:
我故意遗漏了有关结果集中列的任何信息。
等于
最后,FULL OUTER JOIN 是 LEFT 和 RIGHT 外部 JOIN 之间的 UNION:
等于:
为了让它完全正确,我们需要用所涉及的列来扩展解释。
我曾经认为“,”表示法简短而甜蜜,但是在花费了数年时间调整、修改和扩展现有 SQL 之后,我现在更喜欢 ANSI JOIN 而不是“,”。如 ypercubeᵀᴹ 的评论中所示,如果您有一个“,”连接并使用 ANSI 连接扩展它,可能会发生奇怪的事情。我还发现更容易说服自己,当连接条件与连接非常接近时,我已经得到正确的连接条件,而不是 WHERE 子句:
对比