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.