» Entendendo os SQL Joins
07/11/2015    Banco de Dados

Olá pessoal!
Nesse artigo eu vou explicar um pouco mais sobre os comandos Joins da linguagem SQL.
Para entendermos bem os comandos é necessário entedermos a ligação deles com a Teoria Matemática dos Conjuntos.
A maioria dos bancos de dados se baseiam no modelo relacional, como Microsoft SQL Server, MySQL, Firebird etc. Eles tem esse nome (banco de dados relacional) devido à relação matemática com a Teoria dos Conjuntos e não ao fato de ter relacionamentos, como muitos pensam.

Nesse artigo não vou me aprofundar na Teoria dos Conjuntos, mas sim na ligação dela com os comandos SQL.
Em meu exemplo estou usando o banco de dados MySQL, apesar de alguns comandos serem diferentes dependendo do banco de dados que esteja utilizando, os comandos básicos de SELECT como os que veremos a seguir permanecem os mesmos.

Para começar vou criar duas tabelas simples para exemplificar os comandos:

Tabela País:


Tabela Estado:

Repare que alguns estados (Alfa e Beta) não tem ligação com a tabela de países pois o campo IDPais está como 0, e alguns países (Canadá e Argentina) não aparecem na tabela de estados.

Agora vamos chamar a tabela de Estado de A, e a tabela de País de B e vamos brincar com os Joins e essas duas tabelas


A + (A Intersecção B)

            SELECT A.Nome AS Estado, A.Sigla, B.Nome AS Pais FROM Estado A
            LEFT JOIN Pais B ON A.IDPais = B.ID
        

Como resultado do código a cima nós temos os seguintes dados:


O comando LEFT JOIN, buscou a intersecção entre os elementos A e B, ou seja, os estados que estavam ligados aos países, mas também mostrou o conteúdo do elemento A que está fora da intersecção, ou seja, os estados sem países (Alfa e Beta). Como mostra a figura abaixo:



A - (A Intersecção B)

Para excluirmos os dados de A intersecção B e pegarmos somente os dados de A, basta inserirmos uma cláusula WHERE informando que queremos os dados de A que não tem ligação com B, ou seja, sem ligação com os países:

            SELECT A.Nome AS Estado, A.Sigla, B.Nome AS Pais FROM fabricioleite3.Estado A
            LEFT JOIN fabricioleite3.Pais B ON A.IDPais = B.ID
            WHERE A.IDPais = 0
        

Como resultado do código a cima nós temos os seguintes dados:


O comando a cima fez a mesma coisa que o comando anterior, a diferença é que como incluímos o WHERE onde os estados não tinham ligação com países, então ele excluiu a intersecção no retorno. Como mostra a figura abaixo:



A Intersecção B

Para pegarmos somente a intersecção, vamos utilizar o mesmo código, porém tirarmos o WHERE e trocarmos o LEFT JOIN por INNER JOIN:

            SELECT A.Nome AS Estado, A.Sigla, B.Nome AS Pais FROM fabricioleite3.Estado A
            INNER JOIN fabricioleite3.Pais B ON A.IDPais = B.ID
        

Como resultado do código a cima nós temos os seguintes dados:


Essa é a diferença entre o LEFT JOIN e o INNER JOIN. Como mostra a figura abaixo:



B + (A Intersecção B)

Vimos a cima como pegar os dados de A junto com a intersecção, agora vamos pegar os dados de B junto com a intersecção, para isso basta trocar o comando LEFT JOIN por RIGHT JOIN:

            SELECT A.Nome AS Estado, A.Sigla, B.Nome AS Pais FROM fabricioleite3.Estado A
            RIGHT JOIN fabricioleite3.Pais B ON A.IDPais = B.ID
        

Como resultado do código a cima nós temos os seguintes dados:


Essa é a diferença entre o LEFT JOIN e o RIGHT JOIN. Como mostra a figura abaixo:



A + (A Intersecção B) + B

Agora nós vamos pegar todos os dados, ou seja, o conteúdo de A fora da intersecção, a intersecção toda e também o conteúdo de B fora da intersecção.
Para isso nós vamos unir os comandos já visto, o comando para pegar A + (A intersecção B), somado ao comando para pegar A intersecção B, somado ao comando para pegar (A intersecção B) + B:

            SELECT A.Nome AS Estado, A.Sigla, B.Nome AS Pais FROM Estado A
            LEFT JOIN Pais B ON A.IDPais = B.ID
            UNION
            SELECT A.Nome AS Estado, A.Sigla, B.Nome AS Pais FROM fabricioleite3.Estado A
            INNER JOIN fabricioleite3.Pais B ON A.IDPais = B.ID
            UNION
            SELECT A.Nome AS Estado, A.Sigla, B.Nome AS Pais FROM fabricioleite3.Estado A
            RIGHT JOIN fabricioleite3.Pais B ON A.IDPais = B.ID
        

Como resultado do código a cima nós temos todos os dados das duas tabelas:


É isso pessoal... espero que tenham gostado de mais esse artigo!
Até o próximo! ;)




Comentários