Neste sexto tópico falarei sobre junções, ou JOINs. JOIN é uma técnica para visualizar dados de multiplas tabelas através de um único SELECT. Existem diversos tipos de JOINs, que podem ser vistos a seguir:

  • INNER JOINS
  1.    NATURAL JOIN
  2.    JOIN … USING
  3.    JOIN … ON
  4.    CARTESIAN JOINS (CROSS JOIN)
  • OUTER JOINS
  1.    LEFT OUTER JOIN
  2.    RIGHT OUTER JOIN
  3.    FULL OUTER JOIN
  • SELF-JOIN

É importante mencionar que todos os exemplos abaixo foram feitos usando a sintaxe ANSI SQL, que serve para todos os bancos que implementam esse padrão de SQL, ou seja, todos. Esse também é o tipo de sintaxe abordada nas provas 11g do Oracle.

1) INNER JOINS

Também pode ser chamado de EQUI JOIN. Esse tipo de JOIN uma um operador de igualdade para comparar linhas de multiplas tabelas. Caso essas linhas “batam” estas serão retornadas pelo SELECT. Mais adiante é possível ver os tipos de INNER JOIN:

1.1) NATURAL JOIN

O join é baseado em todas as colunas com os mesmos nomes em todas as tabelas.envolvidas no SELECT. Ex:

 
 -- as 2 tabelas abaixo possuem a coluna em comum ID_DEPARTAMENTO

 SELECT ID_EMP, 
 NOME_EMP, 
 NOME_DEPARTAMENTO 
 FROM CERTIFICACAO.TAB_EMPREGADOS NATURAL JOIN 
      CERTIFICACAO.TAB_DEPARTAMENTOS

 -- colunas em comum não podem ter qualificadores. 
 -- o exemplo abaixo gera o erro "ora-25155: column used in 
 -- NATURAL join cannot have qualifier"

 SELECT E.ID_EMP, 
 E.NOME_EMP, 
 E.ID_DEPARTAMENTO,
 D.NOME_DEPARTAMENTO 
 FROM CERTIFICACAO.TAB_EMPREGADOS E NATURAL JOIN 
      CERTIFICACAO.TAB_DEPARTAMENTOS D

 -- para colunas comuns em todas as tabelas, basta omitir 
 -- o qualificador

 SELECT E.ID_EMP, 
 E.NOME_EMP, 
 ID_DEPARTAMENTO, --coluna comum
 D.NOME_DEPARTAMENTO 
 FROM CERTIFICACAO.TAB_EMPREGADOS E NATURAL JOIN 
      CERTIFICACAO.TAB_DEPARTAMENTOS D

1.2) JOIN … USING

Especifica através da clausula USING, colunas com nomes comuns nas tabelas a serem usadas nos JOINS. Ex:

-- na clausula using deve ser especificada a coluna comum 
-- às tabelas

 SELECT E.ID_EMP, 
 E.NOME_EMP, 
 D.NOME_DEPARTAMENTO 
 FROM CERTIFICACAO.TAB_EMPREGADOS E JOIN 
      CERTIFICACAO.TAB_DEPARTAMENTOS D 
      USING (ID_DEPARTAMENTO)

 -- colunas em comum não podem ter qualificadores. 
 -- o exemplo abaixo gera o erro "ora-25154: column used in 
 -- USING join cannot have qualifier"

 SELECT E.ID_EMP, 
 E.NOME_EMP, 
 E.ID_DEPARTAMENTO,
 D.NOME_DEPARTAMENTO 
 FROM CERTIFICACAO.TAB_EMPREGADOS E JOIN 
      CERTIFICACAO.TAB_DEPARTAMENTOS D 
      USING (ID_DEPARTAMENTO)

 -- para colunas comuns em todas as tabelas, basta omitir o 
 -- qualificador

 SELECT E.ID_EMP, 
 E.NOME_EMP, 
 ID_DEPARTAMENTO,
 D.NOME_DEPARTAMENTO 
 FROM CERTIFICACAO.TAB_EMPREGADOS E JOIN 
      CERTIFICACAO.TAB_DEPARTAMENTOS D 
      USING (ID_DEPARTAMENTO)

1.3) JOIN … ON

Define especificamente as condições e colunas que farão o JOIN. Ex:

-- define que o join sera feito pelas colunas id_departamento 
-- de ambas as tabelas, ou seja,so retornara resultados caso as 
-- duas tabelas possuam departamentos iguais

 SELECT E.ID_EMP, 
 E.NOME_EMP, 
 E.ID_DEPARTAMENTO,
 D.NOME_DEPARTAMENTO 
 FROM CERTIFICACAO.TAB_EMPREGADOS E JOIN 
      CERTIFICACAO.TAB_DEPARTAMENTOS D 
      ON (E.ID_DEPARTAMENTO = D.ID_DEPARTAMENTO)

 -- é possível especificar mais de uma coluna 

 SELECT E.ID_EMP, 
 E.NOME_EMP, 
 E.ID_DEPARTAMENTO,
 D.NOME_DEPARTAMENTO 
 FROM CERTIFICACAO.TAB_EMPREGADOS E JOIN 
      CERTIFICACAO.TAB_DEPARTAMENTOS D 
      ON (E.ID_DEPARTAMENTO = D.ID_DEPARTAMENTO 
         AND E.ID_EMP = D.ID_GERENTE)

