Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Dúvida no Ex. 1 da Aula 7 - Entendendo o LEFT JOIN

no caso do left join / right join ;

o left join vai pegar o lado esquerdo da tabela ! no caso o que estiver do lado esquerdo do join ? ex.:

"select * from tabela_A left join tabela_B ..."

ele vai considerar a tabela_A como sendo lado esquerdo, ou seja o que esta do lado esquerdo do join ?

deu pra entender minha duvida ?

3 respostas

Caro Julio, O conceito é basicamente assim: todos os registros da tabela_A serão retornados, mais os da tabela_B quando houver correspondência entre as duas tabelas.

Espero ter ajudado.

CREATE TABLE ALUNOS( ID INTEGER NOT NULL, NOME VARCHAR(60) NOT NULL )ENGINE=INNODB;

ALTER TABLE ALUNOS ADD CONSTRAINT PK_ALUNO PRIMARY KEY(ID);

CREATE TABLE ENDERECOS_ELETRONICOS( ID INTEGER NOT NULL, TIPO VARCHAR(20) NOT NULL, ENDERECO VARCHAR(120) NOT NULL ) ENGINE=INNODB;

ALTER TABLE ENDERECOS_ELETRONICOS ADD CONSTRAINT PK_ENDERECO_ELETRONICO PRIMARY KEY(ID, TIPO); ALTER TABLE ENDERECOS_ELETRONICOS ADD CONSTRAINT FK_ENDERECO_ELETRONICO_ALUNO FOREIGN KEY(ID) REFERENCES ALUNOS(ID); ALTER TABLE ENDERECOS_ELETRONICOS ADD CONSTRAINT CK_TIPO_ENDERECO_ELETRONICO CHECK (TIPO IN('EMAIL','SITE','TWITTER','FACEBOOK'));

INSERT INTO ALUNOS (ID, NOME) VALUES(1,'A'); INSERT INTO ALUNOS (ID, NOME) VALUES(2,'B'); INSERT INTO ALUNOS (ID, NOME) VALUES(3,'C'); INSERT INTO ALUNOS (ID, NOME) VALUES(4,'D');

INSERT INTO ENDERECOS_ELETRONICOS(ID, TIPO, ENDERECO) VALUES(1,'FACEBOOK','a.facebook.com'); INSERT INTO ENDERECOS_ELETRONICOS(ID, TIPO, ENDERECO) VALUES(1,'TWITTER','a.twitter.com'); INSERT INTO ENDERECOS_ELETRONICOS(ID, TIPO, ENDERECO) VALUES(2,'SITE','b.com.br');

SELECT A.ID, A.NOME, EE.TIPO, EE.ENDERECO FROM ALUNOS A INNER JOIN ENDERECOS_ELETRONICOS EE ON (A.ID = EE.ID);

+----+------+----------+----------------+ | ID | NOME | TIPO | ENDERECO | +----+------+----------+----------------+ | 1 | A | FACEBOOK | a.facebook.com | | 1 | A | TWITTER | a.twitter.com | | 2 | B | SITE | b.com.br | +----+------+----------+----------------+

SELECT A.ID, A.NOME, EE.TIPO, EE.ENDERECO FROM ALUNOS A LEFT JOIN ENDERECOS_ELETRONICOS EE ON (A.ID = EE.ID); +----+------+----------+----------------+ | ID | NOME | TIPO | ENDERECO | +----+------+----------+----------------+ | 1 | A | FACEBOOK | a.facebook.com | | 1 | A | TWITTER | a.twitter.com | | 2 | B | SITE | b.com.br | | 3 | C | NULL | NULL | | 4 | D | NULL | NULL | +----+------+----------+----------------+

Na primeira consulta, o inner join traz apenas os valores que casam, na segunda , o left join traz todos os valores da primeira tabela, neste caso A e insere 'null' onde não consegue fazer o casamento. Experimente trocar a posição das tabelas para ver como o resultado se altera.

solução!
CREATE TABLE ALUNOS(
  ID INTEGER NOT NULL,
  NOME VARCHAR(60) NOT NULL
)ENGINE=INNODB;

ALTER TABLE ALUNOS ADD CONSTRAINT PK_ALUNO PRIMARY KEY(ID);

CREATE TABLE ENDERECOS_ELETRONICOS(
  ID INTEGER NOT NULL,
  TIPO VARCHAR(20) NOT NULL,
  ENDERECO VARCHAR(120) NOT NULL
) ENGINE=INNODB;

ALTER TABLE ENDERECOS_ELETRONICOS ADD CONSTRAINT PK_ENDERECO_ELETRONICO PRIMARY KEY(ID, TIPO);
ALTER TABLE ENDERECOS_ELETRONICOS ADD CONSTRAINT FK_ENDERECO_ELETRONICO_ALUNO FOREIGN KEY(ID) REFERENCES ALUNOS(ID);
ALTER TABLE ENDERECOS_ELETRONICOS  ADD CONSTRAINT CK_TIPO_ENDERECO_ELETRONICO CHECK (TIPO IN('EMAIL','SITE','TWITTER','FACEBOOK'));


INSERT INTO ALUNOS (ID, NOME) VALUES(1,'A');
INSERT INTO ALUNOS (ID, NOME) VALUES(2,'B');
INSERT INTO ALUNOS (ID, NOME) VALUES(3,'C');
INSERT INTO ALUNOS (ID, NOME) VALUES(4,'D');


INSERT INTO ENDERECOS_ELETRONICOS(ID, TIPO, ENDERECO) VALUES(1,'FACEBOOK','a.facebook.com');
INSERT INTO ENDERECOS_ELETRONICOS(ID, TIPO, ENDERECO) VALUES(1,'TWITTER','a.twitter.com');
INSERT INTO ENDERECOS_ELETRONICOS(ID, TIPO, ENDERECO) VALUES(2,'SITE','b.com.br');


SELECT A.ID, A.NOME, EE.TIPO, EE.ENDERECO FROM 
ALUNOS A INNER JOIN ENDERECOS_ELETRONICOS EE
ON (A.ID = EE.ID);

+----+------+----------+----------------+
| ID | NOME | TIPO     | ENDERECO       |
+----+------+----------+----------------+
|  1 | A    | FACEBOOK | a.facebook.com |
|  1 | A    | TWITTER  | a.twitter.com  |
|  2 | B    | SITE     | b.com.br       |
+----+------+----------+----------------+




SELECT A.ID, A.NOME, EE.TIPO, EE.ENDERECO FROM 
ALUNOS A LEFT JOIN ENDERECOS_ELETRONICOS EE
ON (A.ID = EE.ID);
+----+------+----------+----------------+
| ID | NOME | TIPO     | ENDERECO       |
+----+------+----------+----------------+
|  1 | A    | FACEBOOK | a.facebook.com |
|  1 | A    | TWITTER  | a.twitter.com  |
|  2 | B    | SITE     | b.com.br       |
|  3 | C    | NULL     | NULL           |
|  4 | D    | NULL     | NULL           |
+----+------+----------+----------------+

Na primeira consulta, o inner join traz apenas os valores que casam, na segunda , o left join traz todos os valores da primeira tabela, neste caso A e insere 'null' onde não consegue fazer o casamento. Experimente trocar a posição das tabelas para ver como o resultado se altera.