Vous êtes sur la page 1sur 22

PROGRAMACION REPASO

Javier Garca Cambronel PRIMERO DE ASIR

CREAMOS LAS TABLAS CON INTEGRIDAD REFERENCIAL


[PROGRAMACION REPASO]

INSERTAMOS ALGUNOS DATOS EN LAS TABLAS

EJERCICIOS
1.- Crea una funcin DevolverNombreEquipo que reciba un cdigo de equipo y devuelva el nombre del mismo. Si el equipo no existe devuelve la cadena Error en cdigo.

2.- Crea una funcin DevolverGolesEquipo que reciba el cdigo de un equipo y devuelva el total de goles a favor y total de goles en contra. Contempla las excepciones oportunas.

3. Crea un procedimiento DevolverResultadosEquipo que reciba el cdigo de un equipo y devuelva el nmero de partidos que ha ganado, el nmero de partidos que ha perdido y el nmero de partidos que ha empatado. Contempla las excepciones oportunas.

4.- Realiza un procedimiento ActualizarClasificacion que haga lo siguiente: Borra todos los registros de la tabla Clasificacin_liga. A partir de la tabla partidos, rellena la tabla Clasificacin_liga, la informacin la obtiene slo de los partidos de liga, para calcular los puntos debes considerar 3 puntos las victorias y 1 punto los empates. Para terminar muestra la clasificacin de los equipos, ordenados por puntos, y mostrando el nombre del equipo, en vez del cdigo, todos los datos anteriores. Nota: Utiliza las funciones y procedimientos que has realizado en los ejercicios anteriores.

5.- Crear un procedimiento MostrarQuinielaJornada que reciba una jornada y muestre la quiniela de dicha jornada de la liga segn los partidos jugados. El resultado debe ser de la siguiente manera: Nombre equipo1 Nombre equipo2(1, X o 2) El 1 ser cuando el equipo1 (Local) haya ganado, la X cuando sea un empate y un 2 cuando el equipo 2 (visitante) haya ganado. Se deben tratar las siguientes excepciones: a) Tabla Equipos vaca b) Tabla Partidos vaca. c) No hay partidos de esa jornada. PRIMERO DE ASIR Pgina 1 Puedes crear los procedimientos o funciones que creas oportunos, o usar algunos de los que ya has realizado.

[PROGRAMACION REPASO]
Partiendo del esquema que tenemos en el Moodle, que es el que vemos a continuacin:

PRIMERO DE ASIR

Pgina 2

[PROGRAMACION REPASO]

CREAMOS LAS TABLAS CON INTEGRIDAD REFERENCIAL


TABLA EQUIPOS
CREATE TABLE Equipos( CodEquipo VARCHAR(4), Nombre VARCHAR(30) NOT NULL, Localidad VARCHAR(15), CONSTRAINT PK_Equipos PRIMARY KEY (CodEquipo))

TABLA PARTIDOS
CREATE TABLE Partidos( CodPartido VARCHAR(4), CodEquipoLocal VARCHAR(4), CodEquipoVisitante VARCHAR(4), Fecha DATE, Jornada VARCHAR(20), Gol_Local INT, Gol_Visitante INT, CONSTRAINT PK_Partidos PRIMARY KEY (CodPartido), CONSTRAINT FK_Partidos_EquiposL FOREIGN KEY (CodEquipoLocal) REFERENCES Equipos(CodEquipo), CONSTRAINT FK_Partidos_EquiposV FOREIGN KEY (CodEquipoVisitante) REFERENCES Equipos(CodEquipo), CONSTRAINT CK_Fecha CHECK (MONTH(FECHA) NOT IN (7,8)))

PRIMERO DE ASIR

Pgina 3

[PROGRAMACION REPASO]

INSERTAMOS ALGUNOS DATOS EN LAS TABLAS


INSERTAMOS DATOS EN LA TABLA EQUIPOS
INSERT INTO EQUIPOS VALUES (1, 'At.Madrid', 'Madrid'), (2, 'Barcelona', 'Barcelona'), (3, 'Espanyol', 'Barcelona'), (4, 'R.Madrid', 'Madrid'), (5, 'Valencia', 'Valencia'), (6, 'Sevilla', 'Sevilla')

INSERTAMOS DATOS EN LA TABLA PARTIDOS


