Consultas Avanzadas en SQL: Inteligencia en Columnas
Resumen
La capacidad de crear consultas SQL avanzadas es una habilidad fundamental para cualquier profesional que trabaje con bases de datos. Las "súper queries" permiten extraer información valiosa y presentarla de manera clara y accesible, transformando datos crudos en conocimiento accionable. En esta exploración profundizaremos en técnicas para dar inteligencia a nuestras consultas SQL, permitiéndonos manipular y presentar datos de forma más efectiva y comprensible.
¿Qué son las "súper queries" y por qué son importantes?
Las "súper queries" son consultas SQL avanzadas que van más allá de la simple selección de columnas, incorporando expresiones y operaciones que dotan de inteligencia a cada columna. Aunque el término no es oficial en la documentación de SQL, representa un concepto poderoso: la capacidad de procesar y transformar datos directamente en la consulta.
Estas consultas son fundamentales porque:
Mejoran la legibilidad de los datos para el usuario final
Reducen la necesidad de procesamiento posterior en la aplicación
Permiten generar información estructurada directamente desde la base de datos
Facilitan la creación de reportes y análisis sin herramientas adicionales
En el mundo real, presentar información de fácil consumo es crucial, ya sea que estés desarrollando una aplicación, conectándote a través de un framework o utilizando herramientas como Metabase para explorar bases de datos.
¿Cómo transformar datos con expresiones condicionales en SQL?
Para ilustrar el poder de las súper queries, trabajaremos con una tabla de clientes a la que añadiremos información demográfica. Primero, modificaremos la estructura de la tabla para incluir género y país:
ALTERTABLE clients ADDCOLUMN gender ENUM('male','female','not_set')NOTNULLDEFAULT'not_set';ALTERTABLE clients ADDCOLUMN country VARCHAR(2)NOTNULLDEFAULT'MX';
Luego, poblaremos estas columnas con datos aleatorios para simular un escenario real:
UPDATE clients SET gender ='female'WHERE RAND()>0.51;UPDATE clients SET gender ='male'WHERE gender ='not_set';UPDATE clients SET country ='CO'WHERE RAND()<0.31;UPDATE clients SET country ='US'WHERE RAND()<0.15;UPDATE clients SET country ='AR'WHERE RAND()<0.15AND country IN('MX','US');
Una consulta básica para ver la distribución por país sería:
SELECT country,COUNT(*)AS total
FROM clients
GROUPBY country
ORDERBY total;
Creando matrices de datos con expresiones condicionales
La verdadera potencia de las súper queries se revela cuando necesitamos crear matrices de datos. Por ejemplo, si queremos ver la distribución de género por país, podríamos hacer:
SELECT country, gender,COUNT(*)AS total
FROM clients
GROUPBY country, gender
ORDERBY total;
Sin embargo, esto nos da un vector de datos, no una matriz. Para crear una verdadera matriz donde cada fila represente un país y las columnas muestren la cantidad de hombres y mujeres, usamos expresiones condicionales dentro de funciones de agregación:
SELECT country,SUM(IF(gender ='male',1,0))AS M,SUM(IF(gender ='female',1,0))AS F,COUNT(*)AS total
FROM clients
GROUPBY country;
Esta técnica es extremadamente poderosa porque:
Permite visualizar datos multidimensionales en un formato tabular claro
Facilita la comparación entre diferentes categorías
Elimina la necesidad de múltiples consultas o procesamiento posterior
¿Cómo transponer matrices de datos en SQL?
Una capacidad fascinante de las súper queries es la posibilidad de transponer matrices de datos. Si queremos invertir nuestra matriz anterior para mostrar géneros en las filas y países en las columnas, podemos hacerlo así:
SELECT gender,SUM(IF(country ='MX',1,0))AS MX,SUM(IF(country ='CO',1,0))AS Colombia,SUM(IF(country ='AR',1,0))AS AR,SUM(IF(country ='US',1,0))AS US
FROM clients
GROUPBY gender;
Esta técnica es particularmente útil para:
Crear reportes personalizados con diferentes perspectivas de los mismos datos
Facilitar análisis comparativos entre categorías
Generar visualizaciones más adecuadas según el caso de uso
La clave de estas consultas está en entender que funciones como SUM() y COUNT() pueden combinarse con expresiones condicionales para crear lógica sofisticada directamente en la consulta SQL.
Las súper queries representan una forma poderosa de extraer valor de tus datos directamente desde la base de datos. Dominar estas técnicas te permitirá crear consultas más eficientes y presentar información de manera más clara y útil. ¿Has utilizado expresiones condicionales en tus consultas SQL? Comparte tus experiencias y descubre cómo estas técnicas pueden transformar tu forma de trabajar con bases de datos.
Jóvenes, como nota, el tipo enum() no es muy usado dentro del propio mysql y tampoco es portable a otros gestores, por lo tanto, en producción, es recomendable crear otra mini-tabla con los datos a referenciar y mediante una clave foránea referenciar los datos, ejemplo: la columna género será un campo de clave foránea que apunte a la columna id de la nueva mini-tabla géneros (que obviamente serán solo dos porque los devs respetamos las leyes de la realidad y de la lógica).
CREATE TABLE genders (
gender_id INT AUTO_INCREMENT PRIMARY KEY,
gender ENUM('male', 'female', 'not_set') NOT NULL UNIQUE
);
ALTER TABLE clients ADD COLUMN gender_id INT NOT NULL DEFAULT 3;
--Elon vibes
SELECT country,COUNT(CASEWHEN gender ='male'THEN1END)ASM,COUNT(CASEWHEN gender ='female'THEN1END)ASF,COUNT(*)AS total
FROM clients
GROUPBY country;
Creo que la indentación ayuda mucho en esta clase a entender mejor la estructura, si bien no tiene un impacto en el resultado a que es el mismo, visualmente logras entender mejor la estructura de la consulta que haces.
select gender,
sum(if(country = 'mx', 1, 0)) as mexicanos,
sum(if(country = 'es', 1, 0)) as españoles,
sum(if(country = 'us', 1, 0)) as Estadounidenses,
sum(if(country = 'co', 1, 0)) as Colombianos
from clients
group by 1
Inteligencia en Columnas: Super Queries
La clave de las Super Queries es dejar de ver las columnas como simples contenedores de datos y empezar a tratarlas como expresiones lógicas capaces de procesar información directamente en la base de datos.
Sustitución de COUNT por SUM: Al usar SUM(IF(condición, 1, 0)), transformas una consulta lineal en una herramienta de segmentación. Cada fila decide por sí misma si suma o no, permitiendo crear matrices de datos personalizadas.
Creación de Matrices: Puedes agrupar datos complejos (como género por país) en una sola vista, evitando múltiples consultas.
Traspuesta de Datos: La misma lógica permite rotar la matriz, cambiando los ejes de análisis (filas por columnas) según la necesidad de lectura.
Tengo una pregunta y es con respecto al usar de rand() para rellenar los datos de la columna gender en la tabla clients de forma aleatoria.
🧪 Tu enfoque:
ALTER TABLE clients
ADD COLUMN gender ENUM('m', 'f', 'ns') DEFAULT 'ns'
AFTER name;
✅ Añades la columna gender después de name, con valor por defecto 'ns' (no especificado).
UPDATE clients
SET gender = 'f'WHERE RAND() > 0.51;
⚠️ Este intento no funciona como esperas en MySQL. ¿Por qué?
RAND() se evalúa una sola vez por sentencia, no por fila.
Eso significa que todos los registros tendrán el mismo resultado de RAND() y se actualizarán en masa como 'f' o no, pero no de forma aleatoria por fila.
UPDATE clients
SET gender = 'm'WHERE gender = 'ns';
✅ Esta segunda sentencia simplemente le asigna 'm' a todos los que quedaron como 'ns', lo cual es útil para completar los que no fueron afectados por el UPDATE anterior.
⚠️ Problema:
Tu enfoque no genera género aleatorio fila por fila como parece.
✅ Solución correcta: Asignar género aleatoriamente por cliente
Para hacerlo correctamente, puedes usar una subconsulta o una variable temporal, pero la manera más simple en MySQL 8+ es con una expresión condicional dentro de UPDATE, así:
UPDATE clients SET gender = CASEWHEN RAND() < 0.5 THEN 'm'ELSE 'f'END;
✅ Aquí RAND() se evalúa individualmente por cada fila, y se asigna 'm' o 'f' de manera aleatoria.