Lección 20 - Aplicación SQL

Curso SQL para principiantes


En esta última parte, y última lección del curso, vamos a desarrollar a modo de ejemplo una pequeña aplicación donde se pretende, además de ver como crear las tablas y claves en la BD, mostrar las fases a nivel de BD para el desarrollo de una aplicación.

Así pues vamos primero a esquematizar las fases de esta aplicación de ejemplo.

  • Toma y análisis de requerimientos.
  • Modelo entidad-relación.
  • Creación de la estructura o modelo de datos.
  • Creación de claves primarias y foráneas de las tablas.
  • Inserción de registros en las tablas.
  • Informes o explotación de datos.

Análisis de requerimientos.

Para analizar los requerimientos primero debemos conocer cuales son, así pues consideremos lo siguiente:

Requerimientos
Se necesita una aplicación que permita gestionar las apuestas de quinielas futbolísticas para un único apostante, es decir, para uno mismo. La aplicación deberá ser capaz de escrutar los pronósticos una vez se tiene el resultado de la jornada, e informar de cuantos aciertos se han logrado, no es necesario que gestione los gastos y premios ni apuestas múltiples(con dobles y/o triples). En general deberá permitir mantener los datos referentes a las jornadas de Liga y a las quinielas para explotar los datos referentes a los aciertos.

Análisis
Bien, dadas estas especificaciones debemos conocer esencialmente como funcionan las quinielas futbolísticas. En el mundo del fútbol podemos afirmar que se convocan jornadas en las que se organizan eventos, en estos eventos participan equipos, y sobre estos eventos se pronostican resultados a 1,X, 2. El conjunto de pronósticos sobre los eventos de una misma jornada es lo que se llama quiniela. Y el conjunto de resultados de los eventos de una misma jornada es lo que se llama combinación ganadora.

Entidades
Del análisis anterior proponemos las siguientes entidades:
  • EQUIPOS
  • JORNADAS
  • EVENTOS
  • QUINIELAS
  • PRONOSTICOS


Modelo entidad-relación

Mostremos primero el diagrama resultante:




Y estos son los razonamientos que se hicieron mientras se elaboraba el diagrama de los cuales se obtiene la cardinalidad de las relaciones.
  • En una jornada se organizan varios eventos mientras que un evento se celebra en una jornada. Eventos es una entidad débil dependiente de jornadas.
  • Un equipo participa en varios eventos como local mientras que en un evento sola hay un equipo local.
  • Un equipo participa en varios eventos como visitante mientras que en un evento sola hay un equipo visitante.
  • En una jornada se sellan varias quinielas mientras que una quiniela solo es válida para una jornada.
  • En una quiniela se realizan varios pronósticos mientras que un pronóstico pertenece a una quiniela concreta. Pronósticos es una entidad débil dependiente de quinielas.
  • Sobre un evento se realizan varios pronósticos mientras que un pronóstico pertenece a un evento concreto.

Las entidades EVENTOS y PRONOSTICOS se han considerado débiles. Por lo tanto la clave primaria de estas entidades será compuesta interviniendo en ella la clave foránea de la entidad fuerte de la que dependen. EVENTOS depende de JORNADAS, y PRONOSTICOS depende de QUINIELAS.

Atributos de cada entidad
Este apartado se debería integrar en el modelo entidad-relación, en su lugar lo haremos aparte con la intención de no cargar el diagrama, de modo que el modelo presentado con anterioridad es un modelo simplificado. En la primera columna de la siguiente propuesta de atributos se especifica el nombre del atributo, en la segunda el tipo de dato, en la tercera si puede ser o no nulo, y en la cuarta columna, si se tercia, si es clave primaria, foránea, o los posibles valores si es un campo codificado.

EQUIPOS:
Código: Seleccionar todo

ID_EQUIPO     numérico      no nulo     clave primaria
EQUIPO        cadena
(30)    no nulo


