├── README.md ├── aula3-1.sql ├── aula3.2.sql ├── aula3.3.sql ├── aula3.4.sql ├── aula3.5.sql ├── aula4-1.sql ├── aula5-1.sql ├── aula5-2.sql └── aula5-3.sql /README.md: -------------------------------------------------------------------------------- 1 | # dio-bd-relacional -------------------------------------------------------------------------------- /aula3-1.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE usuarios ( 2 | id INT, 3 | nome VARCHAR(255) NOT NULL COMMENT 'Nome do usuário', 4 | email VARCHAR(255) NOT NULL UNIQUE COMMENT 'Endereço de e-mail do usuário', 5 | data_nascimento DATE NOT NULL COMMENT 'Data de nascimento do usuário', 6 | endereco VARCHAR(50) NOT NULL COMMENT 'Endereço do Cliente' 7 | ); 8 | 9 | CREATE TABLE viagens.destinos ( 10 | id INT, 11 | nome VARCHAR(255) NOT NULL UNIQUE COMMENT 'Nome do destino', 12 | descricao VARCHAR(255) NOT NULL COMMENT 'Descrição do destino' 13 | ); 14 | 15 | CREATE TABLE viagens.reservas ( 16 | id INT COMMENT 'Identificador único da reserva', 17 | id_usuario INT COMMENT 'Referência ao ID do usuário que fez a reserva', 18 | id_destino INT COMMENT 'Referência ao ID do destino da reserva', 19 | data DATE COMMENT 'Data da reserva', 20 | status VARCHAR(255) DEFAULT 'pendente' COMMENT 'Status da reserva (confirmada, pendente, cancelada, etc.)' 21 | ); 22 | 23 | -- Inserts -- 24 | INSERT INTO viagens.usuarios (id, nome, email, data_nascimento, endereco) VALUES 25 | (1, 'João Silva', 'joao@example.com', '1990-05-15', 'Rua A, 123, Cidade X, Estado Y'), 26 | (2, 'Maria Santos', 'maria@example.com', '1985-08-22', 'Rua B, 456, Cidade Y, Estado Z'), 27 | (3, 'Pedro Souza', 'pedro@example.com', '1998-02-10', 'Avenida C, 789, Cidade X, Estado Y'); 28 | 29 | INSERT INTO viagens.destinos (id, nome, descricao) VALUES 30 | (1, 'Praia das Tartarugas', 'Uma bela praia com areias brancas e mar cristalino'), 31 | (2, 'Cachoeira do Vale Verde', 'Uma cachoeira exuberante cercada por natureza'), 32 | (3, 'Cidade Histórica de Pedra Alta', 'Uma cidade rica em história e arquitetura'); 33 | 34 | INSERT INTO viagens.reservas (id, id_usuario, id_destino, data, status) VALUES 35 | (1, 1, 2, '2023-07-10', 'confirmada'), 36 | (2, 2, 1, '2023-08-05', 'pendente'), 37 | (3, 3, 3, '2023-09-20', 'cancelada'); 38 | 39 | -- Selects -- 40 | 41 | -- Selecionar todos os registros da tabela "usuarios" 42 | SELECT * FROM usuarios; 43 | 44 | -- Selecionar apenas o nome e o email dos usuários 45 | SELECT nome, email FROM usuarios; 46 | 47 | -- Selecionar os usuários que possuem o nome "João Silva" 48 | SELECT * FROM usuarios WHERE nome = 'João Silva'; 49 | 50 | -- Selecionar os usuários que nasceram antes de uma determinada data 51 | SELECT * FROM usuarios WHERE data_nascimento < '1990-01-01'; 52 | 53 | -- Like 54 | SELECT * FROM usuarios WHERE nome LIKE '%Silva%'; 55 | SELECT * FROM usuarios WHERE nome LIKE 'Jo_o%'; 56 | 57 | -- Update -- 58 | UPDATE usuarios SET endereco = 'Nova Rua, 123' WHERE email = 'joao@example.com'; 59 | 60 | -- delete -- 61 | DELETE FROM reservas WHERE status = 'cancelada'; 62 | -------------------------------------------------------------------------------- /aula3.2.sql: -------------------------------------------------------------------------------- 1 | 2 | -- Inserts -- 3 | INSERT INTO viagens.usuarios (id, nome, email, data_nascimento, endereco) VALUES 4 | (1, 'João Silva', 'joao@example.com', '1990-05-15', 'Rua A, 123, Cidade X, Estado Y'), 5 | (2, 'Maria Santos', 'maria@example.com', '1985-08-22', 'Rua B, 456, Cidade Y, Estado Z'), 6 | (3, 'Pedro Souza', 'pedro@example.com', '1998-02-10', 'Avenida C, 789, Cidade X, Estado Y'); 7 | 8 | INSERT INTO viagens.destinos (id, nome, descricao) VALUES 9 | (1, 'Praia das Tartarugas', 'Uma bela praia com areias brancas e mar cristalino'), 10 | (2, 'Cachoeira do Vale Verde', 'Uma cachoeira exuberante cercada por natureza'), 11 | (3, 'Cidade Histórica de Pedra Alta', 'Uma cidade rica em história e arquitetura'); 12 | 13 | INSERT INTO viagens.reservas (id, id_usuario, id_destino, data, status) VALUES 14 | (1, 1, 2, '2023-07-10', 'confirmada'), 15 | (2, 2, 1, '2023-08-05', 'pendente'), 16 | (3, 3, 3, '2023-09-20', 'cancelada'); 17 | 18 | -- Selects -- 19 | 20 | -- Selecionar todos os registros da tabela "usuarios" 21 | SELECT * FROM usuarios; 22 | 23 | -- Selecionar apenas o nome e o email dos usuários 24 | SELECT nome, email FROM usuarios; 25 | 26 | -- Selecionar os usuários que possuem o nome "João Silva" 27 | SELECT * FROM usuarios WHERE nome = 'João Silva'; 28 | 29 | -- Selecionar os usuários que nasceram antes de uma determinada data 30 | SELECT * FROM usuarios WHERE data_nascimento < '1990-01-01'; 31 | 32 | -- Like 33 | SELECT * FROM usuarios WHERE nome LIKE '%Silva%'; 34 | SELECT * FROM usuarios WHERE nome LIKE 'Jo_o%'; 35 | -------------------------------------------------------------------------------- /aula3.3.sql: -------------------------------------------------------------------------------- 1 | -- Update -- 2 | UPDATE usuarios SET endereco = 'Nova Rua, 123' WHERE email = 'joao@example.com'; 3 | 4 | -- delete -- 5 | DELETE FROM reservas WHERE status = 'cancelada'; 6 | -------------------------------------------------------------------------------- /aula3.4.sql: -------------------------------------------------------------------------------- 1 | -- Criando nova tabela -- 2 | 3 | CREATE TABLE usuarios_nova ( 4 | id INT, 5 | nome VARCHAR(255) NOT NULL COMMENT 'Nome do usuário', 6 | email VARCHAR(255) NOT NULL UNIQUE COMMENT 'Endereço de e-mail do usuário', 7 | data_nascimento DATE NOT NULL COMMENT 'Data de nascimento do usuário', 8 | endereco VARCHAR(100) NOT NULL COMMENT 'Endereço do Cliente' 9 | ); 10 | 11 | -- Migrando os dados -- 12 | 13 | INSERT INTO usuarios_nova 14 | SELECT * from usuarios; 15 | 16 | -- Excluindo tabela anterior -- 17 | DROP table usuarios; 18 | 19 | -- Renomeando nova tabela -- 20 | ALTER TABLE usuarios_nova RENAME usuarios; 21 | 22 | 23 | -- Ou opção 2 : Alterar tamanho da coluna endereço -- 24 | ALTER TABLE usuarios MODIFY COLUMN endereco VARCHAR(100); 25 | -------------------------------------------------------------------------------- /aula3.5.sql: -------------------------------------------------------------------------------- 1 | 2 | 3 | -- Primary Key-- 4 | -- Tabela "usuarios" 5 | ALTER TABLE usuarios 6 | MODIFY COLUMN id INT AUTO_INCREMENT, 7 | ADD PRIMARY KEY (id); 8 | 9 | -- Tabela "destinos" 10 | ALTER TABLE destinos 11 | MODIFY COLUMN id INT AUTO_INCREMENT, 12 | ADD PRIMARY KEY (id); 13 | 14 | -- Tabela "reservas" 15 | ALTER TABLE reservas 16 | MODIFY COLUMN id INT AUTO_INCREMENT, 17 | ADD PRIMARY KEY (id); 18 | 19 | -- Exemplos -- 20 | 21 | -- Inserção na tabela "usuarios" 22 | INSERT INTO usuarios (nome, email, data_nascimento, endereco) 23 | VALUES ('João Maria', 'joaomaria@example.com', '1990-01-01', 'Rua A, 123'); 24 | 25 | -- Inserção na tabela "destinos" 26 | INSERT INTO destinos (nome, descricao) 27 | VALUES ('Praia Teste', 'Destino paradisíaco com belas praias.'); 28 | 29 | -- Inserção na tabela "reservas" 30 | INSERT INTO reservas (id_usuario, id_destino, data, status) 31 | VALUES (4, 4, '2023-07-01', 'pendente'); 32 | 33 | -- Chaves estrangeiras -- 34 | 35 | -- Adicionando chave estrangeira na tabela "reservas" referenciando a tabela "usuarios" 36 | ALTER TABLE reservas 37 | ADD CONSTRAINT fk_reservas_usuarios 38 | FOREIGN KEY (id_usuario) REFERENCES usuarios(id); 39 | 40 | -- Adicionando chave estrangeira na tabela "reservas" referenciando a tabela "destinos" 41 | ALTER TABLE reservas 42 | ADD CONSTRAINT fk_reservas_destinos 43 | FOREIGN KEY (id_destino) REFERENCES destinos(id); 44 | 45 | -- Alterando a restrição da chave estrangeira "fk_reservas_usuarios" na tabela "reservas" para ON DELETE CASCADE 46 | ALTER TABLE reservas 47 | DROP FOREIGN KEY fk_reservas_usuarios; 48 | 49 | ALTER TABLE reservas 50 | ADD CONSTRAINT fk_reservas_usuarios 51 | FOREIGN KEY (id_usuario) REFERENCES usuarios(id) 52 | ON DELETE CASCADE; 53 | -------------------------------------------------------------------------------- /aula4-1.sql: -------------------------------------------------------------------------------- 1 | -- Adicionar colunas de endereço à tabela "Usuarios" 2 | ALTER TABLE Usuarios 3 | ADD rua VARCHAR(100), 4 | ADD numero VARCHAR(10), 5 | ADD cidade VARCHAR(50), 6 | ADD estado VARCHAR(50); 7 | 8 | -- Copia os dados da tabela original para a nova tabela 9 | UPDATE usuarios 10 | SET rua = SUBSTRING_INDEX(SUBSTRING_INDEX(endereco, ',', 1), ',', -1), 11 | numero = SUBSTRING_INDEX(SUBSTRING_INDEX(endereco, ',', 2), ',', -1), 12 | cidade = SUBSTRING_INDEX(SUBSTRING_INDEX(endereco, ',', 3), ',', -1), 13 | estado = SUBSTRING_INDEX(endereco, ',', -1); 14 | 15 | -- Exclusão da coluna "endereco" da tabela original 16 | ALTER TABLE usuarios 17 | DROP COLUMN endereco; 18 | -------------------------------------------------------------------------------- /aula5-1.sql: -------------------------------------------------------------------------------- 1 | INSERT INTO usuarios (nome, email, data_nascimento, rua, numero, cidade, estado) VALUES ('Usuario sem reservas', 'semreservar@teste.com', '1990-10-10', 'Rua','123','cidade','estado'); 2 | 3 | -- Traz apenas os usuario com reservas 4 | SELECT * FROM usuarios us 5 | INNER JOIN reservas rs 6 | ON us.id = rs.id_usuario; 7 | 8 | -- Traz todos os usuario e suas reservas se tiver 9 | SELECT * FROM usuarios us 10 | INNER JOIN reservas rs 11 | ON us.id = rs.id_usuario; 12 | 13 | INSERT INTO viagens.destinos ( nome, descricao) VALUES 14 | ('Deestino sem reserva', 'Uma bela praia com areias brancas e mar cristalino') 15 | 16 | -- Tras todos os destinos e as reservas se tiverem -- 17 | SELECT * FROM reservas rs 18 | RIGHT JOIN destinos des 19 | ON des.id = rs.id_destino; 20 | 21 | -- Produz o mesmo resultado que a anterior 22 | SELECT * FROM destinos des 23 | LEFT JOIN reservas rs 24 | ON des.id = rs.id_destino; 25 | 26 | -- SUb consultas 27 | 28 | -- Usuários que não fizeram nenhuma reserva 29 | SELECT nome 30 | FROM usuarios 31 | WHERE id NOT IN (SELECT id_usuario FROM reservas); 32 | 33 | -- Subconsulta para encontrar os destinos menos populares (com menos reservas): 34 | 35 | SELECT nome 36 | FROM destinos 37 | WHERE id NOT IN (SELECT id_destino FROM reservas) 38 | ORDER BY id; 39 | 40 | -- contagem de reservas por usuario 41 | 42 | SELECT nome, (SELECT COUNT(*) FROM reservas WHERE id_usuario = usuarios.id) AS total_reservas 43 | FROM usuarios; 44 | -------------------------------------------------------------------------------- /aula5-2.sql: -------------------------------------------------------------------------------- 1 | SELECT COUNT(*) FROM usuarios; 2 | 3 | -- Media da idade dos usuarios 4 | SELECT AVG(TIMESTAMPDIFF(YEAR, data_nascimento, CURRENT_DATE())) AS idade 5 | FROM usuarios; 6 | 7 | -- Soma da idade dos usuarios 8 | SELECT SUM(TIMESTAMPDIFF(YEAR, data_nascimento, CURRENT_DATE())) AS media_idade 9 | FROM usuarios; 10 | 11 | -- Menor Idade 12 | SELECT MIN(TIMESTAMPDIFF(YEAR, data_nascimento, CURRENT_DATE())) AS media_idade 13 | FROM usuarios; 14 | 15 | -- Maior Idade 16 | SELECT MAX(TIMESTAMPDIFF(YEAR, data_nascimento, CURRENT_DATE())) AS media_idade 17 | FROM usuarios; 18 | 19 | -- Calcula quantidade de reservas por destino -- 20 | SELECT *, COUNT(*) AS total_reservas FROM reservas GROUP BY id_destino ; 21 | 22 | 23 | -- Limit 24 | SELECT *, COUNT(*) AS total_reservas FROM reservas GROUP BY id_destino LIMIT 1 OFFSET 2; 25 | 26 | SELECT *, COUNT(*) AS total_reservas FROM reservas GROUP BY id_destino LIMIT 1; 27 | 28 | -- Ordenação 29 | SELECT nome 30 | FROM usuarios 31 | ORDER BY nome; 32 | 33 | SELECT nome, data_nascimento 34 | FROM usuarios 35 | ORDER BY data_nascimento, nome; 36 | 37 | SELECT nome, data_nascimento 38 | FROM usuarios 39 | ORDER BY data_nascimento, nome DESC; 40 | 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /aula5-3.sql: -------------------------------------------------------------------------------- 1 | -- Inserindo massa de dados -- 2 | 3 | INSERT INTO usuarios (nome, email, data_nascimento, rua) VALUES 4 | ('João Silva', 'joao.silva@example.com', '1990-01-01', 'Rua A'), 5 | ('Maria Santos', 'maria.santos@example.com', '1992-03-15', 'Rua B'), 6 | ('Pedro Almeida', 'pedro.almeida@example.com', '1985-07-10', 'Rua C'), 7 | ('Ana Oliveira', 'ana.oliveira@example.com', '1998-12-25', 'Rua D'), 8 | ('Carlos Pereira', 'carlos.pereira@example.com', '1991-06-05', 'Rua E'), 9 | ('Laura Mendes', 'laura.mendes@example.com', '1994-09-12', 'Rua F'), 10 | ('Fernando Santos', 'fernando.santos@example.com', '1988-02-20', 'Rua G'), 11 | ('Mariana Costa', 'mariana.costa@example.com', '1997-11-30', 'Rua H'), 12 | ('Ricardo Rodrigues', 'ricardo.rodrigues@example.com', '1993-04-18', 'Rua I'), 13 | ('Camila Alves', 'camila.alves@example.com', '1989-08-08', 'Rua J'), 14 | ('Bruno Carvalho', 'bruno.carvalho@example.com', '1995-03-25', 'Rua K'), 15 | ('Amanda Silva', 'amanda.silva@example.com', '1996-12-02', 'Rua L'), 16 | ('Paulo Mendonça', 'paulo.mendonca@example.com', '1999-07-20', 'Rua M'), 17 | ('Larissa Oliveira', 'larissa.oliveira@example.com', '1987-10-15', 'Rua N'), 18 | ('Fernanda Sousa', 'fernanda.sousa@example.com', '1992-05-08', 'Rua O'), 19 | ('Gustavo Santos', 'gustavo.santos@example.com', '1993-09-18', 'Rua P'), 20 | ('Helena Costa', 'helena.costa@example.com', '1998-02-22', 'Rua Q'), 21 | ('Diego Almeida', 'diego.almeida@example.com', '1991-11-27', 'Rua R'), 22 | ('Juliana Lima', 'juliana.lima@example.com', '1997-04-05', 'Rua S'), 23 | ('Rafaela Silva', 'rafaela.silva@example.com', '1996-01-10', 'Rua T'), 24 | ('Lucas Pereira', 'lucas.pereira@example.com', '1986-08-30', 'Rua U'), 25 | ('Fábio Rodrigues', 'fabio.rodrigues@example.com', '1989-03-12', 'Rua V'), 26 | ('Isabela Santos', 'isabela.santos@example.com', '1994-12-07', 'Rua W'), 27 | ('André Alves', 'andre.alves@example.com', '1995-09-28', 'Rua X'), 28 | ('Clara Carvalho', 'clara.carvalho@example.com', '1990-02-15', 'Rua Y'), 29 | ('Roberto Mendes', 'roberto.mendes@example.com', '1992-07-21', 'Rua Z'), 30 | ('Mariana Oliveira', 'mariana.oliveira@example.com', '1997-05-03', 'Av. A'), 31 | ('Gustavo Costa', 'gustavo.costa@example.com', '1998-11-16', 'Av. B'), 32 | ('Lara Sousa', 'lara.sousa@example.com', '1993-06-09', 'Av. C'), 33 | ('Pedro Lima', 'pedro.lima@example.com', '1996-09-27', 'Av. D'); 34 | 35 | 36 | 37 | 38 | EXPLAIN SELECT * FROM usuarios WHERE nome = "Maria"; 39 | 40 | EXPLAIN SELECT * FROM usuarios us 41 | INNER JOIN reservas rs 42 | ON us.id = rs.id_usuario 43 | WHERE nome = "Maria"; 44 | 45 | 46 | CREATE INDEX idx_nome ON usuarios (nome); 47 | 48 | EXPLAIN SELECT * FROM usuarios WHERE nome = "Maria"; 49 | --------------------------------------------------------------------------------