Para ordenar las filas devueltas por una select utilizamos la cláusula ORDER BY, la cual va al final de toda la SELECT.
SELECT ename, sal,comm,sal+comm total
FROM emp
ORDER BY ename;
Significaría que muestre ordenado por el campo «ename» en orden ascendente.
Se puede ordenar por más de un campo, e indicar individualmente si ascendentemente (ASC) o descendentemente (DESC). Por defecto el orden es ascendente.
SELECT ename, sal,comm,sal+comm total
FROM emp
ORDER BY sal ASC, total DESC, 1 ASC;
Se ordena primero por el campo «sal» en orden ascendente y en caso de similares «1250» se ordena por el siguiente campo especificado «total —alias de sal+comm—» en orden descendente . Y en caso de iguales, se ordenará por la tercera opción que es «1 —corresponde al campo "ename" que es el primero» en orden ascendente (ej: cuando sal es 3000 y total null).
Se puede utilizar para hacer referencia a la columna por la cual se quiere ordenar: el nombre, el alias o el orden que ocupa en la select. No se puede utilizar expresiones (ej: sal+com, to_char(fecha,'mm')).
Los campos de la cláusula ORDER BY tienen que ser campos pertenecientes a los objetos especificados en el FROM (tablas, vistas, subconsultas), es decir, se puede ordenar por un campo que no necesariamente tiene por qué ser seleccionado. Por ejemplo, podríamos ordenar por «ename» y la SELECT ser: «sal,comm+sal» (excluyendo a «ename»).
Además de ordenar por los campos que tienen datos, se puede especificar si queremos los nulos al inicio (FIRST) o al final (LAST) de todo. Por defecto cuando es descendente los nulos van al inicio, y cuando es ascendente los nulos van al final.
SELECT ename, sal,comm,sal+comm total
FROM emp
ORDER BY total DESC NULLS LAST;
En caso de utilizar los operadores de conjunto: INTERSECT, MINUS, UNION, UNION ALL, se escribe una sola cláusula ORDER BY que se coloca al final del todo y solo una.
SELECT ename
FROM emp
MINUS
SELECT UPPER(first_name)
FROM employees
ORDER BY ename;
A la primer select se le restan los elementos que coinciden con la segunda select («JAMES») y al resultado de todo se lo ordena. Se utiliza la función UPPER para transformar los datos que provienen de la tabla «employees» a mayúsculas.
En caso de querer filtrar por el número de fila ROWNUM de una ordenación. Hay que saber lo que se hace. Por ejemplo queremos a los tres que ganan más.
ROWNUM nos indica el número de la fila y no cambiará aunque cambiemos el orden.
Así que si pensamos en obtener los tres que ganan más. Y pensamos en la siguiente SELECT:
Si comparamos con la SELECT en la que vemos a todos, notamos que no es lo que queremos.
Una alternativa es primero ordenarlos en una subconsulta y a esas filas filtrarlas por el ROWNUM.
Si se quiere optimizar, es recomendable evitar ordenar los datos para evitar el darle ese trabajo extra a la base de datos. Hacerlo únicamente cuando estemos obligados a eso. Analizarlo.
Por ejemplo, con tan solo catorce filas se puede ver cómo el coste aumenta, de realizar una SELECT («ename,sal») sin ordenar, y la misma ordenando (por «sal»). No pensar en que si se ordena por un campo indexado va a ir más rápido.
Se ha utilizado:
—Windows XP SP3
—Oracle Data Base 11.2.0.1
—SQL*PLUS 11.2.0.1
—Tablas de los esquemas SCOTT (emp) y HR(employees)
—Tablas de los esquemas SCOTT (emp) y HR(employees)
No hay comentarios:
Publicar un comentario