JORNADAS:
Código: Seleccionar todo

ID_JORNADA    numérico      no nulo     clave primaria
NOMBRE        cadena
(30)    no nulo
FECHA         fecha         no nulo
DISPUTADA     cadena
(1)     no nulo     posibles valores: ('S' , 'N') S -> sí , N -> No


EVENTOS:
Código: Seleccionar todo

ID_JORNADA    numérico      no nulo     clave primaria
ID_EVENTO     numérico      no nulo     clave primaria
LOCAL         numérico      no nulo     clave foránea de la entidad EQUIPOS
VISITANTE     numérico      no nulo     clave foránea de la entidad EQUIPOS
RESULTADO     cadena
(1)     nulo        posibles valores: ('1' , 'X' , '2')
 


QUINIELAS:
Código: Seleccionar todo

ID_QUINIELA   numérico      no nulo     clave primaria
NOMBRE        cadena
(30)    nulo
ESCRUTADA     cadena
(1)     no nulo     posibles valores: ('S' , 'N') S -> sí , N -> No
ACIERTOS      numerico      nulo


PRONOSTICOS:
Código: Seleccionar todo

ID_QUINIELA   numérico      no nulo     clave primaria
ID_PRO        numérico      no nulo     clave primaria
ID_JORNADA    numérico      no nulo     clave foránea de la entidad EVENTOS junto con ID_EVENTO
ID_EVENTO     numérico      no nulo     clave foránea de la entidad EVENTOS junto con ID_JORNADA
PRONOSTICO    cadena
(1)     no nulo     posibles valores: ('1' , 'X' , '2')
 


Creación de la estructura o modelo de datos.
Las instrucciones DDL (Data Definition Language) lenguaje de definición de datos, permiten crear las tablas o estructuras de datos así como sus claves primarias y foráneas entre otras cosas. La sintaxis que permite crear las tablas y sus claves primarias según lo expuesto con anterioridad es la siguiente:

Tabla EQUIPOS:
Código: Seleccionar todo
create table EQUIPOS (
  ID_EQUIPO int(10)     not null,
  EQUIPO    varchar(30) not null
); 


Clave primaria de EQUIPOS
Código: Seleccionar todo
alter table EQUIPOS add constraint primary key EQUIPOS_PK (ID_EQUIPO); 


Tabla EVENTOS
Código: Seleccionar todo
create table EVENTOS (
  ID_JORNADA int        not null,
  ID_EVENTO  int        not null,
  LOCAL      int        not null,
  VISITANTE  int        not null,
  RESULTADO  varchar(1) null
); 


Clave primaria de EVENTOS
Código: Seleccionar todo
alter table EVENTOS add constraint primary key EVENTOS_PK (ID_JORNADA,ID_EVENTO); 


Tabla JORNADAS
Código: Seleccionar todo
create table JORNADAS (
  ID_JORNADA int         not null,
  NOMBRE     varchar(30) not null,
  FECHA      date        not null,
  DISPUTADA  varchar(1)  not null default 'N'
); 


Clave primaria de JORNADAS
Código: Seleccionar todo
alter table JORNADAS add constraint primary key JORNADAS_PK (ID_JORNADA); 


Tabla QUINIELAS
Código: Seleccionar todo
create table QUINIELAS (
  ID_QUINIELA int         not null,
  NOMBRE      varchar(30) null,
  ESCRUTADA   varchar(1)  not null default 'N',
  ACIERTOS    int         null
); 


Clave primaria de QUINIELAS
Código: Seleccionar todo
alter table QUINIELAS add constraint primary key QUINIELAS_PK (ID_QUINIELA); 


Tabla PRONOSTICOS
Código: Seleccionar todo
create table PRONOSTICOS (
  ID_QUINIELA int        not null,
  ID_PRO      int        not null,
  ID_JORNADA  int        not null,
  ID_EVENTO   int        not null,
  PRONOSTICO  varchar(1) not null
); 


