Uma explicação visual das junções de SQL

Achei que o livro de Ligaya Turmelle sobre junções SQL foi uma excelente cartilha para desenvolvedores iniciantes. Como as junções de SQL aparecem ser baseado em conjuntos, o uso de diagramas de Venn para explicá-los parece, à primeira vista, ser um ajuste natural. Entretanto, assim como os comentaristas de sua postagem, descobri que os diagramas de Venn não combinavam muito bem com a Sintaxe de junção do SQL realidade em meus testes.

No entanto, adoro o conceito, então vamos ver se conseguimos fazê-lo funcionar. Suponha que tenhamos as duas tabelas a seguir. Tabela A está à esquerda, e o Tabela B está à direita. Vamos preenchê-las com quatro registros cada.

id name       id  name
-- ----       --  ----
1  Pirate     1   Rutabaga
2  Monkey     2   Pirate
3  Ninja      3   Darth Vader
4  Spaghetti  4   Ninja

Vamos unir essas tabelas pelo campo name de algumas maneiras diferentes e ver se conseguimos uma correspondência conceitual com esses diagramas de Venn.

SELECT * FROM TableA
INNER JOIN TableB
ON TableA.name = TableB.name

id name id name


1 Pirate 2 Pirate
3 Ninja 4 Ninja

União interna produz apenas o conjunto de registros que correspondem tanto na Tabela A quanto na Tabela B.

Diagrama de Venn da junção interna do SQL
SELECT * FROM TableA
FULL OUTER JOIN TableB
ON TableA.name = TableB.name

id name id name


1 Pirate 2 Pirate
2 Monkey null null
3 Ninja 4 Ninja
4 Spaghetti null null
null null 1 Rutabaga
null null 3 Darth Vader

Junção externa completa produz o conjunto de todos os registros na Tabela A e na Tabela B, com registros correspondentes de ambos os lados, quando disponíveis. Se não houver correspondência, o lado ausente conterá nulo.

Diagrama de Venn da junção cartesiana do SQL
SELECT * FROM TableA
LEFT OUTER JOIN TableB
ON TableA.name = TableB.name

id  name       id    name
--  ----       --    ----
1   Pirate     2     Pirate
2   Monkey     null  null
3   Ninja      4     Ninja
4   Spaghetti  null  null

Junção externa esquerda produz um conjunto completo de registros da Tabela A, com os registros correspondentes (quando disponíveis) na Tabela B. Se não houver correspondência, o lado direito conterá null.

Diagrama de Venn da junção esquerda do SQL
SELECT * FROM TableA
LEFT OUTER JOIN TableB
ON TableA.name = TableB.name
WHERE TableB.id IS null

id name id name


2 Monkey null null
4 Spaghetti null null

Para produzir o conjunto de registros somente na Tabela A, mas não na Tabela B, realizamos a mesma junção externa esquerda, então excluímos os registros que não queremos do lado direito por meio de uma cláusula where.

join-left-outer.png
SELECT * FROM TableA
FULL OUTER JOIN TableB
ON TableA.name = TableB.name
WHERE TableA.id IS null
OR TableB.id IS null

id name id name


2 Monkey null null
4 Spaghetti null null
null null 1 Rutabaga
null null 3 Darth Vader

Para produzir o conjunto de registros exclusivos da Tabela A e da Tabela B, realizamos a mesma união externa completa e, em seguida excluímos os registros que não queremos de ambos os lados por meio de uma cláusula where.

join-outer.png

Há também um produto cartesiano ou junção cruzadaque, até onde sei, não pode ser expressa como um diagrama de Venn:

SELECT * FROM TableA
CROSS JOIN TableB

Isso junta “tudo a tudo”, resultando em 4 x 4 = 16 linhas, muito mais do que tínhamos nos conjuntos originais. Se o senhor fizer as contas, poderá ver por que isso é um problema. muito perigosa para executar em tabelas grandes.