Instrucción SELECT
La sentencia SELECT es la encargada de la recuperación (selección) de datos, con cualquier tipo de condición, agrupación u ordenación. Una sentencia SELECT retorna un único conjunto de resultados, por lo que podrá ser aplicada en cualquier lugar donde se espere un conjunto de resultados.
La sintaxis básica es:
SELECT columnas FROM tablas WHERE condición GROUP BY columnas de agrupación HAVING condición agrupada ORDER BY columnas de ordenación;
Todas las cláusulas son opcionales excepto SELECT y FROM.
A continuación vamos a hacer una descripción breve de cada cláusula:
SELECT Se deben indicar las columnas que se desean mostrar en el resultado. Las distintas columnas deben aparecer separadas por coma (","). Opcionalmente puede ser cualificadas con el nombre de su tabla utilizando la sintaxis:
TABLA.COLUMNA
Si se quieren introducir todas las columnas se podrá incluir el carácter *, o bien TABLA.* Existe la posibilidad de sustituir los nombres de columnas por constantes (1, 'pepe' o '1-may-2000'), expresiones, pseudocolumnas o funciones SQL.
A toda columna, constante, pseudocolumna o función SQL, se le puede cualificar con un
nombre adicional: COLUMNA NOMBRE CONSTANTE NOMBRE PSEUDOCOLUMNA NOMBRE FUNCION SQL NOMBRE
Si se incluye la cláusula DISTINCT después de SELECT, se suprimirán aquellas filas del resultado que tenga igual valor que otras.
Así
SELECT C_CLIENTE FROM FACTURA;
Puede retornar 1, 3, 5, 5, 1, 7, 3, 2 y 9
Sin embargo, para el mismo caso:
SELECT DISTINCT C_CLIENTE FROM FACTURA;
Retornará (suprimiendo las repeticiones): 1, 3, 5, 7, 2 y 9
Ejemplos:
SELECT REFERENCIA REF, DESCRIPCION SELECT FACTURA.REFERENCIA, DESCRIPCION SELECT * SELECT FACTURA.* SELECT 1 UN_NUMERO_CTE_CUALIFICADO, REFERENCIA SELECT 1+1-3*5/5.4 UNA_EXPRESION_SIN_CUALIFICADA SELECT DESCRIPCION, ROWNUM UNA_PSEUDOCOLUMNA_CUALIFICADA SELECT TRUNC( '1-JAN-2001'+1, 'MON' ) FUNCION_CUALIFICADA SELECT DISTINCT * SELECT DISTINCT DESCRIPCION, IMPORTE SELECT REFERENCIA||DESCRIPCION
FROM se indican el(los) conjunto(s) de resultado(s) que interviene(n) en la consulta. Normalmente se utilizan tablas, pero se admite cualquier tipo de conjunto (tabla, select, vista…). Si apareciese más de una tabla, deben ir separadas por coma. Las tablas deben existir y si no existiera alguna aparecería el siguiente error:
ORA-00942: table or view does not exist
Al igual que a las columnas, también se puede cualificar a las tablas
TABLA NOMBRE
Oracle tiene definida una tabla especial, llamada DUAL, que se utiliza para consultar valores que no dependen de ninguna tabla.
SELECT (1+1.1*3/5)-1-2 FROM DUAL;
Ejemplos:
FROM FACTURA FAC FROM FACTURA FAC, CLIENTE CLI FROM DUAL FROM ( SELECT C_CLIENTE FROM FACTURA ) CLIENTE_FAC
WHERE Indica qué condiciones debe cumplirse para que una fila entre dentro del conjunto de resultados retornado. Para construir las condiciones se podrán utilizar todos los operadores lógicos vistos anteriormente. Es posible construir condiciones complejas uniendo dos o más condiciones simples a través de los operadores lógicos AND y OR.
Ejemplos:
WHERE FACTURA.REFERENCIA = 'AA3455' WHERE FACTURA.C_CLIENTE IS NULL WHERE C_CLIENTE BETWEEN '12' AND '20' WHERE C_CLIENTE IS NULL AND
REFERENCIA IN ('AA23344', 'BB23345') WHERE C_CLIENTE != 55 OR REFERENCIA LIKE 'AA%5_'
GROUP BY La expresión GROUP BY se utiliza para agrupar valores que es necesario procesar como un grupo. Por ejemplo, puede darse el caso de necesitar procesar todas las facturas de cada cliente para ver su total, o para contarlas, o para incrementarles un 10%… Para estos casos se haría un SELECT agrupando por C_CLIENTE. Un SELECT con GRUOP BY es equivalente a un SELECT DISTINCT, siempre y cuando en el SELECT no aparezcan consultas sumarias (ver apartado Funciones SQL).
Trataremos con más profundidad este tipo de consultas en el apartado "Consultas agrupadas".
HAVING Se utiliza para aplicar condiciones sobre agrupaciones. Sólo puede aparecer si se ha incluido la cláusula GROUP BY. Trataremos con más profundidad este tipo de consultas en el apartado "Consultas agrupadas".
ORDER BY Se utiliza para ordenar las filas del conjunto de resultados final. Dentro de esta cláusula podrá aparecer cualquier expresión que pueda aparecer en el SELECT, es decir, pueden aparecer columnas, pseudocolumnas, constantes (no tiene sentido, aunque está permitido), expresiones y funciones SQL. Como característica adicional, se pueden incluir números en la ordenación, que serán sustituidos por la columna correspondiente del SELECT en el orden que indique el número.
La ordenación es el último paso en la ejecución de una consulta SQL, y para ello Oracle suele necesitar crear objetos temporales que son creados en el tablespace Temporal. Por eso es recomendable hacer las ordenaciones del lado de cliente (siempre que sea posible), ya que el servidor puede cargarse bastante si tiene que hacer, por ejemplo, 300 ordenaciones de tablas de 2 millones de registros. Después de cada columna de ordenación se puede incluir una de las palabras reservadas ASC o DESC, para hacer ordenaciones ASCendentes o DESCendentes. Por defecto, si no se pone nada se hará ASC.
Ejemplos:
ORDER BY REFERENCIA ASC ORDER BY REFERENCIA DESC, C_CLIENTE DES, IMPORTE ASC ORDER BY C_CLIENTE ORDER BY 1, C_CLIENTE, 2 ORDER BY TRUNC( '1-JAN-2001'+1, 'MON' ) ORDER BY 1.1+3-5/44.3 -- no tiene sentido ordenar por una cte.
Consultas agrupadas
Una consulta agrupada se utiliza para considerar los registros cuyos ciertos campos tienen el mismo valor, y procesarlos de la misma manera, para contarlos, sumarlos, hacer la media… Las consultas típicas son para contar los registros de cierto tipos, sumar los importes de cierto cliente, etc. Por ejemplo, vamos a sacar el total del importe de las factura, por cliente:
SELECT C_CLIENTE, SUM(IMPORTE) FROM FACTURA GROUP BY C_CLIENTE;
Esto nos sumará (la función SUM suma su parámetro) los registro agrupando por cliente. Internamente Oracle tiene que hacer una ordenación interna de los registros, según las columnas incluidas en el GROUP BY, así que todo lo dicho para el ORDER BY (sobre la sorbecarga del servidor) se puede aplicar para el GROUP BY.
Cuando en la cláusula SELECT no se incluyen funciones SQL (para más información ver el apartado Funciones SQL), una consulta GROUP BY es equivalente a una consulta SELECT DISTINCT.
Un error muy común cuando se construyen consultas agrupadas, es el siguiente:
ORA-00979: not a GROUP BY expression
Esto es debido al modo que tiene Oracle de analizar las consultas agrupadas: Lo que hace es comprobar que todas las columnas incluidas en la cláusula SELECT fuera de funciones sumarias, estén dentro de la cláusula GROUP BY, aunque pueden estar en cualquier orden y en el GROUP BY pueden aparecer columnas que no estén en el SELECT. Si encuentra alguna columna en el SELECT (que no esté dentro de una función sumaria) que no aparezca en el GROUP BY, entonces nos retorna el error anterior. Si pensamos la situación, es lógico que nos retorne un error, porque no podemos agrupar por la columna C_CLIENTE, si luego queremos mostrar otras columnas que estén sin agrupar. O agrupamos por todo, o mostramos sin agrupar, pero ambas a la vez no es posible.