create table estudiantes (
id_estudiante serial primary key,
nombre varchar(50),
apellido varchar(50)
);
create table asignaturas (
id_asignatura serial primary key,
nombre_asignatura varchar(100)
);
create table calificaciones (
id_calificacion serial primary key,
id_estudiante int references estudiantes(id_estudiante),
id_asignatura int references asignaturas(id_asignatura),
nota numeric(3,1)
);
insert into estudiantes (nombre, apellido) values
('adrian', 'astaiza'),
('esteban', 'collazos'),
('leidy', 'gomez');
insert into asignaturas (nombre_asignatura) values
('matematicas'),
('fisica'),
('programacion');
insert into calificaciones (id_estudiante, id_asignatura, nota) values
(1.9, 1, 3.5),
(1, 2, 4.0),
(2.4, 1, 2.0),
(2.5, 2, 1.5),
(3.6, 3, 3.0),
(3, 1, 4.5);
--a. Mostrar el nombre del estudiante, asignatura y las calificaciones ordenadas en
--forma ascendente.
select e.nombre, a.nombre_asignatura, c.nota from calificaciones c join estudiantes e on c.id_estudiante = e.id_estudiante join asignaturas a on c.id_asignatura = a.id_asignatura order by c.nota 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, c.nota from calificaciones c join estudiantes e on c.id_estudiante = e.id_estudiante join asignaturas a on c.id_asignatura = a.id_asignatura where c.nota 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(c.nota) as promedio from calificaciones c join estudiantes e on c.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(c.nota) as promedio from calificaciones c join estudiantes e on c.id_estudiante = e.id_estudiante group by e.nombre, e.apellido having avg(c.nota) >= 3;
--e. Mostrar el nombre de los dos primeros estudiantes que tuvieron mayor promedio
--de notas.
select e.nombre, e.apellido, avg(c.nota) as promedio from calificaciones c join estudiantes e on c.id_estudiante = e.id_estudiante group by e.nombre, e.apellido order by promedio desc limit 2;
--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(c.nota) as promedio from calificaciones c join estudiantes e on c.id_estudiante = e.id_estudiante join asignaturas a on c.id_asignatura = a.id_asignatura group by e.nombre, a.nombre_asignatura having avg(c.nota) >= 3;