Clave primaria de PRONOSTICOS
Código: Seleccionar todo
alter table PRONOSTICOS add constraint primary key PRONOSTICOS_PK (ID_QUINIELA,ID_PRO); 


* * *

A continuación se mostrarán las instrucciones que crean las claves foráneas según indica el modelo entidad-reación. Las claves foráneas es preferible crearlas una vez se han creado todas las tablas con sus claves primarias, de lo contrario puede que se esté intentando crear una clave foránea que hace referencia a una tabla que todavía no existe en la base de datos, en ese caso la instrucción fallará y devolverá un error.

Claves foráneas de EVENTOS
Código: Seleccionar todo
alter table EVENTOS
  add constraint EVENTOS_ID_JORNADA_FK   foreign key 
(ID_JORNADA) references JORNADAS (ID_JORNADA),
  add constraint EVENTOS_ID_LOCAL_FK     foreign key (LOCAL)      references EQUIPOS  (ID_EQUIPO),
  add constraint EVENTOS_ID_VISITANTE_FK foreign key (VISITANTE)  references EQUIPOS  (ID_EQUIPO); 


Clave foránea de QUINIELAS
Código: Seleccionar todo
alter table QUINIELAS 
  add constraint QUINIELAS_ID_JORNADA_FK foreign key 
(ID_JORNADA) references JORNADAS (ID_JORNADA); 


Clave foránea de PRONOSTICOS
Código: Seleccionar todo
alter table PRONOSTICOS
  add constraint PRONOSTICOS_ID_QUINIELA_FK    
      foreign key 
(ID_QUINIELA)          references QUINIELAS (ID_QUINIELA),
  add constraint PRONOSTICOS_ID_JOR_ID_EVEN_FK 
      foreign key 
(ID_JORNADA,ID_EVENTO) references EVENTOS (ID_JORNADA,ID_EVENTO); 


* * *

Inserción de registros en las tablas
Para alimentar la BD lo habitual es disponer de alguna pantalla, o interface de usuario, donde mediante un formulario permita realizar las inserciones. Como esto queda fuera del alcance de este curso los registros se han creado directamente con instrucciones de inserción directamente sobre la BD, aunque lo habitual hubiese sido que un usuario insertara los datos desde los formularios de entrada de datos y mantenimiento de la aplicación.

Para simplificar vamos a suponer que en la competetición participan solo seis equipos y, por tanto, se celebrarán diez jornadas de Liga, cinco la primera vuelta y cinco más la segunda, con un total de tres eventos por jornada. Supondremos también que la competición se encuentra en momento tal que la jornada 8 todavía no se ha disputado, es decir, se han disputado ya 7 jornadas, por lo que en los registros de las tabla JORNADAS referentes a las jornadas 8, 9 y 10 el campo DISPUTADA contendrá una "N" y los registros de la tabla eventos referentes a las mismas jornadas el campo RESULTADO estará a nulo.

Inserts
Las inserciones que dejan la BD en esta situación son las siguientes:

Inserciones en la tabla EQUIPOS
Código: Seleccionar todo
insert into EQUIPOS (ID_EQUIPO, EQUIPO) values (1, 'Las Palmas');
insert into EQUIPOS (ID_EQUIPO, EQUIPO) values (2, 'Xerez');
insert into EQUIPOS (ID_EQUIPO, EQUIPO) values (3, 'Getafe');
insert into EQUIPOS (ID_EQUIPO, EQUIPO) values (4, 'Nastic');
insert into EQUIPOS (ID_EQUIPO, EQUIPO) values (5, 'Celta');
insert into EQUIPOS (ID_EQUIPO, EQUIPO) values (6, 'Alcorcón'); 


