Article image
Emanoel Rosa
Emanoel Rosa09/08/2024 02:04
Compartilhe

Introdução aos Bancos de Dados Relacionais: Um Guia Prático com Comandos SQL

  • #SQL
  • #Banco de Dados
  • #Banco de dados relacional

Introdução

Este artigo foi baseado no curso de Introdução a Bancos de Dados Relacionais oferecido pela DIO (Digital Innovation One). O objetivo é fornecer uma visão geral dos conceitos fundamentais de bancos de dados relacionais, abordando a criação e manipulação de tabelas, operações de consulta, atualização e exclusão de dados, bem como o uso de junções e subconsultas.

Os bancos de dados relacionais são fundamentais na organização, armazenamento e recuperação de dados em diversos tipos de sistemas, desde aplicativos simples até grandes plataformas corporativas. Neste artigo, vamos explorar os conceitos básicos dos bancos de dados relacionais, utilizando comandos SQL como base para entender sua estrutura e funcionamento.

O que é um Banco de Dados Relacional?

Um banco de dados relacional é um sistema de gerenciamento de dados que organiza informações em tabelas. Essas tabelas são compostas por linhas (registros) e colunas (campos), onde cada coluna possui um tipo de dado específico. A chave para a estrutura relacional é a capacidade de relacionar tabelas entre si por meio de chaves primárias e estrangeiras, criando uma rede de informações conectadas.

Criando Tabelas no Banco de Dados

Para começar, vamos criar algumas tabelas básicas para ilustrar como os dados podem ser organizados em um banco de dados relacional. As tabelas que criaremos armazenam informações sobre usuários, destinos de viagens e reservas.

CREATE TABLE usuarios (
id INT,
nome VARCHAR(255) NOT NULL COMMENT 'Nome do usuário',
email VARCHAR(255) NOT NULL UNIQUE COMMENT 'Endereço de e-mail do usuário',
data_nascimento DATE NOT NULL COMMENT 'Data de nascimento do usuário',
endereco VARCHAR(50) NOT NULL COMMENT 'Endereço do Cliente'
);

Aqui, estamos criando a tabela usuarios, que armazena informações pessoais de usuários, como nome, e-mail, data de nascimento e endereço.

CREATE TABLE viagens.destinos (
id INT,
nome VARCHAR(255) NOT NULL UNIQUE COMMENT 'Nome do destino',
descricao VARCHAR(255) NOT NULL COMMENT 'Descrição do destino'
);

A tabela destinos, por sua vez, armazena os diferentes destinos de viagem, com campos para o nome e descrição de cada destino.

CREATE TABLE viagens.reservas (
id INT COMMENT 'Identificador único da reserva',
id_usuario INT COMMENT 'Referência ao ID do usuário que fez a reserva',
id_destino INT COMMENT 'Referência ao ID do destino da reserva',
data DATE COMMENT 'Data da reserva',
status VARCHAR(255) DEFAULT 'pendente' COMMENT 'Status da reserva (confirmada, pendente, cancelada, etc.)'
);

Por fim, a tabela reservas registra as reservas feitas pelos usuários, relacionando-as com os destinos de viagem.

Inserindo Dados nas Tabelas

Uma vez criadas as tabelas, podemos começar a inserir dados nelas. Vamos adicionar alguns registros de exemplo.

INSERT INTO usuarios (id, nome, email, data_nascimento, endereco) VALUES 
(1, 'João Silva', 'joao@example.com', '1990-05-15', 'Rua A, 123, Cidade X, Estado Y'),
(2, 'Maria Santos', 'maria@example.com', '1985-08-22', 'Rua B, 456, Cidade Y, Estado Z'),
(3, 'Pedro Souza', 'pedro@example.com', '1998-02-10', 'Avenida C, 789, Cidade X, Estado Y');
INSERT INTO viagens.destinos (id, nome, descricao) VALUES 
(1, 'Praia das Tartarugas', 'Uma bela praia com areias brancas e mar cristalino'),
(2, 'Cachoeira do Vale Verde', 'Uma cachoeira exuberante cercada por natureza'),
(3, 'Cidade Histórica de Pedra Alta', 'Uma cidade rica em história e arquitetura');
INSERT INTO viagens.reservas (id, id_usuario, id_destino, data, status) VALUES 
(1, 1, 2, '2023-07-10', 'confirmada'),
(2, 2, 1, '2023-08-05', 'pendente'),
(3, 3, 3, '2023-09-20', 'cancelada');

