SQLite - JOINS

SQLite Joinscláusula é usada para combinar registros de duas ou mais tabelas em um banco de dados. Um JOIN é um meio de combinar campos de duas tabelas usando valores comuns a cada uma.

SQL define três tipos principais de junções -

  • O CROSS JOIN
  • O INNER JOIN
  • O OUTER JOIN

Antes de prosseguirmos, vamos considerar duas tabelas EMPRESA e DEPARTAMENTO. Já vimos instruções INSERT para preencher a tabela COMPANY. Então, vamos supor que a lista de registros disponíveis na tabela COMPANY -

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
1           Paul        32          California  20000.0
2           Allen       25          Texas       15000.0
3           Teddy       23          Norway      20000.0
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0
6           Kim         22          South-Hall  45000.0
7           James       24          Houston     10000.0

Outra tabela é DEPARTAMENTO com a seguinte definição -

CREATE TABLE DEPARTMENT(
   ID INT PRIMARY KEY      NOT NULL,
   DEPT           CHAR(50) NOT NULL,
   EMP_ID         INT      NOT NULL
);

Aqui está a lista de instruções INSERT para preencher a tabela DEPARTMENT -

INSERT INTO DEPARTMENT (ID, DEPT, EMP_ID)
VALUES (1, 'IT Billing', 1 );

INSERT INTO DEPARTMENT (ID, DEPT, EMP_ID)
VALUES (2, 'Engineering', 2 );

INSERT INTO DEPARTMENT (ID, DEPT, EMP_ID)
VALUES (3, 'Finance', 7 );

Por fim, temos a seguinte lista de registros disponíveis na tabela DEPARTAMENTO -

ID          DEPT        EMP_ID
----------  ----------  ----------
1           IT Billing  1
2           Engineering 2
3           Finance     7

O CROSS JOIN

CROSS JOIN corresponde a cada linha da primeira tabela com cada linha da segunda tabela. Se as tabelas de entrada tiverem linha xey, respectivamente, a tabela resultante terá linha x * y. Como os CROSS JOINs têm o potencial de gerar tabelas extremamente grandes, deve-se tomar cuidado para usá-los apenas quando apropriado.

A seguir está a sintaxe de CROSS JOIN -

SELECT ... FROM table1 CROSS JOIN table2 ...

Com base nas tabelas acima, você pode escrever um CROSS JOIN da seguinte forma -

sqlite> SELECT EMP_ID, NAME, DEPT FROM COMPANY CROSS JOIN DEPARTMENT;

A consulta acima produzirá o seguinte resultado -

EMP_ID      NAME        DEPT
----------  ----------  ----------
1           Paul        IT Billing
2           Paul        Engineering
7           Paul        Finance
1           Allen       IT Billing
2           Allen       Engineering
7           Allen       Finance
1           Teddy       IT Billing
2           Teddy       Engineering
7           Teddy       Finance
1           Mark        IT Billing
2           Mark        Engineering
7           Mark        Finance
1           David       IT Billing
2           David       Engineering
7           David       Finance
1           Kim         IT Billing
2           Kim         Engineering
7           Kim         Finance
1           James       IT Billing
2           James       Engineering
7           James       Finance

O INNER JOIN

INNER JOIN cria uma nova tabela de resultados combinando valores de coluna de duas tabelas (tabela1 e tabela2) com base no predicado de junção. A consulta compara cada linha da tabela1 com cada linha da tabela2 para encontrar todos os pares de linhas que satisfazem o predicado de junção. Quando o predicado de junção é satisfeito, os valores da coluna para cada par de linhas correspondentes de A e B são combinados em uma linha de resultado.

Um INNER JOIN é o tipo de junção mais comum e padrão. Você pode usar a palavra-chave INNER opcionalmente.

A seguir está a sintaxe de INNER JOIN -

SELECT ... FROM table1 [INNER] JOIN table2 ON conditional_expression ...

Para evitar redundância e manter o fraseado mais curto, as condições INNER JOIN podem ser declaradas com um USINGexpressão. Esta expressão especifica uma lista de uma ou mais colunas.

SELECT ... FROM table1 JOIN table2 USING ( column1 ,... ) ...

Um NATURAL JOIN é semelhante a um JOIN...USING, apenas testa automaticamente a igualdade entre os valores de cada coluna que existe em ambas as tabelas -

SELECT ... FROM table1 NATURAL JOIN table2...

Com base nas tabelas acima, você pode escrever um INNER JOIN da seguinte forma -

sqlite> SELECT EMP_ID, NAME, DEPT FROM COMPANY INNER JOIN DEPARTMENT
   ON COMPANY.ID = DEPARTMENT.EMP_ID;

A consulta acima produzirá o seguinte resultado -

EMP_ID      NAME        DEPT
----------  ----------  ----------
1           Paul        IT Billing
2           Allen       Engineering
7           James       Finance

O OUTER JOIN

OUTER JOIN é uma extensão de INNER JOIN. Embora o padrão SQL defina três tipos de OUTER JOINs: LEFT, RIGHT e FULL, o SQLite suporta apenas oLEFT OUTER JOIN.

OUTER JOINs têm uma condição idêntica a INNER JOINs, expressa usando uma palavra-chave ON, USING ou NATURAL. A tabela de resultados iniciais é calculada da mesma forma. Depois que o JOIN primário é calculado, um OUTER JOIN pegará todas as linhas não unidas de uma ou de ambas as tabelas, preencherá-as com NULLs e as anexará à tabela resultante.

A seguir está a sintaxe de LEFT OUTER JOIN -

SELECT ... FROM table1 LEFT OUTER JOIN table2 ON conditional_expression ...

Para evitar redundância e manter o fraseado mais curto, as condições OUTER JOIN podem ser declaradas com uma expressão USING. Esta expressão especifica uma lista de uma ou mais colunas.

SELECT ... FROM table1 LEFT OUTER JOIN table2 USING ( column1 ,... ) ...

Com base nas tabelas acima, você pode escrever uma junção interna da seguinte maneira -

sqlite> SELECT EMP_ID, NAME, DEPT FROM COMPANY LEFT OUTER JOIN DEPARTMENT
   ON COMPANY.ID = DEPARTMENT.EMP_ID;

A consulta acima produzirá o seguinte resultado -

EMP_ID      NAME        DEPT
----------  ----------  ----------
1           Paul        IT Billing
2           Allen       Engineering
            Teddy
            Mark
            David
            Kim
7           James       Finance