Formateador SQL

Formatear y embellecer consultas SQL

1
Entendiendo Formato SQL
TL;DR

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

EstiloEjemploPrevalencia
Palabras clave en MAYÚSCULASSELECT id FROM users WHERE active = 1Más común
Palabras clave en minúsculasselect id from users where active = 1Común en ORMs
Capitalización tipo títuloSelect id From users Where active = 1Raro

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 u o users AS u)
  • Prefija todas las referencias de columna con el alias de la tabla cuando hay múltiples tablas involucradas
  • Coloca la palabra clave AS explí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ísticaPostgreSQLMySQLSQL ServerBigQuery
Comillas de cadenas'text''text' o "text"'text''text'
Comillas de identificadores"column"`column`[column]`column`
Sintaxis LIMITLIMIT 10LIMIT 10TOP 10LIMIT 10
Tipo booleanoTRUE/FALSE1/01/0TRUE/FALSE
UPSERTON CONFLICTON DUPLICATE KEYMERGEMERGE
Soporte CTECompleto8.0+CompletoCompleto

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 TABLE y CREATE INDEX se 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 ord en lugar de o cuando 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

SELECT bien formateado con JOINs Válido

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;
Consulta sin formato en una sola línea Válido

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;