Saltar al contenido

Auditoría de datos.

Guardar datos es fácil. Mantenerlos correctos es el verdadero trabajo de quien administra una base. Con el tiempo aparecen filas huérfanas, duplicados, valores imposibles y campos vacíos. Auditar es buscar esos problemas con consultas — y arreglarlos.

01Por qué los datos se ensucian

Ninguna base nace sucia: se ensucia de a poco. Una app con un bug inserta un pedido sin fecha; una integración carga dos veces el mismo cliente; alguien borra una categoría pero deja los productos que la usaban. El motor no siempre lo impide —sobre todo cuando faltan restricciones— así que la integridad termina dependiendo de que alguien la vigile.

02Los problemas clásicos

Huérfanos
Una fila apunta (por su id foráneo) a otra que ya no existe. Un pedido de un cliente fantasma.
Duplicados
El mismo dato cargado dos veces: dos clientes con idéntico email. Rompen conteos y reportes.
NULLs indebidos
Campos críticos vacíos: un pedido sin fecha, un cliente sin nombre. Se cazan con IS NULL.
±
Valores inválidos
Datos que no tienen sentido en el dominio: precios en 0 o negativos, cantidades menores a cero.
Detectar y reparar

Una auditoría real tiene dos tiempos: primero detectás el problema con un SELECT que lo aísla, y después lo reparás con un UPDATE, un DELETE o un INSERT corregido. Los desafíos de abajo practican ambos.

03Explorá la base sucia

Esta tienda tiene problemas plantados a propósito en sus cuatro tablas. Corré las consultas de ejemplo y mirá qué encontrás antes de pasar a los desafíos.

~/sql-labpostgres · in-memory
query.sql
-- Mirá todos los pedidos: ¿notás algo raro?
SELECT * FROM pedidos;
listo
clientes
idINT🔑nombreVARCHAR(60)emailVARCHAR(120)
1Ana Torres[email protected]
2Luis Pérez[email protected]
3María Gómez[email protected]
4Carla RuizNULL
productos
idINT🔑nombreVARCHAR(60)categoriaVARCHAR(30)precioDECIMAL(10,2)
1Café SierraCafé32000
2Café Huilacafé28000
3Té verde12000
4GalletasSnack-5000
5ChocolateSnack0
pedidos
idINT🔑cliente_idINTfechaDATEtotalDECIMAL(10,2)
112024-01-1064000
22NULL28000
3992024-02-0112000
412024-02-1599999
items_pedido
idINT🔑pedido_idINTproducto_idINTcantidadINTprecio_unitDECIMAL(10,2)
111232000
243112000
341132000
Ojo con NULL

fecha = NULL nunca es verdadero, ni siquiera cuando la fecha es nula. NULL significa “desconocido”, así que se compara con IS NULL / IS NOT NULL. Es el error de auditoría más común.

04Desafíos · auditá y repará

Seis retos sobre la base sucia: unos te piden detectar el problema con una consulta, otros te dan una operación que falla con un error y tenés que corregirla. Escribí tu solución y dale Comprobar.

  • Detección: el editor arranca vacío — vos escribís la consulta que aísla el problema.
  • Reparación: el editor trae la consulta rota. Corréla para ver el error del motor, después arreglala.

Auditá los pedidos incompletos: listá el id de los pedidos que no tienen fecha registrada.

Básico

Encontrá los productos con precio inválido: mostrá nombre y precio de los que tienen precio menor o igual a 0.

Básico

Detectá emails duplicados entre clientes: mostrá el email y cuántas veces aparece (columna 'veces'), solo los que se repiten.

Intermedio

Este INSERT falla con el error: La columna "nombre" no admite NULL. Registrá al cliente correctamente con id 5, nombre 'Diego Soto' y email '[email protected]'.

Intermedio
INSERT INTO clientes (id, nombre, email) VALUES (5, NULL, '[email protected]');

Encontrá los pedidos huérfanos: aquellos cuyo cliente_id no corresponde a ningún cliente real. Mostrá el id del pedido y su cliente_id.

Avanzado

El pedido 4 tiene un total mal cargado (99999) que no coincide con la suma real de sus ítems. Corregí el total del pedido 4 para que sea la suma de cantidad × precio_unit de sus ítems.

Avanzado
-- El total del pedido 4 no cuadra con sus items. Corregilo:
UPDATE pedidos SET total = 0 WHERE id = 4;