23-05-2026

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.