Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 86 additions & 0 deletions resoluciones/maria-montepeque/ejercicio-74/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
# Ejercicio 74: UPDATE Nivel Basico

**Nombre:** Maria Jose Montepeque
**Fecha:** 2026-08-24

## Tema central

UPDATE

## Descripcion del problema

Un torneo de videojuegos registra sus partidas todas como
`'programada'` con puntaje 0-0 apenas se arma el calendario. Los
resultados reales, las cancelaciones y las correcciones se aplican
despues, una por una, con `UPDATE`.

## Tablas y relaciones

- `equipos`: catalogo de equipos participantes.
- `jugadores`: catalogo de jugadores, cada uno ligado a un equipo.
- `partidas`: tabla principal de este ejercicio. Relaciona un equipo
local con un equipo visitante en una fecha, con puntaje y estado.
`equipos` 1—N `jugadores`; `equipos` 1—N `partidas` (dos veces:
como local y como visitante).

## Uso de UPDATE

En `dml/inserts.sql`, despues de insertar las 4 partidas (todas
`'programada'`, 0-0):

1. `UPDATE` de una sola fila (dos veces): llegan los resultados reales
de las partidas 1 y 2, cada uno con su propio `WHERE id_partida = ...`.
2. `UPDATE` multiple: las partidas 3 y 4 se cancelan juntas por un
problema con el estadio, con un solo `UPDATE` y
`WHERE id_partida IN (3, 4)`.
3. `UPDATE` con expresion: la revision en video anula un gol que ya se
habia contado de mas en la partida 1. En vez de escribir el
resultado final a mano, se usa
`SET puntaje_local = puntaje_local - 1`, que calcula el nuevo valor
a partir del que ya tenia la columna.

La consulta 5 en `dql/consultas.sql` confirma el estado final de las
partidas 1, 3 y 4 despues de todos estos `UPDATE`.

## Otras restricciones aplicadas

- `PRIMARY KEY` autoincremental en las 3 tablas.
- `FOREIGN KEY`: `jugadores.id_equipo`, `partidas.id_equipo_local`,
`partidas.id_equipo_visitante`.
- `NOT NULL` en todas las columnas obligatorias.
- `UNIQUE`: `equipos.nombre_equipo`.
- `CHECK`: `partidas.estado IN (...)`, `puntaje_local >= 0`,
`puntaje_visitante >= 0`.
- `DEFAULT` en `partidas.puntaje_local`, `puntaje_visitante` y
`estado`.
- `PRAGMA foreign_keys = ON;` activado al inicio del script.

## Caso que falla / no recomendable (comentado en `dml/inserts.sql`)

`UPDATE partidas SET estado = 'suspendida' WHERE id_partida = 1;`
falla porque `'suspendida'` no esta en la lista de valores permitidos
por el `CHECK` de `estado`. Se valido con Python (`sqlite3`): lanza
`CHECK constraint failed`. Ademas se dejo una nota (sin ejecutar)
sobre por que cada `UPDATE` de este archivo usa un `WHERE` especifico:
un `UPDATE` sin `WHERE` habria modificado las 4 partidas a la vez.

## Evidencias de ejecucion

Scripts validados en orden (`ddl` -> `inserts` -> `consultas`) con
Python (modulo `sqlite3`), ya que no se tenia el binario `sqlite3`
disponible en el entorno. Detalle completo en
[`evidencias/resultados.md`](evidencias/resultados.md).

- Datos finales: 4 equipos, 4 jugadores, 4 partidas (2 `jugada`, 2
`cancelada`). Partida 1 terminada 2-1 despues de la correccion por
video.

## Como ejecutar

```bash
sqlite3 ejercicio-74.db < ddl/schema.sql
sqlite3 ejercicio-74.db < dml/inserts.sql
sqlite3 ejercicio-74.db < dql/consultas.sql
```

No suba archivos `.db`, `.sqlite` ni `.sqlite3`.
36 changes: 36 additions & 0 deletions resoluciones/maria-montepeque/ejercicio-74/ddl/schema.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
PRAGMA foreign_keys = ON;

-- Ejercicio 74: UPDATE Nivel Basico
-- Tema central: UPDATE
-- Contexto: torneo de videojuegos, partidas y puntajes por equipo.