Inserciones en la tabla JORNADAS
Código: Seleccionar todo
insert into JORNADAS (ID_JORNADA, NOMBRE, FECHA, DISPUTADA) values (1, 'Jornada 1', '2010-01-10', 'S');
insert into JORNADAS (ID_JORNADA, NOMBRE, FECHA, DISPUTADA) values (2, 'Jornada 2', '2010-01-17', 'S');
insert into JORNADAS (ID_JORNADA, NOMBRE, FECHA, DISPUTADA) values (3, 'Jornada 3', '2010-01-24', 'S');
insert into JORNADAS (ID_JORNADA, NOMBRE, FECHA, DISPUTADA) values (4, 'Jornada 4', '2010-02-07', 'S');
insert into JORNADAS (ID_JORNADA, NOMBRE, FECHA, DISPUTADA) values (5, 'Jornada 5', '2010-02-14', 'S');
insert into JORNADAS (ID_JORNADA, NOMBRE, FECHA, DISPUTADA) values (6, 'Jornada 6', '2010-02-21', 'S');
insert into JORNADAS (ID_JORNADA, NOMBRE, FECHA, DISPUTADA) values (7, 'Jornada 7', '2010-03-07', 'S');
insert into JORNADAS (ID_JORNADA, NOMBRE, FECHA, DISPUTADA) values (8, 'Jornada 8', '2010-03-21', 'N');
insert into JORNADAS (ID_JORNADA, NOMBRE, FECHA, DISPUTADA) values (9, 'Jornada 9', '2010-04-04', 'N');
insert into JORNADAS (ID_JORNADA, NOMBRE, FECHA, DISPUTADA) values (10, 'Jornada 10', '2010-04-18', 'N');
 