INSERT INTO Partidos VALUES(1,1,2,'07/04/2012',1,4,2), (2,3,4,'14/04/2012',1,0,4), (3,5,6,'21/04/2012',1,2,2), (4,2,3,'28/04/2012',2,3,4), (5,4,5,'05/05/2012',2,3,2), (6,6,1,'05/05/2012',2,2,2)

PRIMERO DE ASIR

Pgina 4

[PROGRAMACION REPASO]
1.- Crea una funcin DevolverNombreEquipo que reciba un cdigo de equipo y devuelva el nombre del mismo. Si el equipo no existe devuelve la cadena Error en cdigo.
Creamos la funcin con el nombre de equipo y declaramos la variable que se va a recibir que la llamamos CODIGO y el tipo de datos que ser entero, le decimos que tipo de datos va a devolver y el mximo de caracteres admitidos por RETURN. Una vez hecho esto comenzamos con el cuerpo de la funcin en el que declaramos la variable NOMBRE indicamos que si en la variable CODIGO no se encuentra un cdigo que est al hacer un SELECT de CodEquipo desde la tabla EQUIPOS nos muestre un mensaje dando a la variable NOMBRE con SET, el valor que tenemos en la cadena que escribimos en este caso ERROR EN CODIGO ya que ese cdigo de equipo escrito no pertenece a ningn equipo de la base de datos; sin embargo cuando no ocurre esto ELSE le damos el valor a la variable NOMBRE del SELECT sobre el nombre donde WHERE CodEquipo sea igual al que hemos introducido y que ha recogido la variable CODIGO, por ultimo devolvemos el contenido de la variable NOMBRE. CREATE FUNCTION equipo (@codigo AS INT ) RETURNS VARCHAR(30) AS BEGIN DECLARE @nombre VARCHAR(30) IF @codigo NOT IN (SELECT CodEquipo FROM Equipos) SET @nombre = 'ERROR EN CODIGO' ELSE BEGIN SET @nombre = (SELECT Nombre FROM Equipos WHERE CodEquipo = @codigo) END RETURN @nombre END

PRIMERO DE ASIR

Pgina 5

[PROGRAMACION REPASO]

COMPROBAMOS EL FUNCIONAMIENTO
Los equipos que estn en el rectngulo rojo, son los que vamos a comprobar.

Hacemos un SELECT sobre la funcin y le pasamos como parmetro cdigo de equipo 1, vemos que el nombre del equipo que nos da es At.Madrid, lo cul es correcto.

Hacemos lo mismo, pero ahora con el cdigo de equipo 4 y vemos que el resultado es R.Madrid, el cul es correcto.

Ahora lo que hacemos es comprobar con un cdigo de equipo que no se encuentra en la tabla, como vemos se nos muestra el mensaje de error que le hemos indicado ERROR EN CODIGO

PRIMERO DE ASIR

Pgina 6

[PROGRAMACION REPASO]
2.- Crea una funcin DevolverGolesEquipo que reciba el cdigo de un equipo y devuelva el total de goles a favor y total de goles en contra. Contempla las excepciones oportunas.
Creamos la funcin con el nombre que se nos indica en el ejercicio e indicamos que la variable que vamos a insertar va a ser de tipo entero INT y que va a devolver lo que contenga la variable goles en forma de tabla, primero los goles a favor y despus los goles en contra. Empezamos con el cuerpo de la funcin y declaramos las variables, despus con SET indicamos su valor y en la variable AFAVOR donde irn los goles a favor indicamos que cuando juega como local los goles a favor son los locales y en el segundo SELECT, que los goles pertenecientes a los visitantes cuando el equipo juega como visitante tambin son a favor, hacemos lo mismo pero teniendo en cuenta todo esto para los goles en contra y lo guardamos en la variable ENCONTRA insertamos en la variable GOLES los valores de los goles a favor y en contra almacenados en las variables y hacemos el RETURN. CREATE FUNCTION DevolverGolesEquipo (@codigo AS INT ) RETURNS @goles TABLE ([Goles a favor] INT,[Goles en contra] INT) AS BEGIN DECLARE @afavor INT DECLARE @encontra INT SET @afavor = ((SELECT SUM(Gol_Local) FROM Partidos WHERE CodEquipoLocal = @codigo GROUP BY CodEquipoLocal) + (SELECT SUM(Gol_Visitante) FROM Partidos WHERE CodEquipoVisitante = @codigo GROUP BY CodEquipoLocal)) SET @encontra = ((SELECT SUM(Gol_Visitante) FROM Partidos WHERE CodEquipoLocal = @codigo GROUP BY CodEquipoLocal) + (SELECT SUM(Gol_Local) FROM Partidos WHERE CodEquipoVisitante = @codigo GROUP BY CodEquipoLocal)) INSERT INTO @goles VALUES (@afavor,@encontra) RETURN END

