Sql más allá del select: recursos mysql que se deben conocer
Aunque muchos de los que usan MySQL se limitan a usar "SELECT ... FROM ... WHERE", el verdadero poder de MySQL está en funciones y técnicas avanzadas que permiten escribir consultas más eficientes, legibles y potentes. SQL no se trata solo de escribir código sino que se trata de resolver problemas de forma inteligente y eficiente.Dominar estas técnicas permiten- Escribir consultas más rápidas
- Mejorar la legibilidad del código
- Reducir drásticamente el tiempo de análisis
- Destacar como analista de datos
EXISTS
Evita "JOIN" innecesarios cuando solo se necesita comprobar si existe un registro en la base de datos.-- Ejemplo: Clientes que han realizado al menos una compra
SELECT *
FROM clientes c
WHERE EXISTS (
SELECT 1
FROM pedidos p
WHERE p.cliente_id = c.id
);
Ventajas
- Más rápido en grandes volúmenes de datos
- Ideal para preguntas del tipo “¿existe...?”
ROW_NUMBER
Crea rankings y elimina duplicados. Una de las "Window Functions" más usadas.WITH ranked AS (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY cliente_id ORDER BY fecha DESC) AS rn
FROM pedidos
)
SELECT * FROM ranked
WHERE rn = 1;
COALESCE
Evita NULLs y estandariza resultados.
SELECT
nombre,
COALESCE(telefono, 'Sin teléfono') AS contacto,
COALESCE(valor, 0) AS valor_tratado
FROM clientes;
Muy útil para reportes y cálculos donde los "NULL" pueden romper fórmulas.
LAG y LEAD
Compara periodos fácilmente. Es perfecto para análisis de tendencias y variaciones.
SELECT
fecha,
ventas,
LAG(ventas) OVER (ORDER BY fecha) AS ventas_anterior,
ventas - LAG(ventas) OVER (ORDER BY fecha) AS variacion
FROM ventas_diarias;
- "LAG()": valor anterior
- "LEAD()": valor siguiente
Filtro después de Window Functions
MySQL no soporta la cláusula "QUALIFY" de forma nativa, solo en MySQL HeatWave.
QUALIFY es una cláusula, similar a "WHERE" o "HAVING" que se utiliza para filtrar los resultados después de calcular las funciones de ventana (Window Functions).
WITH ranked AS (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY cliente_id ORDER BY fecha DESC) AS rn
FROM ventas
)
SELECT *
FROM ranked
WHERE rn = 1;
Esta es la forma más limpia y legible en MySQL.
CTE (WITH)
Las Common Table Expressions hacen tus consultas mucho más legibles.
WITH ultimas_compras AS (
SELECT *
FROM pedidos
WHERE fecha >= '2025-01-01'
)
SELECT *
FROM ultimas_compras
WHERE monto > 1000;
Ayuda a tener una mejor organización, reutilización y mantenimiento del código.
Tablas Temporales
Ideales cuando se necesita procesar datos en múltiples pasos.
CREATE TEMPORARY TABLE temp_ventas AS
SELECT * FROM ventas
WHERE fecha >= '2025-01-01';
-- Ahora se puede usar varias veces
SELECT * FROM temp_ventas;
Ventajas frente a CTE:
- Se pueden crear índices
- Mejor rendimiento con grandes volúmenes de datos
- Persiste durante toda la sesión
CASE WHEN
Crea reglas y clasificaciones.
SELECT
coste,
CASE
WHEN coste>= 1000 THEN 'Alto'
WHEN coste >= 500 THEN 'Medio'
ELSE 'Bajo'
END AS categoria
FROM pedidos;
Extremadamente útil en dashboards y segmentaciones.
SELECT
nombre,
COALESCE(telefono, 'Sin teléfono') AS contacto,
COALESCE(valor, 0) AS valor_tratado
FROM clientes;
SELECT
fecha,
ventas,
LAG(ventas) OVER (ORDER BY fecha) AS ventas_anterior,
ventas - LAG(ventas) OVER (ORDER BY fecha) AS variacion
FROM ventas_diarias;
WITH ranked AS (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY cliente_id ORDER BY fecha DESC) AS rn
FROM ventas
)
SELECT *
FROM ranked
WHERE rn = 1;
WITH ultimas_compras AS (
SELECT *
FROM pedidos
WHERE fecha >= '2025-01-01'
)
SELECT *
FROM ultimas_compras
WHERE monto > 1000;
CREATE TEMPORARY TABLE temp_ventas AS
SELECT * FROM ventas
WHERE fecha >= '2025-01-01';
-- Ahora se puede usar varias veces
SELECT * FROM temp_ventas;
SELECT
coste,
CASE
WHEN coste>= 1000 THEN 'Alto'
WHEN coste >= 500 THEN 'Medio'
ELSE 'Bajo'
END AS categoria
FROM pedidos;