CREATE TABLE equipos (
id_equipo INTEGER PRIMARY KEY AUTOINCREMENT,
nombre_equipo TEXT NOT NULL UNIQUE,
region TEXT NOT NULL
);

CREATE TABLE jugadores (
id_jugador INTEGER PRIMARY KEY AUTOINCREMENT,
nombre TEXT NOT NULL,
id_equipo INTEGER NOT NULL,

FOREIGN KEY (id_equipo) REFERENCES equipos (id_equipo)
);

-- partidas: tabla principal de este ejercicio. Todas las partidas
-- nacen 'programada' con puntaje en 0; los UPDATE de
-- dml/inserts.sql son los que las mueven a su estado y puntaje real.
CREATE TABLE partidas (
id_partida INTEGER PRIMARY KEY AUTOINCREMENT,
id_equipo_local INTEGER NOT NULL,
id_equipo_visitante INTEGER NOT NULL,
fecha_partida TEXT NOT NULL,
puntaje_local INTEGER NOT NULL DEFAULT 0 CHECK (puntaje_local >= 0),
puntaje_visitante INTEGER NOT NULL DEFAULT 0 CHECK (puntaje_visitante >= 0),
estado TEXT NOT NULL DEFAULT 'programada'
CHECK (estado IN ('programada', 'jugada', 'cancelada')),

FOREIGN KEY (id_equipo_local) REFERENCES equipos (id_equipo),
FOREIGN KEY (id_equipo_visitante) REFERENCES equipos (id_equipo)
);
60 changes: 60 additions & 0 deletions resoluciones/maria-montepeque/ejercicio-74/dml/inserts.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
PRAGMA foreign_keys = ON;

-- Ejercicio 74: UPDATE Nivel Basico
-- Datos de prueba y UPDATE de validacion.

INSERT INTO equipos (nombre_equipo, region) VALUES
('Dragones del Norte', 'Norte'),
('Lobos del Sur', 'Sur'),
('Halcones del Centro', 'Centro'),
('Tigres del Oeste', 'Oeste');

INSERT INTO jugadores (nombre, id_equipo) VALUES
('Kevin Us', 1),
('Oscar Tzul', 2),
('Melissa Ordonez', 3),
('Sergio Batz', 4);

-- Las 4 partidas nacen todas 'programada' con puntaje 0-0 (el DEFAULT
-- de la tabla). Los UPDATE de abajo son los que las mueven a su
-- estado y resultado real, uno por uno.
INSERT INTO partidas (id_equipo_local, id_equipo_visitante, fecha_partida) VALUES
(1, 2, '2026-08-01'),
(3, 4, '2026-08-01'),
(2, 1, '2026-08-08'),
(4, 3, '2026-08-08');

-- 1. UPDATE de una sola fila: llega el resultado de la partida 1 con
-- WHERE por id_partida.
UPDATE partidas
SET puntaje_local = 3, puntaje_visitante = 1, estado = 'jugada'
WHERE id_partida = 1;

-- 2. UPDATE de una sola fila: llega el resultado de la partida 2.
UPDATE partidas
SET puntaje_local = 2, puntaje_visitante = 2, estado = 'jugada'
WHERE id_partida = 2;

-- 3. UPDATE multiple: las partidas 3 y 4 se cancelan juntas por un
-- problema con el estadio, con un solo UPDATE y un WHERE con IN.
UPDATE partidas
SET estado = 'cancelada'
WHERE id_partida IN (3, 4);

-- 4. UPDATE con expresion (no un valor fijo): la revision en video
-- anula un gol que ya se habia contado de mas para el equipo local de
-- la partida 1. En vez de escribir el numero final a mano, se resta 1
-- al valor que ya tenia la columna.
UPDATE partidas
SET puntaje_local = puntaje_local - 1
WHERE id_partida = 1 AND puntaje_local > 0;

-- Caso comentado que debe fallar (no ser recomendable), dejar
-- comentado: un estado que no esta en la lista permitida viola el
-- CHECK.
-- UPDATE partidas SET estado = 'suspendida' WHERE id_partida = 1;

