Dado:
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)
Eu então join
usei a seguinte sintaxe JOIN:
postgres=# select * from foo, bar;
a | b | a | b
---+-----+---+-----
1 | one | 2 | two
(1 row)
Então comparei com full outer join
:
postgres=# select * from foo full outer join bar using (a);
a | b | b
---+-----+-----
1 | one |
2 | | two
(2 rows)
e cross join
:
postgres=# select * from foo cross join bar;
a | b | a | b
---+-----+---+-----
1 | one | 2 | two
(1 row)
É sempre verdade que a from a, b, c
vontade produzirá um cross join
?
Como @Akina diz em seu comentário, "," e CROSS JOIN é equivalente:
Isso também é conhecido como PRODUTO CARTESIANO. O resultado terá uma cardinalidade (tamanho) de:
| A, B | = | A | * | B |
Podemos restringir o resultado para que ele se torne um subconjunto do CROSS JOIN como:
A operação correspondente torna-se
INNER pode ser deixado de fora:
OUTER JOIN é um pouco mais complicado de explicar em termos de conjuntos, mas vamos começar com um LEFT OUTER JOIN:
Isso significa:
Eu deliberadamente deixei de fora qualquer informação sobre colunas no conjunto de resultados.
é igual a
Finalmente, FULL OUTER JOIN é uma UNION entre um LEFT e um EXTERNO JOIN DIREITO:
é igual a:
Para acertar completamente, precisaríamos estender a explicação com as colunas envolvidas.
Costumo pensar que a notação "," era curta e agradável, mas depois de passar anos e anos ajustando, modificando e estendendo o SQL existente, agora prefiro os ANSI JOINs aos ",". Como mostrado nos comentários de ypercubeᵀᴹ fiddle , coisas estranhas podem acontecer se você tiver uma junção "," e estendê-la com uma junção ANSI. Também acho muito mais fácil me convencer de que consegui as condições de junção corretas quando elas estão localizadas perto da junção, em vez da cláusula WHERE:
vs