Dicas de SQL para Iniciantes: Consultando Proprietários de Animais de Estimação (Joins)
Audrey-Albuquerque
Posted on October 8, 2024
O SGBD escolhido para essa amostra foi o MySql, e seu Workbench.
Vamos criar um banco de dados.
Imagine que temos um hotelzinho de pets e vamos hospedar Gatos e Caezinhos. Precisamos também ter o nome de seus donos, chamaremos essa tabela de Pessoa.
As tabelas serão simples para focar no conceito.
Explicando o Projeto
Tabelas:
Gato: 🐈⬛contém os gatos que estão no hotelzinho.
- id_gato
- nome_gato
- id_pessoa
Cachorro: 🐕🦺contém os cachorros que estão no hotelzinho.
- id_cachorro
- nome_cachorro
- id_pessoa
Pessoa: 🚶🏻♂️contém as pessoas que são donas dos pets.
- id_pessoa
- nome_pessoa
- cpf
Criando o Banco
Vamos iniciar nosso banco:
Logo que abrimos os schemas temos a query1. Vamos utilizá-la.
Digitamos o comando:
CREATE DATABASE hotelzinho;
e em seguida o raiozinho com o número 1.
Esse botão nos permite executar uma linha de cada vez.
o check verdinho indica que tudo deu certo na criação do nosso Banco
e você pode salvar esse Script, indo em File, save Script as :
Aqui eu salvei como HotelzinhoPets em uma pasta somente de Scripts Sql que facilitam a minha vida.😄
Para criarmos tabelas dentro do nosso banco hotelzinho temos que indicar que queremos usar o banco. Para isso precisamos do comando:
USE hotelzinho;
Para executar um comando no MySQL Workbench, basta posicionar o cursor na linha desejada e clicar no botão: "Execute o comando debaixo do meu cursor". Eu prefiro chamar esse botão de "raio único", ok? 😊
Quando o comando for executado com sucesso, um check verde aparecerá, indicando que tudo está correto.
Criando as Tabelas
Agora, vamos criar as tabelas Pessoa, Gato e Cachorro.
⚠️ Dica: Se você preferir usar os nomes das tabelas no plural (como Gatos, Cachorros e Pessoas), certifique-se de que todas as tabelas sigam esse padrão. Isso mantém o projeto dentro das boas práticas de consistência na nomeação.
- Vamos criar a tabela Pessoa primeiro, pois ela será a nossa chave estrangeira nas outras duas tabelas:
Este comando cria uma tabela chamada Pessoa que armazena informações sobre pessoas, com três colunas: id_pessoa, nome_pessoa e cpf.
A coluna id_pessoa é um identificador único que se incrementa automaticamente, enquanto nome_pessoa e cpf devem ser fornecidos sempre que uma nova pessoa é adicionada, garantindo que o CPF seja único na tabela.
- Em seguida, as demais tabelas:
Nessas outras tabelas Cachorro e Gato, podemos dar um nome que faça mais sentido para o dono do pet. Por exemplo, podemos chamar a pessoa de Proprietário na tabela Gato, o que torna a relação mais intuitiva.
Dessa forma, o nome da coluna será id_proprietario, e ela ainda funcionará como uma Foreign Key, referenciando a chave primária da tabela Pessoa.
Isso deixa claro tanto o propósito da coluna quanto o processo de criação da chave estrangeira, mantendo a integridade do banco de dados.
Posicione o cursor em cima da primeira linha de cada comando de criação de tabela e clique no botão raio único para executar, uma tabela de cada vez. Isso permite que você crie as tabelas separadamente e garanta que cada uma seja processada corretamente.
sucesso!
Até o momento, usamos comandos DDL (Data Definition Language) do SQL, que são responsáveis pela definição e estruturação do banco de dados. Esses comandos incluem a criação de tabelas e a definição de chaves estrangeiras, como vimos nos exemplos anteriores.
Inserindo Valores nas Tabelas
A partir de agora, vamos usar um pouco de DML (Data Manipulation Language), que é responsável por manipular nossos dados. Com esses comandos, vamos inserir valores nas colunas das tabelas que criamos para podermos utilizar os Joins em seguida.
Para inserir os dados em uma tabela em que o Id é do tipo Auto_increment, não é necessário lhe dar algum valor. Isso é feito automaticamente.
Usamos o comando INSERT INTO seguido do nome da tabela. Em seguida, abrimos parênteses e digitamos os nomes das colunas que queremos popular. Fechamos os parênteses e acrescentamos a palavra VALUES.
Para cada registro, abrimos parênteses, inserimos os valores separados por vírgula, e, quando chegamos ao final, usamos o ponto e vírgula para finalizar o comando.
Ao final da inserção de cada tabela, é importante clicar no Raio único, para que a próxima tabela possa usar corretamente o id_proprietario ao referenciar a tabela Pessoa. Isso garante que o relacionamento entre as tabelas seja feito corretamente.
Fazemos isso também com as demais tabelas, garantindo que cada uma seja inserida e relacionada adequadamente.
Consultando as tabelas
Com o comando SELECT * FROM seguido do nome da tabela, podemos visualizar todos os valores presentes nela. A sintaxe é a seguinte:
1. INNER JOIN - Listando todas as Pessoas que têm gatos no hotelzinho
Agora, precisamos saber a lista de todas as pessoas que deixaram seus gatos em nosso hotel. Queremos ofertar uma raçao especial para estes proprietários de gatos.
SELECT
Pessoa.nome_pessoa,
Gato.nome
FROM
Pessoa
INNER JOIN
Gato
ON
Pessoa.id_pessoa = Gato.id_proprietario;
Traduzindo a Consulta:
Select Pessoa.nome_pessoa, Gato.nome
isso é o que eu preciso na minha consulta:
o nome da pessoa, na tabela Pessoa, e o nome na tabela Gato.
Poderiam ter mais atributos, como telefone, se fosse o caso, ou o cpf, email, etc
Em seguida
FROM Pessoa INNER JOIN Gato
FROM: Esta palavra-chave indica de qual tabela queremos recuperar os dados.
Pessoa: Estamos especificando que a tabela principal de onde vamos buscar os dados é a tabela Pessoa. Ou seja, as informações que você obtém inicialmente virão desta tabela.
INNER JOIN: Este comando indica que estamos combinando (ou "juntando") a tabela Pessoa com outra tabela, que neste caso é a tabela Gato. O INNER JOIN retorna apenas as linhas que têm correspondência em ambas as tabelas.
Gato: Estamos especificando que a segunda tabela que queremos juntar à tabela Pessoa é a tabela Gato. Isso significa que estamos interessados em obter dados de ambas as tabelas.
ON Pessoa.id_pessoa = Gato.id_proprietario;
ON aqui podemos entender o ON como um EM QUE o id_pessoa na tabela Pessoa seja igual ao id_proprietario na tabela Gato.
2. LEFT JOIN:
SELECT
Pessoa.nome_pessoa,
Gato.nome
FROM
Pessoa
LEFT JOIN
Gato
ON
Pessoa.id_pessoa = Gato.id_proprietario;
O LEFT JOIN é como se você estivesse dizendo: "Quero ver todas as pessoas, e se elas tiverem gatos, mostre os gatos também. Se não tiver, tudo bem, só mostre as pessoas mesmo!"
Dessa forma, o LEFT JOIN garante que todas as Pessoa sejam vistos, mesmo que alguns não tenham Gato.
Note que Roberto Carlos e a Mariana não tem gato, mas estão aparecendo. Esse é o Left Join.
3. RIGHT JOIN
O RIGHT JOIN retorna todas as linhas da tabela à direita (Cachorro) e as linhas correspondentes da tabela à esquerda (Pessoa). Se não houver correspondência, os resultados da tabela à esquerda serão NULL.
SELECT
Pessoa.nome_pessoa,
Cachorro.nome
FROM
Pessoa
RIGHT JOIN
Cachorro
ON
Pessoa.id_pessoa = Cachorro.id_proprietario;
Esse comando retorna todos os cachorros, incluindo aqueles que não têm um proprietário registrado. Mas no nosso hotelzinho todos os cachorros tem seus proprietários, por isso nao tivemos um null.
4. FULL OUTER JOIN
O FULL OUTER JOIN retorna todas as linhas quando há uma correspondência em uma das tabelas. Porém, esse tipo de JOIN não é suportado diretamente pelo MySQL. Você pode simular um FULL OUTER JOIN usando a combinação de LEFT JOIN e RIGHT JOIN.
Se por exemplo tivéssemos Gatos sem o id_proprietario apareceria aqui com essa consulta:
SELECT
Pessoa.nome_pessoa,
Gato.nome
FROM
Pessoa
LEFT JOIN
Gato
ON
Pessoa.id_pessoa = Gato.id_proprietario
UNION
SELECT
Pessoa.nome_pessoa,
Gato.nome
FROM
Pessoa
RIGHT JOIN
Gato
ON
Pessoa.id_pessoa = Gato.id_proprietario;
Agora precisamos de uma última consulta. Precisamos de uma listagem por Pessoa de todos os animais que elas tem. Cachorros, Gatos ou ambos
SELECT
Pessoa.nome_pessoa,cpf,
Gato.nome AS nome_gato,
Cachorro.nome AS nome_cachorro
FROM
Pessoa
LEFT JOIN
Gato ON Pessoa.id_pessoa = Gato.id_proprietario
LEFT JOIN
Cachorro ON Pessoa.id_pessoa = Cachorro.id_proprietario;
Explicação da Consulta
SELECT: Estamos selecionando o nome da pessoa, o cpf dela; o nome do gato e o nome do cachorro. E como quero identificar os nomes dos animais de um modo mais específico, passo Gato.nome As nome_gato. A palavra-chave AS significa Como
FROM: Começamos pela tabela Pessoa, que é a nossa tabela principal.
LEFT JOIN:
Gato: Estamos unindo a tabela Gato à tabela Pessoa usando a coluna id_proprietario. Isso traz os gatos dos proprietários.
Cachorro: Fazemos o mesmo para a tabela Cachorro.
Resultado: Esta consulta retorna todos os proprietários. Se um proprietário não tiver um gato ou um cachorro, o resultado mostrará NULL (ou uma célula em branco, dependendo do cliente SQL que você está usando).
Posted on October 8, 2024
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.