ATLASBITÁCORA DE MISIONES · BASES DE DATOS ESTRUCTURADAS
ENTRADA 01
REGISTRO DE CAMPO · BASES DE DATOS ESTRUCTURADAS
ATLAS
Bitácora de un estudiante que aprende bases de datos y las anota como si fueran misiones. Cada semana: una misión completada, el loot que me llevé, y un cofre con acertijo para quien pase por acá.
DÍAS SOBREVIVIDOS
7
MISIONES
01 / 16
PROGRESO DEL SEMESTREXP 0
SEMANA 08FUNCIONES DE GRUPO
MISIÓN 08 · UNIDAD 2, SEMANA 8 · FUNCIONES DE GRUPO Y AGRUPAMIENTO DE FILAS
Sala de Directorio: no quieren 4.000 filas, quieren un número
Esta semana vimos las funciones de grupo (COUNT, SUM, AVG, MAX y MIN), cómo separar las filas en grupos con GROUP BY y cómo filtrar esos grupos con HAVING. Y ORA-00001 sigue creciendo: además de la sala nueva, la oficina cambió entera.
Lo nuevo en MoonJCode:
La oficina ahora es "El anillo". Un pasillo rodea el open space y las salas quedan alrededor. Cada sala deja pistas en el piso (cables, burbujas, papeles timbrados) y una flecha te lleva a la sala que se acaba de abrir. Cruzar por el medio es un atajo... si no te para un zombi a contarte su vida. Para eso están los audífonos de la máquina expendedora.
Tutorial en cada minijuego. La primera vez que entras, el reloj se detiene, practicas con un ticket que no cuenta y Wheatley te aconseja justo lo que no hay que hacer.
La Aduana de Datos ahora se arma con piezas: arrastras funciones, columnas y formatos a la consulta, y sobran algunas.
JUGAR LA SEMANA: desde el menú vas directo al minijuego de la semana, sin avanzar días ni tocar tu partida.
La Sala de Directorio, con la materia de esta semana: el directorio quiere resúmenes y Wheatley les imprimió la tabla entera. Les encantó el grosor.
WASD moverse · E usar · ESC menú · haz clic dentro del juego si las teclas no responden
TEMA DE LA SEMANA · FUNCIONES DE GRUPO Y AGRUPAMIENTO
Las funciones de una sola fila devuelven un resultado por cada fila. Las funciones de grupo hacen lo contrario: toman un conjunto de filas y devuelven un solo resultado por grupo. Sin GROUP BY, toda la tabla es un solo grupo:
SELECT COUNT(*), COUNT(comision), AVG(sueldo), MAX(sueldo), MIN(sueldo)
FROM empleados;
Lo que más me costó entender es que todas ignoran los NULL. COUNT(*) cuenta filas, pero COUNT(comision) cuenta solo las que tienen comisión. Y AVG(comision) divide solo por los que tienen comisión: si quiero que los demás cuenten como 0, tengo que usar AVG(NVL(comision, 0)). Para contar valores distintos está COUNT(DISTINCT cargo).
Con GROUP BY se arma un grupo por cada valor distinto de la columna, y HAVING filtra esos grupos igual que WHERE filtra filas:
SELECT depto, MAX(sueldo)
FROM empleados
WHERE cargo <> 'SA_REP' -- filtra FILAS, antes de agrupar
GROUP BY depto
HAVING MAX(sueldo) > 2000000; -- filtra GRUPOS, después de agrupar
Hay dos reglas que Oracle no perdona. La primera: toda columna del SELECT que no esté dentro de una función de grupo tiene que estar en el GROUP BY (si no, ORA-00937 o ORA-00979). La segunda: en el WHERE no se pueden usar funciones de grupo, porque cuando se evalúa el WHERE todavía no hay grupos (ORA-00934). El orden real en que Oracle lo hace es: FROM, WHERE, GROUP BY, las funciones de grupo, HAVING y al final SELECT y ORDER BY.
En el juego eso es la Clasificadora de la Sala de Directorio: eliges cada parte de la consulta (algunas opciones son trampa) y, al ejecutarla, ves cómo el WHERE tritura filas, el GROUP BY las mete en cajas, la función calcula cada caja y el HAVING bota las que no cumplen. Si pones un COUNT en el WHERE, la máquina se tranca con el mismo error que daría Oracle.
La Clasificadora: el WHERE sacó a los SA_REP y el HAVING botó las cajas que no cumplían.COUNT en el WHERE: ORA-00934.JUGAR LA SEMANA 8, directo desde el menú.
CÓMO SE JUEGA
Muévete con WASD y usa las estaciones con E. Cada día dura de 08:00 a 24:00 (unos 5 minutos): cumple la meta del jefe para que al día siguiente se abra la sala que sigue (la Lavandería, la Aduana y ahora la Sala de Directorio, cuya puerta está en la Aduana). Si no quieres avanzar días, en el menú de inicio (o en la pausa, con ESC) está JUGAR LA SEMANA 8: vas directo a la Sala de Directorio sin tocar tu partida. Ahí eliges la función, el WHERE, el GROUP BY y el HAVING, y aprietas EJECUTAR: el resultado tiene que calzar con lo que pide el directorio. La pestaña MANUAL tiene toda la materia.
LOOT:COUNTSUMAVGMAXMINDISTINCTGROUP BYHAVING
FUENTES CITADAS ESTA SEMANA
Funciones de grupo y agrupamiento de filas, material de la asignatura — virtual.inacap.cl
Oracle Database SQL Language Reference, Aggregate Functions — docs.oracle.com
Oracle Database SQL Language Reference, SELECT (GROUP BY y HAVING) — docs.oracle.com
MISIÓN 07 · UNIDAD 2, SEMANA 7 · FUNCIONES DE CONVERSIÓN Y EXPRESIONES CONDICIONALES
Aduana de Datos: cuando Wheatley migra desde el sistema gringo
Esta semana vimos las funciones de conversión (TO_CHAR, TO_NUMBER y TO_DATE con sus modelos de formato) y las expresiones condicionales (CASE y DECODE), junto con las funciones generales que sirven para los NULL. Como prometí, el juego de la semana pasada creció: ORA-00001 tiene una sala nueva y algunos cambios que lo hacen todavía más (in)humano.
Lo nuevo en MoonJCode:
Días de trabajo. La jornada va de 08:00 a 24:00; las otras 8 horas duermes (¿qué más vas a hacer? el trabajo es tu hobby). Cada día el jefe te pone una meta de tickets y, si la cumples, al día siguiente se abre la sala que sigue.
El burnout ahora cuesta tiempo. Te quedas 4 horas tirado en el suelo, y esas horas no vuelven para cumplir la meta.
Wheatley "optimiza" el botón Reintentar del instalador de Oracle: te lo mueve justo cuando vas a hacer clic. Hay una mejora, Botón con Super Glue, para que deje de molestar.
La Aduana de Datos, con la materia de esta semana: Wheatley migró los datos del sistema gringo y cada ticket trae varias filas. Tu consulta tiene que servir para todas.
TEMA DE LA SEMANA · CONVERSIÓN Y EXPRESIONES CONDICIONALES
Oracle a veces convierte los datos solo (conversión implícita): si una expresión espera un número y le das el texto '2', lo transforma. Pero lo recomendable es convertir uno mismo (conversión explícita) con las funciones de conversión, porque así la consulta no depende de la suerte:
TO_DATE('03/15/2024', 'MM/DD/YYYY') -- texto "gringo" a fecha
TO_CHAR(fecha_ingreso, 'DD-MON-YYYY') -- fecha a texto: 15-MAR-2024
TO_CHAR(sueldo, '$9,999,999') -- número a texto: $1,500,000
TO_NUMBER('$1,234', '$9,999') -- texto a número: 1234
El modelo de formato va entre comillas simples y distingue mayúsculas: MONTH da MARZO y Month da Marzo. Dos detalles que me costaron: el formato RR decide el siglo de los años de dos dígitos (95 es 1995, 24 es 2024), y el modificador fx exige que el texto calce exacto con el formato, sin espacios de más.
Para los NULL están NVL (cambia el NULL por un valor), NVL2 (devuelve una cosa si no es NULL y otra si lo es) y NULLIF (devuelve NULL si dos expresiones son iguales). Y para tomar decisiones dentro de una consulta, la lógica IF-THEN-ELSE de SQL:
SELECT apellido, cargo, sueldo,
CASE cargo WHEN 'IT_PROG' THEN 1.10 * sueldo
WHEN 'ST_CLERK' THEN 1.15 * sueldo
WHEN 'SA_REP' THEN 1.20 * sueldo
ELSE sueldo
END AS sueldo_revisado
FROM empleados;
CASE es el estándar ANSI y DECODE es la versión propia de Oracle: DECODE(cargo, 'IT_PROG', 1.10 * sueldo, 'ST_CLERK', 1.15 * sueldo, sueldo) hace lo mismo. En el juego, esta es la Aduana de Datos: el ticket muestra varias filas y armas la consulta arrastrando piezas (funciones, columnas y formatos; ojo, que sobran algunas). Mientras armas, cada fila dice si tu consulta calza (OK) o no (NO). Ahí se nota que una función de una sola fila se ejecuta una vez por cada fila.
La Aduana: mi CASE calzaba en 2 de 4 filas.Wheatley "optimizando" el botón Reintentar.Fin del día: sin meta cumplida, no hay sala nueva.
CÓMO SE JUEGA
Muévete con WASD y usa las estaciones con E. Cada día dura de 08:00 a 24:00 (unos 5 minutos) y arriba ves la hora y la meta del jefe: cúmplela para que al día siguiente se abra otra sala (primero la Lavandería, después la Aduana). Si dejas que los tickets se venzan, Wheatley los "resuelve" y te sube el estrés; al 100% te da burnout y pierdes 4 horas. En la Aduana arrastras las piezas a la consulta (por ejemplo TO_DATE, fecha_txt y 'MM/DD/YYYY') y miras cómo se pone en verde fila por fila. La pestaña MANUAL de cada estación tiene toda la materia.
MISIÓN 06 · UNIDAD 2, SEMANA 6 · FUNCIONES DE UNA SOLA FILA
ORA-00001: el último humano que todavía sabe SQL
Esta semana vimos funciones de una sola fila. Pero esta vez no quise hacer otro minijuego suelto: empecé un juego más grande en Godot que va a ir creciendo con cada semana del ramo hasta terminar el semestre.
Se llama ORA-00001 (el error que tira Oracle cuando un valor que debería ser único se repite) y es una sátira: eres el único humano de la empresa MoonJCode que todavía sabe bases de datos, porque todos los demás le preguntan todo a Wheatley, la IA de la empresa. Adivina quién termina haciendo todo el trabajo.
Es un juego incremental: al principio todo se hace a mano y los tickets se te acumulan. Con los puntos que ganas compras mejoras para hacerlo más rápido o para automatizarlo... pero cada cosa que automatizas te quita neuronas. Cada semana se va a abrir una sala nueva de la oficina con la materia que toque, y al final del semestre ya veremos qué queda de tu cerebro.
Una función de una sola fila trabaja sobre cada fila por separado y devuelve un resultado por fila. Si la tabla tiene 100 empleados, UPPER(apellido) se ejecuta 100 veces y devuelve 100 apellidos en mayúscula. Además se pueden anidar, y se evalúan de adentro hacia afuera:
-- ' jUAN pÉREZ ' entra sucio y sale 'Juan Pérez'
SELECT INITCAP(TRIM(nombre)), -- de adentro hacia afuera
NVL(sueldo, 0), -- si es NULL, muestra 0
TO_CHAR(fecha_ingreso, 'DD-MM-YYYY')
FROM empleados;
Generales (para los NULL):NVL, NVL2, NULLIF, COALESCE, DECODE
En el juego esta materia es la Lavandería de Datos: Wheatley "limpió" la tabla de empleados y la dejó peor, así que tienes que escribir la función que deja cada dato como lo pide el ticket. Por dentro el juego trae un mini Oracle, así que también te responde con los errores de verdad, como ORA-00904 si escribes mal una columna. Y si haces trampa escribiendo el resultado a mano, tu script guardado falla en la siguiente fila.
La Lavandería: así dejó Wheatley los nombres.Más rápido o automático... a cambio de neuronas.Burnout. Wheatley siendo Wheatley.
CÓMO SE JUEGA
Muévete con WASD y usa las estaciones con E. A cada estación le llegan tickets con una barra de paciencia: si se acaba, Wheatley lo "resuelve" (mal) y te sube el estrés; al 100% te da burnout. En la Lavandería escribes solo la expresión, por ejemplo INITCAP(TRIM(nombre_completo)), y el juego pone el SELECT ... FROM alrededor. Con los puntos que ganas compras mejoras en la pestaña MEJORAS de cada estación, o café y sillas más rápidas en la máquina expendedora. Si no sabes qué función usar, la pestaña MANUAL tiene todas.
El almacén sin índice: encontrar cofres sin abrirlos todos
Esta semana vimos la utilización de índices no únicos y sinónimos, y al igual que la semana anterior quise crear otro minijuego para hacer la semana más divertida.
CÓMO SE JUEGA
Un aldeano te va haciendo pedidos al almacén. Aprieta BUSCAR y mira qué hace Oracle: si no hay un índice que le sirva, abre los cofres uno por uno. Con los botones puedes crear índices (árbol B, UNIQUE o BITMAP) y borrarlos con DROP INDEX; el comando se arma solo. Cada pedido tiene un límite de lecturas, de espacio o de escrituras que tienes que cumplir.
EL ALMACÉN SIN ÍNDICE · PEDIDO 1/5○○○○○
TABLA ALMACEN
¡ALMACÉN ORDENADO!
Insignia · Maestro del índice
+120 XP · un índice no guarda los cofres: guarda el camino para llegar a ellos.
Creación y utilización de índices no únicos y sinónimos, material de la asignatura — virtual.inacap.cl
SEMANA 03SECUENCIAS
MISIÓN 03 · UNIDAD 1, SEMANA 3 · SECUENCIAS
Monstruos hambrientos: una secuencia para cada apetito
Esta semana vimos:
Creación y utilización de vistas simples y complejas
Creación y utilización de secuencias
Este blog me gustaría centrarlo en la materia de secuencias ya que fue la que más me interesó y me inspiró a crear este juego, el cual pueden jugar y aprender cómo funcionan las secuencias.
CÓMO SE JUEGA
Cada monstruo come una lista de números muy específica. Tu trabajo es escribir la secuencia que genera justo esos números, encendiendo las cláusulas con los botones: el comando se va armando solo mientras haces clic. Cuando aprietes NEXTVAL, el helicóptero le va soltando al monstruo los números que la secuencia produce, uno por uno. Si la secuencia está bien, se los come todos; si no, los escupe.
COMEDERO DE SECUENCIAS · MONSTRUO 1/5○○○○○
¡TODOS LOS MONSTRUOS ALIMENTADOS!
Insignia · Generador de números
+100 XP · una secuencia no guarda datos: solo fabrica el siguiente número cuando alguien se lo pide con NEXTVAL.
Creación y utilización de secuencias, material de la asignatura — virtual.inacap.cl
SEMANA 02MODELADO Y DICCIONARIO DE DATOS
MISIÓN 02 · UNIDAD 1, SEMANA 2 · MODELADO Y CREACIÓN DE BASES DE DATOS
Planos antes que bloques: modelando una base de datos como una casa
Esta semana se presentaron 2 temas muy importantes en los recursos de la semana, los cuales son: modelamiento y creación de base de datos, y consulta de diccionarios. Estos 2 temas me parecieron muy interesantes, sobre todo el primero, ya que explica cómo una idea de base de datos nace en la mente de alguien, luego se dibuja el diagrama lógico o el "esqueleto de la base de datos", y por último se crea la base de datos. Esto me recuerda cuando creo un nuevo mundo de Minecraft: después de ver un paisaje me llega a la mente la idea de una hermosa casa junto a los árboles.
Después de pensar bien la idea y juntar los materiales, armo el esqueleto de la casa para tener una idea más clara y visual. Al tener el esqueleto de la casa se pueden tener mejoras o ideas nuevas. Lo mismo sucede con la base de datos: al tener el diagrama lógico se pueden detectar fallos o datos faltantes.
Luego de tener la idea clara, finalmente se puede proceder a crear la base de datos en base a lo modelado. Así tendrás una base de datos bien estructurada... o una bonita casa, como en mi caso.
La idea, todavía sin un solo bloque puesto.El esqueleto: el piso ya dice dónde va cada muro.Misma idea, otro ángulo — así se nota mejor si algo no calza.A medio construir — el diagrama físico ya se nota.Para el que se preguntaba cómo quedó la casa, aquí está el resultado.
TEMA 2 · CONSULTA AL DICCIONARIO DE DATOS
El segundo tema me costó más entenderlo ya que no sabía a qué se refería con que cada usuario podía ver ciertos datos de la base de datos, ya que yo estoy acostumbrado a ver todos los datos como administrador, no tenía idea de esos comandos de base de datos.
No se me ocurrió nada creativo para explicar esta materia así que intentaré explicarlo con el ejemplo anterior, si tú y tu amigo están construyendo una casa, para que los 2 entiendan la idea necesitan un plano del cual puedan consultar los bloques y decoraciones que necesita la casa, en el caso de la base de datos un desarrollador puede consultar la estructura de la base de datos para poder trabajar con ella de manera clara.
No tuve mucha creatividad con esta segunda materia así que para hacer más divertida la semana decidí dejar clips graciosos de mi tiempo libre.
LOOT:DICCIONARIO DE DATOSDBA_ALL_USER_
COFRE BLOQUEADO · ACERTIJO DE LA SEMANA○○○
En Oracle hay 3 familias de vistas para consultar el diccionario de datos, y cada una ve una porción distinta de lo que existe en la base. Conecta cada prefijo con lo que puede ver:
¡DICCIONARIO DESCIFRADO!
Insignia · DBA_ / ALL_ / USER_
+60 XP · cada prefijo abre una ventana distinta al mismo diccionario de datos.
MISIÓN 01 · UNIDAD 1, SEMANA 1 · GESTIÓN DE OBJETOS DE ESQUEMA
Instalando Oracle y descubriendo que ya sabía más de lo que pensaba
Esta semana vimos como instalar el DBMS llamado Oracle Database y un resumen de lo que es y que se puede llegar a hacer con esta herramienta. En lo personal, ya cuento con experiencia trabajando en base de datos, específicamente con la herramienta llamada XAMPP, es algo antigua pero sirve perfectamente para crear una base de datos estable.
Explicar como funciona una base de datos es complicado, sobre todo si no tienes conocimiento alguno sobre informática, así que les explicaré como funciona una base de datos de la manera más simple que se me ocurre, y eso es con Minecraft. ¿Ustedes se preguntarán cómo lo haré?
En Minecraft hay diversos mods con los que se puede jugar, pero hay uno en específico que funciona como almacenamiento en la nube llamado Applied Energistics 2. Aquí tenemos un almacenamiento físico el cual guarda discos de almacenamiento, donde se guardan nuestros "objetos" o "datos". Pero cuidado, que entre más "objetos" almacenemos, tendremos que construir un almacenamiento más grande, eso significa que tendremos que destruir un precioso prado lleno de animales para poder colocar nuestro almacenamiento.
Luego tenemos la terminal, en donde podemos pedir qué objetos almacenar o qué objetos pedir, de la misma manera que lo hacemos con consultas SQL. Para pedir un "objeto" de la base de datos, podemos filtrar en el buscador colocando el nombre del objeto, como por ejemplo Diamante. En una base de datos lo haríamos de forma similar con las consultas SQL, por ejemplo:
SELECT * FROM Minecraft WHERE nombre = 'Diamante';
El buscador de la terminal y el WHERE de SQL hacen exactamente lo mismo: filtrar. La única diferencia es que uno tiene una interfaz bonita y el otro se escribe.
La terminal: buscador arriba, grilla abajo.El núcleo, recién empezando a montarse.
ANALOGÍA DE MISIÓN · MINECRAFT — APPLIED ENERGISTICS 2
El núcleo guarda, la terminal solo pide. Escribir "Diamante" en el buscador de la terminal es lo mismo que escribir WHERE nombre = 'Diamante' en una consulta: los dos filtran sobre datos que viven en otro lado, no en la pantalla que estás mirando.
LOOT:SGBDORACLEXAMPPWHERE
REGISTRO EN VIDEO
COFRE BLOQUEADO · ACERTIJO DE LA SEMANA●○○
En la terminal de AE2 escribes "Diamante" en el buscador y filtra justo esos ítems entre todo lo almacenado. En SQL, ¿qué palabra clave hace exactamente ese mismo filtro?
¡LOOT OBTENIDO!
Insignia · Primer WHERE
+80 XP · WHERE filtra, igual que el buscador de la terminal.