Skip to content

Latest commit

Β 

History

History
306 lines (261 loc) Β· 10.6 KB

File metadata and controls

306 lines (261 loc) Β· 10.6 KB

πŸ“Š sql-chipi-case: Diagrama ER y Referencia RΓ‘pida

πŸ—‚οΈ Diagrama de Entidades y Relaciones (ER)

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     PROYECTO: sql-chipi-case                    β”‚
β”‚                   El Secuestro de Chipi 🐼                      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   equipos    β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ id (PK)      β”‚
β”‚ nombre       β”‚
β”‚ descripcion  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
       β”‚ 1:N
       β”‚
       β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚           alumnos                        β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ id (PK)                                  β”‚
β”‚ nombre                                   β”‚
β”‚ email                      [sospechosos] β”‚
β”‚ equipo_id (FK β†’ equipos)                 β”‚
β”‚ turno ('maΓ±ana' o 'tarde')              β”‚
β”‚ fecha_inscripcion                        β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
       β”‚
       β”œβ”€ 1:N ──→ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
       β”‚          β”‚  dispositivos     β”‚
       β”‚          β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
       β”‚          β”‚ id (PK)           β”‚
       β”‚          β”‚ tipo              β”‚
       β”‚          β”‚ ip (UNIQUE)       β”‚
       β”‚          β”‚ alumno_id (FK)    β”‚
       β”‚          β”‚ fecha_registro    β”‚
       β”‚          β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
       β”‚
       β”œβ”€ 1:N ──→ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
       β”‚          β”‚  commits          β”‚
       β”‚          β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ [PISTAS]
       β”‚          β”‚ id (PK)           β”‚
       β”‚          β”‚ rama              β”‚
       β”‚          β”‚ mensaje [chipi?]  β”‚
       β”‚          β”‚ estado_ci         β”‚
       β”‚          β”‚ fecha (TIMESTAMP) β”‚
       β”‚          β”‚ alumno_id (FK)    β”‚
       β”‚          β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
       β”‚
       β”œβ”€ 1:N ──→ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
       β”‚          β”‚  cafe_ordenes        β”‚
       β”‚          β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ [PISTA 🚨]
       β”‚          β”‚ id (PK)              β”‚
       β”‚          β”‚ bebida               β”‚
       β”‚          β”‚ leche                β”‚
       β”‚          β”‚ hora [02:13?]        β”‚
       β”‚          β”‚ fecha (TIMESTAMP)    β”‚
       β”‚          β”‚ alumno_id (FK)       β”‚
       β”‚          β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
       β”‚
       └─ [MENCIONES] ─→ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                         β”‚  discord_logs       β”‚
                         β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ [PISTAS]
                         β”‚ id (PK)             β”‚
                         β”‚ usuario             β”‚
                         β”‚ canal               β”‚
                         β”‚ mensaje             β”‚
                         β”‚ fecha (TIMESTAMP)   β”‚
                         β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  ubicaciones     β”‚      β”‚  pistas          β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€      β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ id (PK)          β”‚      β”‚ id (PK)          β”‚
β”‚ nombre           β”‚      β”‚ dia              β”‚
β”‚ lugar            β”‚      β”‚ codigo [P-***]   β”‚
β”‚ estado [?]       β”‚      β”‚ descripcion      β”‚
β”‚ ΓΊltima_update    β”‚      β”‚ desbloqueo_sql   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜      β”‚ resuelta         β”‚
                          β”‚ fecha_creacion   β”‚
                          β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ“‹ Referencia RΓ‘pida de Tablas

🏒 equipos (3 registros)

id β”‚ nombre            β”‚ descripcion
───┼─────────────────┼──────────────────────
1  β”‚ SuperKode A      β”‚ Equipo Backend fuerte
2  β”‚ SuperKode B      β”‚ Equipo Frontend creativo
3  β”‚ Los Pato Devs    β”‚ Equipo DevOps

πŸ‘₯ alumnos (12 registros)

id β”‚ nombre       β”‚ email              β”‚ equipo_id β”‚ turno
───┼──────────────┼────────────────────┼───────────┼────────
1  β”‚ Miguel       β”‚ miguel@...         β”‚ 1         β”‚ maΓ±ana
2  β”‚ SalchiPresi  β”‚ salchipresi@...    β”‚ 1         β”‚ tarde
3  β”‚ Marcus       β”‚ marcus@...         β”‚ 1         β”‚ maΓ±ana
...

β˜• cafe_ordenes (12 registros)

id β”‚ alumno_id β”‚ bebida            β”‚ leche     β”‚ hora   β”‚ fecha
───┼───────────┼──────────────────┼───────────┼────────┼──────
9  β”‚ 9 (Wizi)  β”‚ matcha latte      β”‚ parcial   β”‚ 02:13  β”‚ ... 🚨
...

πŸ’¬ discord_logs (11 registros)

id β”‚ usuario         β”‚ canal          β”‚ mensaje
───┼─────────────────┼────────────────┼────────────────
1  β”‚ root_but_intern β”‚ #general       β”‚ A las 02:13 Chipi desapareciΓ³...
...

πŸ“ commits (12 registros)

id β”‚ alumno_id β”‚ mensaje                        β”‚ estado_ci β”‚ fecha
───┼───────────┼────────────────────────────────┼───────────┼─────
1  β”‚ 1 (Miguel)β”‚ Implementar JWT con chipi_...  β”‚ success   β”‚ ...
...