Inserciones en la tabla EVENTOS
Código: Seleccionar todo
insert into EVENTOS (ID_JORNADA, ID_EVENTO, LOCAL, VISITANTE, RESULTADO) values (1, 1, 5, 1, '1');
insert into EVENTOS (ID_JORNADA, ID_EVENTO, LOCAL, VISITANTE, RESULTADO) values (1, 2, 2, 3, '1');
insert into EVENTOS (ID_JORNADA, ID_EVENTO, LOCAL, VISITANTE, RESULTADO) values (1, 3, 4, 6, '1');
insert into EVENTOS (ID_JORNADA, ID_EVENTO, LOCAL, VISITANTE, RESULTADO) values (2, 1, 1, 2, '2');
insert into EVENTOS (ID_JORNADA, ID_EVENTO, LOCAL, VISITANTE, RESULTADO) values (2, 2, 3, 4, '1');
insert into EVENTOS (ID_JORNADA, ID_EVENTO, LOCAL, VISITANTE, RESULTADO) values (2, 3, 6, 5, '2');
insert into EVENTOS (ID_JORNADA, ID_EVENTO, LOCAL, VISITANTE, RESULTADO) values (3, 1, 1, 4, 'X');
insert into EVENTOS (ID_JORNADA, ID_EVENTO, LOCAL, VISITANTE, RESULTADO) values (3, 2, 3, 5, '2');
insert into EVENTOS (ID_JORNADA, ID_EVENTO, LOCAL, VISITANTE, RESULTADO) values (3, 3, 6, 2, '1');
insert into EVENTOS (ID_JORNADA, ID_EVENTO, LOCAL, VISITANTE, RESULTADO) values (4, 1, 3, 6, '2');
insert into EVENTOS (ID_JORNADA, ID_EVENTO, LOCAL, VISITANTE, RESULTADO) values (4, 2, 2, 4, '2');
insert into EVENTOS (ID_JORNADA, ID_EVENTO, LOCAL, VISITANTE, RESULTADO) values (4, 3, 1, 5, '1');
insert into EVENTOS (ID_JORNADA, ID_EVENTO, LOCAL, VISITANTE, RESULTADO) values (5, 1, 1, 3, '1');
insert into EVENTOS (ID_JORNADA, ID_EVENTO, LOCAL, VISITANTE, RESULTADO) values (5, 2, 5, 2, '2');
insert into EVENTOS (ID_JORNADA, ID_EVENTO, LOCAL, VISITANTE, RESULTADO) values (5, 3, 6, 4, '1');
insert into EVENTOS (ID_JORNADA, ID_EVENTO, LOCAL, VISITANTE, RESULTADO) values (6, 1, 2, 1, 'X');
insert into EVENTOS (ID_JORNADA, ID_EVENTO, LOCAL, VISITANTE, RESULTADO) values (6, 2, 4, 3, '1');
insert into EVENTOS (ID_JORNADA, ID_EVENTO, LOCAL, VISITANTE, RESULTADO) values (6, 3, 5, 6, '2');
insert into EVENTOS (ID_JORNADA, ID_EVENTO, LOCAL, VISITANTE, RESULTADO) values (7, 1, 3, 2, 'X');
insert into EVENTOS (ID_JORNADA, ID_EVENTO, LOCAL, VISITANTE, RESULTADO) values (7, 2, 4, 5, '1');
insert into EVENTOS (ID_JORNADA, ID_EVENTO, LOCAL, VISITANTE, RESULTADO) values (7, 3, 6, 1, 'X');
insert into EVENTOS (ID_JORNADA, ID_EVENTO, LOCAL, VISITANTE, RESULTADO) values (8, 1, 3, 1, NULL);
insert into EVENTOS (ID_JORNADA, ID_EVENTO, LOCAL, VISITANTE, RESULTADO) values (8, 2, 2, 6, NULL);
insert into EVENTOS (ID_JORNADA, ID_EVENTO, LOCAL, VISITANTE, RESULTADO) values (8, 3, 5, 4, NULL);
insert into EVENTOS (ID_JORNADA, ID_EVENTO, LOCAL, VISITANTE, RESULTADO) values (9, 1, 1, 6, NULL);
insert into EVENTOS (ID_JORNADA, ID_EVENTO, LOCAL, VISITANTE, RESULTADO) values (9, 2, 5, 3, NULL);
insert into EVENTOS (ID_JORNADA, ID_EVENTO, LOCAL, VISITANTE, RESULTADO) values (9, 3, 4, 2, NULL);
insert into EVENTOS (ID_JORNADA, ID_EVENTO, LOCAL, VISITANTE, RESULTADO) values (10, 1, 6, 3, NULL);
insert into EVENTOS (ID_JORNADA, ID_EVENTO, LOCAL, VISITANTE, RESULTADO) values (10, 2, 4, 1, NULL);
insert into EVENTOS (ID_JORNADA, ID_EVENTO, LOCAL, VISITANTE, RESULTADO) values (10, 3, 2, 5, NULL);
 


Inserciones en la tabla QUINIELAS
Código: Seleccionar todo

