# Session two: Getting better | Banco de Dados
**Autor**: Vitório Trindade Santana
**Turma**: Informática C
**Número**: 50
[toc]
## Modelagem 1: Catálogo de Filmes
### Create Script
```sql=
CREATE TABLE TB_Genero (
ID_Genero int PRIMARY KEY AUTO_INCREMENT,
DS_Genero varchar (30),
BT_Ativo bool
);
CREATE TABLE TB_Filmes (
ID_Filmes int PRIMARY KEY AUTO_INCREMENT,
NM_Filme varchar (30),
DT_Lancamento date,
BT_Disponivel bool,
VL_Avaliacao decimal (3,1)
);
CREATE TABLE TB_Filmes_Genero (
ID_Filmes_Genero int PRIMARY KEY AUTO_INCREMENT,
ID_Filmes int,
ID_Genero int,
FOREIGN KEY (ID_Filmes) REFERENCES TB_Filmes (ID_Filmes) ON DELETE CASCADE,
FOREIGN KEY (ID_Genero) REFERENCES TB_Genero (ID_Genero) ON DELETE CASCADE
);
```
### Insert Script
```sql=
INSERT INTO TB_Genero (DS_Genero, BT_Ativo)
VALUES ('Comédia', true),
('Romance', true),
('Ação', true),
('Ficção Científica', false),
('Biográfico', false);
INSERT INTO TB_Filmes (NM_Filme, DT_Lancamento, BT_Disponivel, VL_Avaliacao)
VALUES ('Deadpool', '2016-02-11', true, 3.9),
('O Auto da Compadecida', '2000-09-10', true, 7.6),
('John Wick - De volta ao jogo', '2014-11-27', false, 9.7),
('O jogo da imitação', '2015-01-08', false, 7.9),
('Sonic: O filme', '2020-02-13', true, 8.3);
INSERT INTO TB_Filmes_Genero (ID_Filmes, ID_Genero)
VALUES (1, 1),
(1, 3),
(1, 4),
(2, 1),
(3, 3),
(4, 4),
(4, 5),
(5, 1),
(5, 3),
(5, 5);
UPDATE TB_Filmes
SET BT_Disponivel = true
WHERE ID_Filmes = 3;
UPDATE TB_Genero
SET BT_Ativo = true
WHERE ID_Genero = 4;
UPDATE TB_Filmes_Genero
SET ID_Genero = 2
WHERE ID_Filmes_Genero = 3;
UPDATE TB_Filmes_Genero
SET ID_Genero = 4
WHERE ID_Filmes_Genero = 10;
DELETE
FROM TB_Filmes
WHERE ID_Filmes = 4;
DELETE
FROM TB_Genero
WHERE ID_Genero = 5;
DELETE
FROM TB_Filmes_Genero
WHERE ID_FIlmes_Genero = 6;
DELETE
FROM TB_Filmes_Genero
WHERE ID_FIlmes_Genero = 7;
```
### Select Script
```sql=
-- Selecionar fime, gênero aplicando o relacionamento nas tabelas, sem filtros, ordenando por filme.
SELECT F.NM_Filme,
G.DS_Genero
FROM TB_Filmes_Genero FG
INNER JOIN TB_Genero G
ON G.ID_Genero = FG.ID_Genero
INNER JOIN TB_Filmes F
ON F.ID_Filmes = FG.ID_Filmes
ORDER BY F.NM_Filme;
-- Selecionar id do filme, filme, id do gênero e gênero aplicando o relacionamento nas tabelas, filtrando os que possuem avaliação maior que 4, ordenando por filme.
SELECT F.ID_Filmes,
F.NM_Filme,
G.ID_Genero,
G.DS_Genero
FROM TB_Filmes_Genero FG
INNER JOIN TB_Genero G
ON G.ID_Genero = FG.ID_Genero
INNER JOIN TB_Filmes F
ON F.ID_Filmes = FG.ID_Filmes
WHERE F.VL_Avaliacao > 4
ORDER BY F.NM_Filme;
-- Selecionar filme, avaliação, lançamento aplicando o relacionamento nas tabelas, filtrando os filmes disponíveis com gênero igual a ‘ação’, ordenando por avaliação.
SELECT F.NM_Filme,
F.VL_Avaliacao,
F.DT_Lancamento
FROM TB_Filmes_Genero FG
INNER JOIN TB_Genero G
ON G.ID_Genero = FG.ID_Genero
INNER JOIN TB_Filmes F
ON F.ID_Filmes = FG.ID_Filmes
WHERE F.BT_Disponivel = true
AND G.DS_Genero = 'Ação'
ORDER BY F.VL_Avaliacao;
-- Selecionar filme, avaliação, lançamento, disponível, gênero aplicando o relacionamento nas tabelas, filtrando os filmes que possuam os gêneros ‘romance’ e ‘comédia’.
SELECT F.NM_Filme,
F.VL_Avaliacao,
F.DT_Lancamento,
F.BT_Disponivel,
G.DS_Genero
FROM TB_Filmes_Genero FG
INNER JOIN TB_Genero G
ON G.ID_Genero = FG.ID_Genero
INNER JOIN TB_Filmes F
ON F.ID_Filmes = FG.ID_Filmes
WHERE F.BT_Disponivel = true
AND G.DS_Genero = 'Romance'
OR G.DS_Genero = 'Comédia';
-- Consultas personalizadas
-- Consultar gênero, nome e disponibilidade dos filmes que estejam disponíveis e com uma avaliação entre 7 e 8.5.
SELECT G.DS_Genero,
F.NM_Filme,
F.BT_Disponivel
FROM TB_Filmes_Genero FG
INNER JOIN TB_Genero G
ON G.ID_Genero = FG.ID_Genero
INNER JOIN TB_Filmes F
ON F.ID_Filmes = FG.ID_Filmes
WHERE F.BT_Disponivel = true
AND F.VL_Avaliacao BETWEEN 7 AND 8.5;
-- Consultar pelo gênero, nome e avaliação onde o gênero seja comédia ou ação.
SELECT G.DS_Genero,
F.NM_Filme,
F.Vl_Avaliacao
FROM TB_Filmes_Genero FG
INNER JOIN TB_Genero G
ON G.ID_Genero = FG.ID_Genero
INNER JOIN TB_Filmes F
ON F.ID_Filmes = FG.ID_Filmes
WHERE G.DS_Genero = 'Comédia'
OR G.DS_Genero = 'Ação';
-- Consultar todos os filmes que tenham o gênero biográfico ou ação e que a avaliação seja maior que 7.5.
SELECT *
FROM TB_Filmes_Genero FG
INNER JOIN TB_Genero G
ON G.ID_Genero = FG.ID_Genero
INNER JOIN TB_Filmes F
ON F.ID_Filmes = FG.ID_Filmes
WHERE G.DS_Genero
IN('Biográfico', 'Ação')
AND F.VL_Avaliacao > 7.5;
-- Selecionar gênero, nome, disponibilidade e lançamento dos filmes que tenham sua data de lançamento entre primeiro de janeiro de 2000 e primeiro de janeiro de 2007.
SELECT G.DS_Genero,
F.NM_Filme,
F.BT_Disponivel,
F.DT_Lancamento
FROM TB_Filmes_Genero FG
INNER JOIN TB_Genero G
ON G.ID_Genero = FG.ID_Genero
INNER JOIN TB_Filmes F
ON F.ID_Filmes = FG.ID_Filmes
WHERE F.DT_Lancamento
BETWEEN '2000-01-01' AND '2007-01-01';
-- Consultar todos os filmes que comecem com J, estejam disponíveis e tenham uma avaliação maior ou igual que 9.
SELECT *
FROM TB_Filmes_Genero FG
INNER JOIN TB_Genero G
ON G.ID_Genero = FG.ID_Genero
INNER JOIN TB_Filmes F
ON F.ID_Filmes = FG.ID_Filmes
WHERE F.NM_Filme like 'J%'
AND F.BT_Disponivel = true
AND F.VL_Avaliacao >= 9;
```
## Modelagem 2: Turmas e alunos
### Create Script
```sql=
CREATE TABLE TB_Disciplina (
ID_Disciplina int PRIMARY KEY AUTO_INCREMENT,
NM_Disciplina varchar (30),
NM_Professor varchar (40)
);
CREATE TABLE TB_Aluno (
ID_Aluno int PRIMARY KEY AUTO_INCREMENT,
NM_Turma varchar (50),
NR_Ano_Letivo int,
NM_Aluno varchar (40),
DS_Sexo varchar (15),
NR_Chamada int,
TP_Status varchar(1)
);
CREATE TABLE TB_Boletim (
ID_Boletim int PRIMARY KEY AUTO_INCREMENT,
ID_Aluno int,
ID_Disciplina int,
VL_Nota decimal (5,2),
QTD_Faltas int,
FOREIGN KEY (ID_Aluno) REFERENCES TB_Aluno (ID_Aluno) ON DELETE CASCADE,
FOREIGN KEY (ID_Disciplina) REFERENCES TB_Disciplina (ID_Disciplina) ON DELETE CASCADE
);
```
### Insert Script
```sql=
INSERT INTO TB_Disciplina (NM_Disciplina, NM_Professor)
VALUES ('Inglês', 'Gustavo'),
('Matemática', 'Tânia'),
('História', 'Roberto'),
('Ciências', 'Renata'),
('Artes', 'Giovanni');
INSERT INTO TB_Aluno (NM_Turma, NR_Ano_Letivo, NM_Aluno, DS_Sexo, NR_Chamada, TP_Status)
VALUES ('2°E', 2021, 'Vitório Trindade Santana', 'Masculino', 50, 'F'),
('9°A', 2019, 'Kauã Pansan Ferreira', 'Masculino', 32, 'F'),
('7°A', 2017, 'Thaís Felix Oliveira', 'Feminino', 43, 'F'),
('7°A', 2020, 'Fernando Araujo Miguel', 'Masculino', 22, 'D');
INSERT INTO TB_Boletim (ID_Aluno, ID_Disciplina, VL_Nota, QTD_Faltas) VALUES (1, 1, 7, 2),
(1, 3, 6, 0),
(1, 4, 7, 5),
(2, 1, 10, 0),
(2, 2, 9, 1),
(2, 4, 8, 0),
(3, 1, 9, 0),
(3, 2, 8, 0),
(3, 4, 9, 0),
(3, 5, 10, 2);
UPDATE TB_Disciplina
SET NM_Professor = 'Marcio Wallace'
WHERE ID_Disciplina = 1;
UPDATE TB_Aluno
SET NR_Ano_Letivo = 2021
WHERE ID_Aluno = 3;
UPDATE TB_Boletim
SET VL_Nota = 4
WHERE ID_Boletim = 6;
UPDATE TB_Boletim
SET VL_Nota = 9
WHERE ID_Boletim = 2;
DELETE
FROM TB_Disciplina
WHERE ID_Disciplina = 5;
DELETE
FROM TB_Aluno
WHERE ID_ALuno = 4;
DELETE
FROM TB_Boletim
WHERE ID_Boletim = 10;
```
### Select Script
```sql=
-- Selecionar aluno, turma, ano, disciplina, nota aplicando o relacionamento nas tabelas, sem filtros, ordenando por aluno.
SELECT A.NM_Aluno,
A.NM_Turma,
A.NR_Ano_Letivo,
D.NM_Disciplina,
B.VL_Nota
FROM TB_Boletim B
INNER JOIN TB_Disciplina D
ON D.ID_Disciplina = B.ID_Disciplina
INNER JOIN TB_Aluno A
ON A.ID_Aluno = B.ID_Aluno
ORDER BY A.NM_Aluno;
-- Selecionar aluno, turma, ano, disciplina, nota aplicando o relacionamento nas tabelas, filtrando por turma e ano letivo, ordenando por nota da maior para a menor.
SELECT A.NM_Aluno,
A.NM_Turma,
A.NR_Ano_Letivo,
D.NM_Disciplina,
B.VL_Nota
FROM TB_Boletim B
INNER JOIN TB_Disciplina D
ON D.ID_Disciplina = B.ID_Disciplina
INNER JOIN TB_Aluno A
ON A.ID_Aluno = B.ID_Aluno
WHERE A.NM_Turma = '2°E'
AND NR_Ano_Letivo = 2021
ORDER BY B.VL_Nota DESC;
-- Selecionar aluno, turma, ano, disciplina, nota aplicando o relacionamento nas tabelas, filtrando os alunos aprovados por ano e turma, ordenando por ano, turma e chamada.
SELECT A.NM_Aluno,
A.NM_Turma,
A.NR_Ano_Letivo,
D.NM_Disciplina,
B.VL_Nota
FROM TB_Boletim B
INNER JOIN TB_Disciplina D
ON D.ID_Disciplina = B.ID_Disciplina
INNER JOIN TB_Aluno A
ON A.ID_Aluno = B.ID_Aluno
WHERE B.VL_Nota >= 5
AND A.NR_Ano_Letivo = 2021
AND A.NM_Turma = '7°A'
ORDER BY A.NR_Ano_Letivo,
A.NM_Turma,
A.NR_Chamada;
-- Selecionar aluno, turma, ano aplicando o relacionamento nas tabelas, filtrando os alunos reprovados por ano e turma.
SELECT A.NM_Aluno,
A.NM_Turma,
A.NR_Ano_Letivo
FROM TB_Boletim B
INNER JOIN TB_Disciplina D
ON D.ID_Disciplina = B.ID_Disciplina
INNER JOIN TB_Aluno A
ON A.ID_Aluno = B.ID_Aluno
WHERE B.VL_Nota < 5
AND A.NR_Ano_Letivo = 2019
AND A.NM_Turma = '9°A';
-- Consultas personalizadas
-- Selecione nome e número da chamada da tabela boletim filtrando pelo sexo e ano letivo.
SELECT A.NM_Aluno,
A.NR_Chamada
FROM TB_Boletim B
INNER JOIN TB_Disciplina D
ON D.ID_Disciplina = B.ID_Disciplina
INNER JOIN TB_Aluno A
ON A.ID_Aluno = B.ID_Aluno
WHERE A.DS_Sexo = 'Masculino'
AND A.NR_Ano_Letivo = 2021;
-- Selecione todos os campos da tabela boletim filtrando pela disciplina e pelo ano letivo.
SELECT *
FROM TB_Boletim B
INNER JOIN TB_Disciplina D
ON D.ID_Disciplina = B.ID_Disciplina
INNER JOIN TB_Aluno A
ON A.ID_Aluno = B.ID_Aluno
WHERE D.NM_Disciplina = 'História'
AND A.NR_Ano_Letivo = 2021;
-- Selecione todos os campos da tabea boletim filtrando pelo sexo e a frequência.
SELECT *
FROM TB_Boletim B
INNER JOIN TB_Disciplina D
ON D.ID_Disciplina = B.ID_Disciplina
INNER JOIN TB_Aluno A
ON A.ID_Aluno = B.ID_Aluno
WHERE A.DS_Sexo = 'Masculino'
AND A.TP_Status = 'F';
-- Selecione o nome, número de chamada e turma da tabela boletim filtrando pelo número da chamada ordenando a consulta pelo nome do aluno.
SELECT A.NM_Aluno,
A.NR_Chamada,
A.NM_Turma
FROM TB_Boletim B
INNER JOIN TB_Disciplina D
ON D.ID_Disciplina = B.ID_Disciplina
INNER JOIN TB_Aluno A
ON A.ID_Aluno = B.ID_Aluno
WHERE A.NR_Chamada BETWEEN 25 AND 50
ORDER BY A.NM_Aluno;
-- Selecione todos os campos da tabela boletim filtrando pelo ano letivo e pela frequência.
SELECT *
FROM TB_Boletim B
INNER JOIN TB_Disciplina D
ON D.ID_Disciplina = B.ID_Disciplina
INNER JOIN TB_Aluno A
ON A.ID_Aluno = B.ID_Aluno
WHERE A.NR_Ano_Letivo = 2021
AND A.TP_Status = 'F';
```
{"metaMigratedAt":"2023-06-16T00:09:39.931Z","metaMigratedFrom":"Content","title":"Session two: Getting better | Banco de Dados","breaks":true,"contributors":"[{\"id\":\"052c8e10-b233-429a-a1e0-0d8df7864830\",\"add\":24116,\"del\":10940}]"}