BD II – SQL – Junções (JOINS) Right Join e Full join

No post anterior vimos as junções Inner e Left join agora vamos ver Right join e Full join.

Vamos analisar o seguinte cenário:

Foram omitidos no diagrama as colunas restantes, mas estão presentes no modelo físico. As cardinalidades mínimas dos dois lados estão em 0 (zero) isso afirma que podem existir colaboradores sem cargo, como também cargo sem colaborador forçando a chave estrangeira (FK) a aceitar valores nulos (null).

Segue o código abaixo:

  CREATE TABLE CARGO (
    ID           INTEGER NOT NULL PRIMARY KEY,
    CARDESCRICAO VARCHAR(100) NOT NULL,
    CARSALBASE   NUMERIC(7,2) NOT NULL
  );
/* reparar no detalhe da chave estrangeira aceitando null */
  CREATE TABLE COLABORADOR (
    ID         INTEGER NOT NULL PRIMARY KEY,
    COLNOME    VARCHAR(100) NOT NULL,
    COLIDADE   INTEGER NOT NULL,
    COLSALARIO NUMERIC(8,2) NOT NULL,
    IDCARGO    INTEGER,
    FOREIGN KEY(IDCARGO) REFERENCES CARGO
  );

Agora a inserção dos dados nas tabelas, primeiro CARGO.

  INSERT INTO CARGO (ID,CARDESCRICAO,CARSALBASE)
         VALUES (1,'Assistente Administrativo',1000.00);

  INSERT INTO CARGO (ID,CARDESCRICAO,CARSALBASE)
         VALUES (2,'Operador de Telemarketing',1200.00);

  INSERT INTO CARGO (ID,CARDESCRICAO,CARSALBASE)
         VALUES (3,'Recepcionista',850.00);

  INSERT INTO CARGO (ID,CARDESCRICAO,CARSALBASE)
         VALUES (4,'Programador Pleno',2500.00);

  INSERT INTO CARGO (ID,CARDESCRICAO,CARSALBASE)
         VALUES (5,'Analista de Sistemas Sênior',6000.00);

Inserção na tabela COLABORADOR.

  INSERT INTO COLABORADOR(ID,COLNOME,COLIDADE,COLSALARIO,IDCARGO)
         VALUES (100,'Funcionario A',25,1250.00,2);

  INSERT INTO COLABORADOR(ID,COLNOME,COLIDADE,COLSALARIO,IDCARGO)
         VALUES (200,'Funcionario B',36,860.00,3);

  INSERT INTO COLABORADOR(ID,COLNOME,COLIDADE,COLSALARIO,IDCARGO)
         VALUES (300,'Funcionario C',41,1060.00,NULL);

  INSERT INTO COLABORADOR(ID,COLNOME,COLIDADE,COLSALARIO,IDCARGO)
         VALUES (400,'Funcionario D',55,6000.00,5);

  INSERT INTO COLABORADOR(ID,COLNOME,COLIDADE,COLSALARIO,IDCARGO)
         VALUES (500,'Funcionario E',27,1200.00,2);

  INSERT INTO COLABORADOR(ID,COLNOME,COLIDADE,COLSALARIO,IDCARGO)
         VALUES (600,'Funcionario F',37,3200.00,NULL);

  INSERT INTO COLABORADOR(ID,COLNOME,COLIDADE,COLSALARIO,IDCARGO)
         VALUES (700,'Funcionario G',39,3200.00,NULL);

 Uma junção Inner (interna) pra começar os trabalhos.

 SELECT COLABORADOR.ID,COLABORADOR.COLNOME,COLABORADOR.COLSALARIO,
        CARGO.CARDESCRICAO,CARGO.CARSALBASE FROM COLABORADOR
 JOIN CARGO ON CARGO.ID = COLABORADOR.IDCARGO

 A saída era a esperada, trouxe todos as colunas que se relacionam.

Agora vamos para a junção LEFT JOIN, (relembrar), nesta a prioridade é para a tabela que está a esquerda do operador JOIN, no caso do exemplo a tabela COLABORADOR. Notar que o comando é o mesmo, porém agora aparece a palavra LEFT antes do JOIN.

 SELECT COLABORADOR.ID,COLABORADOR.COLNOME,COLABORADOR.COLSALARIO,
        CARGO.CARDESCRICAO,CARGO.CARSALBASE FROM COLABORADOR
 LEFT JOIN CARGO ON CARGO.ID = COLABORADOR.IDCARGO

Notar que agora listou todos os COLABORADORES, inclusive quem não tem cargo vinculado.

Agora vem o objetivo do post, RIGHT JOIN  da prioridade a tabela que esta a DIREITA do operador JOIN no caso a tabela CARGO.

 SELECT COLABORADOR.ID,COLABORADOR.COLNOME,COLABORADOR.COLSALARIO,
        CARGO.CARDESCRICAO,CARGO.CARSALBASE FROM COLABORADOR
 RIGHT JOIN CARGO ON CARGO.ID = COLABORADOR.IDCARGO

Notar que agora foram listados também CARGOS que não tem colaboradores vinculados.

Agora o outro objetivo do post o FULL JOIN, este operador trás tudo as colunas COLABORADOR x CARGO que se relacionam (INNER)  as LEFT JOIN e RIGHT JOIN, ou seja COLABORADORES QUE TEM CARGO, COLABORADORES SEM CARGO, E CARGO SEM COLABORADORES.

 SELECT COLABORADOR.ID,COLABORADOR.COLNOME,COLABORADOR.COLSALARIO,
       CARGO.ID,CARGO.CARDESCRICAO,CARGO.CARSALBASE FROM COLABORADOR
 FULL JOIN CARGO ON CARGO.ID = COLABORADOR.IDCARGO

Até mais.

Esse post foi publicado em BD II - Banco de Dados II. Bookmark o link permanente.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s