terça-feira, 12 de junho de 2012

Unindo Resultados de Duas Tabelas em MySQL


Hoje iremos entender, na prática, como juntar os dados de duas Tabelas relacionadas de um Banco de Dados através de uma consulta utilizando o comando INNER JOIN. Usaremos como exemplo um cadastro simples de usuários e seus respectivos endereços. Para isto, criaremos duas tabelas, uma contendo os dados simples dos usuários e outra contendo os dados de endereço de cada um deles. Chamaremos estas Tabelas, respectivamente, usuarios e enderecos.

A Tabela usuarios conterá os campos user_id (a identificação de cada usuário), nome, email, login e senha. Já a Tabela enderecos conterá os campos end_id (o qual será o campo de identificação de cada endereço), rua_avenida, cep, bairro, cidade, estado e user_id. Mas, outro campo user_id?

Exatamente. Este campo fará o relacionamento entre as duas Tabelas, de forma que todo código user_id da Tabela usuarios esteja ligado com o código user_id da Tabela enderecos, e, assim, todos os campos desta última Tabela estejam disponíveis para que seja feita a união. Na prática, este é oRELACIONAMENTO, tanto falado nos Bancos de Dados.

Vamos agora, para a criação das Tabelas necessárias.
CREATE TABLE usuarios (
user_id INT(11) NOT NULL AUTO_INCREMENT,
nome VARCHAR(80) NOT NULL,
email VARCHAR(80) NOT NULL,
login VARCHAR(50) NOT NULL,
senha VARCHAR(50) NOT NULL,
PRIMARY KEY (user_id));
--Referente à Tabela usuarios.
CREATE TABLE enderecos (
end_id INT(11) NOT NULL AUTO_INCREMENT,
rua_avenida VARCHAR(80) NOT NULL,
cep INT(8) NOT NULL,
bairro VARCHAR(50) NOT NULL,
cidade VARCHAR(80) NOT NULL,
estado VARCHAR(80) NOT NULL,
user_id INT(11) NOT NULL,
PRIMARY KEY (end_id));
--Referente à Tabela enderecos.

Pronto. Nesta etapa as nossas Tabelas já estão feitas e com o devido Relacionamento. Note que "RELACIONAMENTO" refere-se à um modelo lógico, não há uma linha de comando que faça com que as Tabelas se relacionem, com exceção do campo chave de uma Tabela que deve fazer parte da outra Tabela; em nosso caso, o campo user_id. Este campo é o responsável pelo Relacionamento entre as duas. Após prontas as Tabelas, vamos inserir alguns dados.
INSERT INTO usuarios (
user_id, nome, email, login, senha)
VALUES (
NULL, "Pedro Aurélio Silva", "pedro.silva@gmail.com", "psilva", "bananas89");
INSERT INTO usuarios (
user_id, nome, email, login, senha)
VALUES (
NULL, "Janir Maria Mangini", "janir.mangini@terra.com.br", "jmangini", "pessegos123");

INSERT INTO usuarios (
user_id, nome, email, login, senha)
VALUES (
NULL, "Cainan Lopes Alves", "cainan.lopes@hotmail.com.br", "calves", "tibirritos");


Ok. Agora temos uma Tabela de usuários com alguns registros simples. Você pode observar que em todos os campor user_id foram inseridos valores NULL quando, na verdade, definimos o campo como valor INT. Entretando, o campo é AUTO_INCREMENT, o que significa que mesmo que seja posto um valor ou não, ele será inserido automaticamente e incrementando em mais um de acordo com os novos cadastros. Assim sendo, a Tabela usuarios possui Pedro com user_id número 1, Janir com user_id número 2 e Cainan com user_id número 3. Feito isso, vamos popular nossa Tabela de endereços, chamada enderecos (Detalhe: os endereços são meramente fictícios e não correspondem à realidade).
INSERT INTO enderecos (
end_id, rua_avenida, cep, bairro, cidade, estado, user_id)
VALUES (
NULL, "Rua Nova York", "91854350", "São Geraldo", "Porto Alegre", "Rio Grande do Sul", 1);

INSERT INTO enderecos (
end_id, rua_avenida, cep, bairro, cidade, estado, user_id)
VALUES (
NULL, "Rua São Paulo", "18845244", "São Gonçalo", "São Paulo", "São Paulo", 2);

INSERT INTO enderecos (
end_id, rua_avenida, cep, bairro, cidade, estado, user_id)
VALUES (
NULL, "Avenida Workfield", "50225411", "Bombinhas", "Ouro Preto", "Minas Gerais", 3);

Agora temos uma Tabela de usuários e seus endereços já populada. Note que a mesma regra do NULLfoi aplicada para o campo end_id e que o campo user_id foi valorado na mão, afinal, SQL não permite duplo AUTO_INCREMENT na mesma Tabela. Feito isso, agora veremos como juntar os dados.

Para realizar esta junção, utilizaremos o comando INNER JOIN, o qual tem a seguinte sintaxe: "SELECT campos FROM tabela1 INNER JOIN tabela2 ON tabela1.campo = tabela2.campo;". Vamos entender na prática. Utilize o código abaixo:

"SELECT * FROM usuarios INNER JOIN enderecos ON usuarios.user_id = enderecos.user_id;"

Desta forma, resultamos todos os campos da Tabela usuarios e enderecos onde o campo user_id da Tabela usuario seja igual ao campo user_id da Tabela enderecos.

Podemos também selecionar apenas alguns campos, se quisermos utilizando a sintaxe: "SELECT tabela1.campo, tabela2.campo FROM tabela1 INNER JOIN tabela2 ON tabela1.campo = tabela2.campo;". Selecione todos os campos que você desejar da Tabela número 1, separados por nomedatabela.respectivocampo e logo em seguida os campos da Tabela número 2, também separados da mesma forma. Desta forma, temos:

"SELECT usuarios.nome, usuarios.email, usuarios.login, usuarios.senha, enderecos.rua_avenida, enderecos.cep, enderecos.bairro, enderecos.cidade, enderecos.estado FROM usuarios INNERJOIN enderecos ON usuarios.user_id = enderecos.user_id;"

Da forma acima, obtemos a resposta somente dos campos selecionados e não de toda a tabela. Isso facilita a leitura, deixando-a mais ágil.

Agora, mãos a obra! Vamos produzir mais tabelas, faça seu teste! Um exercício que recomendo é criar uma Tabela de livros e uma Tabela de autores, interligá-las através de um campo comum e realizar a execução da leitura. Você vai ver como é fácil.
Até a próxima.

Nenhum comentário:

Postar um comentário