1.4) CARTESIAN JOINS (CROSS JOIN)

Ocorrem quando os dados são selecionados de 2 ou mais tabelas, mas nenhuma condição é especificada. Cada linha da 1º tabela é unida com cada linha da 2º tabela. Se a tabela A possui 3 linhas e a tabela B possui 4 linhas, o select resultante retorna 12 (3 x 4) linhas. Ex:

-- une cada linhas de TAB_EMPREGADOS com cada linha de 
-- TAB_DEPARTAMENTOS
-- evite fazer isso. além de não retornar informações úteis, 
-- dependendo do tamanho das tabelas, isso pode ocupar toda a area -- de memória disponível para isso.
 SELECT *
 FROM CERTIFICACAO.TAB_EMPREGADOS E, 
      CERTIFICACAO.TAB_DEPARTAMENTOS D

2) OUTER JOINS

Retorna linhas que são encontradas em todas as tabelas, bem como linhas que não foram encontradas em alguma das tabelas envolvidas no SELECT.

2.1) LEFT OUTER JOIN

Citando o documento da própria Oracle para explicar esse conceito:

“A LEFT OUTER JOIN is one of the JOIN operations that allow you to specify a join clause. It preserves the unmatched rows from the first (left) table, joining them with a NULL row in the shape of the second (right) table.”

A dica que eu passo a vocês, para facilitar é: LEFT OUTER JOIN deve ser usado quando eu precisar de TUDO que estiver apenas na tabela a esquerda, não importando se existam registros equivalentes na tabela da direita

 -- retorna os registros que possuem o id_departamento comum 
 -- em ambas as tabelas,
 -- bem como os departamentos que nao possuem empregados associados
 -- retorna dados da tabela a esquerda na clausula from, mesmo 
 -- que esses dados não possuam correspondentes (NULL) na tabela 
 -- da direita

 SELECT E.ID_EMP, 
 E.NOME_EMP, 
 E.ID_DEPARTAMENTO,
 D.NOME_DEPARTAMENTO 
 FROM CERTIFICACAO.TAB_DEPARTAMENTOS D LEFT OUTER JOIN 
      CERTIFICACAO.TAB_EMPREGADOS E
      ON (E.ID_DEPARTAMENTO = D.ID_DEPARTAMENTO)

OBS1: A cláusula OUTER é opcional

2.2) RIGHT OUTER JOIN

Citando o documento da própria Oracle para explicar esse conceito:

“A RIGHT OUTER JOIN is one of the JOIN operations that allow you to specify a JOIN clause. It preserves the unmatched rows from the second (right) table, joining them with a NULL in the shape of the first (left) table. A LEFT OUTER JOIN B is equivalent to B RIGHT OUTER JOIN A, with the columns in a different order.”

A dica que eu passo a vocês, para facilitar é: RIGHT OUTER JOIN deve ser usado quando eu precisar de TUDO que estiver apenas na tabela a direita, não importando se existam registros equivalentes na tabela da esquerda

 -- retorna os registros que possuem o id_departamento comum 
 -- em ambas as tabelas, bem como os empregados que não possuem 
 -- departamentos associados.
 -- retorna dados da tabela a direita na clausula from, mesmo 
 -- que esses dados não possuam correspondentes na tabela 
 -- da esquer

 SELECT E.ID_EMP, 
 E.NOME_EMP, 
 E.ID_DEPARTAMENTO,
 D.NOME_DEPARTAMENTO 
 FROM CERTIFICACAO.TAB_DEPARTAMENTOS D RIGHT OUTER JOIN CERTIFICACAO.TAB_EMPREGADOS E
 ON (E.ID_DEPARTAMENTO = D.ID_DEPARTAMENTO)

OBS1: A cláusula OUTER é opcional

3) SELF-JOIN

Realiza um JOIN entre uma tabela e “ela mesma”. O nome da tabela aparece na clausula FROM, duas vezes, com aliases diferentes. Ex:

-- mostra os gerentes de cada empregado. cada gerente também é 
-- um empregado.

 SELECT TA.NOME_EMP || ' trabalha para ' || TB.NOME_EMP 
 FROM CERTIFICACAO.TAB_EMPREGADOS TA JOIN 
      CERTIFICACAO.TAB_EMPREGADOS TB 
      ON (TA.ID_GERENTE = TB.ID_EMP)

É isso ai pessoal. Por hoje já deu. Até a próxima oportunidade. Keep Querying.