CODIGOHTML=<font color="00000" size="15">La sentencia SELECT es la encargada de la recuperacin (seleccin) de datos, con cualquier tipo de condicin, agrupacin u ordenacin.
Una sentencia SELECT retorna un result set (conjunto de resultados), por lo que podr ser aplicada en cualquier lugar donde se espere un result set.
La sintaxis bsica es:
SELECT columnas
FROM tablas
WHERE condicin
GROUP BY agrupacin
HAVING condicin agrupada
ORDER BY ordenacin;
Todas las clusulas son opcionales excepto SELECT y FROM.
A continuacin vamos a hacer una descripcin breve de cada clusula:

SELECT: se deben indicar las columnas que se desean mostrar en el resultado. Las distintas columnas deben aparecer separadas por coma (",").
Opcionalmente puede ser cualificada con el nombre de su tabla utilizando la sintaxis:
TABLA.COLUMNA
Si se quieren introducir todas las columnas se podr incluir el carcter *, o bien TABLA.*
Existe la posibilidad de sustituir los nombres de columnas por constantes (1, 'pepe' o '1-may-2000'), expresiones, pseudocolumnas  funciones SQL.

A toda columna, constante, pseudocolumna  funcin SQL, se le puede cualificar con un nombre adicional:
COLUMNA NOMBRE
CONSTANTE NOMBRE
PSEUDOCOLUMNA NOMBRE
FUNCION SQL NOMBRE
Si se incluye la clusula DISTINCT despus de SELECT, se suprimirn 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
9

Sin embargo:

SELECT DISTINCT C_CLIENTE FROM FACTURA;
Retornar (suprimiendo las repeticiones)
1
3
5
7
2
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' ) UNA_FUNCION_CUALIFICADA
SELECT DISTINCT *
SELECT DISTINCT DESCRIPCION, IMPORTE
SELECT REFERENCIA||DESCRIPCION

FROM: se indican el(los) result set(s) que interviene(n) en la consulta. Normalmente se utilizan tablas, pero se admite cualquier tipo result set (tabla, select, vista).
Si apareciese ms de una tabla, deben ir separadas por coma.
Las tablas deben existir y si no existiera alguna aparecera el siguiente error:
ORA-00942: table or view does not exist
Al igual que a las columnas, tambin 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 ningn result set.
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 result set retornado.
Para construir las condiciones se podrn utilizar todos los operadores lgicos vistos anteriormente.
Es posible construir condiciones complejas uniendo dos o ms condiciones simples a travs de los operadores lgicos 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 expresin 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 hara 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 ms profundidad este tipo de consultas en el apartado "Consultas agrupadas".

HAVING: Se utiliza para aplicar condiciones sobre agrupaciones. Slo puede aparecer si se ha incluido la clusula GROUP BY.
Trataremos con ms profundidad este tipo de consultas en el apartado "Consultas agrupadas".

ORDER BY: Se utiliza para ordenar las filas del result set final.
Dentro de esta clusula podr aparecer cualquier expresin que pueda aparecer en el SELECT, es decir, pueden aparecer columnas, pseudocolumnas, constantes (no tiene sentido, aunque est permitido), expresiones y funciones SQL. Como caracterstica adicional, se pueden incluir nmeros en la ordenacin, que sern sustituidos por la columna correspondiente del SELECT en el orden que indique el nmero.

La ordenacin es el ltimo paso en la ejecucin 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.