-- Nota sobre buenas practicas (no se ejecuta): un UPDATE sin WHERE
-- modificaria las 4 partidas a la vez, incluidas las que no debian
-- cambiar. Por eso cada UPDATE de este archivo usa una condicion
-- especifica (WHERE id_partida = ... o WHERE id_partida IN (...)).
41 changes: 41 additions & 0 deletions resoluciones/maria-montepeque/ejercicio-74/dql/consultas.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
.headers on
.mode column

-- Ejercicio 74: UPDATE Nivel Basico
-- Consultas de validacion.

-- 1. Mostrar todos los datos principales (partidas con nombre de
-- equipo local y visitante).
SELECT p.id_partida,
eloc.nombre_equipo AS equipo_local,
evis.nombre_equipo AS equipo_visitante,
p.fecha_partida,
p.puntaje_local,
p.puntaje_visitante,
p.estado
FROM partidas p
JOIN equipos eloc ON eloc.id_equipo = p.id_equipo_local
JOIN equipos evis ON evis.id_equipo = p.id_equipo_visitante;

-- 2. Consulta con WHERE: partidas ya jugadas.
SELECT id_partida, fecha_partida, puntaje_local, puntaje_visitante
FROM partidas
WHERE estado = 'jugada';

-- 3. Consulta con ORDER BY: partidas ordenadas por fecha.
SELECT id_partida, fecha_partida, estado
FROM partidas
ORDER BY fecha_partida;

-- 4. Conteo o resumen: total de partidas por estado.
SELECT estado, COUNT(*) AS total
FROM partidas
GROUP BY estado;

-- 5. Validacion especifica de UPDATE: la partida 1 quedo con
-- puntaje_local = 2 (broto 3, la revision en video resto 1 con un
-- UPDATE por expresion) y estado = 'jugada'; las partidas 3 y 4
-- quedaron 'cancelada' por el UPDATE multiple con WHERE IN.
SELECT id_partida, puntaje_local, puntaje_visitante, estado
FROM partidas
WHERE id_partida IN (1, 3, 4);
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
# Evidencias - Ejercicio 74

## Tema

UPDATE

## Comandos ejecutados

No se conto con el binario `sqlite3` en el entorno de trabajo, por lo que
la ejecucion se valido con Python (`sqlite3`), aplicando los mismos
scripts en el mismo orden:

```bash
sqlite3 ejercicio-74.db < ddl/schema.sql
sqlite3 ejercicio-74.db < dml/inserts.sql
sqlite3 ejercicio-74.db < dql/consultas.sql
```

## Resultados

Estado final tras `dml/inserts.sql` (que incluye los 4 `UPDATE` de
validacion sobre las 4 partidas insertadas todas en `'programada'`
con 0-0):

```text
id_partida | equipo_local | equipo_visitante | fecha_partida | puntaje_local | puntaje_visitante | estado
1 | 1 | 2 | 2026-08-01 | 2 | 1 | jugada
2 | 3 | 4 | 2026-08-01 | 2 | 2 | jugada
3 | 2 | 1 | 2026-08-08 | 0 | 0 | cancelada
4 | 4 | 3 | 2026-08-08 | 0 | 0 | cancelada
```

**Caso comentado verificado:**

- `UPDATE partidas SET estado = 'suspendida' WHERE id_partida = 1;` → `CHECK constraint failed: estado IN ('programada', 'jugada', 'cancelada')`.

**4. Resumen: partidas por estado:**

```text
estado total
cancelada 2
jugada 2
```

**5. Validacion especifica de UPDATE:**

```text
id_partida | puntaje_local | puntaje_visitante | estado
1 | 2 | 1 | jugada
3 | 0 | 0 | cancelada
4 | 0 | 0 | cancelada
```

La partida 1 llego a 3-1 con el primer `UPDATE`, y quedo en 2-1
despues del `UPDATE` por expresion (`puntaje_local = puntaje_local - 1`)
que anulo un gol tras revision en video. Las partidas 3 y 4 quedaron
`'cancelada'` con un solo `UPDATE` multiple (`WHERE id_partida IN (3, 4)`).

## Aprendizaje

