Ordenar los resultados de una consulta en MySQL

Todo usuario de MySQL comprueba que al crear una tabla, añadir filas y ejecutar una instrucción SELECT, las filas se recuperan en el mismo orden en el que se hayan añadido. Parece intuitivo, por lo que es natural asumir que las filas se recuperen de este modo predeterminado.
Pero no es el caso. Si borra y añade filas tras cargar inicialmente la tabla, es probable que dichas acciones modifiquen el orden en que el servidor devuelve las filas de la tabla. (Al borrar filas, se generan huecos en la tabla que posteriormente MySQL trata de completar.

Debe recordar que el orden en que el servidor devuelve filas no está garantizado, a menos que lo especifique personalmente. Para ello, añada una cláusula ORDER BY a la instrucción para definir el orden deseado. La siguiente consulta devuelve nombres de presidente, ordenados alfabéticamente por apellido:

mysql> SELECT last_name, first_name FROM president
-> ORDER BY last_name;

last_name first_name
Wilson Woodrow
Washington George
Van Buren Martin
Tyler John
...

Puede ordenar varias columnas, de forma independiente en orden ascendente o descendente. La siguiente consulta recupera de la tabla president, las ordena a la inversa por estado de nacimiento y en orden ascendente por apellido en cada estado:

mysql> SELECT last_name, first_name, state FROM president
-> ORDER BY state DESC, last_name ASC;

last_name first_name state
Arthur Chester A. VT
Coolidge Calvin VT
Harrison William H. VA
Jefferson Thomas VA
Madison James VA
Monroe James VA
Taylor Zachary VA
Tyler Jonh VA
Washington George VA
Wilson Woodrow VA
Eisenhower Dwight D. TX
Johnson Lyndon B. TX
...

En una columna, los valores NULL se ordenan al principo en orden ascendente y al final en orden descendente. Si desea que los valores NULL aparezcan en un extremo concreto, debe añadir una columna de orden adicional que distinga valores NULL de no NULL. Por ejemplo, si ordena presidentes por fecha de defunción inversa, los presidentes vivos (con fechas de defunción NULL) aparecerán al final. Para colocarlos al principio, utilice el siguiente código:

mysql> SELECT last_name, first_name, death FROM president
-> ORDER BY IF(death IS NULL,0,1), death DESC;

last_name first_name death
Clinton William J. NULL
Bush George H.W. NULL
Carter James E. NULL
Bush George W. NULL
Ford Gerald R. 2006-12-26
Reagan Ronald W. 2004-06-05
Nixon Richard M. 1994-04-22
Johnson Lyndon B. 1973-01-22
...
Jefferson Thomas 1826-07-04
Adams John 1826-07-04
Washington George 1799-12-14

La función IF() evalúa la expresión indicada por su primer argumento y devuelve el valor del segundo o tercer argumento, en función de que sea true o false. En este caso, IF() evalúa a 0 para los valores NULL y a 1 para los valores no NULL. De este modo, los valores NULL se sitúan por delante de los valores no NULL.

Comparte