Despus de cada columna de ordenacin 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, etc.
Las consultas tpicas son para contar los registros de ciertos tipos, sumar los importes de cierto cliente, etc.
Por ejemplo, vamos a sacar el total del importe de las facturas, por cliente:
SELECT C_CLIENTE, SUM(IMPORTE)
FROM FACTURA
GROUP BY C_CLIENTE;
Esto nos sumar (la funcin SUM suma su parmetro) los registro agrupando por cliente.
Internamente Oracle tiene que hacer una ordenacin interna de los registros, segn las columnas incluidas en el GROUP BY, as que todo lo dicho para el ORDER BY se puede aplicar para el GROUP BY (sobrecarga del servidor).
Cuando en la clusula SELECT no se incluyen funciones SQL (para ms informacin ver el apartado Funciones SQL), una consulta GROUP BY es equivalente a una consulta SELECT DISTINCT.
Un error muy comn 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 todos las columnas incluidos en la clusula SELECT fuera de funciones sumarias, estn dentro de la clusula GROUP BY, aunque pueden estar en cualquier orden y en el GROUP BY pueden aparecer columnas que no estn en el SELECT.
Si encuentra alguna columna en el SELECT (que no est dentro de una funcin sumaria) que no aparezca en el GROUP BY, entonces nos retorna el error anterior.
Si pensamos la situacin, es lgico que nos retorne un error, porque no podemos agrupar por la columna C_CLIENTE, si luego queremos mostrar otras columnas que estn sin agrupar. O agrupamos por todo, o mostramos sin agrupar, pero ambas a la vez no es posible.
Ejemplos de consultas agrupadas:
SELECT C_CLIENTE, SUM( IMPORTE )
FROM FACTURA
GROUP BY C_CLIENTE;
SELECT C_PAIS, SUM( IMPORTE )
FROM FACTURA
GROUP BY C_PAIS;
SELECT C_CLIENTE, COUNT(*)
FROM FACTURA
GROUP BY C_CLIENTE;
SELECT C_CLIENTE, SUM(1)
FROM FACTURA
GROUP BY C_CLIENTE;
SELECT C_PAIS, AVG( IMPORTE )
FROM FACTURA
GROUP BY C_PAIS;
SELECT C_PAIS, COUNT(*)
FROM CLIENTE
GROUP BY C_PAIS,
SELECT C_CLIENTE + AVG( IMPORTE )
FROM FACTURA;

Consultas multitabla
El posible que para consultas sencillas, todos los datos que necesitemos estn en una sola tabla.
Pero y si estn repartidos por una, dos o muchas tablas?
Es posible hacer consultas que incluyan ms de una tabla (o result set) dentro de la clusula FROM, como ya vimos anteriormente.
Pero en estas consultas hay que tener en cuenta ciertos factores.
Vemos lo que hacer Oracle para esta consulta.
SELECT F.REFERENCIA, F.C_CLIENTE, C.C_CLIENTE, C.D_CLIENTE
FROM FACTURA F, CLIENTE C;
Suponiendo que tenemos los siguientes datos:
<img src="imagenes/UNIDAD1T7/tabla1.png" align="left">
<br>
<br>
El select anterior nos retornar el siguiente result set:
<img src="imagenes/UNIDAD1T7/tabla2.png" align="left">
<br>
<br><br>
<br>
Podemos ver que el resultado es el producto cartesiano de una tabla por otra tabla, es decir, todas las combinaciones posibles de la tabla FACTURA con la tabla CLIENTE.
Pero en realidad lo que a nosotros nos interesa es mostrar todas las facturas, pero con la descripcin del cliente de cada factura, es decir, que cada factura seleccione slo su registro correspondiente de la tabla CLIENTE.
Los registros que a nosotros nos interesan estn marcados en negrita en el esquema anterior, y en todos ellos se cumple que F.C_CLIENTE = C.C_CLIENTE. O dicho de otro modo, los campos que componen la relacin igualados.
Entonces del result set anterior, slo nos interesan los registros marcados en negrita, y el select que nos retorna ese resultado es:
SELECT F.REFERENCIA, F.C_CLIENTE, C.C_CLIENTE, C.D_CLIENTE
FROM FACTURA F, CLIENTE C
WHERE F.C_CLIENTE = C.C_CLIENTE;
El resultado final es:
<img src="imagenes/UNIDAD1T7/tabla3.png" align="left">
<br>
<br>
Esto son con la descripcin del cliente.
Como norma general se puede decir que para combinar dos o ms tablas hay que poner como condicin la igualdad entre las claves de una tabla y el enlace de la otra.
Las condiciones dentro del WHERE que sirven para hacer el enlace entre tablas se denominan JOIN (unin, enlace).
Nota: en el ejemplo utilizado hemos omitido por simplicidad la columna C_PAIS que tambin forma parte de la clave, as que el join debera hacerse con las columnas C_PAIS y C_CLIENTE.

