Usar alias con significado

AUTORA: Ana Ramos Clavijo

Usar alias para tablas en el from de una consulta es una herramienta imprescindible que podemos aprovechar siempre que utilizamos una base de datos. A pesar de su utilidad puede llegar a confundir; debemos aprender a usar alias otorgándoles significado y, a la vez, hacer que sean cortos y entendibles.

Supongamos una BD con las siguientes dos tablas, las cuales utilizaremos para nuestra cuestión:

En ellas almacenamos datos sobre corredores y las carreras en las que han participado.

Utilización de alias para acortar nombres

Queremos hacer un join entre la tabla Corredor y Carrera para conseguir el nombre, el dorsal y el puesto. Para ello haremos:

MEJORABLE
select Corredor.nombre, Carrera.dorsal, Carrera.puesto
from   Carrera
  join Corredor on Carrera.idCorredor = Corredor.idCorredor;

Aunque es bastante simple de leer y útil para su compresión, es bastante largo de escribir. En cambio, si usamos alias podemos acortar fácilmente la consulta.

Para dar un alias podemos usar una o varias letras del principio de la palabra
MEJOR
select Co.nombre, Ca.dorsal, Ca.puesto
from   Carrera Ca
  join Corredor Co on Ca.idCorredor = Co.idCorredor; 

Darle un significado al alias

Como vemos en el siguiente ejemplo, es posible encontrarse con tablas con las mismas iniciales, lo que impide que usemos una sola letra para identificarlas, en estos casos intentaremos encontrar un significado para asociarlo con una o varias letras.

Ilustrémoslo con otro ejemplo, en el cual, para todas las carreras, queremos encontrar la diferencia de tiempos entre el ganador y un corredor cualquiera. Esta consulta requiere de un autojoin entre la misma tabla Carrera.

MEJORABLE
select ca2.puesto, ca2.dorsal, ca2.tiempo, 
       timediff(ca2.tiempo, ca1.tiempo) diff
from Carrera ca1 join Carrera ca2 on ca1.id = ca2.id
where ca1.puesto = 1
order by ca2.id, ca2.puesto;

A pesar de que la consulta es correcta, es algo difícil de entender. La expresión timediff(ca2.tiempo,ca1.tiempo), es algo confusa porque no es evidente a quien corresponden los tiempos que estamos restando. ¿Estamos restando el tiempo del ganador del de otro corredor? ¿O nos habremos equivocado y lo hemos escrito al revés?

Deberíamos usar otros alias, aprovechando el "papel" que juega la tabla Carrera en ambos lados del join. Así, en el siguiente ejemplo, con G nos referimos al uso de la tabla Carrera para fijar la tupla del ganador de la carrera (fijarse en que impondremos la condición G.puesto = 1); y con C nos referimos al uso de la tabla Carrera en general, en el que están el resto de corredores con los cuales queremos comparar el tiempo.

BIEN
select C.puesto, C.dorsal, C.tiempo, 
       timediff(C.tiempo, G.tiempo) diff
from Carrera G join Carrera C on G.id = C.id
where G.puesto = 1
order by C.id, C.puesto;

Ahora sí queda claro que lo que estamos restando el tiempo del ganador del tiempo de otro corredor (en timediff, el tiempo más alto se pone primero).

Además, con este segundo ejemplo podemos ver como no hace falta usar las iniciales de las tablas para poner un alias, a pesar de que sea lo más común.

No hay comentarios:

Publicar un comentario