Fechar

Participo de algumas listas de discussão sobre PHP e percebi que muitos desenvolvedores têm dúvidas a respeito de comandos SQL, não sabem ou não utilizam de forma correta os outer joins.

Por isso, decidi fazer um post sobre esse assunto explicando como utilizar o left outer join, right outer join, natural join, cross join ou inner join (mais utilizado).

Para que servem os outer joins?

Servem para fazer as junções entre duas ou mais tabelas, cruzando informações, combinando registros, testando desigualdades.

Por que cruzar dados?

Quando pensamos em armazenamento de dados, não podemos sair criando tabelas sem uma avaliação e sem a criação de um modelo ER (Entidade Relacionamento), e uma das vantagens de pensar no modelo é evitar a repetição de dados. E como fazer isso? Distribuindo-os em mais de uma tabela de forma que possamos categorizar as repetições.

Se você olhar o modelo abaixo, existe uma tabela de programadores e uma de empresas, note que as duas estão relacionadas. Guardo na tabela programadores somente um código que identifica a empresa em que o programador trabalha. Fiz isso em virtude da possibilidade de ter vários programadores relacionados a mesma empresa, assim evito ter que escrever várias vezes o nome da empresa (texto ocupa mais espaço que número) e evito que a mesma empresa seja escrita de maneiras diferentes, dificultando assim, por exemplo, uma busca. Porém, agora para recuperar esses dados será necessário utilizar junções.

modelo

empresas
programadores_linguagens
programador
linguagens

Cruzando Dados

1 – Produto Cartesiano

Esse não é bem um tipo de junção, é conhecido como conexão cruzada, ou seja, resulta no cruzamento de cada linha de uma tabela com todas as linhas de outra tabela.

SELECT p.nome, l.nome FROM programadores p CROSS JOIN linguagens l;

cross

O resultado desta consulta gera 36 linhas de combinações. Obs.: Esse tipo de junção não é muito utilizado.

Para obter o mesmo resultado podemos utilizar outras duas sintaxes: retirar o CROSS JOIN e inserir uma vírgula (,) ou usar o INNER JOIN sem a condição de comparação (ON). O resultado será o mesmo.

SELECT p.nome, l.nome FROM programadores p, linguagens l;

SELECT p.nome, l.nome FROM programadores p INNER JOIN linguagens l;

Marcadores: , , , , , , ,





Confira os 12 comentários deixados

  1. Jackson via Rec6
    9:12 em 22 de junho de 2009
    1

    Entendendo Outer Joins SQL – Parte 1 (Produto Cartesiano) | Profissionais TI…

    Participo de algumas listas de discussão sobre PHP e percebi que muitos desenvolvedores têm dúvidas a respeito de comandos SQL, não sabem ou não utilizam de forma correta os outer joins……

  2. Jackson Caset
    9:17 em 22 de junho de 2009
    2

    Paulinha,

    Seja bem-vinda e parabéns pelo conteúdo, muito interessante.

    Abraço

  3. Paulinha Winter
    12:05 em 22 de junho de 2009
    3

    Jackson,

    Obrigada. Espero poder contribuir com mais conteúdos.

    Abraços

  4. Klaus Peter Laube
    12:08 em 22 de junho de 2009
    4

    Belo post! Sempre é bom saber mais sobre SQL…

    Parabéns.

  5. Paulinha Winter
    12:16 em 22 de junho de 2009
    5

    Oi Klaus!!!

    Obrigada. Em breve falarei mais sobre o assunto.

    Abraços

  6. Guilherme Pinter
    18:19 em 22 de junho de 2009
    6

    Parabéns pelo post. Trabalho com desenvolvimento PHP utilizando o framework Cake. Muitas vezes acabamos não prestando a devida atenção nesses detalhes de banco que interferem diretamente no desempenho da aplicação.

    Parabéns!

  7. Paulinha Winter
    19:05 em 22 de junho de 2009
    7

    Oi Pinter…

    Obrigada!!!
    É verdade, é que uma vez que você passa usar Frameworks acaba na maioria das vezes não precisando gerar consultas na mão.

    Abraços

  8. Entendendo Outer Joins SQL – Parte 2 (Conexões Internas – INNER JOIN) | Profissionais TI
    7:07 em 23 de junho de 2009
    8

    [...] conexão interna inicialmente faz a mesma coisa que a conexão cruzada, porém aplica restrições que podem ser de igualdade ou desigualdade, isso faz com que algumas [...]

  9. Entendendo Outer Joins SQL – Parte 3 (Conexões Externas LEFT, RIGHT JOIN) | Profissionais TI
    7:02 em 24 de junho de 2009
    9

    [...] Obs.: O modelo de dados utilizado neste post encontra-se em Entendendo Outer Joins SQL – Parte 1 (Produto Cartesiano) [...]

  10. 8 meses de PTI – Resumão do mês de junho! | Profissionais TI
    10:13 em 6 de julho de 2009
    10

    [...] Entendendo Outer Joins SQL – Parte 1 (Produto Cartesiano) [...]

  11. Celso Fernandes R Junior
    17:24 em 29 de abril de 2010
    11

    Gostaria de saber como o produto cartesiano pode ajudar a tabela verdade.

  12. Paulinha Winter
    19:00 em 29 de abril de 2010
    12

    Boa tarde Celso,

    Eu não sei se entendi muito bem a sua pergunta, pode me explicar melhor sua dúvida?

    É que o produto cartesiano simplesmente é uma forma de relacionar todos os dados entre duas tabelas para obter a relação entre elas.

    Também recomendo que você de uma lida na continuação desse post em: http://www.profissionaisti.com.br/author/paulinha/

    Até mais.
    Paulinha

Deixe seu comentário, participe!