Y llegamos a la última cláusula de una consulta SQL: ORDER BY, que permite ordenar las filas de resultado por una o más columnas. Esta cláusula no se presenta en última instancia por casualidad, sino porque siempre irá al final de una consulta y el motor SQL también será la última cosa que haga, a efectos lógicos, antes de devolver el resultado.
Una última cláusula implica una última pregunta de construcción: ¿Cómo deben ordenarse los datos resultantes?
Cláusula ORDER BY
Supongamos que queremos obtener una lista ordenada de los empleados por sueldo, de modo que primero esté situado el de menor salario y por último el de mayor:
| NOMBRE | APELLIDOS | SALARIO |
|---|---|---|
| Elena | Rubio Cuestas | 1300.00 |
| Margarita | Rodriguez Garcés | 1325.50 |
| José | Calvo Sisman | 1400.00 |
| Carlos | Jiménez Clarín | 1500.00 |
Observamos cómo introduciendo la cláusula ORDER BY e indicando la columna por la que ordenar, el resultado viene ordenado de forma ascendente (ASC), es decir, de menor a mayor. ¿Y si queremos ordenar a la inversa, de mayor a menor? Bien, en ese caso se debe indicar que la ordenación es descendente (DESC). Veamos esto tomando como patrón la consulta anterior:
| NOMBRE | APELLIDOS | SALARIO |
|---|---|---|
| Carlos | Jiménez Clarín | 1500.00 |
| José | Calvo Sisman | 1400.00 |
| Margarita | Rodriguez Garcés | 1325.50 |
| Elena | Rubio Cuestas | 1300.00 |
Por tanto si seguido del campo por el que queremos ordenar indicamos ASC, o bien no indicamos nada, la ordenación se hará de forma ascendente, mientras que si indicamos DESC, se hará de forma descendente.
Ordenación por Múltiples Campos
Veamos un ejemplo donde se ordena por más de un campo. Tomemos por ejemplo la tabla MASCOTAS, y obtengamos una lista de los perros que han pasado por el centro, de modo que primero aparezcan las bajas, y al final las altas, o perros que siguen en el centro. Además queremos que en segundo término la lista esté ordenada por nombre:
| ID_MASCOTA | NOMBRE | ESPECIE | SEXO | UBICACION | ESTADO |
|---|---|---|---|---|---|
| 1 | Budy | P | M | E05 | B |
| 2 | Pipo | P | M | E02 | B |
| 4 | Bruts | P | M | E03 | A |
| 16 | Canela | P | H | E02 | A |
| 3 | Nuna | P | H | E02 | A |
| 6 | Sombra | P | H | E05 | A |
| 9 | Trabis | P | M | E02 | A |
| 12 | Truca | P | H | E02 | A |
| 13 | Zulay | P | H | E05 | A |
Ordenación del Resultado
Veamos un poco cómo resuelve esto el motor SQL. No vamos a entrar en los algoritmos de ordenación que usa, pero sí es un buen ejercicio trazar, como hemos venido haciendo a lo largo del curso, lo que el motor SQL hace. En la consulta anterior el motor SQL recorre la tabla MASCOTAS y selecciona aquellos registros en que el campo ESPECIE contiene una "P", ignorando el resto. De los registros que satisfacen la cláusula WHERE tomará todos los campos, puesto que se ha indicado un asterisco en la cláusula SELECT, y una vez ha recorrido toda la tabla y tiene el resultado, lo ordenará según se indica en la cláusula ORDER BY.
Lo que debe quedar claro es que la ordenación, a efectos lógicos, se realiza siempre al final de todo, sobre las filas de resultado, al margen de la tabla; y siempre lo hará así por muy extensa y compleja que sea una consulta. La ordenación es lo último de lo último que realiza el motor SQL. Y como la ordenación se realiza sobre las filas de resultado, existen otras formas de indicar que columnas van a establecer la ordenación. Podemos por ejemplo hacer referencia a la columna por el orden que ocupa en la cláusula SELECT, por ejemplo:
En esta consulta estamos indicando que ordene por el tercer campo de la cláusula SELECT
| ID_EMPLEADO | NOMBRE | APELLIDOS |
|---|---|---|
| 3 | José | Calvo Sisman |
| 1 | Carlos | Jiménez Clarín |
| 4 | Margarita | Rodriguez Garcés |
| 2 | Elena | Rubio Cuestas |
Para ordenar se puede indicar indistintamente el alias con el que se ha rebautizado la columna, o el campo de tabla tenga o no tenga alias.
Resultado:
| NAME | SURNAMES | SALARY |
|---|---|---|
| José | Calvo Sisman | 1400.00 |
| Carlos | Jiménez Clarín | 1500.00 |
| Margarita | Rodriguez Garcés | 1325.50 |
| Elena | Rubio Cuestas | 1300.00 |
De todos modos se recomienda usar para indicar la columna por la que se quiere ordenar, los nombres de tabla, por dos razones:
- Si usamos alias y este cambia, se debe modificar la cláusula
ORDER BY. - Si usamos posición de columna y se añaden o se eliminan campos de la cláusula
SELECT, es posible que se deba modificar la cláusulaORDER BY.
Resumen
La cláusula ORDER BY permite establecer el orden de las filas de resultado en función de las columnas que se indiquen en dicha cláusula:
order by CAMPO_1, CAMPO_2, ..., CAMPO_N
Para ordenar en forma descendente por una columna debemos indicar a continuación del nombre de la columna la palabra clave DESC. Para hacerlo de forma ascendente no hace falta indicar nada, si se quiere enfatizar se usa la palabra clave ASC.
order by CAMPO_1 desc, CAMPO_2 desc, ..., CAMPO_N asc
Para hacer referencia a una columna en la cláusula ORDER BY, es indiferente usar el alias de una columna, que el orden de la columna en la cláusula SELECT, que el nombre de campo de la tabla. Sin embargo, se recomienda hacer esto último para minimizar fuentes de error.
Ejercicios Propuestos
- Obtenga una lista de las personas de la tabla PERSONAS, donde primero aparezcan las rubias, después las altas, y finalmente las que llevan gafas. De manera que la primera persona de la lista, si la hay, será rubia alta y sin gafas, y la última, si la hay, no será rubia ni alta y llevará gafas.
- Obtenga el número actual de ejemplares de cada ubicación del centro de mascotas, que tenga dos o más ejemplares ordenado de mayor a menor por número de ejemplares y en segundo término por ubicación.
Reseñas de la lección 9
Aún no hay reseñas para esta lección. ¡Sé el primero!