Formateador SQL
Formatear y embellecer consultas SQL
El formato SQL aplica indentación, capitalización y saltos de línea consistentes a las consultas SQL. Un SQL legible es un SQL depurable.
¿Qué es el formato SQL?
El formato SQL es la práctica de aplicar indentación, saltos de línea, capitalización y espaciado consistentes a las consultas SQL. Aunque el motor SQL ignora los espacios en blanco y trata SELECT y select de forma idéntica, los lectores humanos no. Una consulta bien formateada comunica su intención de un vistazo; una mal formateada oculta errores.
SQL es frecuentemente el código más largo y complejo que los desarrolladores escriben sin el beneficio de un auto-formateador del IDE. Las consultas de 50, 100 o incluso 500 líneas son comunes en análisis, ingeniería de datos y desarrollo backend. Sin un formato consistente, estas consultas se vuelven casi imposibles de revisar, depurar o mantener.
Un formateador SQL automatiza este proceso — toma cualquier SQL sintácticamente válido y lo reestructura según un conjunto de reglas, produciendo una salida limpia y consistente independientemente de cómo se haya escrito la entrada.
Convenciones comunes de formato SQL
Aunque no existe una guía de estilo SQL universalmente única, la mayoría de los equipos convergen en convenciones similares:
Capitalización de palabras clave
| Estilo | Ejemplo | Prevalencia |
|---|---|---|
| Palabras clave en MAYÚSCULAS | SELECT id FROM users WHERE active = 1 | Más común |
| Palabras clave en minúsculas | select id from users where active = 1 | Común en ORMs |
| Capitalización tipo título | Select id From users Where active = 1 | Raro |
Las palabras clave en mayúsculas son la convención dominante en la comunidad SQL. Crean una distinción visual clara entre la estructura SQL (SELECT, FROM, WHERE, JOIN) y los identificadores definidos por el usuario (nombres de tablas, nombres de columnas, alias).
Indentación y saltos de línea
Las reglas de formato estándar incluyen:
- Cláusulas principales en nuevas líneas: Cada cláusula SQL (SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY, LIMIT) comienza en una nueva línea al nivel base de indentación.
- Listas de columnas indentadas: Cada columna en una cláusula SELECT tiene su propia línea, indentada un nivel.
- Condiciones JOIN indentadas: La cláusula ON de un JOIN se indenta bajo la palabra clave JOIN.
- Condiciones WHERE alineadas: Múltiples condiciones en una cláusula WHERE se indentan y se prefijan con AND u OR al inicio de cada línea.
- Subconsultas indentadas: Las subconsultas se indentan un nivel adicional y se envuelven en paréntesis en sus propias líneas.
Alias
- Usa alias de tabla cortos y significativos (
users uousers AS u) - Prefija todas las referencias de columna con el alias de la tabla cuando hay múltiples tablas involucradas
- Coloca la palabra clave
ASexplícitamente para mayor claridad (opcional pero recomendado)
Diferencias entre dialectos
SQL no es un solo lenguaje — es una familia de dialectos. Cada motor de base de datos extiende el estándar SQL con sintaxis propietaria, y los formateadores deben tener en cuenta estas diferencias:
| Característica | PostgreSQL | MySQL | SQL Server | BigQuery |
|---|---|---|---|---|
| Comillas de cadenas | 'text' | 'text' o "text" | 'text' | 'text' |
| Comillas de identificadores | "column" | `column` | [column] | `column` |
| Sintaxis LIMIT | LIMIT 10 | LIMIT 10 | TOP 10 | LIMIT 10 |
| Tipo booleano | TRUE/FALSE | 1/0 | 1/0 | TRUE/FALSE |
| UPSERT | ON CONFLICT | ON DUPLICATE KEY | MERGE | MERGE |
| Soporte CTE | Completo | 8.0+ | Completo | Completo |
Al configurar un formateador SQL, siempre especifica el dialecto de destino. Un formateador configurado para PostgreSQL puede producir sintaxis inválida para MySQL y viceversa. Los formateadores modernos soportan múltiples dialectos y pueden alternar entre ellos.
Mejores prácticas de formato
Más allá de las convenciones básicas, los desarrolladores SQL experimentados siguen prácticas adicionales:
- Una sentencia por línea para DDL: Las sentencias
CREATE TABLE,ALTER TABLEyCREATE INDEXse benefician de tener una definición de columna por línea. - CTEs (cláusulas WITH) primero: Coloca las Expresiones de Tabla Comunes al inicio de la consulta, cada una con un nombre descriptivo, antes del SELECT principal.
- Ubicación consistente de comas: Ya sea comas al inicio (
,name) o al final (name,) — elige una y mantén la consistencia. Las comas al inicio facilitan comentar columnas. - Alias significativos: Evita alias de una sola letra para consultas complejas. Usa
orden lugar deocuando la consulta abarca más de 50 líneas. - Comenta la lógica compleja: Agrega comentarios en línea (
-- explicación) para condiciones WHERE no obvias, cálculos o reglas de negocio.
Casos de uso comunes
- Revisión de código: El SQL formateado es dramáticamente más fácil de revisar en pull requests. Los revisores pueden detectar condiciones JOIN faltantes, lógica WHERE incorrecta y problemas de rendimiento de un vistazo.
- Depuración: Cuando una consulta devuelve resultados inesperados, el formato consistente ayuda a aislar el problema cláusula por cláusula.
- Documentación: Las consultas formateadas en documentación, wikis y runbooks son más accesibles para los miembros del equipo que no las escribieron.
- Scripts de migración: Los archivos de migración de base de datos (Flyway, Liquibase, Alembic) se benefician del formato consistente para auditabilidad y claridad en reversiones.
- Análisis y reportes: Los analistas de datos que trabajan con consultas analíticas largas dependen del formato para gestionar la complejidad de joins multi-tabla, funciones de ventana y subconsultas anidadas.
Prueba estos ejemplos
Una consulta correctamente formateada con palabras clave en mayúsculas, indentación consistente, una columna por línea en la cláusula SELECT y condiciones JOIN/WHERE alineadas. Este estilo es inmediatamente legible.
SELECT
u.id,
u.name,
o.total_amount
FROM users u
INNER JOIN orders o
ON o.user_id = u.id
WHERE u.active = 1
AND o.created_at >= '2024-01-01'
ORDER BY o.total_amount DESC
LIMIT 100; SQL sintácticamente válido que produce el mismo resultado, pero comprimido en una sola línea con capitalización inconsistente. Extremadamente difícil de leer, depurar o revisar en un contexto de revisión de código.
select u.id,u.name,o.total_amount from users u inner join orders o on o.user_id=u.id where u.active=1 and o.created_at>='2024-01-01' order by o.total_amount desc limit 100;