Obtenha dados de várias tabelas

Exibindo dados de várias tabelas

As tabelas relacionadas de um grande banco de dados são vinculadas por meio do uso de chaves estrangeiras e primárias ou o que costuma ser chamado de colunas comuns. A capacidade de unir tabelas permitirá que você acrescente mais significado à tabela de resultados produzida. Para que 'n' tabelas numéricas sejam unidas em uma consulta, são necessárias condições de junção mínimas (n-1). Com base nas condições de junção, o Oracle combina o par de linhas correspondente e exibe aquele que satisfaz a condição de junção.

Joins são classificados como abaixo

  • Junção natural (também conhecida como equijoin ou junção simples) - cria uma junção usando uma coluna comumente nomeada e definida.

  • Junção de não igualdade - une tabelas quando não há linhas equivalentes nas tabelas a serem unidas - por exemplo, para combinar valores em uma coluna de uma tabela com um intervalo de valores em outra tabela.

  • Auto-associação - associa uma tabela a ela mesma.

  • Junção externa - Inclui registros de uma tabela na saída quando não há nenhum registro correspondente na outra tabela.

  • Junção cartesiana (também conhecida como produto cartesiano ou junção cruzada) - Replica cada linha da primeira tabela com cada linha da segunda tabela. Cria uma junção entre tabelas exibindo todas as combinações de registro possíveis.

União Natural

A palavra-chave NATURAL pode simplificar a sintaxe de um equijoin. Um NATURAL JOIN é possível sempre que duas (ou mais) tabelas têm colunas com o mesmo nome e as colunas são compatíveis com junções, ou seja, as colunas têm um domínio compartilhado de valores. operação junta linhas das tabelas que têm valores de coluna iguais para as mesmas colunas nomeadas.

Considere o relacionamento um para muitos entre as tabelas DEPARTMENTS e EMPLOYEES. Cada tabela possui uma coluna denominada DEPARTMENT_ID. Esta coluna é a chave primária da tabela DEPARTMENTS e uma chave estrangeira da tabela EMPLOYEES.

SELECT E.first_name NAME,D.department_name DNAME
FROM employees E NATURAL JOIN departments D;

FIRST_NAME DNAME
---------- ------
MILLER     DEPT 1
JOHN       DEPT 1
MARTIN     DEPT 2
EDWIN      DEPT 2

A consulta SELECT abaixo une as duas tabelas especificando explicitamente a condição de junção com a palavra-chave ON.

SELECT E.first_name NAME,D.department_name DNAME
FROM employees E JOIN departments D
ON (E.department_id = D.department_id);

Existem algumas limitações em relação ao NATURAL JOIN. Você não pode especificar uma coluna LOB com um NATURAL JOIN. Além disso, as colunas envolvidas na junção não podem ser qualificadas por um nome de tabela ou alias.

Cláusula USING

Usando junções naturais, o Oracle identifica implicitamente as colunas para formar a base da junção. Muitas situações exigem declaração explícita de condições de associação. Nesses casos, usamos a cláusula USING para especificar os critérios de adesão. Como a cláusula USING une as tabelas com base na igualdade das colunas, ela também é conhecida como Equijoin. Eles também são conhecidos como junções internas ou junções simples.

Sintaxe:

SELECT <column list>
FROM   TABLE1   JOIN   TABLE2	
USING (column name)

Considere a consulta SELECT abaixo, a tabela EMPLOYEES e a tabela DEPARTMENTS são unidas usando a coluna comum DEPARTMENT_ID.

SELECT E.first_name NAME,D.department_name DNAME
FROM employees E JOIN departments D
USING (department_id);

Self Join

Uma operação SELF-JOIN produz uma tabela de resultados quando o relacionamento de interesse existe entre as linhas armazenadas em uma única tabela. Em outras palavras, quando uma tabela é associada a si mesma, a junção é conhecida como Self Join.

Considere a tabela EMPLOYEES, que contém o funcionário e seus gerentes de relatório. Para localizar o nome do gerente de um funcionário, seria necessário fazer uma junção na própria tabela EMP. Este é um candidato típico para Self Join.

SELECT e1.FirstName Manager,e2.FirstName Employee
FROM employees e1 JOIN employees e2
ON (e1.employee_id = e2.manager_id)
ORDER BY e2.manager_id DESC;

Não Equijoins

Uma junção de não igualdade é usada quando as colunas relacionadas não podem ser unidas com um sinal de igual, o que significa que não há linhas equivalentes nas tabelas a serem unidas. Uma junção de não igualdade permite que você armazene o valor mínimo de um intervalo em uma coluna de um registro e o valor máximo em outra coluna. Portanto, em vez de encontrar uma correspondência coluna-tocoluna, você pode usar uma junção de não igualdade para determinar se o item que está sendo enviado está entre os intervalos mínimo e máximo nas colunas. Se a junção encontrar um intervalo correspondente para o item, o frete correspondente a taxa pode ser devolvida nos resultados. Como com o método tradicional de junções de igualdade, uma junção de não igualdade pode ser executada em uma cláusula WHERE. Além disso, a palavra-chave JOIN pode ser usada com a cláusula ON para especificar colunas relevantes para a junção.