`UPDATE` con `WHERE` modifica exactamente las filas que cumplen la
condicion, ni una mas: el `UPDATE` de la partida 1 nunca toco las
partidas 2, 3 ni 4. Un mismo `UPDATE` puede afectar varias filas a la
vez si el `WHERE` las agrupa (`IN (3, 4)`), sin tener que repetir la
sentencia. Ademas, `SET columna = columna - 1` demuestra que `UPDATE`
puede calcular el nuevo valor a partir del valor actual, en vez de
tener que escribir el resultado final a mano; eso es justo lo que
permitio corregir el marcador de la partida 1 sin necesitar saber de
antemano cual iba a quedar el numero exacto.
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
# Solicitud SQL - Ejercicio 074: Liga Videojuego Futbol

**Nombre:** Maria Jose Montepeque
**Fecha:** 2026-08-24

## Solicitud del cliente

Una liga de videojuegos de futbol registra usuarios, clubes, jornadas
y goles. El cliente necesita un reporte rapido para tomar decisiones
al final de cada semana. Pidio convertir esa operacion en una base de
datos que permita consultar datos, corregir estados, registrar
movimientos y sacar reportes utiles.

## Que entendi de la solicitud

"Al final de cada semana" se traduce en "al final de cada jornada":
el modelo necesita poder responder, para una jornada especifica, que
club domino en goles. El nivel pedido (4, reportes y agrupaciones)
exige ademas `JOIN`, `GROUP BY`, `HAVING`, totales y ranking. El
detalle completo del analisis esta en
[analisis/requerimiento.md](analisis/requerimiento.md).

## Que tablas cree y por que

- `usuarios`: catalogo de jugadores humanos de la liga.
- `clubes`: catalogo de clubes de futbol del videojuego.
- `jornadas`: catalogo de semanas de competencia.
- `partidos`: tabla transaccional, cada uno dentro de una jornada,
entre dos usuarios que juegan con dos clubes.
- `goles`: detalle de cada partido. El marcador no se guarda como
numero fijo, se calcula sumando estas filas, lo que hace que el
reporte semanal que pidio el cliente siempre sea confiable.

## Como se relacionan

`jornadas` 1:N `partidos`; `usuarios` 1:N `partidos` (como local y
como visitante); `clubes` 1:N `partidos` (como local y como
visitante); `partidos` 1:N `goles`; `clubes` 1:N `goles`. El diagrama
esta en [diagramas/diagrama-er.svg](diagramas/diagrama-er.svg).

## Que datos de prueba use

4 usuarios, 4 clubes, 2 jornadas, 4 partidos (3 marcados `jugado` en
algun momento, 1 `programado`) y 9 goles, incluido uno cargado por
error para un partido que despues se descubrio que habia que cancelar.
Tambien tres `INSERT` comentados que deben fallar (uno por cada
restriccion). Detalle en [dml/inserts.sql](dml/inserts.sql).

## Que operaciones de mantenimiento incluyo

En [dml/operaciones.sql](dml/operaciones.sql): un `UPDATE` de estado
(el partido que se desconecto a la mitad pasa a `cancelado`) y un
`DELETE` controlado que limpia el gol huerfano de ese partido, sin
tocar ningun gol de un partido ya `jugado`.

## Que consultas responden al cliente

En [dql/consultas.sql](dql/consultas.sql): que goles existen (JOIN
club-partido-jornada), en que estado esta cada partido, que club
anoto mas goles, los goles ordenados por minuto, y el reporte rapido
semanal con `GROUP BY` + `HAVING` de goles por club en una jornada
especifica.

## Evidencias

Resultados de ejecutar todo en orden, incluyendo la verificacion de
los tres casos de error y de las operaciones de mantenimiento, en
[evidencias/resultados.md](evidencias/resultados.md).

## Como ejecutar

```bash
sqlite3 ejercicio-074.db < ddl/schema.sql
sqlite3 ejercicio-074.db < dml/inserts.sql
sqlite3 ejercicio-074.db < dml/operaciones.sql
sqlite3 ejercicio-074.db < dql/consultas.sql
```

No suba archivos `.db`, `.sqlite`, `.sqlite3` ni `.dump`.
Loading
Loading