-- Crear las tablas
create table estudiante (
id_estudiante serial primary key,
nombre varchar(45),
apellido varchar(45),
fecha_nacimiento date
);
create table asignatura (
codigo_asignatura int primary key,
nombre_asignatura varchar(100)
);
create table nota (
codigo_nota int primary key,
id_estudiante int references estudiante(id_estudiante),
id_asignatura int references asignatura(codigo_asignatura),
calificacion float
);
-- Insertar datos en la tabla estudiante
insert into estudiante (nombre, apellido, fecha_nacimiento) values
('Adrian', 'Astaiza', '2000-01-15'),
('Esteban', 'Collazos', '2001-03-22'),
('Leidy', 'Gomez', '2000-07-05');
-- Insertar datos en la tabla asignatura
insert into asignatura (codigo_asignatura, nombre_asignatura) values
(1, 'Matematicas'),
(2, 'Fisica'),
(3, 'Programacion');
-- Insertar datos en la tabla nota
insert into nota (codigo_nota, id_estudiante, id_asignatura, calificacion) values
(1, 1, 1, 3.5),
(2, 1, 2, 4.0),
(3, 2, 1, 2.0),
(4, 2, 2, 1.5),
(5, 3, 3, 3.0),
(6, 3, 1, 4.5),
(7, 1, 3, 2.0),
(8, 2, 3, 3.5),
(9, 3, 2, 2.5);
-- a. Mostrar el nombre del estudiante, asignatura y las calificaciones ordenadas en forma ascendente.
select e.nombre, a.nombre_asignatura, n.calificacion
from nota n
join estudiante e on n.id_estudiante = e.id_estudiante
join asignatura a on n.id_asignatura = a.codigo_asignatura
order by n.calificacion asc;
-- b. Mostrar el nombre del estudiante, asignatura y las calificaciones de los estudiantes que su calificación sea 1.5, 2.0, 3.0.
select e.nombre, a.nombre_asignatura, n.calificacion
from nota n
join estudiante e on n.id_estudiante = e.id_estudiante
join asignatura a on n.id_asignatura = a.codigo_asignatura
where n.calificacion in (1.5, 2.0, 3.0);
-- c. Calcular la media de las calificaciones de cada estudiante y agrupar por nombre y apellido.
select e.nombre, e.apellido, avg(n.calificacion) as promedio
from nota n
join estudiante e on n.id_estudiante = e.id_estudiante
group by e.nombre, e.apellido;
-- d. Mostrar nombres, apellidos y las medias de notas de los estudiantes cuya media es mayor o igual a 3.
select e.nombre, e.apellido, avg(n.calificacion) as promedio
from nota n
join estudiante e on n.id_estudiante = e.id_estudiante
group by e.nombre, e.apellido
having avg(n.calificacion) >= 3;
-- e. Mostrar el nombre de los dos primeros estudiantes que tuvieron mayor promedio de notas.
select e.nombre, e.apellido, avg(n.calificacion) as promedio
from nota n
join estudiante e on n.id_estudiante = e.id_estudiante
group by e.nombre, e.apellido
order by promedio desc
limit 2;
-- f. Mostrar el nombre del estudiante, asignatura y las calificaciones de los estudiantes que ganaron la materia. La materia se gana con un promedio de notas igual o mayor a 3.
select e.nombre, a.nombre_asignatura, avg(n.calificacion) as promedio
from nota n
join estudiante e on n.id_estudiante = e.id_estudiante
join asignatura a on n.id_asignatura = a.codigo_asignatura
group by e.nombre, a.nombre_asignatura
having avg(n.calificacion) >= 3;