jueves, 29 de marzo de 2012

ORDER BY. Oracle.

Diagrama de ORDER BY

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.

Salida de select de ejemplo

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;
Salida de select de ejemplo
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;
Salida de select de ejemplo

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)

No hay comentarios:

Publicar un comentario