Banco De Dados - Exercícios SQL
Exercício valendo nota
sql code snippet start
-- Trabalho de IBD
-- Exercicio 1: Criar o banco com as tabelas propostas;
CREATE DATABASE faculdade;
USE faculdade;
CREATE TABLE alunos (
ra INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
nome VARCHAR(100),
cidade VARCHAR(40)
);
CREATE TABLE professor (
codigoprofessor INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
nome VARCHAR(100),
cidade VARCHAR(40)
);
CREATE TABLE disciplina (
codigodisciplina INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
disciplina VARCHAR(100),
cargahoraria FLOAT
);
CREATE TABLE historico (
codigohistorico INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
ra INT,
CONSTRAINT fk_hist_aluno FOREIGN KEY (ra) REFERENCES alunos (ra),
codigodisciplina INT,
CONSTRAINT fk_hist_disc FOREIGN KEY (codigodisciplina) REFERENCES disciplina (codigodisciplina),
codigoprofessor INT,
CONSTRAINT fk_hist_prof FOREIGN KEY (codigoprofessor) REFERENCES professor (codigoprofessor),
semestre INT,
faltas INT,
nota FLOAT
);
-- 02 Inserir informações em todas as tabelas (10 alunos, 4 disciplinas - Banco de dados, Sistemas Operacionais, Rede de Computadores e Estrutura de dados, 3professores e 15 históricos)
INSERT INTO
alunos (nome, cidade)
VALUES
('Gabriel', 'Mogi Guaçu'),
('Marcos', 'Mogi Guaçu'),
('Adryelle', 'Mogi Mirim'),
('Brenda', 'Mogi Mirim'),
('Tabata', 'Mogi Guaçu'),
('Renan', 'Mogi Guaçu'),
('Thaito', 'Mogi Guaçu'),
('Fernando', 'Mogi Mirim'),
('Luis', 'Jaguariuna'),
('Ian', 'Estiva');
INSERT INTO
disciplina (disciplina, cargahoraria)
VALUES
('Banco de Dados', 80),
('Sistemas Operacionais', 80),
('Redes de Computadores', 40),
('Estrutura de Dados', 80);
INSERT INTO
professor (nome, cidade)
VALUES
('Maromo', 'Mogi Mirim'),
('Sandro', 'Mogi Mirim'),
('Ana Célia', 'Mogi Mirim');
INSERT INTO
historico (
ra,
codigodisciplina,
codigoprofessor,
semestre,
faltas,
nota
)
VALUES
(1, 1, 2, 3, 4, 10),
(1, 2, 2, 3, 8, 10),
(1, 3, 1, 3, 12, 8.5),
(1, 4, 3, 3, 20, 7.8),
(2, 1, 2, 3, 4, 8.5),
(2, 2, 2, 3, 4, 9),
(2, 3, 2, 3, 4, 9.5),
(2, 2, 2, 1, 5, 2.5),
(4, 2, 1, 3, 4, 6.5),
(5, 3, 2, 3, 3, 10.0),
(6, 3, 3, 3, 3, 9.0),
(7, 4, 1, 3, 5, 8.5),
(8, 4, 2, 3, 2, 7.0),
(4, 3, 1, 3, 4, 6.5),
(9, 1, 3, 3, 4, 6.5);
--03 Encontre o nome e RA dos alunos com nota na disciplina de Banco de Dados no 2º semestre menor que 5.
SELECT
A.ra as RA,
A.nome as 'Nome Aluno'
FROM
alunos A,
historico H,
disciplina D
WHERE
A.ra = H.ra
AND H.codigodisciplina = D.codigodisciplina
AND D.disciplina = 'Banco de Dados'
AND H.semestre = 2
AND H.nota < 5;
-- 04 Alterar a tabela histórico e incluir um campo inteiro chamado ano, com o objetivo de armazenar o ano e semestre do registro de histórico dos alunos.
ALTER TABLE historico ADD ano INT;
UPDATE historico
SET
ano = CASE
WHEN semestre = 2 THEN 2024
WHEN semestre = 3 THEN 2023
WHEN semestre = 1 THEN 2024
END
WHERE
semestre IN (2, 3, 1);
-- 05 Alterar a tabela de histórico definindo o ano para cada um dos registros de histórico da tabela.
UPDATE historico
SET
ano = CASE
WHEN codigohistorico = 1 THEN 2009
WHEN codigohistorico = 2 THEN 2010
WHEN codigohistorico = 3 THEN 2011
WHEN codigohistorico = 4 THEN 2009
WHEN codigohistorico = 5 THEN 2012
WHEN codigohistorico = 6 THEN 2013
WHEN codigohistorico = 7 THEN 2004
WHEN codigohistorico = 8 THEN 2015
WHEN codigohistorico = 9 THEN 2016
WHEN codigohistorico = 10 THEN 2017
WHEN codigohistorico = 11 THEN 2018
WHEN codigohistorico = 12 THEN 2019
WHEN codigohistorico = 13 THEN 2020
WHEN codigohistorico = 14 THEN 2021
WHEN codigohistorico = 15 THEN 2022
END
WHERE
codigohistorico IN (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
-- 06 Apresente o nome dos professores de banco de dados que ministraram aulas em 2020
SELECT DISTINCT
P.nome
FROM
professor P
JOIN historico H ON P.codigoprofessor = H.codigoprofessor
JOIN disciplina D ON H.codigodisciplina = D.codigodisciplina
WHERE
D.disciplina = 'Banco de Dados'
AND H.ano = 2020;
-- 07 Apresente a quantidae e nomes das disciplinas que cada professor ministrou em 2020
SELECT
P.nome AS 'Nome do Professor',
COUNT(DISTINCT (D.disciplina)) AS 'Quantidade Ministrada'
FROM
professor P
JOIN historico H on P.codigoprofessor = H.codigoprofessor
JOIN disciplina D ON H.codigodisciplina = D.codigodisciplina
WHERE
H.ano = 2020
GROUP BY
P.nome;
-- 08 Encontre o nome, cidade dos alunos, código das disciplinas e nome da disciplina onde os alunos tiveram nota menor que 5 no 1º semestre de 2020.
SELECT
A.nome as 'Nome do Aluno',
A.cidade as 'Cidade',
D.codigodisciplina as 'Codigo da Disciplina',
D.disciplina as 'Disciplina'
FROM
alunos A
INNER JOIN historico H on A.ra = H.ra
INNER JOIN disciplina D on H.codigodisciplina = D.codigodisciplina
WHERE
H.nota < 5;
-- 09 Apresente o nome e RA dos alunos que frequentaram a disciplina de Estrutura de Dados com o professor Marcos em 2019.
SELECT
A.nome as 'Nome do Aluno',
A.ra as 'R.A.'
FROM
alunos A
INNER JOIN historico H ON A.ra = H.ra
INNER JOIN disciplina D on H.codigodisciplina = D.codigodisciplina
INNER JOIN professor P on H.codigoprofessor = P.codigoprofessor
WHERE
D.disciplina = 'Estrutura de Dados'
AND P.nome = 'Marcos'
AND H.ano = 2019;
-- 10 Apresentar o histórico escolar do aluno Alex com informações do seu RA, nome, disciplinas, faltas, nota, ano e semestre.
SELECT
A.ra as 'R.A.',
A.nome as 'Nome do Aluno',
D.disciplina as 'Disciplina',
H.faltas as 'Faltas',
H.nota as 'Nota',
H.ano as 'Ano Letivo',
H.semestre as 'Semestre'
FROM
alunos A
INNER JOIN historico H on A.ra = H.ra
INNER JOIN disciplina D on H.codigodisciplina = D.codigodisciplina
WHERE
A.nome = 'Alex';
-- 11 Encontre o nome dos professores que reside em Mogi Mirim.
SELECT
nome AS 'Nome do Professor'
FROM
professor
WHERE
cidade = 'Mogi Mirim';
-- 12 Forneça o nome dos alunos e nome das disciplinas com carga horária menor que 60 horas.
SELECT
A.nome as 'Nome do Aluno',
D.disciplina as 'Disciplina',
P.nome as 'Nome Professor'
FROM
alunos A
INNER JOIN historico H on A.ra = H.ra
INNER JOIN disciplina D on H.codigodisciplina = D.codigodisciplina
INNER JOIN professor P ON H.codigoprofessor = P.codigoprofessor
WHERE
D.cargahoraria < 60;
-- 13 Localize o nome dos professores que lecionam matérias ao aluno "Pedro Paulo Cunha" que foi reprovado com nota inferior a 5
SELECT DISTINCT
P.nome
FROM
historico H
INNER JOIN alunos A ON H.ra = A.ra
INNER JOIN professor P ON H.codigoprofessor = P.codigoprofessor
WHERE
H.nota < 5
AND A.nome = 'Pedro Paulo Cunha';
-- 14 Apresente o RA e nome dos alunos que frequentam disciplinas do professor Sandro
SELECT
A.nome as 'Nome do Aluno',
A.ra as 'R.A.'
FROM
alunos A
INNER JOIN historico H ON A.ra = H.ra
INNER JOIN disciplina D ON H.codigodisciplina = D.codigodisciplina
INNER JOIN professor P ON H.codigoprofessor = P.codigoprofessor
WHERE
P.nome = 'Sandro'
GROUP BY
A.nome;
-- 15 Encontre o RA, Nome e Média das notas dos alunos que cursaram as materias de professores de Mogi Mirim
SELECT
A.nome as 'Nome do Aluno',
A.ra as 'R.A.',
AVG(H.nota) as 'Media'
FROM
alunos A
INNER JOIN historico H ON A.ra = H.ra
INNER JOIN disciplina D ON H.codigodisciplina = D.codigodisciplina
INNER JOIN professor P ON H.codigoprofessor = P.codigoprofessor
WHERE
P.cidade = 'Mogi Mirim'
GROUP BY
A.nome;
-- 16 Apresente o número de alunos que fizeram banco de dados e estrutura de dados em 2020 no primeiro semestre.
SELECT
COUNT(DISTINCT A.ra) as 'Quantidade de alunos que cursaram IBD e IED no primeiro Semestre de 2020'
FROM
alunos A
INNER JOIN historico H ON A.ra = H.ra
INNER JOIN disciplina D ON H.codigodisciplina = D.codigodisciplina
WHERE
D.disciplina = 'Banco de Dados'
AND D.disciplina = 'Banco de Dados'
AND H.ano = 2020
AND H.semestre = 1;
-- 17 Apresente a média de notas por disciplina. Ordenar por média decrescente
SELECT
D.disciplina as 'Disciplina',
AVG(H.nota) as Média
FROM
historico H
INNER JOIN disciplina D ON H.codigodisciplina = D.codigodisciplina
GROUP BY
D.disciplina
ORDER BY
H.nota DESC;
-- 18 Apresente nome do aluno, cidade, código da disciplina e nome da disciplina que os alunos tiveram nota superior a 5 no 1º semestre de 2020. ORdenar por nome da disciplina.
SELECT
A.nome as 'Nome do Aluno',
A.cidade as 'Cidade',
D.codigodisciplina as 'Código da Disciplina',
D.disciplina as 'Disciplina cuja nota foi maior que 5 no 1º semestre de 2020'
FROM
historico H
INNER JOIN alunos A ON H.ra = A.ra
INNER JOIN disciplina D ON H.codigodisciplina = D.codigodisciplina
WHERE
H.semestre = 1
AND H.ano = 2020
AND H.nota > 5
GROUP BY
A.nome
ORDER BY
D.disciplina ASC;
-- 19 Apresentar o Historico escolar do aluno Alex, contendo seu RA, nome, lista de disciplinas que já cursou contendo codigo e nome da disciplina, faltas, nota, ano e semestre.
SELECT
A.nome as 'Nome do Aluno',
A.ra as 'R.A.',
D.disciplina as 'Disciplina',
D.codigodisciplina as 'Código da Disciplina',
H.semestre as 'Cursada no semestre:',
H.ano as 'no Ano:',
H.faltas as 'Faltando ... Dias',
H.nota as 'Nota Final:'
FROM
historico H
INNER JOIN alunos A ON H.ra = A.ra
INNER JOIN disciplina D ON H.codigodisciplina = D.codigodisciplina
WHERE
A.nome = 'Alex'
ORDER BY
H.ano DESC;
-- 20 Apresente a quantidade que o aluno José da Silva cursou Banco de Dados
SELECT
A.nome as 'Nome do Aluno',
D.disciplina as 'Disciplina',
COUNT(H.codigodisciplina) as 'Vezes que cursou'
FROM
historico H
INNER JOIN alunos A ON H.ra = A.ra
INNER JOIN disciplina D ON H.codigodisciplina = D.codigodisciplina
WHERE
A.nome = 'José da Silva'
AND D.disciplina = 'Banco de Dados';
-- 21 Apresentar a quantidade de alunos que cursou a disciplina de banco de dados em 2019 e 2020.
SELECT
COUNT(DISTINCT A.ra) as 'Quantidade de aluno que cursou Banco de Dados'
FROM
historico H
INNER JOIN alunos A ON H.ra = A.ra
INNER JOIN disciplina D ON H.codigodisciplina = D.codigodisciplina
WHERE
D.disciplina = 'Banco de Dados'
AND (
H.ano = 2019
OR H.ano = 2020
);
-- 22 Insira todos os alunos da disciplina de BD em 2019 e que tiveram nota > 5, cursando uma disciplina de TBD (Tópicos em Banco de Dados) em 2018 com o mesmo professor mas frequencia e notas desconhecidas.
INSERT INTO
disciplina (disciplina, cargahoraria)
VALUES
('Tópicos em Banco de Dados', 80);
INSERT INTO
historico (
ra,
codigodisciplina,
codigoprofessor,
semestre,
ano
)
SELECT
A.ra,
D.codigodisciplina,
P.codigoprofessor,
1,
2018
FROM
historico H
INNER JOIN alunos A ON H.ra = A.ra
INNER JOIN disciplina D ON H.codigodisciplina = D.codigodisciplina
INNER JOIN professor P ON H.codigoprofessor = P.codigoprofessor
WHERE
D.disciplina = 'Banco de Dados'
AND H.ano = 2019
AND H.nota > 5;
-- 23 Altere as notas dos alunos de BD em 2019 com o professor Sandro através da regra:
-- -- Notas entre 4 e 5, ficam 4. Notas entre 5 e 9.5 terao acrescimo de 0.5, notas acima de 9.5 serao 10.
UPDATE historico H
INNER JOIN professor P ON H.codigoprofessor = P.codigoprofessor
INNER JOIN disciplina D ON H.codigodisciplina = D.codigodisciplina
SET
nota = CASE
WHEN nota BETWEEN 4 AND 5 THEN 4
WHEN nota BETWEEN 5 AND 9.5 THEN nota + 0.5
WHEN nota > 9.5 THEN 10
END
WHERE
D.disciplina = 'Banco de Dados'
AND P.nome = 'Sandro'
AND H.ano = 2019;
-- 24 Apresente uma consulta de nome do aluno, nome da disciplina, faltas, notas e uma informação de reprovado caso nota inferior a 7, e aprovado caso superior a 7.
SELECT
A.nome as 'Nome do Aluno',
D.disciplina as 'Disciplina',
H.faltas as 'Faltas',
H.nota as 'Nota',
CASE
WHEN H.nota >= 7 THEN 'Aprovado'
ELSE 'Reprovado'
END AS 'Fechamento'
FROM
historico H
INNER JOIN alunos A ON H.ra = A.ra
INNER JOIN disciplina D on H.codigodisciplina = D.codigodisciplina;
-- 25 Apresente como resultado a média dos alunos REPROVADOS, ou seja média inferior a 5 (???? A Média acima era 7, agora virou 5... Vou fazer dos dois)
SELECT
D.disciplina,
AVG(H.nota) AS 'Médias'
FROM
disciplina D
JOIN historico H ON D.codigodisciplina = H.codigodisciplina
WHERE
H.nota < 5
GROUP BY
D.disciplina;
SELECT
D.disciplina,
AVG(H.nota) AS 'Médias'
FROM
disciplina D
JOIN historico H ON D.codigodisciplina = H.codigodisciplina
WHERE
H.nota < 7
GROUP BY
D.disciplina;
-- 26 comando sql para acrescentar 0.5 pontos na materia de banco de dados para todos os alunos que participam.
UPDATE historico H
SET
nota = CASE
WHEN nota <= 9.5 THEN nota + 0.5
WHEN nota = 10 THEN 10
END
WHERE
codigodisciplina = (
SELECT
codigodisciplina
FROM
disciplina
WHERE
disciplina = 'Banco de Dados'
);
-- 27 Considere a necessidade de normalizar o DB. Observa-se que o campo CIDADE não atende às normas normais na tabela ALUNOS. Desta forma, apresentar os camondos SQL na sequencia para:
-- 27a) Criar uma tabela nova chamada CIDADE e transferir o campo cidade da tabela alunos para esta tabela.
-- 27b) Criar chave primária e identity (auto_increment)
CREATE TABLE cidade (
codigocidade INT AUTO_INCREMENT PRIMARY KEY,
nome VARCHAR(40) UNIQUE NOT NULL
);
INSERT INTO
cidade (nome)
SELECT DISTINCT
cidade
FROM
alunos ON DUPLICATE KEY
UPDATE nome =
VALUES
(nome);
-- 27c) Criar uma chave estrangeira para a tabela alunos e relacionar.
ALTER TABLE alunos ADD (
codigocidade INT,
CONSTRAINT fk_aluno_cidade FOREIGN KEY (codigocidade) REFERENCES cidade (codigocidade)
);
-- 27d) Preencher o campo de chave estrangeira da tabela alunos com o código novo da tabela da cidade levando em consideração o campo cidade da tabela alunos.
UPDATE alunos A
INNER JOIN cidade C ON A.cidade = C.nome
SET
A.codigocidade = C.codigocidade;
-- 27e) Excluir o campo cidade na tabela aluno
ALTER TABLE alunos
DROP COLUMN cidade;
-- Opcional: Selecionar para trocar o código da cidade pelo nome:
SELECT
A.ra,
A.nome,
C.nome
FROM
alunos A
JOIN cidade C ON A.codigocidade = C.codigocidade
ORDER BY
A.ra ASC;
sql code snippet end
Exercícios em sala
sql code snippet start
-- Exercicio 1:
CREATE DATABASE faculdade;
USE faculdade;
CREATE TABLE ALUNOS (
RA INT IDENTITY PRIMARY KEY,
NOME VARCHAR(100),
CIDADE VARCHAR(40)
);
CREATE TABLE DISCIPLINAS (
codigodisciplina INT IDENTITY NOT NULL PRIMARY KEY,
nome VARCHAR(100),
carga_horaria INT
);
CREATE TABLE PROFESSORES (
codigoprofessor INT IDENTITY PRIMARY KEY,
nome VARCHAR(100),
cidade VARCHAR(40)
);
CREATE TABLE HISTORICO (
codigohistorico INT IDENTITY PRIMARY KEY,
ra INT,
codigodisciplina INT,
codigoprofessor INT,
semestre INT,
faltas INT,
nota FLOAT,
FOREIGN KEY (ra) REFERENCES ALUNOS (RA),
FOREIGN KEY (codigodisciplina) REFERENCES DISCIPLINAS (codigodisciplina),
FOREIGN KEY (codigoprofessor) REFERENCES PROFESSORES (codigoprofessor)
);
-- Exercicio 2:
INSERT INTO
ALUNOS (NOME, CIDADE)
VALUES
('João Silva', 'São Paulo'),
('Maria Oliveira', 'Campinas'),
('Pedro Santos', 'Rio de Janeiro'),
('Ana Costa', 'Curitiba'),
('Lucas Almeida', 'São Paulo'),
('José da Silva', 'Campinas'),
('Carlos Lima', 'Fortaleza'),
('Bianca Pereira', 'Belo Horizonte'),
('Pedro Paulo Cunha', 'Salvador'),
('Alex', 'Porto Alegre');
SELECT
*
FROM
ALUNOS;
INSERT INTO
PROFESSORES (nome, cidade)
VALUES
('Sandro Armelin', 'Mogi Mirim'),
('Marcos Nava', 'Mogi Mirim'),
('Ricardo Akira', 'Mogi Mirim');
SELECT
*
FROM
PROFESSORES;
INSERT INTO
DISCIPLINAS (nome, carga_horaria)
VALUES
('Banco de Dados', 80),
('Sistemas Operacionais', 40),
('Redes de Computadores', 80),
('Estrutura de Dados', 40);
SELECT
*
FROM
DISCIPLINAS;
INSERT INTO
HISTORICO (
ra,
codigodisciplina,
codigoprofessor,
semestre,
faltas,
nota
)
VALUES
(1, 1, 1, 1, 2, 7.5),
(2, 2, 1, 2, 0, 8.0),
(3, 3, 3, 1, 3, 6.0),
(4, 4, 2, 2, 1, 5.5),
(5, 1, 1, 1, 0, 9.0),
(6, 2, 1, 1, 4, 4.0),
(7, 3, 3, 2, 2, 7.0),
(8, 4, 2, 1, 1, 6.5),
(8, 1, 2, 1, 3, 2.5),
(9, 1, 1, 2, 3, 1.5),
(10, 2, 1, 1, 0, 5.0),
(1, 3, 3, 2, 1, 7.0),
(2, 4, 2, 1, 2, 6.0),
(3, 1, 1, 2, 0, 9.5),
(4, 2, 1, 1, 3, 4.5),
(5, 3, 3, 2, 1, 5.5);
SELECT
*
FROM
HISTORICO;
-- Exercicio 3:
SELECT
a.NOME,
a.RA
FROM
ALUNOS a
JOIN HISTORICO h ON a.RA = h.ra
JOIN DISCIPLINAS d ON h.codigodisciplina = d.codigodisciplina
WHERE
d.nome = 'Banco de Dados'
AND h.semestre = 2
AND h.nota < 5;
-- Exercicio 4:
ALTER TABLE HISTORICO ADD ano INT;
-- Exercicio 5:
UPDATE HISTORICO
SET
ano = 2019
WHERE
codigohistorico <= 7;
UPDATE HISTORICO
SET
ano = 2020
WHERE
codigohistorico > 7;
select
*
from
historico;
-- Exercicio 6:
SELECT DISTINCT
p.nome
FROM
PROFESSORES p
JOIN HISTORICO h ON p.codigoprofessor = h.codigoprofessor
JOIN DISCIPLINAS d ON h.codigodisciplina = d.codigodisciplina
WHERE
d.nome = 'Banco de Dados'
AND h.ano = 2020;
-- Exercicio 7:
SELECT
p.nome AS nome_professor,
COUNT(DISTINCT d.nome) AS quantidade_disciplinas
FROM
PROFESSORES p
JOIN HISTORICO h ON p.codigoprofessor = h.codigoprofessor
JOIN DISCIPLINAS d ON h.codigodisciplina = d.codigodisciplina
WHERE
h.ano = 2020
GROUP BY
p.nome;
-- Exercicio 8:
SELECT
a.NOME AS nome_aluno,
a.CIDADE AS cidade_aluno,
d.codigodisciplina,
d.nome AS nome_disciplina
FROM
ALUNOS a
JOIN HISTORICO h ON a.RA = h.ra
JOIN DISCIPLINAS d ON h.codigodisciplina = d.codigodisciplina
WHERE
h.nota < 5
AND h.semestre = 1
AND h.ano = 2020;
-- Exercicio 9:
SELECT
a.NOME,
a.RA
FROM
ALUNOS a
JOIN HISTORICO h ON a.RA = h.ra
JOIN DISCIPLINAS d ON h.codigodisciplina = d.codigodisciplina
JOIN PROFESSORES p ON h.codigoprofessor = p.codigoprofessor
WHERE
d.nome = 'Estrutura de Dados'
AND p.nome = 'Marcos Nava'
AND h.ano = 2019;
-- Exercicio 10:
SELECT
a.RA,
a.NOME AS nome_aluno,
d.nome AS nome_disciplina,
h.faltas,
h.nota,
h.ano,
h.semestre
FROM
ALUNOS a
JOIN HISTORICO h ON a.RA = h.ra
JOIN DISCIPLINAS d ON h.codigodisciplina = d.codigodisciplina
WHERE
a.NOME = 'Alex';
-- Exercicio 11:
SELECT
nome
FROM
PROFESSORES
WHERE
cidade = 'Mogi Mirim';
-- Exercicio 12:
SELECT
a.nome AS nome_aluno,
d.nome AS nome_disciplina,
p.nome AS nome_professor
FROM
ALUNOS a
JOIN HISTORICO h ON a.RA = h.ra
JOIN DISCIPLINAS d ON h.codigodisciplina = d.codigodisciplina
JOIN PROFESSORES p ON h.codigoprofessor = p.codigoprofessor
WHERE
d.carga_horaria < 60;
-- Exercicio 13:
SELECT DISTINCT
p.nome AS nome_professor
FROM
ALUNOS a
JOIN HISTORICO h ON a.RA = h.ra
JOIN DISCIPLINAS d ON h.codigodisciplina = d.codigodisciplina
JOIN PROFESSORES p ON h.codigoprofessor = p.codigoprofessor
WHERE
a.NOME = 'Pedro Paulo Cunha'
AND h.nota < 5;
-- Exercicio 14:
SELECT
a.NOME,
a.RA
FROM
ALUNOS a
JOIN HISTORICO h ON a.RA = h.ra
JOIN PROFESSORES p ON h.codigoprofessor = p.codigoprofessor
WHERE
p.nome = 'Sandro Armelin';
-- Exercicio 15:
SELECT
A.nome as 'Nome do Aluno',
A.ra as 'R.A.',
AVG(H.nota) as 'Media'
FROM
alunos A
INNER JOIN historico H ON A.ra = H.ra
INNER JOIN disciplinas D ON H.codigodisciplina = D.codigodisciplina
INNER JOIN professores P ON H.codigoprofessor = P.codigoprofessor
WHERE
P.cidade = 'Mogi Mirim'
GROUP BY
A.ra,
A.nome;
-- Exercicio 16:
SELECT
COUNT(DISTINCT h.ra) AS numero_de_alunos
FROM
HISTORICO h
JOIN DISCIPLINAS d ON h.codigodisciplina = d.codigodisciplina
WHERE
(
d.nome = 'Banco de Dados'
OR d.nome = 'Estrutura de Dados'
)
AND h.semestre = 1
AND h.ano = 2020
GROUP BY
h.ra
HAVING
COUNT(DISTINCT d.codigodisciplina) = 2;
-- Exercicio 17:
SELECT
d.nome AS nome_disciplina,
AVG(h.nota) AS media_notas
FROM
HISTORICO h
JOIN DISCIPLINAS d ON h.codigodisciplina = d.codigodisciplina
GROUP BY
d.nome
ORDER BY
media_notas DESC;
-- Exercicio 18:
SELECT
a.NOME AS nome_aluno,
a.CIDADE AS cidade_aluno,
d.codigodisciplina,
d.nome AS nome_disciplina
FROM
ALUNOS a
JOIN HISTORICO h ON a.RA = h.ra
JOIN DISCIPLINAS d ON h.codigodisciplina = d.codigodisciplina
WHERE
h.nota > 5
AND h.semestre = 1
AND h.ano = 2020
ORDER BY
d.nome;
-- Exercicio 19:
SELECT
a.RA,
a.NOME AS nome_aluno,
d.codigodisciplina,
d.nome AS nome_disciplina,
h.faltas,
h.nota,
h.ano,
h.semestre
FROM
ALUNOS a
JOIN HISTORICO h ON a.RA = h.ra
JOIN DISCIPLINAS d ON h.codigodisciplina = d.codigodisciplina
WHERE
a.NOME = 'Alex';
-- Exercicio 20:
SELECT
COUNT(*) AS 'vezes cursadas'
FROM
HISTORICO h
JOIN ALUNOS a ON h.ra = a.RA
JOIN DISCIPLINAS d ON h.codigodisciplina = d.codigodisciplina
WHERE
a.NOME = 'José da Silva'
AND d.nome = 'Banco de Dados';
-- Exercicio 21:
SELECT
h.ano,
COUNT(DISTINCT h.ra) AS quantidade_alunos
FROM
HISTORICO h
JOIN DISCIPLINAS d ON h.codigodisciplina = d.codigodisciplina
WHERE
d.nome = 'Banco de Dados'
AND h.ano IN (2019, 2020)
GROUP BY
h.ano
ORDER BY
h.ano;
-- Exercicio 22:
INSERT INTO
disciplinas (nome, carga_horaria)
VALUES
('Tópicos em Banco de Dados', 40);
INSERT INTO
Historico (
RA,
codigodisciplina,
codigoprofessor,
semestre,
faltas,
nota,
ano
)
SELECT
h.RA,
5 AS CodDisciplina,
h.codigoprofessor,
1,
NULL,
NULL,
2018
FROM
Historico h
JOIN Disciplinas d ON h.codigodisciplina = d.codigodisciplina
JOIN Professores p ON h.codigoprofessor = p.codigoprofessor
WHERE
d.Nome = 'Banco de Dados'
AND h.Ano = 2019
AND h.Nota > 5
AND p.Nome = 'Sandro Armelin';
select
*
from
historico;
-- Exercicio 23:
UPDATE HISTORICO
SET
nota = CASE
WHEN nota BETWEEN 4.0 AND 5.0 THEN 4.0
WHEN nota BETWEEN 5.0 AND 9.5 THEN nota + 0.5
WHEN nota > 9.5 THEN 10.0
ELSE nota
END
WHERE
codigoprofessor = (
SELECT
codigoprofessor
FROM
PROFESSORES
WHERE
nome = 'Sandro Armelin'
)
AND Ano = 2019
AND codigodisciplina = (
SELECT
codigodisciplina
FROM
DISCIPLINAS
WHERE
nome = 'Banco de Dados'
);
SELECT
*
FROM
HISTORICO
WHERE
codigodisciplina = 1;
-- Exercicio 24:
SELECT
a.NOME,
d.nome,
h.faltas,
h.nota,
CASE
WHEN h.nota >= 7 THEN 'Aprovado'
ELSE 'Reprovado'
END AS Situacao
FROM
ALUNOS a
JOIN HISTORICO h ON a.RA = h.RA
JOIN DISCIPLINAS d ON h.codigodisciplina = d.codigodisciplina;
-- Exercicio 25
SELECT
d.nome,
AVG(h.nota) AS media_notas
FROM
DISCIPLINAS d
JOIN HISTORICO h ON d.codigodisciplina = h.codigodisciplina
WHERE
h.nota < 5
GROUP BY
d.nome;
-- Exercicio 26:
UPDATE HISTORICO
SET
nota = nota + 0.5
WHERE
codigodisciplina = (
SELECT
codigodisciplina
FROM
DISCIPLINAS
WHERE
nome = 'Banco de Dados'
);
SELECT
*
FROM
HISTORICO
WHERE
codigodisciplina = 1;
-- Exercicio 27:
CREATE TABLE Cidade (
CidadeID INT IDENTITY PRIMARY KEY,
CidadeNome VARCHAR(40) UNIQUE NOT NULL
);
INSERT INTO
Cidade (CidadeNome)
SELECT DISTINCT
Cidade
FROM
Alunos
WHERE
Cidade NOT IN (
SELECT
CidadeNome
FROM
Cidade
);
ALTER TABLE Alunos ADD CidadeID INT;
UPDATE Alunos
SET
CidadeID = (
SELECT
CidadeID
FROM
Cidade
WHERE
CidadeNome = Alunos.Cidade
);
ALTER TABLE Alunos
DROP COLUMN Cidade;
select
*
from
alunos;
sql code snippet end