SELECT E.first_name,
            J.job_hisal,
            J.job_losal,
            E.salary
     FROM employees E JOIN job_sal J
     ON (E.salary BETWEEN J.job_losal AND J.job_losal);

Podemos usar todos os parâmetros de comparação discutidos anteriormente, como operadores de igualdade e desigualdade, BETWEEN, IS NULL, IS NOT NULL e RELATIONAL.

Junções Externas

Uma junção externa é usada para identificar situações em que as linhas de uma tabela não correspondem às linhas de uma segunda tabela, embora as duas tabelas estejam relacionadas.

Existem três tipos de junções externas: LEFT, RIGHT e FULL OUTER JOIN. Todos eles começam com INNER JOIN e, em seguida, adicionam de volta algumas das linhas que foram eliminadas. Um LEFT OUTER JOIN adiciona de volta todas as linhas que são eliminadas da primeira tabela (esquerda) na condição de junção e as colunas de saída da segunda tabela (direita) são definidas como NULL. Um RIGHT OUTER JOIN adiciona de volta todas as linhas que são eliminadas da segunda tabela (direita) na condição de junção e as colunas de saída da primeira tabela (esquerda) são definidas como NULL. O FULL OUTER JOIN adiciona de volta todas as linhas que são eliminadas de ambas as tabelas.

Junção Externa Direita

Um RIGHT OUTER JOIN adiciona de volta todas as linhas que foram eliminadas da segunda tabela (direita) na condição de junção e as colunas de saída da primeira tabela (esquerda) são definidas como NULL. Observe que a consulta a seguir lista os funcionários e seus departamentos correspondentes. Além disso, nenhum funcionário foi designado para o departamento 30.

SELECT E.first_name, E.salary, D.department_id          
FROM employees E, departments D
WHERE E.DEPARTMENT_ID (+) = D.DEPARTMENT_ID;

FIRST_NAME SALARY     DEPARTMENT_ID
---------- ---------- ----------
JOHN       6000       10
EDWIN      2000       20
MILLER     2500       10
MARTIN     4000       20
                      30

União Externa Esquerda

Um LEFT OUTER JOIN adiciona de volta todas as linhas que são eliminadas da primeira tabela (esquerda) na condição de junção e as colunas de saída da segunda tabela (direita) são definidas como NULL. A consulta demonstrada acima pode ser usada para demonstrar a junção externa esquerda, trocando a posição do sinal (+).

SELECT E.first_name, E.salary, D.department_id
FROM employees E, departments D
WHERE   D.DEPARTMENT_ID = E.DEPARTMENT_ID (+);

FIRST_NAME SALARY     DEPARTMENT_ID
---------- ---------- ----------
JOHN       6000       10
EDWIN      2000       20
MILLER     2500       10
MARTIN     4000       20
                      30

Full Outer Join

O FULL OUTER JOIN adiciona de volta todas as linhas que são eliminadas de ambas as tabelas. A consulta abaixo mostra listas de funcionários e seus departamentos. Observe que o funcionário 'MAN' não foi atribuído a nenhum departamento até agora (é NULL) e o departamento 30 não foi atribuído a nenhum funcionário.

SELECT  nvl (e.first_name,'-') first_name, nvl (to_char (d.department_id),'-') department_id
FROM employee e FULL OUTER JOIN department d
ON e. depARTMENT_ID = d. depARTMENT_ID;

FIRST_NAME DEPARTMENT_ID
---------- --------------------
MAN        -
JOHN       10
EDWIN      20
MILLER     10
MARTIN     20
-          30

6 rows selected.

Produto cartesiano ou junção cruzada

Para duas entidades A e B, A * B é conhecido como produto cartesiano. Um produto cartesiano consiste em todas as combinações possíveis das linhas de cada uma das tabelas. Portanto, quando uma tabela com 10 linhas é unida a uma tabela com 20 linhas, o produto cartesiano é 200 linhas (10 * 20 = 200). Por exemplo, juntar a tabela de funcionários com oito linhas e a tabela de departamento com três linhas produzirá uma tabela de produtos cartesianos de 24 linhas (8 * 3 = 24).

A junção cruzada se refere ao produto cartesiano de duas tabelas. Ele produz produto vetorial de duas tabelas. A consulta acima pode ser escrita usando a cláusula CROSS JOIN.

Uma tabela cartesiana de resultados de produtos normalmente não é muito útil. Na verdade, essa tabela de resultados pode ser terrivelmente enganosa. Se você executar a consulta abaixo para as tabelas EMPLOYEES e DEPARTMENTS, a tabela de resultados implica que cada funcionário tem um relacionamento com cada departamento, e sabemos que simplesmente não é o caso!

SELECT E.first_name, D.DNAME
FROM employees E,departments D;
A junção cruzada pode ser escrita como,
SELECT E.first_name, D.DNAME
FROM employees E CROSS JOIN departments D;