PRIMERO DE ASIR

Pgina 7

[PROGRAMACION REPASO]

COMPROBACION DE FUNCIONAMIENTO
Hacemos la consulta pertinente para ver el contenido de la tabla PARTIDOS Aqu vemos los goles a favor y en contra de el equipo con cdigo de equipo nmero 4 en el que los goles a favor estn redondeados en verde.

Ejecutamos la funcin que acabamos de crear, pasndole como parmetro 4 y vemos que el resultado es el correcto y que los goles a favor son 7 y en contra 2.

PRIMERO DE ASIR

Pgina 8

[PROGRAMACION REPASO]

PARA SOLO MOSTRAR ESTADSTICAS DE GOLES EN PARTIDOS COMO VISITANTE


CREATE FUNCTION DevolverGolesEquipoind (@codigo INT) RETURNS TABLE AS RETURN (SELECT SUM(GOL_LOCAL) AS [Goles en contra],SUM(GOL_VISITANTE) AS [Goles a favor] FROM PARTIDOS WHERE @codigo=CodEquipoVisitante)

COMPROBACION DE FUNCIONAMIENTO

PRIMERO DE ASIR

Pgina 9

[PROGRAMACION REPASO]

PARA SOLO MOSTRAR ESTADSTICAS DE GOLES EN PARTIDOS COMO LOCAL


Modificaramos la funcin anterior indicando que los goles como locales sean mostrados como A FAVOR y los goles de los visitantes como EN CONTRA y en la clausula WHERE la variable CODIGO donde esta el cdigo del equipo sea comparado solo con CodEquipoLocal ALTER FUNCTION DevolverGolesEquipoind (@codigo INT) RETURNS TABLE AS RETURN (SELECT SUM(GOL_LOCAL) AS [Goles a favor],SUM(GOL_VISITANTE) AS [Goles en contra] FROM PARTIDOS WHERE @codigo=CodEquipoLocal)

COMPROBACION DE FUNCIONAMIENTO

PRIMERO DE ASIR

Pgina 10

[PROGRAMACION REPASO]
3. Crea un procedimiento DevolverResultadosEquipo que reciba el cdigo de un equipo y devuelva el nmero de partidos que ha ganado, el nmero de partidos que ha perdido y el nmero de partidos que ha empatado. Contempla las excepciones oportunas.
Creamos un procedimiento con el nombre que se nos indica, el tipo de datos ser entero, pues va a recibir el cdigo del equipo, declaramos las variables y hacemos un SELECT con contador para cada caso que se de, que cumpla la condicin que indicamos, Por ejemplo en la variable victorias indicamos las victorias del equipo que sern cuando juega como local, que los goles locales sean mayores a los visitantes y cuando juega como visitante cuando el valor de los goles como visitante sea mayor a los goles del equipo local y as sucesivamente con cada opcin, destacar que todas las opciones en el caso de no dar ningn resultado con ISNULL indicamos al final de la instruccin que el valor sea 0 en vez de NULL. Por ltimo el SELECT que mostrar los resultados con el nombre en las columnas que indicamos y con los valores almacenados en cada variables. CREATE PROCEDURE DevolverResultadosEquipo (@codigo AS INT) AS BEGIN DECLARE @victorias INT DECLARE @empates INT DECLARE @derrotas INT SET @victorias = ISNULL((SELECT COUNT(*) FROM Partidos WHERE Gol_Local > Gol_Visitante GROUP BY CodEquipoLocal HAVING CodEquipoLocal = @codigo),0) SET @victorias = @victorias + ISNULL((SELECT COUNT(*) FROM Partidos WHERE Gol_Local < Gol_Visitante GROUP BY CodEquipoVisitante HAVING CodEquipoVisitante = @codigo),0) SET @empates = ISNULL((SELECT COUNT(*) FROM Partidos WHERE Gol_Local = Gol_Visitante GROUP BY CodEquipoLocal HAVING CodEquipoLocal = @codigo),0) SET @empates = @empates + ISNULL((SELECT COUNT(*) FROM Partidos WHERE Gol_Local = Gol_Visitante GROUP BY CodEquipoVisitante HAVING CodEquipoVisitante = @codigo),0) SET @derrotas = ISNULL((SELECT COUNT(*) FROM Partidos WHERE Gol_Local < Gol_Visitante GROUP BY CodEquipoLocal HAVING CodEquipoLocal = @codigo),0) SET @derrotas = @derrotas + ISNULL((SELECT COUNT(*) FROM Partidos WHERE Gol_Local > Gol_Visitante GROUP BY CodEquipoVisitante HAVING CodEquipoVisitante = @codigo),0) SELECT @victorias [Victorias],@empates [empates],@derrotas [Derrotas] END

