BD II – SQL – Junções (JOINS) Inner Join e Left Join

Segundo Heuser, quando em uma instrução SQL estão envolvidas duas ou mais tabelas, a associação entre linhas das duas (ou mais) tabelas é feita normalmente por uma operação chamada junção (‘join’).

Vamos analisar o seguinte cenário:

CREATE TABLE CLASSIFICACAO(
  CLACODIGO INTEGER PRIMARY KEY,
  CLADESCRICAO VARCHAR(50) NOT NULL
);

CREATE TABLE PRODUTO (
 PROCODIGO INTEGER PRIMARY KEY,
 PRODESCRICAO VARCHAR(200) NOT NULL,
 PROVALOR  NUMERIC(10,2) NOT NULL,
 PROSALDO  NUMERIC(8,3) NOT NULL,
 CLACODIGO INTEGER NOT NULL,
 FOREIGN KEY(CLACODIGO) REFERENCES CLASSIFICACAO
);

CREATE TABLE AUTOR (
 AUTCODIGO INTEGER PRIMARY KEY,
 AUTNOME   VARCHAR(100) NOT NULL
);

CREATE TABLE AUTOR_PRODUTO (
 AUTCODIGO INTEGER NOT NULL,
 PROCODIGO INTEGER NOT NULL,
 FOREIGN KEY (AUTCODIGO) REFERENCES AUTOR,
 FOREIGN KEY (PROCODIGO) REFERENCES PRODUTO
);

INSERT INTO CLASSIFICACAO(CLACODIGO,CLADESCRICAO)
       VALUES (1,'LIVROS DIDÁTICOS');
INSERT INTO CLASSIFICACAO(CLACODIGO,CLADESCRICAO)
       VALUES (2,'ELETRÔNICOS');

INSERT INTO PRODUTO
       (PROCODIGO,PRODESCRICAO,PROVALOR,PROSALDO,CLACODIGO)
       VALUES (100,'NOTEBOOK HP 9090BR',1460.99,3,2);

INSERT INTO PRODUTO
       (PROCODIGO,PRODESCRICAO,PROVALOR,PROSALDO,CLACODIGO)
       VALUES (105,'ROTEADOR WIRELESS D-LINK DL560',97.50,3,2);

INSERT INTO PRODUTO
       (PROCODIGO,PRODESCRICAO,PROVALOR,PROSALDO,CLACODIGO)
       VALUES (102,'SHELL SCRIPT PROFISSIONAL 2',85.55,2,1);

INSERT INTO PRODUTO
       (PROCODIGO,PRODESCRICAO,PROVALOR,PROSALDO,CLACODIGO)
       VALUES (200,'ZEND E DOJO 3',60.99,3,1);

INSERT INTO PRODUTO
       (PROCODIGO,PRODESCRICAO,PROVALOR,PROSALDO,CLACODIGO)
       VALUES (101,'CURSANDO GNU LINUX FOREVER',65.01,5,1);

INSERT INTO AUTOR (AUTCODIGO,AUTNOME)
       VALUES (10,'DAVID BANNER RULES');

INSERT INTO AUTOR (AUTCODIGO,AUTNOME)
       VALUES (20,'TONY STARK');

INSERT INTO AUTOR (AUTCODIGO,AUTNOME)
       VALUES (30,'DOC HOLLIDAY');

INSERT INTO AUTOR (AUTCODIGO,AUTNOME)
       VALUES (40,'WYATT EARP');

INSERT INTO AUTOR_PRODUTO(PROCODIGO,AUTCODIGO)
       VALUES (200,20);
INSERT INTO AUTOR_PRODUTO(PROCODIGO,AUTCODIGO)
       VALUES (102,10);
INSERT INTO AUTOR_PRODUTO(PROCODIGO,AUTCODIGO)
       VALUES (101,30);
INSERT INTO AUTOR_PRODUTO(PROCODIGO,AUTCODIGO)
       VALUES (101,40);

Junções:

Juntando CLASSIFICACAO e PRODUTO

Duas formas básicas:
Junções INTERNAS (Inner Join ou simplesmente Join)

SELECT P.PRODESCRICAO,C.CLADESCRICAO FROM PRODUTO P, CLASSIFICACAO C
WHERE P.CLACODIGO = C.CLACODIGO 

/*  OU */ 

SELECT P.PROCODIGO,C.CLADESCRICAO,P.PRODESCRICAO FROM PRODUTO P
JOIN CLASSIFICACAO C ON C.CLACODIGO = P.CLACODIGO

Juntando Código do produto, descrição e autor

SELECT P.PROCODIGO,P.PRODESCRICAO, A.AUTNOME FROM AUTOR_PRODUTO AP
JOIN PRODUTO P ON P.PROCODIGO = AP.PROCODIGO
JOIN AUTOR A ON A.AUTCODIGO = AP.AUTCODIGO

As junções INNER (interna) somente listam que realmente contenham relações entre as tabelas.

Junções a Esquerda (Left Join)
Nessa junção a prioridade é sempre a tabela que está a esquerda do operador LEFT JOIN. No caso nem todos os produtos tem relação com AUTOR, mas mesmo assim preciso que elas sejam listadas.

SELECT P.PROCODIGO, P.PRODESCRICAO, A.AUTNOME FROM PRODUTO P
LEFT JOIN AUTOR_PRODUTO AP ON AP.PROCODIGO = P.PROCODIGO
LEFT JOIN AUTOR A ON A.AUTCODIGO = AP.AUTCODIGO

Ou seja, nesse caso listou todos os produtos inclusive produtos que não tinham autores vinculados

fontes externas para reforço:

http://sqlfromhell.wordpress.com/2009/09/15/trabalhando-com-join

http://www.codeproject.com/KB/database/Visual_SQL_Joins/Visual_SQL_JOINS_orig.jpg

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