Inner Join
Os joins são extremamente úteis para a recuperação de informações. Eles permitem interligar tabelas, ou seja, recuperar informações que estão armazenadas em mais de uma tabela em uma única consulta. Este processo só é possível se existir vínculo entre as tabelas, que é o que acontece quando se adiciona uma chave estrangeira em uma tabela, referenciando a chave primária de outra tabela. É um conceito bastante simples. Vamos analisar atentamente a figura abaixo:
Se você observar atentamente verá que as tabelas estão interligadas através das colunas "Modelo". Bem, vou criar essas tabelas na nossa base de dados "Teste" e vamos entender como o Join funciona.
Create table carro(
modelo varchar(40),
cor varchar(20),
qtde_portas int,
combustivel varchar(20),
montadora varchar(20),
primary key(modelo)) Engine=innoDB;
Create table preco(
modelo varchar(40),
valor float,
primary key(modelo),
foreign key(modelo) references carro(modelo)) Engine=InnoDB;
Agora nossa base de dados possui essas duas tabelas, conforme figura abaixo:
Agora vou inserir os dados conforme a ilustração número 1;
INSERT INTO carro VALUES("Gol I Motion 1.6 MI Total Flex 8V 4P", "Preto", 4, "Flex", "Volkswagen");
INSERT INTO carro VALUES ("Palio Weekend Trekking 1.8 MPI Flex 8V", "Azul", 2, "Flex", "FIAT");
INSERT INTO carro VALUES ("Ka Sport 1.6 8V Flex 2P", "Prata", 2, "Flex", "Ford");
INSERT INTO carro VALUES("Corsa Hat Maxx 1.4 8V ECONOFLEX", "Vermelho", 2, "Flex", "GM");
INSERT INTO carro VALUES ("EDGE LIMITED 3.5 V6 24V AWD Aut.", "Preto", 4, "Gasolina", "Ford");
INSERT INTO carro VALUES ("Jetta 2.0 TSI 16V 4P Tiptronic", "Preto", 4, "Gasolina", "Volkswagen");
INSERT INTO preco VALUES ("Gol I Motion 1.6 MI Total Flex 8V 4P", "36900.00");
INSERT INTO preco VALUES ("Palio Weekend Trekking 1.8 MPI Flex 8V", "44000");
INSERT INTO preco VALUES ("Ka Sport 1.6 8V Flex 2P", "36100");
INSERT INTO preco VALUES ("Corsa Hat Maxx 1.4 8V ECONOFLEX", "31200");
INSERT INTO preco VALUES ("EDGE LIMITED 3.5 V6 24V AWD Aut.", "152500");
INSERT INTO preco VALUES ("Jetta 2.0 TSI 16V 4P Tiptronic", "95000");
Nós temos, na tabela "preço", o valor dos carros referente a cada modelo. Já na tabela "carro" nós temos o modelo, a quantidade de portas, a cor, o combustível e a montadora. No entanto podemos precisar saber qual o preço de todos os carros cujo combustível seja gasolina. Essas informações estão em tabelas separadas, mas que podem ser ligadas através da coluna que elas possuem em comum, que é a coluna "Modelo".
Essa busca de dados interligando mais de uma tabela é, como já foi dito, um Join. Quando precisamos citar mais de uma tabela em nosso comando SQL, devemos dizer qual é a tabela que estamos acessando, em seguida, separado por um ponto, referenciarmos a coluna. Por exemplo: vamos imaginar que tivéssemos uma tabela chamada "aluno" com uma coluna "nome" e uma tabela "escola" com uma coluna "telefone". Se quiséssemos fazer um SELECT exibindo os dados desses dois campos, isso seria feito da seguinte forma:
Vamos ver como fica o comando que nos mostra quais são os preços dos carros cujo combustível seja a Gasolina, considerando que esses dados estão parte na tabela "carro" e parte na tabela "preco":
SELECT carro.modelo AS Modelo, carro.combustivel AS ‘Combustível’, preco.valor AS ‘Preço’ FROM carro, preco WHERE carro.modelo = preco.modelo AND carro.combustivel like ‘Gasolina’;
O comando comentado é:
Vejam que as informações foram cruzadas corretamente e conseguimos montar o que parece ser uma única tabela, mas contendo os dados de tabelas distintas. A essa ligação entre tabelas em que se usa como referência a chave primária de uma e a chave estrangeira de outra, chamamos Inner Join.
O MySQL, assim como outros grandes SGBDs, aceita que você use esse rótulo para realizar suas consultas, em vez de utilizar o parâmetro WHERE, da seguinte forma:
SELECT carro.modelo AS Modelo, combustivel AS 'Combustível', valor AS 'Preço' FROM carro INNER JOIN preco ON carro.modelo = preco.modelo AND carro.combus tivel LIKE 'Gasolina';
Vejam que no lugar de WHERE eu utilizei o termo INNER JOIN e, com o parâmetro ON, especifiquei quais campos seriam comparados.
Observação!
Assim como nos comandos UPDATE e DELETE é fundamental que você especifique quais tuplas devem ser alvo do seu comando, nos Joins isso também é muito importante. Caso você não especifique, o SGDB fará o produto cartesiano das tabelas envolvidas, retornando dados que provavelmente não terão utilidade para você. Vejam o retorno do seguinte comando:
SELECT carro.modelo AS Modelo, carro.combustivel AS 'Combustível', preco.valor AS 'Preço' FROM carro, preco;
Vejam que o sistema nos retornou 36 tuplas, que é o produto das 6 tuplas da tabela "carro" com as 6 da tabela "preco". Notem que existem informações absurdas nesse retorno, já que um mesmo carro tem 6 preços diferentes. A esse produto cartesiano entre as tabelas, damos o nome de Cross Join. Ou seja, sempre que não quiser o produto entre todos os itens das tabelas, o que deve acontecer na maioria esmagadora dos casos, lembre sempre de sempre utilizar o parâmetro WHERE para especificar os campos que devem ser igualados.
É isso! O temido assunto Join nada mais é do que o cruzamento de dados de mais de uma tabela! Aqui vimos o Inner e o Cross, mas existem outros tipos, que veremos na sequência.