PRIMERO DE ASIR

Pgina 11

[PROGRAMACION REPASO]
Vamos a comprobar a dos equipos el primero con cdigo de equipo nmero 4 y el segundo con cdigo 1, aqu vemos que las victorias las tenemos marcadas en verde y el empate que hay en azul.

Ejecutamos el procedimiento para el equipo con cdigo 4 y vemos que nos cuenta que tiene dos victorias, ningn empate y ninguna derrota, lo cual es correcto.

Hacemos los mismo pero ahora comprobando el equipo con cdigo 1 y vemos que como resultado obtenemos una victoria y un empate, lo cul tambin es cierto.

PRIMERO DE ASIR

Pgina 12

[PROGRAMACION REPASO]
4.- Crea la tabla Clasificacin_liga con la siguiente estructura:

Realiza un procedimiento ActualizarClasificacion que haga lo siguiente: Borra todos los registros de la tabla Clasificacin_liga. A partir de la tabla partidos, rellena la tabla Clasificacin_liga, la informacin la obtiene slo de los partidos de liga, para calcular los puntos debes considerar 3 puntos las victorias y 1 punto los empates. Para terminar muestra la clasificacin de los equipos, ordenados por puntos, y mostrando el nombre del equipo, en vez del cdigo, todos los datos anteriores.

Nota: Utiliza las funciones y procedimientos que has realizado en los ejercicios anteriores.

PRIMERO DE ASIR

Pgina 13

[PROGRAMACION REPASO]

CREAMOS LA TABLA CON INTEGRIDAD REFERENCIAL


CREATE TABLE Clasificacion_liga( CodEquipo varchar(4), PJ INT, PG INT, PE INT, PP INT, GF INT, GC INT, Puntos INT, CONSTRAINT PK_Clasificacion PRIMARY KEY (CodEquipo), CONSTRAINT FK_Clasificacion_Equipo FOREIGN KEY (CodEquipo) REFERENCES Equipos(CodEquipo))

Este procedimiento esta formado por un conjunto de los anteriores ya explicados,creamos el procedimiento con el nombre que se nos indica, borramos los datos de la tabla, declaramos las variables y su tipo incluida la variable CONTADOR a la quedaremos el valor de cero crearemos el bucle WHILE para recorrer todos los equipos, el cuerpo del procedimiento esta formado por cdigo del ejercicio dos y tres, sumando las variables correspondientes de victorias empates y derrotas obtenemos el total de partidos jugados y hacemos la insercin en la tabla CLASIFICACION_LIGA debidamente multiplicando cada victoria por tres y el empate por uno sumando los dos resultados para introducirlos en el campo puntos, despus de esto terminamos estas operaciones y creamos el select correspondiente para que al ejecutar el procedimiento, la tabla de clasificacin se nos muestre con los campos que le indicamos incluido el NOMBRE_EQUIPO para lo cual tendremos que hacer los agrupamientos GROUP BY correspondientes y por ltimo ejecutamos la instruccin ORDER BY Clasificacion_liga.Puntos DESC para que aparezcan ordenados por puntuacin de mayor a menor.

CREATE PROCEDURE ClasificacionLiga AS BEGIN PRIMERO DE ASIR Pgina 14

