A frase..

"A bondade tornou feliz minha vida."



domingo, 29 de julho de 2012

Right Join - Para que me será útil?

Right Join
Para que me será útil?

Um videozinho só para quebrar o gelo... (ah gente... esse é meu blog, tenho que estar feliz ao postar algo)

You Are The One - HIM

A verdade é que em casos pequenos pouco se usa right join (ou Right Outer Join), mas sua aplicação é válida. Digamos que você possui uma lista com números telefônicos, numerados, mas apenas os números e outra com os nomes dos donos desses números telefônicos, mais ou menos assim:



Ok, um exemplo até ridículo, afinal ninguém escreve em duas páginas e ainda por cima colocando os nomes (principal referência de consulta em uma agenda telefônica) em segundo plano. Mas isso é um exemplo... Por isso peço paciência é para que possam compreender bem antes de passar pro código SQL. Vou tentar variar as linguagens de SGBD, vamos ver se consigo. Garanto SQLServer e MySQL. Acreditem não tem muita diferença.
Voltando ao exemplo. Você deseja listar os números telefônicos, mas mais do que isso você quer todos os nomes de todos os seus amigos, para então saber quem tem ou não número telefônico. Você pensaria (ou não): "Vou pegar todos os números telefônicos e ligá-los com seus respectivos donos, acompanhado o código e os nomes que sobraram vou copiar também mas com um tracinho pra depois pegar os números desses caras antissociais..." 
Tá isso é bem historinha mesmo. Seria meio assim se visto como um algoritmo:

Selecionar os nomes da lista de nomes e os telefones da lista de telefones, ligando tudo pelo código trazendo tudo da lista da direita na sequência "lista de telefones" e "lista de nomes"

Vamos simular uma ideia muito mais complexa...
Crie um banco, juntamente com suas tabelas. Se preferir temos algumas linhas de código se achar interessante seguir tal linha de raciocínio:

CREATE DATABASE ListaTelefone
USE ListaTelefone

CREATE TABLE Disciplina(
cd_Disciplina INTEGER NOT NULL,
nm_Disciplina VARCHAR(20) NOT NULL
PRIMARY KEY (cd_Disciplina)
);

CREATE TABLE Professor(
cd_Professor INTEGER NOT NULL,
cd_Disciplina INTEGER NULL,
nm_professor VARCHAR (30),
PRIMARY KEY (cd_Professor),
FOREIGN KEY (cd_Disciplina)
REFERENCES Disciplina (cd_Disciplina)
);

CREATE TABLE Telefone(
cd_Telefone INTEGER NOT NULL,
cd_Professor INTEGER NOT NULL,
ds_Telefone VARCHAR(9),
PRIMARY KEY (cd_Telefone),
FOREIGN KEY (cd_Professor)
REFERENCES Professor (cd_Professor)
);


Insira também alguns dados em suas tabelas:

INSERT INTO Disciplina
(cd_Disciplina,nm_Disciplina) 
VALUES
(1,'ESTRUT DE DADOS'),
(2,'ANALISE DE SIST. III'),
(3,'LINGUAG. E TEC. DE P'),
(4,'METODOL. CIENTIFICA '),
(5,'PRATICA DE PROG. I'),
(6,'SIST. OPERACIONAIS I'),
(7,'TELEPROCESSAMENTO'),
(8,'TEORIA DOS GRAFOS I'),
(9,'COMPILADORES I'),
(10,'EMPREENDEDORISMO I') 
INSERT INTO Professor
VALUES
(1,1,'ANA MARIA'),
(2,1,'MARCIA'),
(3,1,'WILMA'),
(4,2,'VILMA'),
(5,2,'ANTONIO CARLOS'),
(6,2,'WILSON'),
(7,3,'FABIO'),
(8,3,'MARCELO'),
(9,3,'TERTULIANO S'),
(10,7,'TERTULIANO T'),
(11,7,'LIDIANE'),
(12,7,'HELENA'),
(13,9,'WAGNER'),
(14,9,'MAURICIO'),
(15,9,'ANDRE'),
(16,4,'ANDREIA'),
(17,4,'MARCO ANTONIO'),
(18,4,'ALEXANDRE ST'),
(19,5,'ALEXANDRE SO'),
(20,5,'BRUNO'),
(21,5,'KATIA')
INSERT INTO Telefone
VALUES
(1,1,'8811-2113'),
(2,11,'8112-4751'),
(3,12,'3564-3647'),
(4,7,'3406-1085'),
(5,13,'9192-1106'),
(6,4,'9192-4356'),
(7,10,'9667-0934'),
(8,5,'8811-2113'),
(9,21,'8112-4751'),
(10,6,'3564-3647'),
(11,20,'3406-1085'),
(12,17,'9609-0934'),
(13,19,'9723-2345'),
(14,8,'3102-3984')



Ótimo, após confiram fazendo os seguinte teste:

SELECT * FROM Disciplina
SELECT * FROM Professor
SELECT * FROM Telefone


Resultado:


Ótimo. Obtendo esse resultado podemos então construir um select um tanto ousado:
Experimente:





SELECT 
PRF.nm_Professor AS [Nome do Docente], 
TEL.ds_Telefone AS [Nº Telefônico],
DSC.nm_Disciplina AS Disciplina
FROM Professor AS PRF
INNER JOIN Telefone AS TEL 
ON PRF.cd_Professor = TEL.cd_Professor
RIGHT JOIN Disciplina AS DSC
ON PRF.cd_Disciplina = DSC.cd_Disciplina


O resultado será esse:




Bom vejamos então, "Nome do Docente", "Nº Telefônico" e "Disciplina". Agora analise os dados. Na coluna "Nome do Docente", existem alguns campos que retornaram NULL, assim como em "Nº Telefone", mas isso em nenhum momento aconteceu com "Disciplina". Por que isso?
Vamos entender então como funciona o right join. Quando a busca pede que recupere todos os professores que possuem telefone ela o faz. Porém o que fizemos de diferente foi exigir que todas as disciplinas fossem recuperadas, nem todas possuem professores que a lecionem. Nesse caso a matéria e apresentada sem nenhum docente. Dê uma olhada na tabela de Professores. Repare que são 21 registros:



E nem todos aparecem, na consulta que fizemos. No entanto na tabela de disciplinas:


Agora veja a consulta que montamos mais o select da tabela disciplinas. Repare que as disciplinas que são apresentadas na tabela ordenamo resultado da consulta. Isso porque foi dado preferência aos dados da tabela disciplina. 

A syntax:

SELECT Coluna(s)
FROM Tabela_Tal
RIGHT JOIN Outra_tabela
ON Tabela_Tal.ColunaCódigo = Outra_tabela.ColunaCódigo



Para quem gosta de tutoriais, indico pra você esse link. Você precisa entender um pouco de inglês se quiser entender o que o narrador diz, mas só pelas imagens muito se dá pra entender.


Obrigada. Se tiverem alguma dúvida ou ideia para um novo tópico, por favor me contatem.