-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDB.sql
More file actions
190 lines (165 loc) · 5.54 KB
/
Copy pathDB.sql
File metadata and controls
190 lines (165 loc) · 5.54 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
/* Lógico_01.12: */
CREATE DATABASE school;
USE school;
CREATE TABLE Aluno (
id_aluno int PRIMARY KEY AUTO_INCREMENT,
nome varchar(255),
data_nascimento date,
genero enum('Masculino', 'Femenino'),
cpf varchar(14) UNIQUE,
serie enum('Primeira', 'Segunda', 'Terceira'),
matricula varchar(50) UNIQUE,
endereco varchar(255),
nome_responsavel varchar(255),
telefone_responsavel varchar(20),
status enum('Ativo', 'Inativo'),
fk_Usuario_id_usuario int UNIQUE
);
CREATE TABLE Professor (
id_professor int PRIMARY KEY AUTO_INCREMENT,
nome varchar(255),
genero enum('Masculino', 'Femenino'),
cpf varchar(14) UNIQUE,
codigo varchar(50) UNIQUE,
email varchar(255) UNIQUE,
telefone varchar(20),
especialidade varchar(255),
endereco varchar(255),
status enum('Ativo', 'Inativo'),
fk_Usuario_id_usuario int UNIQUE
);
CREATE TABLE Disciplina (
id_disciplina int PRIMARY KEY AUTO_INCREMENT,
nome_disciplina varchar(255),
codigo varchar(50) UNIQUE,
descricao text,
carga_horaria int
);
CREATE TABLE Aula (
id_aula int PRIMARY KEY AUTO_INCREMENT,
data_aula date,
hora_inicio time,
hora_fim time,
dados text,
fk_Turma_id_turma int
);
CREATE TABLE Presenca (
id_presenca int PRIMARY KEY AUTO_INCREMENT,
status enum('Presente', 'Ausente'),
hora_chegada time,
fk_Aluno_id_aluno int,
fk_Aula_id_aula int
);
CREATE TABLE Ocorrencia (
id_ocorrencia int PRIMARY KEY AUTO_INCREMENT,
descricao text,
tipo varchar(50),
fk_Professor_id_professor int
);
CREATE TABLE Historico_Ocorrencia (
id_historico_ocorrencia int PRIMARY KEY AUTO_INCREMENT,
data_ocorrencia datetime default now(),
fk_Aluno_id_aluno int,
fk_Ocorrencia_id_ocorrencia int UNIQUE
);
CREATE TABLE Usuario (
id_usuario int PRIMARY KEY AUTO_INCREMENT,
nome_usuario varchar(255) UNIQUE,
senha varchar(255),
tipo_usuario enum('Aluno', 'Professor', 'Administrador'),
data_criacao datetime default now()
);
CREATE TABLE Administrador (
id_administrador int PRIMARY KEY AUTO_INCREMENT,
nome varchar(255),
cargo varchar(50),
email varchar(255),
fk_Usuario_id_usuario int UNIQUE
);
CREATE TABLE Turma (
id_turma int PRIMARY KEY AUTO_INCREMENT,
nome varchar(50) UNIQUE,
capacidade int,
serie enum('Primeira', 'Segunda', 'Terceira'),
ano_letivo year,
semestre enum('Primeiro', 'Segundo'),
fk_Professor_id_professor int,
fk_Disciplina_id_disciplina int
);
CREATE TABLE Nota (
id_nota int PRIMARY KEY AUTO_INCREMENT,
nota decimal(3, 1),
fk_Turma_id_turma int,
fk_Aluno_id_aluno int
);
ALTER TABLE Aluno ADD CONSTRAINT FK_Aluno_1
FOREIGN KEY (fk_Usuario_id_usuario)
REFERENCES Usuario (id_usuario)
ON DELETE CASCADE;
ALTER TABLE Professor ADD CONSTRAINT FK_Professor_1
FOREIGN KEY (fk_Usuario_id_usuario)
REFERENCES Usuario (id_usuario)
ON DELETE CASCADE;
ALTER TABLE Administrador ADD CONSTRAINT FK_Administrador_1
FOREIGN KEY (fk_Usuario_id_usuario)
REFERENCES Usuario (id_usuario)
ON DELETE CASCADE;
ALTER TABLE Aula ADD CONSTRAINT FK_Aula_1
FOREIGN KEY (fk_Turma_id_turma)
REFERENCES Turma (id_turma)
ON DELETE CASCADE;
ALTER TABLE Presenca ADD CONSTRAINT FK_Presenca_1
FOREIGN KEY (fk_Aluno_id_aluno)
REFERENCES Aluno (id_aluno)
ON DELETE CASCADE;
ALTER TABLE Presenca ADD CONSTRAINT FK_Presenca_2
FOREIGN KEY (fk_Aula_id_aula)
REFERENCES Aula (id_aula)
ON DELETE CASCADE;
ALTER TABLE Ocorrencia ADD CONSTRAINT FK_Ocorrencia_1
FOREIGN KEY (fk_Professor_id_professor)
REFERENCES Professor (id_professor)
ON DELETE CASCADE;
ALTER TABLE Historico_Ocorrencia ADD CONSTRAINT FK_Historico_Ocorrencia_1
FOREIGN KEY (fk_Aluno_id_aluno)
REFERENCES Aluno (id_aluno)
ON DELETE CASCADE;
ALTER TABLE Historico_Ocorrencia ADD CONSTRAINT FK_Historico_Ocorrencia_2
FOREIGN KEY (fk_Ocorrencia_id_ocorrencia)
REFERENCES Ocorrencia (id_ocorrencia)
ON DELETE CASCADE;
ALTER TABLE Turma ADD CONSTRAINT FK_Turma_1
FOREIGN KEY (fk_Professor_id_professor)
REFERENCES Professor (id_professor)
ON DELETE SET NULL;
ALTER TABLE Turma ADD CONSTRAINT FK_Turma_2
FOREIGN KEY (fk_Disciplina_id_disciplina)
REFERENCES Disciplina (id_disciplina)
ON DELETE CASCADE;
ALTER TABLE Nota ADD CONSTRAINT FK_Nota_1
FOREIGN KEY (fk_Aluno_id_aluno)
REFERENCES Aluno (id_aluno)
ON DELETE CASCADE;
ALTER TABLE Nota ADD CONSTRAINT FK_Nota_2
FOREIGN KEY (fk_Turma_id_turma)
REFERENCES Turma (id_turma)
ON DELETE CASCADE;
--------------------------------------------------------------------------------------
SELECT
Aluno.matricula,
Aluno.nome,
Aluno.serie,
AVG(Nota.nota) AS media,
COUNT(Aula.id_aula) AS total_aula,
COUNT(CASE WHEN Presenca.status = 'Presente' THEN Presenca.id_presenca END) AS total_presenca,
COUNT(Aula.id_aula) - COUNT(CASE WHEN Presenca.status = 'Presente' THEN Presenca.id_presenca END) AS total_falta,
JSON_ARRAYAGG(Ocorrencia.descricao) AS ocorrencias,
JSON_ARRAYAGG(Turma.nome) AS turmas
FROM Aluno
LEFT JOIN Nota ON Aluno.id_aluno = Nota.fk_Aluno_id_aluno
LEFT JOIN Presenca ON Aluno.id_aluno = Presenca.fk_Aluno_id_aluno
LEFT JOIN Aula ON Presenca.fk_Aula_id_aula = Aula.id_aula
LEFT JOIN Historico_Ocorrencia ON Aluno.id_aluno = Historico_Ocorrencia.fk_Aluno_id_aluno
LEFT JOIN Ocorrencia ON Historico_Ocorrencia.fk_Ocorrencia_id_ocorrencia = Ocorrencia.id_ocorrencia
LEFT JOIN Turma ON Nota.fk_Turma_id_turma = Turma.id_turma
GROUP BY Aluno.id_aluno;