Contenido del curso
Automatización, Reutilización y Eficiencia en Consultas
Trabajo con Datos Avanzados (JSON)
- 11

Columnas JSON en MySQL: qué son y cómo modificarlas
18:27 min - 12

Índices en columnas JSON con MySQL 8
19:41 min - 13

Uso del Left Join en MySQL para Consultas Avanzadas
26:09 min - 14

Engines y Codificaciones en MySQL: MyISAM vs InnoDB y UTF8MB4
08:13 min - 15

Gestión de Usuarios y Permisos en Bases de Datos MySQL
14:06 min
Gestión Avanzada y Análisis de Bases de Datos
Matrices SQL con SUM e IF sin pivots
Resumen
Los super queries son consultas SQL que aprovechan expresiones inteligentes dentro del SELECT para transformar datos crudos en información lista para consumir. En lugar de seleccionar columnas planas, combinas funciones como SUM, IF y COUNT para construir matrices, segmentaciones y reportes directamente desde la base de datos, sin depender de un framework externo.
Este enfoque es útil cuando trabajas con miles de registros y necesitas presentar resultados claros tanto en la terminal como en exploradores tipo Metabase. La idea central es darle capacidad de decisión a cada columna del query.
Cómo preparas la tabla para segmentar datos
Antes de armar un super query necesitas columnas que permitan agrupar. En el ejemplo se trabajó con una tabla clients de cerca de 98 mil registros a la que se le añadieron dos campos nuevos para poder categorizar [01:50].
La primera modificación agrega género usando ALTER TABLE clients ADD COLUMN gender ENUM('NS','M','F') DEFAULT 'NS' NOT NULL. Como la tabla ya tiene datos, no puedes crear una columna NOT NULL sin un valor por defecto, por eso se usa NS (not set) [02:30].
La segunda añade país con un VARCHAR(2) y default MX. Después se llenan ambas columnas con UPDATE aprovechando la función RAND():
- UPDATE clients SET gender = 'F' WHERE RAND() > 0.51.
- UPDATE clients SET gender = 'M' WHERE gender = 'NS'.
- UPDATE clients SET country = 'CO' WHERE RAND() < 0.31.
- UPDATE clients SET country = 'AR' WHERE RAND() < 0.15 AND country IN ('MX','US').
El resultado es una base con datos pseudoaleatorios que simula clientes de México, Colombia, Estados Unidos y Argentina.
Por qué SUM(1) reemplaza a COUNT en SQL
Aquí está la clave conceptual del tema. Tanto COUNT(*) como SUM(1) recorren cada tupla de la tabla, y si la fila cumple las condiciones del WHERE, suman uno al total [07:45].
¿Cuál es la diferencia entre COUNT y SUM(1)? COUNT simplemente cuenta filas que pasan el filtro. SUM(1) hace lo mismo, pero te permite reemplazar ese 1 por una expresión condicional, dándole inteligencia a la columna.
Cuando cambias el 1 por un IF, abres la puerta a contar selectivamente sin tocar el WHERE. Por ejemplo, SUM(IF(country = 'MX', 1, 0)) AS suma devuelve la cantidad de clientes mexicanos directamente desde una columna del SELECT, sin necesidad de un WHERE country = 'MX' aparte.
Esto equivale exactamente a SELECT COUNT(*) FROM clients WHERE country = 'MX', pero con una ventaja: puedes generar varias columnas condicionales en el mismo query.
Cómo construyes una matriz con SUM e IF
Con esta técnica puedes pivotar datos sin extensiones especiales. El objetivo del ejemplo fue mostrar países en filas y géneros en columnas [10:20].
El query final se ve así:
sql SELECT country, SUM(IF(gender = 'M', 1, 0)) AS M, SUM(IF(gender = 'F', 1, 0)) AS F, COUNT(*) AS total FROM clients GROUP BY 1;
El truco del GROUP BY 1 funciona en MySQL y Postgres: enumeras la posición de la columna en lugar de repetir su nombre. El resultado muestra que en México hay 24.984 hombres y 23.740 mujeres, sumando 48.724 clientes [12:15].
¿Qué hace SUM(IF(condicion, 1, 0))? Recorre cada fila y suma 1 cuando la condición es verdadera, 0 cuando es falsa. El resultado es un conteo segmentado dentro de una sola columna del SELECT.
Un detalle importante: necesitas el GROUP BY porque mezclas funciones de agregación (SUM, COUNT) con una columna normal (country). Sin agrupar, MySQL te lanza error.
Cuándo trasponer la matriz en tu query
La misma lógica funciona al revés. Si quieres géneros en filas y países en columnas, solo cambias el GROUP BY y multiplicas las expresiones condicionales [14:00]:
sql SELECT gender, SUM(1) AS total, SUM(IF(country = 'MX', 1, 0)) AS MX, SUM(IF(country = 'CO', 1, 0)) AS CO, SUM(IF(country = 'AR', 1, 0)) AS AR, SUM(IF(country = 'US', 1, 0)) AS US FROM clients GROUP BY 1;
El resultado muestra, por ejemplo, que hay 23.740 mujeres en México, 12.768 en Colombia, 5.333 en Argentina y 6.070 en Estados Unidos. La matriz traspuesta se arma sin tocar la estructura de la tabla.
¿Qué es un super query? Es una consulta donde cada columna del SELECT toma decisiones mediante expresiones como SUM, IF o CASE, generando reportes pivotados directamente desde SQL.
Por qué evitar ORDER BY RAND en producción
Un detalle técnico importante: la función RAND() es útil para poblar datos de prueba, pero usarla en ORDER BY RAND() tiene un costo. SQL ejecuta la función por cada tupla recorrida, le asigna un valor temporal que no se guarda y luego ordena [10:40].
Funciona y agrega aleatoriedad cuando estás diseñando, pero suma tiempo de ejecución en cada query. Para prototipos sirve. Para producción, busca alternativas más eficientes.
El RAND() sí brilla cuando lo combinas con UPDATE para generar datos sintéticos de prueba, como cuando se asignaron géneros y países pseudoaleatorios a los 98 mil clientes del ejemplo.
¿Has armado matrices similares con CASE WHEN en vez de IF? Cuéntanos en los comentarios cómo aplicas estos super queries en tus proyectos.