diff --git a/resoluciones/antonio-canux/ejercicio-06/README.md b/resoluciones/antonio-canux/ejercicio-06/README.md new file mode 100644 index 00000000..2438e9e6 --- /dev/null +++ b/resoluciones/antonio-canux/ejercicio-06/README.md @@ -0,0 +1,31 @@ +# Ejercicio 06: Torneo Esports + +**Camper:** Antonio Canux + +## Descripcion del problema + +El torneo necesita reemplazar el registro manual de equipos, jugadores, partidas y resultados por una base de datos relacional que evite duplicidad y permita generar reportes de desempeno por jugador y por partida. + +## Tablas y relaciones + +- `equipos`: catalogo de equipos participantes (nombre). +- `jugadores`: catalogo de jugadores por equipo (`equipos` 1—N `jugadores`). +- `partidas`: enfrentamiento entre dos equipos (`equipos` 1—N `partidas`, dos veces: local y visitante). +- `resultados`: desempeno de un jugador en una partida (`partidas` 1—N `resultados`, `jugadores` 1—N `resultados`). + +## Restricciones aplicadas + +- `PRIMARY KEY` autoincremental en las 4 tablas. +- `FOREIGN KEY`: `jugadores.id_equipo`, `partidas.equipo_local`, `partidas.equipo_visitante`, `resultados.id_partida`, `resultados.id_jugador`. +- `NOT NULL` en todos los campos obligatorios. +- `UNIQUE`: `equipos.nombre`, `jugadores.nickname`, `(id_partida, id_jugador)` en `resultados`. +- `CHECK`: `jugadores.rol IN (...)`, `partidas.equipo_local <> partidas.equipo_visitante`, `resultados.kills >= 0`, `resultados.muertes >= 0`, `resultados.puntos >= 0`. + +## Como ejecutar + +```bash +sqlite3 ejercicio-06.db < ddl/schema.sql +sqlite3 ejercicio-06.db < dml/inserts.sql +sqlite3 ejercicio-06.db < dml/operaciones.sql +sqlite3 ejercicio-06.db < dql/consultas.sql +``` diff --git a/resoluciones/antonio-canux/ejercicio-06/ddl/schema.sql b/resoluciones/antonio-canux/ejercicio-06/ddl/schema.sql new file mode 100644 index 00000000..e053c607 --- /dev/null +++ b/resoluciones/antonio-canux/ejercicio-06/ddl/schema.sql @@ -0,0 +1,37 @@ +PRAGMA foreign_keys = ON; + +CREATE TABLE equipos ( + id_equipo INTEGER PRIMARY KEY AUTOINCREMENT, + nombre TEXT NOT NULL UNIQUE +); + +CREATE TABLE jugadores ( + id_jugador INTEGER PRIMARY KEY AUTOINCREMENT, + id_equipo INTEGER NOT NULL, + nickname TEXT NOT NULL UNIQUE, + rol TEXT NOT NULL CHECK (rol IN ('duelist', 'support', 'entry', 'igl', 'sniper')), + FOREIGN KEY (id_equipo) REFERENCES equipos (id_equipo) +); + +CREATE TABLE partidas ( + id_partida INTEGER PRIMARY KEY AUTOINCREMENT, + equipo_local INTEGER NOT NULL, + equipo_visitante INTEGER NOT NULL, + fecha_partida TEXT NOT NULL, + mapa TEXT NOT NULL, + FOREIGN KEY (equipo_local) REFERENCES equipos (id_equipo), + FOREIGN KEY (equipo_visitante) REFERENCES equipos (id_equipo), + CHECK (equipo_local <> equipo_visitante) +); + +CREATE TABLE resultados ( + id_resultado INTEGER PRIMARY KEY AUTOINCREMENT, + id_partida INTEGER NOT NULL, + id_jugador INTEGER NOT NULL, + kills INTEGER NOT NULL CHECK (kills >= 0), + muertes INTEGER NOT NULL CHECK (muertes >= 0), + puntos INTEGER NOT NULL CHECK (puntos >= 0), + FOREIGN KEY (id_partida) REFERENCES partidas (id_partida), + FOREIGN KEY (id_jugador) REFERENCES jugadores (id_jugador), + UNIQUE (id_partida, id_jugador) +); diff --git a/resoluciones/antonio-canux/ejercicio-06/diagramas/diagrama-ER.webp b/resoluciones/antonio-canux/ejercicio-06/diagramas/diagrama-ER.webp new file mode 100644 index 00000000..a9aa71a0 Binary files /dev/null and b/resoluciones/antonio-canux/ejercicio-06/diagramas/diagrama-ER.webp differ diff --git a/resoluciones/antonio-canux/ejercicio-06/dml/inserts.sql b/resoluciones/antonio-canux/ejercicio-06/dml/inserts.sql new file mode 100644 index 00000000..10c44a21 --- /dev/null +++ b/resoluciones/antonio-canux/ejercicio-06/dml/inserts.sql @@ -0,0 +1,33 @@ +INSERT INTO equipos (nombre) + VALUES ('Dragones Rojos'), + ('Lobos Nocturnos'), + ('Fenix Gaming'), + ('Tigres Blancos'), + ('Halcones Negros'); + +INSERT INTO jugadores (id_equipo, nickname, rol) + VALUES (1, 'RedDragon', 'igl'), + (2, 'NightWolf', 'entry'), + (3, 'PhoenixX', 'sniper'), + (4, 'WhiteTiger', 'support'), + (5, 'BlackHawk', 'duelist'); + +INSERT INTO partidas (equipo_local, equipo_visitante, fecha_partida, mapa) + VALUES (1, 2, '2026-07-01 18:00', 'Dust'), + (3, 4, '2026-07-01 20:00', 'Mirage'), + (5, 1, '2026-07-02 18:00', 'Inferno'), + (2, 3, '2026-07-02 20:00', 'Nuke'), + (4, 5, '2026-07-03 18:00', 'Dust'), + (1, 3, '2026-07-03 20:00', 'Mirage'); + +INSERT INTO resultados (id_partida, id_jugador, kills, muertes, puntos) + VALUES (1, 1, 20, 12, 85), + (1, 2, 15, 18, 60), + (2, 3, 25, 10, 95), + (2, 4, 18, 15, 70), + (3, 5, 22, 14, 88), + (3, 1, 12, 20, 55), + (4, 2, 19, 16, 72), + (4, 3, 21, 13, 80), + (5, 4, 17, 17, 65), + (5, 5, 24, 11, 92); diff --git a/resoluciones/antonio-canux/ejercicio-06/dml/operaciones.sql b/resoluciones/antonio-canux/ejercicio-06/dml/operaciones.sql new file mode 100644 index 00000000..3c20ae42 --- /dev/null +++ b/resoluciones/antonio-canux/ejercicio-06/dml/operaciones.sql @@ -0,0 +1,26 @@ +INSERT INTO equipos (nombre) VALUES + ('Aguilas Doradas'); + +INSERT INTO resultados (id_partida, id_jugador, kills, muertes, puntos) VALUES + (6, 1, 16, 15, 68); + +UPDATE resultados +SET kills = 26, puntos = 98 +WHERE id_resultado = 3; + +UPDATE jugadores +SET rol = 'entry' +WHERE id_jugador = 4; + +DELETE FROM resultados +WHERE id_resultado = 11; + +DELETE FROM resultados +WHERE puntos < 60; + +-- 2 operaciones que fallarám por restricciones +-- Falla por UNIQUE (equipos.nombre): el equipo ya existe +-- INSERT INTO equipos (nombre) VALUES ('Dragones Rojos'); + +-- Falla por CHECK (equipo_local <> equipo_visitante) +-- INSERT INTO partidas (equipo_local, equipo_visitante, fecha_partida, mapa) VALUES (1, 1, '2026-07-10 18:00', 'Dust'); diff --git a/resoluciones/antonio-canux/ejercicio-06/dql/consultas.sql b/resoluciones/antonio-canux/ejercicio-06/dql/consultas.sql new file mode 100644 index 00000000..719412e5 --- /dev/null +++ b/resoluciones/antonio-canux/ejercicio-06/dql/consultas.sql @@ -0,0 +1,30 @@ +-- 1. Listar todos los registros principales de la entidad central +SELECT * FROM resultados; + +-- 2. Mostrar solo dos columnas relevantes +SELECT kills, puntos FROM resultados; + +-- 3. Filtrar registros por una condicion numerica +SELECT * FROM resultados WHERE kills >= 20; + +-- 4. Ordenar resultados por puntos +SELECT * FROM resultados ORDER BY puntos DESC; + +-- 5. Mostrar los 5 mejores resultados segun puntos +SELECT * FROM resultados ORDER BY puntos DESC LIMIT 5; + +-- 6. Contar registros totales +SELECT COUNT(*) AS total_resultados FROM resultados; + +-- 7. Promedio, minimo y maximo de puntos +SELECT + AVG(puntos) AS promedio, + MIN(puntos) AS minimo, + MAX(puntos) AS maximo +FROM resultados; + +-- 8. Agrupar resultados por jugador +SELECT id_jugador, COUNT(*) AS partidas_jugadas, SUM(puntos) AS puntos_totales +FROM resultados +GROUP BY id_jugador; +