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:
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
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
.
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.
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