Existe un caso especial cuando se establece un "join" entre tablas: el outer-join.
Este caso se da cuando los valores de los campos enlazados en alguna de las tablas, contiene el valor NULL.
Al realizar un join, si algn campo enlazado contiene el valor NULL, es registro quedar automticamente excluido, ya que una condicin en la que un operando sea NULL siempre se evala como falso.
Supongamos que las tablas utilizadas en el ejemplo anterior ahora tienen los siguientes datos:
<img src="imagenes/UNIDAD1T7/tabla4.png" align="left">
<br>
<br>
Si realizamos la misma consulta (las facturas con la descripcin de cliente), no aparecern las facturas "A112" y "A114",
ya que su campo C_CLIENTE contiene un NULL, y al evaluar la condicin de join (WHERE FACTURA.C_CLIENTE = CLIENTE.C_CLIENTE), no se evaluar como verdadero.
Adems, tampoco aparecer la factura "A115", porque el cliente "7" no existe en la tabla de clientes.
Sin embargo, puedes ser que necesitemos mostrar todas las facturas de la base de datos, independientemente de si el cliente existe o si el campo est a NULL.
Para ello debemos utilizar un outer-join, que no es ms que un JOIN con un modificador (+), indicando que queremos considerar aquellos registros que se descarten por existencia de nulos.
El select final sera as
SELECT F.REFERENCIA, F.C_CLIENTE, C.C_CLIENTE, C.D_CLIENTE
FROM FACTURA F, CLIENTE C
WHERE F.C_CLIENTE = C.C_CLIENTE(+);
El resultado de ejecutar este select es:
<img src="imagenes/UNIDAD1T7/tabla5.png" align="left">
<br>
<br>
Esta consulta podra leerse con el siguiente enunciado:
"Selecionar las facturas que tengan cliente (el join) y aquellas que no encuentren su referencia en la tabla cliente (en outer-join)".
Es importante fijarse en la posicin en que se ha colocado el modificador (+). Si se sita detrs del campo de la tabla cliente, significa que se recuperen las todas las facturas, aunque no encuentren referencia al cliente, sin
embargo, si lo ponemos detrs del campo de la tabla factura:
SELECT F.REFERENCIA, F.C_CLIENTE, C.C_CLIENTE, C.D_CLIENTE
FROM FACTURA F, CLIENTE C
WHERE F.C_CLIENTE(+) = C.C_CLIENTE;
Significara que recupere todos los clientes, aunque no encuentre la referencia de la factura.
Slo queda por comentar que si en join entre las tablas es de varios campos, debe indicarse el smbolo del outer (+) en todos los campos, y en la misma posicin en todos ellos.

Pseudocolumnas
Una pseudocolumna es una columna vlida para poner en cualquier clusula SELECT, independientemente de las tablas incluidas en la clausula FROM.

Las pseudocolumnas vlidas para Oracle8 son:
CURRVAL y NEXTVAL: slo vlidas si el objeto del FROM es una secuencia. Permiten recuperar el valor actual y siguiente (respectivamente) de una secuencia.
LEVEL: Retorna el nivel para consultas jerrquicas. Las consultas jerrquicas se realizan utilizando las clusulas START WITH y CONNECT BY de la sentencia SELECT. Para ms informacin sobre consultas jerrquicas, dirigirse a la ayuda se la sentencia SELECT en el Oracle8 SQL Reference.
ROWID: Retorna una direccin de disco donde se encuentra la fila seleccionada. Es un valor nico para cada fila de la base de datos.
ROWNUM: Es un valor consecutivo para cada fila retornada por una consulta. La primera fila tendr un 1, la segunda un 2, etc.
Se suele utilizar para restringir el tamao del result set, por ejemplo, si queremos que slo retorne las 5 primeras facturas:
SELECT * FROM FACTURA WHERE ROWNUM between 0 and 5;
Hay que tener en cuenta que una consulta de este estilo:
SELECT * FROM FACTURA WHRE ROWNUM > 1;
Nunca retornar resultado, porque siempre habr una fila que sea la primera. Despus de que el WHERE elimine la primera fila, el ROWNUM de todas las filas restantes de recalcular y volver a haber otra nueva primera fila. As se seguir aplicando la condicin de filtro hasta que no queden filas. Por eso no retorna ninguna fila.
El valor de ROWNUM se aplica antes de que se ordene el result set (por la clusula ORDER BY).
SYSDATE: Nos retorna un tipo de dato DATE con la fecha y hora del sistema (segn el reloj del servidor de base de datos).
USER, UID: Nos retorna el nombre e identificador de usuarios de la sesin activa.
</font>