Consultando Dados com SELECT

Uma das principais operações em um banco de dados relacional é a consulta de dados. O comando SELECT permite recuperar informações de uma ou mais tabelas.

Para selecionar todos os registros da tabela usuarios, usamos o comando:

SELECT * FROM usuarios;

Se quisermos apenas os nomes e e-mails dos usuários, podemos refinar a consulta:

SELECT nome, email FROM usuarios;

E aplicar filtros para buscar informações específicas, como nome de usuários ou usuários nascidos antes de 1990:

SELECT * FROM usuarios WHERE nome = 'João Silva';

SELECT * FROM usuarios WHERE data_nascimento < '1990-01-01';

O operador LIKE permite realizar pesquisas com padrões. Aqui, %Silva% indica que estamos procurando por qualquer nome que contenha "Silva" em qualquer posição:

SELECT * FROM usuarios WHERE nome LIKE '%Silva%';

Neste exemplo, Jo_o% é um padrão onde "Jo" são os primeiros dois caracteres, _ representa qualquer caractere único (neste caso, o terceiro caractere), e % indica qualquer sequência de caracteres que segue o padrão:

SELECT * FROM usuarios WHERE nome LIKE 'Jo_o%';

Atualizando e Excluindo Dados

Além de consultar dados, também é possível atualizá-los ou removê-los. Por exemplo, para atualizar o endereço de um usuário:

UPDATE usuarios SET endereco = 'Nova Rua, 123' WHERE email = 'joao@example.com';

Cuidados ao usar UPDATE:

  • Condição Específica: Sempre utilize uma cláusula WHERE para garantir que apenas os registros desejados sejam atualizados. Sem WHERE, todos os registros na tabela serão alterados.
  • Verificação dos Dados: Antes de executar a atualização, verifique se a condição WHERE é precisa para evitar a modificação de dados incorretos.
  • Backup: Considere fazer um backup da tabela antes de realizar atualizações significativas.

Para excluir uma reserva cancelada, usamos:

DELETE FROM reservas WHERE status = 'cancelada';

Cuidados ao usar DELETE:

  • Condição Específica: Assim como com UPDATE, a cláusula WHERE é essencial para garantir que apenas os registros desejados sejam excluídos. Sem WHERE, todos os registros da tabela serão removidos.
  • Verificação dos Dados: Revise a condição WHERE para garantir que ela está correta e que você não está excluindo dados importantes.
  • Backup: Faça um backup da tabela ou banco de dados antes de executar exclusões, especialmente se for uma operação em grande escala.

O comando DROP TABLE remove completamente uma tabela do banco de dados, incluindo todos os dados, estrutura e definições da tabela. Neste exemplo, estamos removendo a tabela usuarios.

DROP TABLE usuarios;

Cuidados ao usar DROP TABLE:

  • Irreversibilidade: O comando DROP TABLE é irreversível. Uma vez executado, todos os dados e a estrutura da tabela são permanentemente excluídos. Certifique-se de que a exclusão é realmente necessária.
  • Backup: Sempre faça um backup completo do banco de dados ou da tabela antes de usar DROP TABLE, especialmente se houver dados valiosos ou irrepetíveis.
  • Dependências: Verifique se a tabela tem relações com outras tabelas (chaves estrangeiras) e se a exclusão pode afetar essas relações.

Relacionando Tabelas: Chaves Estrangeiras

Em bancos de dados relacionais, é comum relacionar dados de diferentes tabelas usando chaves estrangeiras. Vamos adicionar essas relações:

ALTER TABLE reservas
ADD CONSTRAINT fk_reservas_usuarios
FOREIGN KEY (id_usuario) REFERENCES usuarios(id);
ALTER TABLE reservas
ADD CONSTRAINT fk_reservas_destinos
FOREIGN KEY (id_destino) REFERENCES destinos(id);

Operações Avançadas: Subconsultas e Agregações

Subconsultas são consultas aninhadas dentro de outra consulta. Elas são úteis para filtrar dados com base em critérios complexos que não podem ser obtidos diretamente.

Esta subconsulta identifica os usuários que ainda não realizaram reservas:

SELECT nome
FROM usuarios
WHERE id NOT IN (SELECT id_usuario FROM reservas);

Aqui, identificamos os destinos que não têm reservas:

SELECT nome
FROM destinos
WHERE id NOT IN (SELECT id_destino FROM reservas)
ORDER BY id;

