Dicas de SQL para Iniciantes: Consultando Proprietários de Animais de Estimação (Joins)

Audrey-Albuquerque - Oct 8 - - Dev Community

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;
Enter fullscreen mode Exit fullscreen mode

e em seguida o raiozinho com o número 1.
Esse botão nos permite executar uma linha de cada vez.

Image description

o check verdinho indica que tudo deu certo na criação do nosso Banco

Image description

e você pode salvar esse Script, indo em File, save Script as :

Image description

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;

Image description

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.

Image description

  1. Vamos criar a tabela Pessoa primeiro, pois ela será a nossa chave estrangeira nas outras duas tabelas:

Image description

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.

  1. Em seguida, as demais tabelas:

Image description

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.

Image description

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.

Image description

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.

Image description

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.

Image description

Consultando as tabelas

Com o comando SELECT * FROM seguido do nome da tabela, podemos visualizar todos os valores presentes nela. A sintaxe é a seguinte:

Image description

Image description

Image description

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;
Enter fullscreen mode Exit fullscreen mode

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.

Image description

Image description

2. LEFT JOIN:

SELECT 
    Pessoa.nome_pessoa, 
    Gato.nome 
FROM 
    Pessoa 
LEFT JOIN 
    Gato 
ON 
    Pessoa.id_pessoa = Gato.id_proprietario;
Enter fullscreen mode Exit fullscreen mode

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.

Image description

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;
Enter fullscreen mode Exit fullscreen mode

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.

Image description

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.

Image description

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;
Enter fullscreen mode Exit fullscreen mode

Image description

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;
Enter fullscreen mode Exit fullscreen mode

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).

Image description

Image description

.
Terabox Video Player