[PROGRAMACION REPASO]
TRUNCATE TABLE Clasificacion_liga DECLARE @jugados INT DECLARE @victorias INT DECLARE @empates INT DECLARE @derrotas INT DECLARE @afavor INT DECLARE @encontra INT DECLARE @contador INT SET @contador=0 WHILE @contador < (SELECT COUNT(*) FROM Equipos) BEGIN SET @victorias=(SELECT COUNT(*) FROM Partidos WHERE CodEquipoLocal=(@contador+1) AND Gol_Local>Gol_Visitante)+(SELECT COUNT(*) FROM Partidos WHERE CodEquipoVisitante=(@contador+1) AND Gol_Local<Gol_Visitante) SET @empates=(SELECT COUNT(*) FROM Partidos WHERE CodEquipoLocal=(@contador+1) AND Gol_Local=Gol_Visitante)+(SELECT COUNT(*) FROM Partidos WHERE CodEquipoVisitante=(@contador+1) AND Gol_Local=Gol_Visitante) SET @derrotas=(SELECT COUNT(*) FROM Partidos WHERE CodEquipoLocal=(@contador+1) AND Gol_Local<Gol_Visitante)+(SELECT COUNT(*) FROM Partidos WHERE CodEquipoVisitante=(@contador+1) AND Gol_Local>Gol_Visitante) SET @afavor=(SELECT SUM(Gol_Local) FROM Partidos WHERE CodEquipoLocal=(@contador+1))+(SELECT SUM(Gol_Visitante) FROM Partidos WHERE CodEquipoVisitante=(@contador+1)) SET @encontra=(SELECT SUM(Gol_Local) FROM Partidos WHERE CodEquipoVisitante=(@contador+1))+(SELECT SUM(Gol_Visitante) FROM Partidos WHERE CodEquipoLocal=(@contador+1)) SET @jugados=@victorias+@empates+@derrotas INSERT INTO Clasificacion_Liga VALUES (@contador+1,@jugados,@victorias,@empates,@derrotas,@afavor,@encontra,@victorias* 3+@empates) SET @contador=@contador + 1 END END BEGIN SELECT Equipos.Nombre,Clasificacion_liga.PJ,Clasificacion_liga.PG,Clasificacion_liga.PE,Clasificacion _liga.PP,Clasificacion_liga.GF,Clasificacion_liga.GC,Clasificacion_liga.Puntos FROM Equipos JOIN Clasificacion_liga ON Equipos.CodEquipo=Clasificacion_liga.CodEquipo GROUP BY Equipos.Nombre,Clasificacion_liga.PJ,Clasificacion_liga.PG,Clasificacion_liga.PE,Clasificacion _liga.PP,Clasificacion_liga.GF,Clasificacion_liga.GC,Clasificacion_liga.Puntos ORDER BY Clasificacion_liga.Puntos DESC END

PRIMERO DE ASIR

Pgina 15

[PROGRAMACION REPASO]

COMPROBACION DE FUNCIONAMIENTO
Vemos que al ejecutar el procedimiento obtenemos de forma automtica la clasificacin con todos los valores que se nos han indicado en el ejercicio y ordenados por la cantidad de puntos.

Si consultamos la tabla CLASIFICACION_LIGA vemos como obtenemos los mismos datos, pero con cdigo de equipo y sin ordenar por puntuacin.

PRIMERO DE ASIR

Pgina 16