🎯 Query Patrones Útiles

PatrΓ³n 1: JOIN simple

SELECT a.nombre, e.nombre as equipo
FROM alumnos a
JOIN equipos e ON a.equipo_id = e.id;

PatrΓ³n 2: LEFT JOIN (incluir registros sin relaciΓ³n)

SELECT e.nombre, COUNT(a.id) as total_alumnos
FROM equipos e
LEFT JOIN alumnos a ON e.id = a.equipo_id
GROUP BY e.id;

PatrΓ³n 3: WHERE con ILIKE (bΓΊsqueda insensible a mayΓΊsculas)

SELECT * FROM commits
WHERE mensaje ILIKE '%chipi%';

PatrΓ³n 4: GROUP BY con HAVING

SELECT a.nombre, COUNT(c.id) as commits_fallidos
FROM alumnos a
JOIN commits c ON a.id = c.alumno_id
WHERE c.estado_ci = 'failed'
GROUP BY a.id
HAVING COUNT(c.id) > 0;

PatrΓ³n 5: UNION (combinar resultados)

SELECT 'cafΓ©' as tipo, usuario FROM cafe_ordenes
UNION ALL
SELECT 'commit' as tipo, usuario FROM commits;

PatrΓ³n 6: Subquery (query dentro de query)

SELECT * FROM alumnos
WHERE id IN (
  SELECT DISTINCT alumno_id FROM commits
  WHERE estado_ci = 'failed'
);

PatrΓ³n 7: CTE (Common Table Expression)

WITH sospechosos AS (
  SELECT DISTINCT alumno_id FROM cafe_ordenes
  WHERE hora = '02:13'
)
SELECT a.nombre FROM alumnos a
WHERE a.id IN (SELECT alumno_id FROM sospechosos);

πŸ” Pistas Claves

Pista 1: β˜• La cafetera

SELECT a.nombre, c.bebida, c.hora 
FROM alumnos a 
JOIN cafe_ordenes c ON a.id = c.alumno_id 
WHERE c.hora = '02:13';
-- Resultado: Wizi, matcha latte, 02:13 🚨

Pista 2: πŸ’» Commits sospechosos

SELECT a.nombre, c.rama, c.mensaje 
FROM alumnos a 
JOIN commits c ON a.id = c.alumno_id 
WHERE c.mensaje ILIKE '%chipi%';
-- Resultado: 6 commits con "chipi"

Pista 3: πŸ’¬ Discord

SELECT usuario, mensaje FROM discord_logs
WHERE mensaje ILIKE '%chipi%'
ORDER BY fecha DESC;
-- Resultado: Pistas en #general, #dev, #confesiones

Pista 4: πŸ–₯️ Dispositivos

SELECT a.nombre, d.ip, d.tipo
FROM alumnos a
JOIN dispositivos d ON a.id = d.alumno_id
WHERE d.ip = '192.168.1.109';
-- Resultado: Wizi, desktop, 192.168.1.109

πŸ“Š EstadΓ­sticas RΓ‘pidas

Equipos

  • SuperKode A: 4 alumnos (Backend)
  • SuperKode B: 4 alumnos (Frontend)
  • Los Pato Devs: 4 alumnos (DevOps)

Turnos

  • MaΓ±ana: 6 alumnos
  • Tarde: 6 alumnos

Estados de CI

  • Success: 7 commits
  • Failed: 2 commits (🚨)
  • Pending: 3 commits

Bebidas mΓ‘s populares

  • CafΓ© con leche / latte: 5 Γ³rdenes
  • Espresso: 2 Γ³rdenes
  • Especiales: 5 Γ³rdenes

πŸš€ Casos de Uso SQL

Caso Query Tabla Principal
Listar alumnos por equipo SELECT + JOIN alumnos, equipos
Encontrar commits sospechosos WHERE ILIKE commits
AnΓ‘lisis por turno GROUP BY alumnos
Timeline de eventos UNION + ORDER BY cafe_ordenes, commits, discord_logs
Sospechosos principales WHERE + HAVING commits, cafe_ordenes
Correlaciones Subqueries / CTE mΓΊltiples tablas

πŸŽ“ Habilidades que PracticarΓ‘s

  • βœ… SELECT bΓ‘sico
  • βœ… WHERE con diferentes operadores
  • βœ… JOIN (INNER, LEFT, UNION)
  • βœ… GROUP BY y agregaciones
  • βœ… ORDER BY, LIMIT
  • βœ… Funciones de string (ILIKE, LENGTH)
  • βœ… Funciones de agregaciΓ³n (COUNT, STRING_AGG)
  • βœ… Subqueries y CTEs
  • βœ… Window functions
  • βœ… Índices y optimizaciΓ³n

πŸ“ž Contacto / Soporte

Para dudas sobre SQL o el proyecto:

  1. Revisa el README principal
  2. Lee los comentarios en db/00_schema.sql
  3. Examina las pistas en challenges/
  4. Consulta 00_COMIENZA_AQUI.md
  5. Pregunta a MamΓ‘ Pato πŸ¦† (ella niega haberlo visto todo)

ΒΏListos para resolver el caso? πŸ”

Todos los datos estΓ‘n aquΓ­.
La verdad estΓ‘ en tus queries.
Chipi te espera.

β€” root_but_intern