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 União interna produz apenas o conjunto de registros que correspondem tanto na Tabela A quanto na Tabela B. |
![]() |
SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name 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. |
![]() |
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. |
![]() |
SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name WHERE TableB.id IS 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. |
![]() |
SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name WHERE TableA.id IS null OR TableB.id IS null 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. |
![]() |
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.