Resultados de los estudiantes de la consulta SQL superiores al promedio

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

Inserte la descripción de la imagen aquí

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
Inserte la descripción de la imagen aquí

Comparación de consultas

El primero

Inserte la descripción de la imagen aquí

El segundoInserte la descripción de la imagen aquí

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 ~~

Supongo que te gusta

Origin blog.csdn.net/Baibair/article/details/108781022
Recomendado
Clasificación