Definición
SQL (Structured Query Language) es el lenguaje con el que se habla con una base de datos relacional. Se usa para consultar, insertar, modificar y borrar datos, y también para definir la estructura de las tablas.
Su característica más interesante es que es declarativo: describes qué quieres, no cómo obtenerlo. Tú pides "los clientes de Barcelona con más de tres pedidos este año" y el motor decide por dónde empieza, qué índices usa y en qué orden cruza las tablas. Ese trabajo lo hace el planificador de consultas, y suele hacerlo mejor de lo que lo harías tú a mano.
Tiene más de cincuenta años y sigue siendo la respuesta correcta a la mayoría de problemas de datos. Pocas tecnologías aguantan eso.
Cómo funciona
Una consulta se lee así:
SELECT c.nombre, COUNT(p.id) AS pedidos
FROM clientes c
JOIN pedidos p ON p.cliente_id = c.id
WHERE c.provincia = 'Barcelona'
GROUP BY c.id, c.nombre
HAVING COUNT(p.id) > 3
ORDER BY pedidos DESC;
Las piezas:
- SELECT — qué columnas quieres.
- FROM / JOIN — de qué tablas y cómo se relacionan.
- WHERE — qué filas filtras, antes de agrupar.
- GROUP BY — cómo agrupas para calcular totales.
- HAVING — filtro después de agrupar. Confundirlo con
WHEREes el error clásico. - ORDER BY / LIMIT — orden y cuántas filas.
Los JOIN son el corazón del asunto: cruzan tablas por una columna común. INNER JOIN devuelve solo lo que casa en ambas; LEFT JOIN devuelve todo lo de la izquierda aunque no haya pareja a la derecha. La diferencia entre ambos explica la mitad de los informes que salen mal.
Ejemplo práctico
En el CRM de IMDICA, casi todo lo que se ve en pantalla es SQL por debajo: qué presupuestos están abiertos, qué pedidos van con retraso, qué márgenes deja cada cliente.
El caso que mejor enseña por qué merece la pena entenderlo: teníamos que unir dos tablas de precios, la de tarifas públicas y la de precios negociados por cliente, con un UNION ALL. Funcionaba en local y en producción devolvía cero filas, sin dar ningún error.
La causa era una diferencia de collation —la regla de comparación de texto— entre las dos tablas. Al unirlas, MySQL no comparaba las referencias como iguales aunque lo fueran. Y lo peor: no protestaba. Simplemente no encontraba nada.
Un fallo así no lo detecta ninguna capa de abstracción por encima. Se detecta sabiendo SQL y mirando la consulta.
Segundo caso, más común: un informe de ventas por cliente que se ejecutaba en catorce segundos. La consulta era correcta; lo que faltaba era un índice en la columna por la que se filtraba. Con el índice, cuarenta milisegundos.
Los cuatro comandos que hay que conocer
- SELECT — leer. Es el 90 % de lo que se escribe.
- INSERT — añadir filas.
- UPDATE — modificar. Siempre con
WHERE, salvo que quieras cambiar la tabla entera. - DELETE — borrar. Lo mismo, y con más motivo.
Y una costumbre que salva disgustos: antes de un UPDATE o un DELETE con condiciones complicadas, ejecuta primero el mismo WHERE con un SELECT y mira cuántas filas salen. Si el número te sorprende, no ejecutes el cambio.
Errores comunes
- Concatenar variables dentro de la consulta. Es la puerta directa a una inyección SQL. Se usan consultas preparadas, siempre y sin excepciones.
SELECT *en producción. Traes columnas que no necesitas, y si mañana alguien añade una columna grande, tu consulta engorda sin que la toques.- Confundir
WHEREyHAVING. - El problema N+1. Consultar una lista y luego hacer una consulta por cada elemento. Cien filas se convierten en ciento una consultas. Se resuelve con un
JOIN. LEFT JOINcon condición en elWHERE. Si filtras por una columna de la tabla derecha en elWHERE, conviertes silenciosamente tuLEFT JOINen unINNER JOIN.- No mirar el plan de ejecución.
EXPLAINdelante de una consulta lenta te dice exactamente qué está haciendo el motor.
Cuándo aprenderlo
Cuanto antes, y aunque no seas programador. Si trabajas con datos de una empresa, saber SQL te da autonomía: dejas de pedir informes y empiezas a sacarlos.
Un ORM no te libra de esto. Te ahorra escribir las consultas fáciles y, cuando algo va lento o devuelve algo raro, tienes que bajar al SQL que generó. Sin entenderlo, estás a ciegas.