[PROGRAMACION REPASO]
5.- Crear un procedimiento MostrarQuinielaJornada que reciba una jornada y muestre la quiniela de dicha jornada de la liga segn los partidos jugados. El resultado debe ser de la siguiente manera:
Nombre equipo1 Nombre equipo2(1, X o 2) El 1 ser cuando el equipo1 (Local) haya ganado, la X cuando sea un empate y un 2 cuando el equipo 2 (visitante) haya ganado. Se deben tratar las siguientes excepciones: a) Tabla Equipos vaca b) Tabla Partidos vaca. c) No hay partidos de esa jornada. Puedes crear los procedimientos o funciones que creas oportunos, o usar algunos de los que ya has realizado. Creamos el procedimiento con el nombre que nos indica el ejercicio la variable que declaramos tiene el nombre de JORNADA y el tipo de datos que le indicamos que va a recibir es de tipo enteros INT empezamos con el cuerpo del procedimiento y declaramos las variables en las que indicamos las EXCEPCIONES que nos indica el ejercicio la primera excepcin que tratamos es que si la jornada que el nmero que hemos introducido no se encuentra en el campo JORNADA de la tabla PARTIDOS daremos el valor a la variable ERROR de la cadena de texto con el mensaje de que no se ha disputado dicha jornada. La segunda excepcin que tratamos es que cuando la Tabla PARTIDOS este vaca as se nos indique para ello seleccionamos el contador de todas las filas y cuando el resultado es cero le damos el valor a la variable ERROR2 de la cadena que contiene que la tabla Partidos se encuentra vaca. En la Excepcin nmero tres hacemos lo mismo que en la dos pero con la tabla EQUIPOS y lo guardamos en la variable ERROR3; si no se cumple ninguna de estas opciones ELSE hacemos una seleccin utilizando la funcin EQUIPO que nos daba el nombre del equipo a partir del cdigo de equipo pasando como parmetros los equipos locales y visitantes despus hacemos con la funcin CASE tres casos diferentes sobre dicho SELECT cuando los goles locales son ms que los goles de visitantes el valor ser 1 cuando tienen el mismo valor ser X y cuando son mayores los goles visitantes, el valor ser 2, Lo finalizamos con END seguido del nombre que llevara la columna en este caso RESULTADO desde la tabla PARTIDOS donde compararemos y sacaremos los datos de la jornada que hemos indicado a la variable JORNADA Para finalizar con SELECT mostramos si hemos tenido algn error. CREATE PROCEDURE MostrarQuinielaJornada (@jornada AS INT) AS BEGIN DECLARE @error VARCHAR(300) DECLARE @error2 VARCHAR(300) DECLARE @error3 VARCHAR(300) PRIMERO DE ASIR Pgina 17

[PROGRAMACION REPASO]
IF @Jornada NOT IN (SELECT Jornada FROM Partidos) SET @error = 'No se ha disputado dicha jornada' IF (SELECT COUNT(*) FROM Partidos) = 0 SET @error2 = 'La Tabla Partidos se encuentra vaca' IF (SELECT COUNT(*) FROM Equipos) = 0 SET @error3 = 'La tabla Equipos se encuentra vaca' ELSE SELECT dbo.equipo(CodEquipoLocal) [Equipo local], dbo.equipo(CodEquipoVisitante) [Equipo visitante], CASE WHEN Gol_Local > Gol_Visitante THEN '1' WHEN Gol_Local < Gol_Visitante THEN '2' WHEN Gol_Local = Gol_Visitante THEN 'X' END Resultado FROM Partidos WHERE Jornada = @jornada SELECT @error,@error2,@error3 END

PRIMERO DE ASIR

Pgina 18

[PROGRAMACION REPASO]

COMPROBACION DE FUNCIONAMIENTO
Hacemos la consulta pertinente en la tabla partidos para ver todos los resultados y a que jornada pertenecen y ver si los resultados que obtenemos al ejecutar el procedimiento son ciertos.

Ejecutamos el procedimiento con la Jornada nmero uno y obtenemos el siguiente resultado, que como vemos es correcto.

Hacemos lo mismo, pero con la consulta nmero dos y vemos que el resultado que obtenemos, tambin es correcto.

PRIMERO DE ASIR

Pgina 19

[PROGRAMACION REPASO]

COMPROBACION DEL FUNCIONAMIENTO DE LAS EXCEPCIONES


EXCEPCION 1 Si pasamos como parmetro la jornada nmero 3, la cual, no se ha disputado, vemos como se nos indica, diciendo que no se ha disputado dicha jornada.

EXCEPCION 2 Despus de borrar la tabla partidos, comprobamos que est vaca y as es.

Volvemos a ejecutar el procedimiento y vemos que los errores que se nos muestran son que la tabla partidos est vaca y que no se ha disputado dicha jornada, ya que la tabla partidos esta vaca y no hay ninguna jornada disputada.

PRIMERO DE ASIR

Pgina 20

[PROGRAMACION REPASO]
EXCEPCION 3 Borramos la tabla Equipos y comprobamos que esta borrada perfectamente haciendo la consulta pertinente

Volvemos a ejecutar el procedimiento y vemos que los tres errores se nos muestras.

PRIMERO DE ASIR

Pgina 21

Vous aimerez peut-être aussi