insert into QUINIELAS (ID_QUINIELA, ID_JORNADA, NOMBRE, ESCRUTADA, ACIERTOS) values (1, 1, 'Quini 1.1', 'S', 0);
insert into QUINIELAS (ID_QUINIELA, ID_JORNADA, NOMBRE, ESCRUTADA, ACIERTOS) values (2, 1, 'Quini 1.2', 'S', 1);
insert into QUINIELAS (ID_QUINIELA, ID_JORNADA, NOMBRE, ESCRUTADA, ACIERTOS) values (3, 1, 'Quini 1.3', 'S', 0);
insert into QUINIELAS (ID_QUINIELA, ID_JORNADA, NOMBRE, ESCRUTADA, ACIERTOS) values (4, 2, 'Quini 2.1', 'S', 1);
insert into QUINIELAS (ID_QUINIELA, ID_JORNADA, NOMBRE, ESCRUTADA, ACIERTOS) values (5, 2, 'Quini 2.2', 'S', 1);
insert into QUINIELAS (ID_QUINIELA, ID_JORNADA, NOMBRE, ESCRUTADA, ACIERTOS) values (6, 3, 'Quini 3.1', 'S', 1);
insert into QUINIELAS (ID_QUINIELA, ID_JORNADA, NOMBRE, ESCRUTADA, ACIERTOS) values (7, 3, 'Quini 3.2', 'S', 1);
insert into QUINIELAS (ID_QUINIELA, ID_JORNADA, NOMBRE, ESCRUTADA, ACIERTOS) values (8, 3, 'Quini 3.3', 'S', 3);
insert into QUINIELAS (ID_QUINIELA, ID_JORNADA, NOMBRE, ESCRUTADA, ACIERTOS) values (9, 3, 'Quini 3.4', 'S', 2);
insert into QUINIELAS (ID_QUINIELA, ID_JORNADA, NOMBRE, ESCRUTADA, ACIERTOS) values (10, 4, 'Quini 4.1', 'S', 2);
insert into QUINIELAS (ID_QUINIELA, ID_JORNADA, NOMBRE, ESCRUTADA, ACIERTOS) values (11, 4, 'Quini 4.2', 'S', 0);
insert into QUINIELAS (ID_QUINIELA, ID_JORNADA, NOMBRE, ESCRUTADA, ACIERTOS) values (12, 4, 'Quini 4.3', 'S', 0);
insert into QUINIELAS (ID_QUINIELA, ID_JORNADA, NOMBRE, ESCRUTADA, ACIERTOS) values (13, 5, 'Quini 5.1', 'S', 2);
insert into QUINIELAS (ID_QUINIELA, ID_JORNADA, NOMBRE, ESCRUTADA, ACIERTOS) values (14, 5, 'Quini 5.2', 'S', 2);
insert into QUINIELAS (ID_QUINIELA, ID_JORNADA, NOMBRE, ESCRUTADA, ACIERTOS) values (15, 6, 'Quini 6.1', 'S', 0);
insert into QUINIELAS (ID_QUINIELA, ID_JORNADA, NOMBRE, ESCRUTADA, ACIERTOS) values (16, 6, 'Quini 6.2', 'S', 1);
insert into QUINIELAS (ID_QUINIELA, ID_JORNADA, NOMBRE, ESCRUTADA, ACIERTOS) values (17, 6, 'Quini 6.3', 'S', 0);
insert into QUINIELAS (ID_QUINIELA, ID_JORNADA, NOMBRE, ESCRUTADA, ACIERTOS) values (18, 7, 'Quini 7.1', 'S', 1);
insert into QUINIELAS (ID_QUINIELA, ID_JORNADA, NOMBRE, ESCRUTADA, ACIERTOS) values (19, 7, 'Quini 7.2', 'S', 1);
insert into QUINIELAS (ID_QUINIELA, ID_JORNADA, NOMBRE, ESCRUTADA, ACIERTOS) values (20, 8, 'Quini 8.1', 'N', NULL);
insert into QUINIELAS (ID_QUINIELA, ID_JORNADA, NOMBRE, ESCRUTADA, ACIERTOS) values (21, 8, 'Quini 8.2', 'N', NULL);


