escena
Existe una tabla, que contiene las calificaciones de los estudiantes y sus cursos correspondientes, es necesario encontrar cursos que sean superiores al promedio de todos los cursos del estudiante.
Estructura de la mesa
Solución
Pienso en dos tipos de SQL, como sigue
El primero
Averigüe el valor promedio correspondiente a cada alumno y conéctelo con la tabla original, y luego compare la puntuación del curso y el valor promedio con las condiciones de la consulta
select t1.student_id,course_id
from t_mark t1,
(
SELECT student_id,AVG(mark) avg
from
t_mark
group by student_id
) t2
where t1.student_id = t2.student_id
and t1.mark > t2.avg
El segundo
Cada vez que utilice una subconsulta en la condición de consulta para averiguar la comparación de promedio de cursos del estudiante
select t1.student_id,course_id
from t_mark t1
where t1.mark>
(select AVG(mark)
from t_mark t2
where t2. student_id = t1.student_id)
Comparar dos SQL
Entrada de datos
Para tener suficientes datos para la comparación, escriba un procedimiento almacenado para insertar 3 piezas de datos de puntuación para 3000 estudiantes
CREATE DEFINER=`root`@`localhost` PROCEDURE `insert_to_mark`()
BEGIN
#Routine body goes here...
DECLARE i INTEGER;
SET i = 1;
WHILE i<=3000 DO
INSERT INTO t_mark
(student_id,course_id,mark)
VALUES
(i,1,RAND()*70+30),
(i,2,RAND()*70+30),
(i,3,RAND()*70+30);
set i = i+1;
END WHILE;
END
Insertado correctamente
Comparación de consultas
El primero
El segundo
La brecha es bastante grande.
En conclusión
Es mejor usar el primero. No sé si hay un sql de consulta más eficiente. Bienvenido al comentario ~~