# Banco de Dados | SQL
**Autor:** Matheus Rafael Morato Rocha
**Turma:** InfoC
**Número:** 40
[TOC]
## Modelagem 1: Netflix
> Create script
```sql=
create table tb_genero (
id_genero int primary key auto_increment,
ds_genero varchar(200),
bt_ativo bool
);
create table tb_filme (
id_filme int primary key auto_increment,
nm_filme varchar(200),
vl_avaliacao decimal(15,2),
bt_disponivel bool
);
create table tb_filme_genero (
id_filme_genero int primary key auto_increment,
id_filme int,
id_genero int,
foreign key (id_genero) references tb_genero (id_genero),
foreign key (id_filme) references tb_filme (id_filme)
);
insert into tb_genero (ds_genero,bt_ativo)
values ("ação",true),
("drama",true),
("romance",true),
("guerra",true),
("terror",true);
insert into tb_filme (nm_filme,vl_avaliacao,bt_disponivel)
values ("Velozes e Furiosos",6,true),
("Até o Último Homem",8,true),
("John Wick: Um Novo Dia Para Matar",10,true),
("O Diabo de Cada Dia",4,true),
("Por Lugares Incríveis",9,true);
insert into tb_filme_genero (id_filme,id_genero)
values (1,1),
(2,4),
(3,1),
(4,2),
(5,3),
(5,5),
(1,5),
(4,2),
(3,5),
(5,1);
UPDATE tb_filme_genero
SET id_genero = 4
WHERE id_filme = 5;
DELETE FROM tb_filme_genero
WHERE id_filme = 4;
```
> Insert script
```sql=
insert into tb_genero (ds_genero,bt_ativo)
values ("ação",true),
("drama",true),
("romance",true),
("guerra",true),
("terror",true);
insert into tb_filme (nm_filme,vl_avaliacao,bt_disponivel)
values ("Velozes e Furiosos",6,true),
("Até o Último Homem",8,true),
("John Wick: Um Novo Dia Para Matar",10,true),
("O Diabo de Cada Dia",4,true),
("Por Lugares Incríveis",9,true);
insert into tb_filme_genero (id_filme,id_genero)
values (1,1),
(2,4),
(3,1),
(4,2),
(5,3),
(5,5),
(1,5),
(4,2),
(3,5),
(5,1);
UPDATE tb_filme_genero
SET id_genero = 4
WHERE id_filme = 5;
UPDATE tb_genero
SET ds_genero = "Rock"
WHERE id_genero = 2;
UPDATE tb_filme
SET nm_filme = "WHATSAPP 2"
WHERE id_filme = 2;
DELETE FROM tb_filme_genero
WHERE id_filme = 9;
DELETE FROM tb_genero
WHERE id_genero = 5;
DELETE FROM tb_filme
WHERE id_filme = 5;
```
> Select script
```sql=
-- Selecionar fime, gênero aplicando o relacionamento nas tabelas, sem filtros, ordenando por filme.
SELECT G.ds_genero,
F.nm_filme
FROM tb_filme_genero as FG
INNER JOIN tb_filme as F
JOIN tb_genero as G
ON FG.id_genero = G.id_genero
AND FG.id_filme = F.id_filme
ORDER BY 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 FG.id_filme,
F.nm_filme,
FG.id_genero,
G.ds_genero
FROM tb_filme_genero as FG
INNER JOIN tb_filme as F
JOIN tb_genero as G
ON FG.id_genero = G.id_genero
AND FG.id_filme = F.id_filme
WHERE F.vl_avaliacao = 4
ORDER BY 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_filme_genero as FG
INNER JOIN tb_filme as F
JOIN tb_genero as G
ON FG.id_genero = G.id_genero
AND FG.id_filme = F.id_filme
WHERE G.ds_genero = 'ação'
AND F.bt_disponivel = true
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,
G.bt_ativo,
G.ds_genero
FROM tb_filme_genero as FG
INNER JOIN tb_filme as F
JOIN tb_genero as G
ON FG.id_genero = G.id_genero
AND FG.id_filme = F.id_filme
WHERE G.ds_genero in ('romance','comedia');
-- Consulta personalizada 1
SELECT G.ds_genero,
F.nm_filme,
F.vl_avaliacao,
F.bt_disponivel
FROM tb_filme_genero as FG
INNER JOIN tb_filme as F
JOIN tb_genero as G
ON FG.id_genero = G.id_genero
AND FG.id_filme = F.id_filme
WHERE G.ds_genero in ('guerra','drama','terror')
ORDER BY vl_avaliacao;
-- Consulta personalizada 2
SELECT G.ds_genero,
F.nm_filme,
F.vl_avaliacao,
F.bt_disponivel
FROM tb_filme_genero as FG
INNER JOIN tb_filme as F
JOIN tb_genero as G
ON FG.id_genero = G.id_genero
AND FG.id_filme = F.id_filme
WHERE F.vl_avaliacao BETWEEN 5 AND 8
ORDER BY F.nm_filme;
-- Consulta personalizada 3
SELECT G.ds_genero,
F.nm_filme,
F.bt_disponivel
FROM tb_filme_genero as FG
INNER JOIN tb_filme as F
JOIN tb_genero as G
ON FG.id_genero = G.id_genero
AND FG.id_filme = F.id_filme
WHERE F.vl_avaliacao BETWEEN 5 AND 8
ORDER BY F.nm_filme;
-- Consulta personalizada 4
SELECT G.ds_genero,
F.nm_filme,
F.bt_disponivel
FROM tb_filme_genero as FG
INNER JOIN tb_filme as F
JOIN tb_genero as G
ON FG.id_genero = G.id_genero
AND FG.id_filme = F.id_filme
WHERE F.vl_avaliacao BETWEEN 5 AND 8
AND LENGTH (F.nm_filme) <= 9
AND F.bt_disponivel = true
OR F.dt_lancamento between '2010-01-01' and '2020-01-01'
ORDER BY F.nm_filme;
-- Consulta personalizada 5
SELECT G.ds_genero,
F.nm_filme,
F.bt_disponivel
FROM tb_filme_genero as FG
INNER JOIN tb_filme as F
JOIN tb_genero as G
ON FG.id_genero = G.id_genero
AND FG.id_filme = F.id_filme
WHERE LENGTH (F.nm_filme) <= 9
AND F.bt_disponivel = true
ORDER BY F.nm_filme ASC;
```
## Modelagem 2: Aluno
> Create script
```sql=
create table tb_aluno (
id_aluno int primary key auto_increment,
nm_turma varchar(200),
nr_ano_letivo int,
nm_aluno varchar(200),
nr_chamada int,
ds_sexo varchar(20),
tp_status varchar(1)
);
create table tb_disciplina (
id_disciplina int primary key auto_increment,
nm_disciplina varchar(200),
nm_professor varchar(200)
);
create table tb_boletim (
id_boletim int primary key auto_increment,
id_aluno int,
id_disciplina int,
vl_nota int,
qtd_faltas int,
foreign key (id_aluno ) references tb_aluno (id_aluno),
foreign key (id_disciplina) references tb_disciplina (id_disciplina)
);
```
> Insert script
```sql=
insert into tb_aluno (nm_turma,nr_ano_letivo,nm_aluno,nr_chamada,ds_sexo,tp_status)
values ("2 ano",2,"Matheus Rafael",27,"Masculino","F"),
("1 ano",1,"Eduardo Guilherme ",40,"Masculino","F"),
("3 ano",3,"Jheniffer Fernandes",20,"Feminino","D");
insert into tb_disciplina (nm_disciplina,nm_professor)
values ("Física","José Silva"),
("Matematica","Bruno de Oliveira"),
("Geografia","Ewerton Rocha"),
("Português","Elisabete Rosa"),
("Inglês","Leticia de Santos");
insert into tb_boletim (id_aluno,id_disciplina,vl_nota,qtd_faltas)
values (1,1,4,2),(1,2,5,3),(1,3,6,5),(1,4,8,2),(1,5,2,10);
insert into tb_boletim (id_aluno,id_disciplina,vl_nota,qtd_faltas)
values (2,1,4,10),(2,2,6,2),(2,3,10,8),(2,4,4,2)(2,5,2,0);
insert into tb_boletim (id_aluno,id_disciplina,vl_nota,qtd_faltas)
values (3,1,10,0),(3,2,6,2),(3,3,1,8),(3,4,4,2),(3,5,8,0);
UPDATE tb_aluno
SET nr_chamada = 10
WHERE id_aluno = 2;
UPDATE tb_disciplina
SET nm_professor = "Alex Rodrigues"
WHERE id_disciplina = 2;
UPDATE tb_boletim
SET vl_nota = 4
WHERE id_disciplina = 2;
DELETE FROM tb_aluno
WHERE id_aluno = 1;
DELETE FROM tb_disciplina
WHERE id_disciplina = 2;
DELETE FROM tb_boletim
WHERE vl_nota = 1;
```
> Select script
```sql=
SELECT A.nm_aluno,
A.nm_turma,
A.nr_chamada,
A.ds_sexo,
A.nm_aluno,
D.nm_disciplina,
D.nm_professor,
B.vl_nota,
B.qtd_faltas
FROM tb_boletim as B
INNER JOIN tb_aluno as A
JOIN tb_disciplina as D
ON B.id_disciplina = D.id_disciplina
AND B.id_aluno = A.id_aluno;
-- 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 as B
INNER JOIN tb_aluno as A
JOIN tb_disciplina as D
ON B.id_disciplina = D.id_disciplina
AND B.id_aluno = A.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 as B
INNER JOIN tb_aluno as A
JOIN tb_disciplina as D
ON B.id_disciplina = D.id_disciplina
AND B.id_aluno = A.id_aluno
WHERE A.nm_aluno = "2 ano"
OR A.nr_ano_letivo = 2
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 as B
INNER JOIN tb_aluno as A
JOIN tb_disciplina as D
ON B.id_disciplina = D.id_disciplina
AND B.id_aluno = A.id_aluno
WHERE B.vl_nota >= 5
AND A.nr_ano_letivo = 3
AND A.nm_turma = "3 ano"
ORDER BY A.nm_turma,A.nr_chamada;
-- Consulta personalizada 1
SELECT A.nm_aluno,
A.nm_turma,
A.nr_ano_letivo,
D.nm_disciplina,
D.nm_professor,
B.qtd_faltas,
B.vl_nota
FROM tb_boletim as B
INNER JOIN tb_aluno as A
JOIN tb_disciplina as D
ON B.id_disciplina = D.id_disciplina
AND B.id_aluno = A.id_aluno
WHERE A.nr_ano_letivo = 2
AND A.nm_aluno LIKE 'M%'
AND B.qtd_faltas <= 5
ORDER BY B.qtd_faltas ASC;
-- Consulta personalizada 2
SELECT A.nm_aluno,
A.nm_turma,
D.nm_disciplina,
B.vl_nota
FROM tb_boletim as B
INNER JOIN tb_aluno as A
JOIN tb_disciplina as D
ON B.id_disciplina = D.id_disciplina
AND B.id_aluno = A.id_aluno
WHERE A.nr_ano_letivo BETWEEN 1 AND 2
AND LENGTH (D.nm_disciplina) >= 7
AND B.vl_nota IN (5,10,2);
-- Consulta personalizada 3
SELECT A.nm_aluno,
A.nm_turma,
A.nr_chamada,
A.ds_sexo,
A.nm_aluno
FROM tb_boletim as B
INNER JOIN tb_aluno as A
JOIN tb_disciplina as D
ON B.id_disciplina = D.id_disciplina
AND B.id_aluno = A.id_aluno
WHERE A.nr_chamada <= 27
AND A.ds_sexo = "Masculino"
OR A.nm_aluno = 'G%'
AND B.qtd_faltas BETWEEN 5 AND 8
ORDER BY A.nm_aluno ASC;
-- Consulta personalizada 4
SELECT A.nr_chamada,
D.nm_disciplina,
D.nm_professor,
B.vl_nota,
B.qtd_faltas
FROM tb_boletim as B
INNER JOIN tb_aluno as A
JOIN tb_disciplina as D
ON B.id_disciplina = D.id_disciplina
AND B.id_aluno = A.id_aluno
WHERE B.qtd_faltas < 6
AND B.vl_nota IN (5,8,7,10,2)
AND A.tp_status = "F"
ORDER BY A.nm_aluno DESC;
-- Consulta personalizada 5
SELECT A.nr_chamada,
D.nm_disciplina,
D.nm_professor,
B.vl_nota,
B.qtd_faltas,
A.tp_status
FROM tb_boletim as B
INNER JOIN tb_aluno as A
JOIN tb_disciplina as D
ON B.id_disciplina = D.id_disciplina
AND B.id_aluno = A.id_aluno
WHERE B.qtd_faltas> 6
AND A.tp_status = "F"
ORDER BY A.nm_aluno DESC;
```
{"metaMigratedAt":"2023-06-15T23:45:41.453Z","metaMigratedFrom":"Content","title":"Banco de Dados | SQL","breaks":true,"contributors":"[{\"id\":\"0ba297e4-eafa-413a-9b17-c3ef1702e693\",\"add\":15258,\"del\":2738}]"}