Probablemente SQL sea el único lenguaje de manejo de base de datos existente (al menos que yo conozca). Ése es el objetivo principal de dicho lenguaje (aunque también permite programar, claro). Tal vez por ese motivo sea uno de los lenguajes más peculiares que existen.

Por peculiar me refiero en este artículo a su sintaxis. El SQL suele estar incluido dentro de otros programas escritos en otros lenguajes, en forma de strings. De modo que ahí surge la cuestión:

¿Cómo crear consultas SQL fáciles de leer?

O dicho de otra forma, ¿qué normas de escritura (coding guidelines) usar? Pues, básicamente, las que te de la gana.

Personalmente, tras mucho tiempo trabajando con este estupendo lenguaje, he desarrollado las siguientes normas de escritura:

  1. Las palabras reservadas en MAYÚSCULAS.
  2. El resto de palabras en minúsculas, separadas_por_guiones_bajos.
  3. Derrochar espacio vertical queda bien.
  4. No superar los 79 caracteres de ancho (salvo que sea imposible).

Hay otras normas que no se muy bien cómo explicarlas con palabras, así que mejor pondré uno ejemplo. Usaré indentación de 4 espacios, que es la que más me gusta:

SELECT
gr.id AS grupo_id, -- Nota 1
gr.nombre AS grupo_nombre,
gr.campo_con_un_nombre_demasiado_largo_como_para_encajar_de_forma_bonita
AS grupo_largo, -- Nota 2

al.nombre AS alumno_nombre, -- Nota 3
al.apellido_1 AS alumno_apellido_1,
al.apellido_2 AS alumno_apellido_2,

fe.fecha_inicio,
fe.fecha_fin
FROM
formacion.grupos -- Nota 4
AS gr

INNER JOIN formacion.alumnos_grupo -- Nota 5
AS ag -- Nota 6
ON ag.grupo
= gr.id

INNER JOIN formacion.alumnos
AS al
ON al.id
= ag.alumno

LEFT JOIN ( -- Nota 7
SELECT
grupo,
MIN(fecha) AS fecha_inicio,
MAX(fecha) AS fecha_fin
FROM
formacion.grupos_fechas
AS s1_fe -- Nota 8
WHERE
grupo = gr.id
)
AS fe
ON fe.grupo
= gr.id
WHERE
CONCAT(
al.nombre, ' ', -- Nota 9
al.apellido_1, ' ',
al.apellido_2
)
LIKE :alumno
AND ( -- Nota 10
gr.id <= :grupo_maximo
OR -- Nota 10
(fe.fecha_inicio < :hasta AND fe.fecha_fin > :desde) -- Nota 11
)

Notas respecto al código de arriba:

  1. Alinear las etiquetas AS.
  2. Si una etiqueta AS no cabe porque el nombre de la columna es demasiado largo, o es una fórmula muy larga también, se pasa a la línea siguiente, igualmente alineado.
  3. Los campos se pueden separar en grupos si:
  1. Tiene cierto significado, como aquí, que hemos separado los campos de grupo de los de alumnos y los de fechas.
  2. También si para calcular un campo hay una fórmula muy complicada, y separándolo más se facilita la lectura porque enfatiza que dicho campo ha terminado.
  • La primera tabla de todas intentaremos que sea la principal.
  • Para los INNER/LEFT/RIGHT JOIN usaremos este tipo de alineación.
  • Si les ponemos alias, la longitud de todos los alias debe ser la misma (en este caso, 2).
  • Las subconsultas se anidarán de la misma forma, pero con más indentación.
  • En las sub-consultas, los alias son:
    1. Una s (indicando que es sub-consulta)
    2. Seguida de un número que indica la profundidad. Por ejemplo, si fuera una sub-sub-consulta, el número sería un 2.
    3. Un guión bajo (_).
    4. Un alias con la misma longitud que hemos decidido en el punto 5.
  •  Al hacer concatenaciones, los espacios se pueden alinear para que no molesten. En cualquier otra función, si no cabe en el ancho, se separará como se ve aquí.
  • Los operadores lógicos se colocan en un nivel anterior que las operaciones, para separarlas (si no caben en una línea).
  • Si cabe en una línea, y siempre y cuando así quede claro de ver, se colocará en una línea.