Iniciación a Oracle - Lenguaje estructurado de consultas SQL (2)

9 - Lenguaje estructurado de consultas SQL (2)

[editar]
Curso gratis creado por José Manuel. Extraido de: http://www.lawebdejm.com
30 de Noviembre de 1999
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 estén en una sola tabla. Pero… ¿y si están repartidos por una, dos o muchas tablas?

Es posible hacer consultas que incluyan más de una tabla (o conjunto de resultados) dentro de la cláusula FROM, como ya vimos anteriormente. Pero en estas consultas hay que tener en cuenta ciertos factores.

Veamos 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:

|| FACTURA || ||
|| Referencia || C_Cliente ||
|| A111 || 1 ||
|| A112 || 2 ||
|| A113 || 1 ||
|| A114 || 5 ||
|| A115 || 2 ||
|| CLIENTE || ||
|| C_Cliente || D_Cliente ||
|| 1 || Pepote ||
|| 2 || Juancito ||
|| 5 || Toñete ||

El select anterior nos retornará el siguiente conjunto de resultados:

|| F.REFERENCIA || F.C_CLIENTE || C.C_CLIENTE || C.D_CLIENTE ||
|| A111 || 1 || 1 || Pepote ||
|| A111 || 1 || 2 || Juancito ||
|| A111 || 1 || 5 || Toñete ||
|| A112 || 2 || 1 || Pepote ||
|| A112 || 2 || 2 || Juancito ||
|| A112 || 2 || 5 || Toñete ||
|| A113 || 1 || 1 || Pepote ||
|| A113 || 1 || 2 || Juancito ||
|| A113 || 1 || 5 || Toñete ||
|| A114 || 5 || 1 || Pepote ||
|| A114 || 5 || 2 || Juancito ||
|| A114 || 5 || 5 || Toñete ||
|| A115 || 2 || 1 || Pepote ||
|| A115 || 2 || 2 || Juancito ||
|| A115 || 2 || 5 || Toñete ||

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 descripción del cliente de cada factura, es decir, que cada factura seleccione sólo su registro correspondiente de la tabla CLIENTE. Los registros que a nosotros nos interesan están 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 relación igualados. Entonces, del conjunto de resultados anterior, sólo nos interesan los registros marcados en negrita, y el select que nos retorna ese resultados 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:

|| F.REFERENCIA || F.C_CLIENTE || C.C_CLIENTE || C.D_CLIENTE ||
|| A111 || 1 || 1 || Pepote ||
|| A112 || 2 || 2 || Juancito ||
|| A113 || 1 || 1 || Pepote ||
|| A114 || 5 || 5 || Toñete ||
|| A115 || 2 || 2 || Juancito ||

Con la descripción del cliente.

Como norma general se puede decir que para combinar dos o más tablas hay que poner como condición 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 (unión, enlace).

Nota: en el ejemplo utilizado hemos omitido por simplicidad la columna C_PAIS que también forma parte de la clave, así que el join debería 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 algún campo enlazado contiene el valor NULL, es registro quedará automáticamente excluido, ya que una condición en la que un operando sea NULL siempre se evalúa como falso.

Supongamos que las tablas utilizadas en el ejemplo anterior ahora tienen los siguientes datos: Si realizamos la misma consulta (las facturas con la descripción de cliente), no aparecerán las facturas "A112" y "A114", ya que su campo C_CLIENTE contiene un NULL, y al evaluar la condición de join (WHERE FACTURA.C_CLIENTE = CLIENTE.C_CLIENTE), no se evaluará como verdadero. Además, tampoco aparecerá la factura "A115", porque el cliente "7" no existe en la tabla de clientes.

|| FACTURA || ||
|| Referencia || C_Cliente ||
|| A111 || 1 ||
|| A112 || NULL ||
|| A113 || 1 ||
|| A114 || NULL ||
|| A115 || 7 ||
|| CLIENTE || ||
|| C_Cliente || D_Cliente ||
|| 1 || Pepote ||
|| 2 || Juancito ||
|| 5 || Toñete ||

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 más que un JOIN con un modificador (+), indicando que queremos considerar aquellos registros que se descarten por existencia de nulos.

El select final sería 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:

|| F.REFERENCIA || F.C_CLIENTE || C.C_CLIENTE || C.D_CLIENTE ||
|| A111 || 1 || 1 || Pepote ||
|| A113 || 1 || 1 || Pepote ||
|| A115 || 2 || 7 || NULL ||
|| A112 || NULL || NULL || NULL ||
|| A114 || NULL || NULL || NULL ||

Esta consulta podría leerse con el siguiente enunciado: "Selecionar las facturas que tengan cliente (el join) y aquellas que no encuentren su referencia en la tabla cliente (el outer-join)".

Es importante fijarse en la posición en que se ha colocado el modificador (+). Si se sitúa detrás 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 detrás 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;

Significaría que recupere todos los clientes, aunque no encuentre la referencia de la factura.

Sólo queda por comentar que si el join entre las tablas es de varios campos, debe indicarse el símbolo del outer (+) en todos los campos, y en la
[editar]

80 opiniones

hai

muy bueno
Muy bueno!

Esta muy buena la explicacion, la verdad es que pude entender muy bien como va el proceso de Almacenamiento de Datos. Excelente!
Hola

Hola
alamacenamiento oracle

esta bueno para aquellas personas que se estan iniciando en Oracle
nadaaaaaaaaaaa

le verdad no me gusto porque yo buscaba elementos de SQL y no los encontre
1 2 3 4 5 6 7 ... 16 | siguiente >

Cursos gratis relacionados con 'Iniciación a Oracle'

El más completo curso de Oracle.

Autor y licencia de 'Iniciación a Oracle'


Curso gratis de José Manuel. Extraido de: http://www.lawebdejm.com CopyLeft
Este contenido ha sido recopilado por el equipo de Wikilearning. Todo el contenido recopilado se ha obtenido respetando y comunicando en nuestro site la licencia de cada fuente.
Wikilearning tiene permiso expreso por escrito de los autores para publicar los contenidos que ha extraído de otras webs, incluyendo su uso comercial.