Inserciones en la tabla PRONOSTICOS
Código: Seleccionar todo
insert into PRONOSTICOS (ID_QUINIELA, ID_PRO, ID_JORNADA, ID_EVENTO, PRONOSTICO) values (1, 1, 1, 1, 'X');
insert into PRONOSTICOS (ID_QUINIELA, ID_PRO, ID_JORNADA, ID_EVENTO, PRONOSTICO) values (1, 2, 1, 2, 'X');
insert into PRONOSTICOS (ID_QUINIELA, ID_PRO, ID_JORNADA, ID_EVENTO, PRONOSTICO) values (1, 3, 1, 3, 'X');
insert into PRONOSTICOS (ID_QUINIELA, ID_PRO, ID_JORNADA, ID_EVENTO, PRONOSTICO) values (2, 1, 1, 1, 'X');
insert into PRONOSTICOS (ID_QUINIELA, ID_PRO, ID_JORNADA, ID_EVENTO, PRONOSTICO) values (2, 2, 1, 2, '1');
insert into PRONOSTICOS (ID_QUINIELA, ID_PRO, ID_JORNADA, ID_EVENTO, PRONOSTICO) values (2, 3, 1, 3, '2');
insert into PRONOSTICOS (ID_QUINIELA, ID_PRO, ID_JORNADA, ID_EVENTO, PRONOSTICO) values (3, 1, 1, 1, 'X');
insert into PRONOSTICOS (ID_QUINIELA, ID_PRO, ID_JORNADA, ID_EVENTO, PRONOSTICO) values (3, 2, 1, 2, 'X');
insert into PRONOSTICOS (ID_QUINIELA, ID_PRO, ID_JORNADA, ID_EVENTO, PRONOSTICO) values (3, 3, 1, 3, '2');
insert into PRONOSTICOS (ID_QUINIELA, ID_PRO, ID_JORNADA, ID_EVENTO, PRONOSTICO) values (4, 1, 2, 1, '1');
insert into PRONOSTICOS (ID_QUINIELA, ID_PRO, ID_JORNADA, ID_EVENTO, PRONOSTICO) values (4, 2, 2, 2, '2');
insert into PRONOSTICOS (ID_QUINIELA, ID_PRO, ID_JORNADA, ID_EVENTO, PRONOSTICO) values (4, 3, 2, 3, '2');
insert into PRONOSTICOS (ID_QUINIELA, ID_PRO, ID_JORNADA, ID_EVENTO, PRONOSTICO) values (5, 1, 2, 1, 'X');
insert into PRONOSTICOS (ID_QUINIELA, ID_PRO, ID_JORNADA, ID_EVENTO, PRONOSTICO) values (5, 2, 2, 2, 'X');
insert into PRONOSTICOS (ID_QUINIELA, ID_PRO, ID_JORNADA, ID_EVENTO, PRONOSTICO) values (5, 3, 2, 3, '2');
insert into PRONOSTICOS (ID_QUINIELA, ID_PRO, ID_JORNADA, ID_EVENTO, PRONOSTICO) values (6, 1, 3, 1, 'X');
insert into PRONOSTICOS (ID_QUINIELA, ID_PRO, ID_JORNADA, ID_EVENTO, PRONOSTICO) values (6, 2, 3, 2, '1');
insert into PRONOSTICOS (ID_QUINIELA, ID_PRO, ID_JORNADA, ID_EVENTO, PRONOSTICO) values (6, 3, 3, 3, 'X');
insert into PRONOSTICOS (ID_QUINIELA, ID_PRO, ID_JORNADA, ID_EVENTO, PRONOSTICO) values (7, 1, 3, 1, '2');
insert into PRONOSTICOS (ID_QUINIELA, ID_PRO, ID_JORNADA, ID_EVENTO, PRONOSTICO) values (7, 2, 3, 2, '2');
insert into PRONOSTICOS (ID_QUINIELA, ID_PRO, ID_JORNADA, ID_EVENTO, PRONOSTICO) values (7, 3, 3, 3, '2');
...
 


* * *

Informes o explotación de datos
Al igual que para las inserciones, lo más normal de una aplicación es que disponga de alguna funcionalidad en las pantallas de gestión que permita obtener informes. Esto también esta fuera del ámbito de este curso, así que lo haremos con consultas SQL directamente sobre la BD.

Usted debería estar capacitado para desarrollar esta parte de la aplicación, puesto que es lo que se ha estado trabajando durante todo el curso. No voy a quitarle el protagonismo que merece y dejaré que ponga en práctica lo aprendido. Los informes o consultas a desarrollar las encontrará a continuación, en el apartado de ejercicios. En esta lección, por ser la última, no se han publicado las soluciones, aunque si los resultados de las consultas que se piden en los ejercicios para que puedan ser contrastados con los resultados que usted obtenga.

