Code icon

MySQL - STORED PROCEDURES EXERCISES

Links


    //--PROCEDIMIENTOS ALMACENADOS EJERCICIOS

    //--1.- Alumnos del 811NMA con nota media mayor que la nota media de ese grupo
    CREATE OR ALTER PROCEDURE spAlumnos811NMAMediaMayor
    AS 
        declare @nmGrupo float
        set @nmGrupo = (SELECT AVG(Nota*1.0) FROM Nota N INNER JOIN Alumno A ON N.idAlumno = A.idAlumno WHERE A.idGrupo = '811NMA')
    
        SELECT A.idAlumno, AVG(N.Nota*1.0) FROM Nota N
        INNER JOIN Alumno A ON N.idAlumno = A.idAlumno WHERE A.idGrupo = '811NMA'
        GROUP BY A.idAlumno HAVING AVG(N.Nota*1.0) > @nmGrupo
    
    GO
    
    EXECUTE spAlumnos811NMAMediaMayor
    
    Go
    
    
    //--2 Alumnos con nota media mayor a la nota media del grupo pasado como parametro
    CREATE OR ALTER PROCEDURE spAlumnosMediaMayorGrupoIntroducido @idGrupo VARCHAR(7)
    AS 
        declare @nmGrupo float
        set @nmGrupo = (SELECT AVG(Nota*1.0) FROM Nota N INNER JOIN Alumno A ON N.idAlumno = A.idAlumno WHERE A.idGrupo = @idgrupo)
    
        SELECT A.idAlumno, AVG(N.Nota*1.0) FROM Nota N
        INNER JOIN Alumno A ON N.idAlumno = A.idAlumno WHERE A.idGrupo = @idgrupo
        GROUP BY A.idAlumno HAVING AVG(N.Nota*1.0) > @nmGrupo
    
    GO
    
    EXECUTE spAlumnosMediaMayorGrupoIntroducido '225NMA'
    
    GO
    
    //--3.- Relacion de alumnos de un grupo dado (por parámetro)
    CREATE OR ALTER PROCEDURE spAlumnosGrupoIntroducido @idGrupo VARCHAR(9)
    AS
        SELECT * FROM Alumno WHERE idGrupo = @idGrupo
    
    GO
    
    EXECUTE spAlumnosGrupoIntroducido '225NMA'
    
    GO
    
    //--4.- Boletín de notas de un alumno . Se pasa como parámetro el numero de expediente
    CREATE OR ALTER PROCEDURE spBoletinNotasAlumnoExpedienteIntroducido @idAlumno INT
    AS
        SELECT AG.Denominacion, N.Nota FROM Alumno A 
        INNER JOIN Nota N ON A.idAlumno = N.idAlumno 
        INNER JOIN Asignatura AG ON N.idAsignatura = AG.idAsignatura
        WHERE A.idAlumno = @idAlumno
    GO
    
    EXECUTE spBoletinNotasAlumnoExpedienteIntroducido 1
    
    GO
    
    //--5. Boletín de notas de un alumno. Se pasa como parámetro apellidos y nombre del alumno
    CREATE OR ALTER PROCEDURE spBoletinconApellidosyNombre @nombre VARCHAR(20), @apellidos VARCHAR (50)
    AS
        SELECT AG.Denominacion, N.Nota FROM Alumno A 
        INNER JOIN Nota N ON A.idAlumno = N.idAlumno 
        INNER JOIN Asignatura AG ON N.idAsignatura = AG.idAsignatura
        WHERE A.Nombre = @nombre AND A.Apellidos = @apellidos
    GO
    
    EXECUTE spBoletinconApellidosyNombre 'Ana', 'Valle CARPANTa'
    
    GO
    
    //--6.- Relación de alumnos con nota media entre dos valores dados que se pasan como parámetros.
    CREATE OR ALTER PROCEDURE spNotaMediaEntre2Num @a float, @b float
    AS
        SELECT A.idAlumno, AVG(N.Nota*1.0) FROM Alumno A
        INNER JOIN Nota N ON A.idAlumno = N.idAlumno 
        GROUP BY A.idAlumno
        HAVING AVG(N.Nota*1.0) BETWEEN @a AND @b
        
    GO
    
    EXECUTE spNotaMediaEntre2Num 2, 3
    
    GO
    
    //--7.- Relación de alumnos con mejor y peor nota media del centro..(TABLAS TEMPORALES)
    
    
    
    
    //--8.- Relación de alumnos de un grupo que se pasa como parámetro cuya nota media es mayor que la nota media de ese grupo.
    CREATE OR ALTER PROCEDURE spAlumnosconNotaMediaMayorqueGrupoIntroducido @idgrupo VARCHAR(9)
    AS
        declare @mediaGrupo FLOAT
        set @mediaGrupo = (SELECT AVG(N.Nota * 1.0) FROM Nota N INNER JOIN Alumno A ON N.idAlumno = A.idAlumno WHERE A.idGrupo = @idgrupo)
        
        SELECT A.idAlumno, AVG(N.Nota*1.0) FROM Alumno A
        INNER JOIN Nota N ON A.idAlumno = N.idAlumno 
        WHERE A.idGrupo = @idgrupo
        GROUP BY A.idAlumno
        HAVING AVG(N.Nota*1.0) > @mediaGrupo
    
    GO
    
    EXECUTE spAlumnosconNotaMediaMayorqueGrupoIntroducido '225NMA'
    
    GO 
    
    //--REVISAR
    //--9.- Número de alumnos de un grupo que tienen mas de 3 asignaturas suspendidas. Elgrupo se pasa como parámetro.
    CREATE OR ALTER PROCEDURE spNumAlumnosMasde3SuspendidasGrupoIntroducido @idGrupo VARCHAR(9)
    AS
        select COUNT(*) "Mas de 3 suspensas" from Alumno a
        where idGrupo = @idGrupo and
        3 < (select COUNT(*) from Nota n where a.idAlumno=n.idAlumno and Nota < 5);
    
    GO
    
    EXECUTE spNumAlumnosMasde3SuspendidasGrupoIntroducido '225NMA'
    
    GO
    
    
    //--10.- Lo mismo que el 9 pero el valor debe ser devuelto al programa que llama el procedimiento.
    create procedure spMasDe3SsuspensasReturn @idGrupo char(6)
    as
        return (
        select COUNT(*) "Mas de 3 suspensas" from Alumno a
        where idGrupo = @idGrupo and
        3 < (select COUNT(*) from Nota n where a.idAlumno=n.idAlumno and
        Nota < 5)
        )
    go
    
    //-- para probarlo
    declare @n int
    execute @n=spMasDe3SsuspensasReturn '225NMA' -- @n tendrá el valor devuelto en return
    print @n
    go
    
    //--11.- Procedimiento almacenado al que le pasamos el código de un alumno y nos devuelve la nota media.
    CREATE OR ALTER PROCEDURE spNotaMediaAlumnoConID @idAlumno INT, @media float OUTPUT
    AS
        set @media = (SELECT AVG(N.Nota*1.0) FROM Alumno A INNER JOIN Nota N ON A.idAlumno = N.idAlumno WHERE A.idAlumno = @idAlumno)
    
    GO
    
    declare @nm float
    EXECUTE spNotaMediaAlumnoConID 1, @nm OUTPUT
    PRINT @nm
    GO
    
    
    //--12. Procedimiento almacenado al que pasamos el código de un grupo y nos devuelve la nota media de ese grupo (media de todas las notas de los alumnos de ese grupo)
    CREATE OR ALTER PROCEDURE spNotaMediaGrupo @idGrupo VARCHAR (7), @media float OUTPUT
    AS
        set @media = (SELECT AVG(N.Nota*1.0) FROM Nota N INNER JOIN Alumno A ON N.idAlumno = A.idAlumno WHERE A.idGrupo = @idGrupo)
    GO
    
    declare @nm float
    EXECUTE spNotaMediaGrupo '225NMA', @nm OUTPUT
    PRINT @nm