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
);
insert into estudiante (nombre, apellido, fecha_nacimiento) values
('Adrian', 'Astaiza', '2000-01-15'),
('Esteban', 'Collazos', '2001-03-22'),
('Leidy', 'Gomez', '2000-07-05');
insert into asignatura (codigo_asignatura, nombre_asignatura) values
(1, 'Matematicas'),
(2, 'Fisica'),
(3, 'Programacion');
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;