As funções de agregação são usadas para realizar cálculos sobre um conjunto de valores, como contar registros, somar valores ou calcular médias.

Esta consulta retorna o nome de cada usuário junto com o total de reservas que eles fizeram:

SELECT nome, (SELECT COUNT(*) FROM reservas WHERE id_usuario = usuarios.id) AS total_reservas
FROM usuarios;

Para contar o número total de registros na tabela usuarios:

SELECT COUNT(*) FROM usuarios;

Calcula a média de idade dos usuários:

SELECT AVG(TIMESTAMPDIFF(YEAR, data_nascimento, CURRENT_DATE())) AS idade
FROM usuarios;

Para somar todas as idades dos usuários:

SELECT SUM(TIMESTAMPDIFF(YEAR, data_nascimento, CURRENT_DATE())) AS media_idade
FROM usuarios;

Para encontrar a menor e maior idade entre os usuários:

SELECT MIN(TIMESTAMPDIFF(YEAR, data_nascimento, CURRENT_DATE())) AS menor_idade
FROM usuarios;

SELECT MAX(TIMESTAMPDIFF(YEAR, data_nascimento, CURRENT_DATE())) AS maior_idade
FROM usuarios;

Esta consulta retorna o número total de reservas para cada destino:

SELECT *, COUNT(*) AS total_reservas 
FROM reservas 
GROUP BY id_destino;

A ordenação e a limitação são técnicas usadas para organizar os resultados de uma consulta e controlar quantos registros serão retornados.

Para ordenar os usuários alfabeticamente:

SELECT nome
FROM usuarios
ORDER BY nome;

Ordenando primeiro por data de nascimento e depois por nome:

SELECT nome, data_nascimento
FROM usuarios
ORDER BY data_nascimento, nome;

A opção DESC pode ser usada para ordenar de forma decrescente:

SELECT nome, data_nascimento
FROM usuarios
ORDER BY data_nascimento, nome DESC;

Para retornar um número limitado de resultados após a ordenação:

SELECT *, COUNT(*) AS total_reservas 
FROM reservas 
GROUP BY id_destino 
LIMIT 1;

Para pular os primeiros resultados e retornar a partir do terceiro:

SELECT *, COUNT(*) AS total_reservas 
FROM reservas 
GROUP BY id_destino 
LIMIT 1 OFFSET 2;

Operações de JOIN

Para combinar dados de diferentes tabelas, utilizamos operações de JOIN:

INNER JOIN: Retorna registros que têm correspondências em ambas as tabelas.

SELECT * FROM usuarios us
INNER JOIN reservas rs ON us.id = rs.id_usuario;

LEFT JOIN: Retorna todos os registros da tabela à esquerda e os registros correspondentes da tabela à direita. Se não houver correspondência, retorna NULL para as colunas da tabela à direita.

SELECT * FROM destinos des
LEFT JOIN reservas rs ON des.id = rs.id_destino;

RIGHT JOIN: Retorna todos os registros da tabela à direita e os registros correspondentes da tabela à esquerda. Se não houver correspondência, retorna NULL para as colunas da tabela à esquerda.

SELECT * FROM reservas rs
RIGHT JOIN destinos des ON des.id = rs.id_destino;

FULL JOIN: Retorna todos os registros quando há uma correspondência em uma das tabelas. Se não houver correspondência, retorna NULL para as colunas sem correspondência.

Nota: O FULL JOIN pode não ser suportado por todos os sistemas de banco de dados.

Conclusão

Neste artigo, exploramos os fundamentos dos bancos de dados relacionais, cobrindo desde a criação e manipulação de tabelas até operações de consulta, atualização e exclusão de dados. Discutimos também o uso de junções para combinar informações de múltiplas tabelas e a importância das subconsultas e agregações na análise de dados.

Esses conceitos são a base para o gerenciamento eficaz de dados e a construção de sistemas de informação robustos. Contudo, este é apenas o início. Para dominar completamente os bancos de dados relacionais, é fundamental aprofundar-se continuamente e praticar técnicas avançadas. Recomendamos a continuidade do estudo e a exploração de materiais adicionais e cursos especializados para expandir seu conhecimento e habilidades neste campo essencial da tecnologia da informação.

Compartilhe
Comentários (1)
David Souza
David Souza - 09/08/2024 14:59

Excelente artigo! Enriquecedor, parabéns.