Sin embargo hay una cuestión que por la naturaleza de esta aplicación de ejemplo es preferible introducir. En los ejercicios se le pedirá un tipo de consultas que requiere que aparezca dos veces la tabla EQUIPOS en la cláusula FROM. Esto es debido a que en todo evento participan dos equipos, el local y el visitante. El modo de poder usar la misma tabla por duplicado en la cláusula from es mediante alias de tabla, con ello se romper la ambigüedad del mismo modo que se hace con los campos de igual nombre pero de tablas distintas. Veamos esto con un ejemplo:

Que calendario tiene en la competición el Xerez, equipo de identificador 2:
Código: Seleccionar todo
  select J.ID_JORNADA,date_format(J.FECHA,'%d-%m-%Y') FECHA, L.EQUIPO LOCAL , V.EQUIPO  VISITANTE
    from JORNADAS J
, EVENTOS E, EQUIPOS L, EQUIPOS V
   where J
.ID_JORNADA  = E.ID_JORNADA
     and E
.LOCAL       = L.ID_EQUIPO
     and E
.VISITANTE   = V.ID_EQUIPO   
     and 
(E.LOCAL = 2 or E.VISITANTE = 2)
order by J.FECHA




* * *

Ejercicio 1
Desarrolle un informe que muestre los pronósticos de una quiniela, pruebe su funcionamiento con la quiniela de identificador 4.

Resultado a obtener:


Ejercicio 2
Desarrolle un informe que muestre la combinación ganadora de una jornada, pruebe su funcionamiento con la jornada de identificador 3.

Resultado a obtener:


Ejercicio 3.1
Desarrolle un informe que escrute una quiniela, es decir, que muestre los eventos en los que se acertó el resultado. Pruebe el funcionamiento con la quiniela de identificador 6.
Nota: Deberá usar la función IF para calcular la columna ACIERTO.

Resultado a obtener:


Ejercicio 3.2
Tomando como patrón la consulta resultante del ejercicio 3.1, desarrolle una consulta que calcule los aciertos de las quinielas, es decir, escrute las quinielas. Agrupe los datos por quiniela. Si una quiniela no tiene ningún acierto no es necesario que aparezca en la lista resultante.

Resultado a obtener:


Añadale un filtro para poder calcular los aciertos de una quiniela concreta. Este dato es especialmente útil para que un usuario, o un proceso automático, pueda actualizar el campo ACIERTOS de la tabla QUINIELAS, que contiene un valor nulo hasta que se conocela la combinación ganadora y, en consecuencia, el dato a atualizar una vez escrutada la quiniela.

Ejercicio 3.3
Desarrolle una consulta que calcule los aciertos de las quinielas pero esta vez considerando las quinielas que no presentan ningún acierto.

Resultado a obtener:


Ejercicio 4
Desarrolle un informe que muestre la media de aciertos agrupado por jornada. No considere quinielas de jornadas no disputadas. No es necesario recalcular los aciertos de las quinielas, en su lugar use el campo ACIERTOS de la tabla QUINIELAS.

Resultado a obtener:


Ejercicio 5
Desarrolle un informe que muestre la media de aciertos agrupado por meses. No considere quinielas de jornadas no disputadas, ni recalcule los aciertos de las quinielas.
Nota: deberá utilizar la función DATE_FORMAT(FECHA_A_FORMATEAR,'%m-%Y') de MySQL para poder agrupar por mes-año.

Resultado a obtener:




    Lección 19 - Síntesis de la segunda parte

Creative Commons License Creative Commons License

Este curso está sujeto a la licencia Reconocimiento-NoComercial-SinObraDerivada 3.0 de Creative Commons. Usted puede copiarla, distribuirla y comunicarla públicamente siempre que especifique su autor y deletesql.com; no la utilice para fines comerciales; y no haga con ella obra derivada. Puede usted consultar la licencia completa aquí.




Volver a Curso SQL desde cero

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 9 invitados

cron