Vous êtes sur la page 1sur 27

CAPITULO 9: SUBCONSULTAS Y EXPRESIONES DE CONSULTAS

BASE DE DATOS
Byron Cuesta 16, 2013

INTEGRANTES:

Fiamma Zenith Claro Vega 190602 Ligdy Milena Orozco 190607 Jos Martn Rios Payares 190641 Ailer Alfonso Durn Coronel 190642

16, 2013

BASE DE DATOS
Byron Cuesta

USO DE LAS SUBCONSULTAS


Las subconsultas en SQL permite usar los resultados de una consulta como parte de otra. Las subconsultas desempean un papel importante en SQL: Una instruccin SQL con una subconsulta es a menudo la forma ms natural de expresar una consulta, porque se acerca a la descripcin en lenguaje natural de la consulta. Las subconsultas hacen ms fcil la escritura de las instrucciones SELECT ya que permiten dividir la consulta en piezas y despus componerlas de nuevo. Algunas consultas no se pueden expresar en el lenguaje SQL sin el uso de una subconsulta.

BASE DE DATOS
Byron Cuesta

DIFERENCIAS ENTRE UNA SUBCONSULTA Y LA INSTRUCCIN SELECT


Una subconsulta debe producir una nica fila de datos como resultado. Es decir que una subconsulta casi siempre tiene un nico elemento de seleccin en su clusula SELECT. La clusula ORDER BY no se puede especificar en una subconsulta. Los resultados de la subconsulta se usan internamente en la consulta principal y nunca son visibles para el usuario, as que tiene poco sentido, en cualquier caso, ordenarlas.

BASE DE DATOS
Byron Cuesta

DIFERENCIAS ENTRE UNA SUBCONSULTA Y LA INSTRUCCIN SELECT


Los nombres de columna que aparecen en una subconsulta pueden hacer referencia a columnas de tablas de la consulta principal. En la mayora de implementaciones, una subconsulta no puede ser la UNION de varias instrucciones SELECT diferentes; slo se permita una nica SELECT.

BASE DE DATOS
Byron Cuesta

SUBCONSULTAS EN LA CLASULA WHERE


Cuando aparece una subconsulta en la clusula WHERE, funciona como parte del proceso de seleccin de filas. Las subconsultas ms simples aparecen dentro de una condicin de bsqueda y producen un valor que se usa para comprobar la condicin de bsqueda.

BASE DE DATOS
Byron Cuesta

Listar el nombre de los clientes cuyas compras sean mayores a la cuarta parte del promedio de las ventas entre el 01/01/2012 hasta la fecha actual. SELECT DISTINCT C.NOMBRE FROM EMPRESA.CLIENTE C, EMPRESA.FACTURA F WHERE F.CLIENTE = C.DOCUMENTO AND TOTAL>(SELECT 0.25*AVG(TOTAL) AS PROMEDIO_VENTAS FROM EMPRESA.FACTURA WHERE FECHA BETWEEN 2012-01-01 AND 2013-07-13);

EJEMPLO

BASE DE DATOS
Byron Cuesta

REFERENCIAS EXTERNAS
Dentro del cuerpo de una subconsulta es necesario a menudo hacer referencia al valor de una columna de la fila actual de la consulta principal.

BASE DE DATOS
Byron Cuesta

EJEMPLO
Listar el documento, el nombre y la fecha de la primera compra de cada cliente. SELECT C.DOCUMENTO, C.NOMBRE, (SELECT MIN(F.FECHA) AS PRIMERA_COMPRA FROM EMPRESA. FACTURA F WHERE C.DOCUMENTO=F.CLIENTE) FROM EMPRESA.CLIENTE C;

BASE DE DATOS
Byron Cuesta

CONDICIONES DE BSQUEDA EN LAS SUBCONSULTAS


Las subconsultas aparecen usualmente como parte de la condicin de bsqueda de una clusula WHERE o HAVING. Algunas de las condiciones de bsqueda SQL en las subconsultas son: Test de comparacin en Subconsultas. Test de pertenencia al conjunto devuelto por una Subconsulta. Test de existencia. Tests cuantificados.

BASE DE DATOS
Byron Cuesta

TEST DE COMPARACIN EN SUBCONSULTAS


Este test se parece al test simple de comparacin. Consiste en comparar el valor de una expresin con el valor producido por la subconsulta, devolviendo un resultado TRUE si la comparacin es cierta. Algunos operadores de comparacin son: (=, <>, <, <=, >, >=)

BASE DE DATOS
Byron Cuesta

EJEMPLO
TRAER EL NOMBRE DEL ARTICULO Y SU VALOR QUE ES EL MAS COSTOSO DE LOS PRODUCTOS OFRECIDOS SELECT NOMBRE, VALOR FROM EMPRESA.ARTICULO WHERE VALOR = (SELECT MAX(VALOR) FROM EMPRESA.ARTICULO);

BASE DE DATOS
Byron Cuesta

TEST DE PERTENENCIA A CONJUNTOS (IN)


Este test se parece al test simple de pertenencia a conjuntos. Consiste en comprobar si el valor de una expresin coincide con uno de los valores del conjunto producido por la subconsulta, devolviendo un resultado TRUE si el valor de datos coincide con uno de los valores de la columna.

BASE DE DATOS
Byron Cuesta

EJEMPLO
LISTAR EL NOMBRE DE LOS ARTICULOS QUE NO SE HAN VENDIDO A LA FECHA
SELECT NOMBRE FROM EMPRESA.ARTICULO WHERE CODIGO NOT IN (SELECT DISTINCT ARTICULO FROM EMPRESA.DETALLE_FACTURA);

BASE DE DATOS
Byron Cuesta

TEST DE EXISTENCIA (EXISTS)


Este test se usa slo en subconsultas. Consiste en comprobar si una subconsulta produce alguna fila como resultado de la consulta.

BASE DE DATOS
Byron Cuesta

EJEMPLO
Listar los artculos para los cuales exista un pedido con cuatro o ms elementos comprados. SELECT A.CODIGO FROM EMPRESA.ARTICULO A WHERE EXISTS (SELECT SUM(D.CANTIDAD) FROM EMPRESA.DETALLE_FACTURA D WHERE D.ARTICULO = A.CODIGO HAVING SUM(D.CANTIDAD) > 4);

BASE DE DATOS
Byron Cuesta

TEST CUANTIFICADOS
Consiste en comparar el valor de una expresin con cada uno de los valores del conjunto producido por una subconsulta. SQL proporciona dos tests cuantificados ANY y ALL que extienden esta nocin a otros operadores de comparacin.

BASE DE DATOS
Byron Cuesta

TEST ANY
El test ANY se usa en conjuncin con uno de los seis operadores de comparacin de SQL (=, <>, <, <=, >, >=) para contrastar un nico valor de test con una con una columna de valores de datos producida por una subconsulta.

BASE DE DATOS
Byron Cuesta

EJEMPLO
Listar los clientes que han hecho una compra que sea mayor al 10 por ciento de las ventas. SELECT CLIENTE FROM EMPRESA.FACTURA F WHERE (0.1 * TOTAL) > ANY (SELECT D.SUBTOTAL FROM EMPRESA.DETALLE_FACTURA D WHERE F.ID= D.ID);

BASE DE DATOS
Byron Cuesta

REGLAS PARA DESCRIBIR LOS RESULTADOS ANY


False: Si la subconsulta produce una columna vaca de resultados, este test devuelve FALSE, es decir no produce ningn valor en la subconsulta para que cumpla el test de comparacin. True: Si la subconsulta produce al menos una columna de resultados para los valores de datos, entonces devuelve TRUE, es decir que realmente hay algn valor producido por la subconsulta para que se cumpla el test de comparacin. Null: Si el test de comparacin no es TRUE para algn valor de datos de la columna, pero es NULL (desconocido) para uno o ms valores de datos, entonces devuelve NULL.

BASE DE DATOS
Byron Cuesta

TEST ALL
El test ALL se usa en conjuncin con uno de los seis operadores de comparacin de SQL (=, <>, <, <=, >, >=) para contrastar un nico valor de test con una con una columna de valores de datos producidos por una subconsulta. Este test usa el operador de comparacin especificado para contrastar el valor de test con cada valor de datos de la columna, uno por uno.

BASE DE DATOS
Byron Cuesta

EJEMPLO
Listar la factura donde todos los subtotales sean menores al total de las ventas.

SELECT F.ID FROM EMPRESA.FACTURA F WHERE TOTAL > ALL (SELECT SUM(SUBTOTAL) FROM EMPRESA.DETALLE_FACTURA D WHERE F.ID=D.ID);

BASE DE DATOS
Byron Cuesta

REGLAS PARA DESCRIBIR LOS RESULTADOS ALL


True: Si la subconsulta produce una columna vaca de resultados, este test devuelve TRUE, es decir que el test de comparacin no se cumple para ningn valor de la subconsulta. No hay valores. False: Si el test de comparacin es FALSE para algn valor de datos de la columna, entonces devuelve FALSE, es decir que el test de comparacin no se cumple para ningn valor de datos producido por la consulta. Null: Si el test de comparacin no es FALSE para ningn valor de datos de la columna, pero es NULL (desconocido) para uno o ms valores de datos, entonces devuelve NULL.

BASE DE DATOS
Byron Cuesta

SUBCONSULTAS Y REUNIONES
Es posible escribir las subconsultas como consultas multitabla o reuniones. EJEMPLO: Listar la factura y el cliente que contienen el articulo 10 A SUBCONSULTA: SELECT F.ID, F.CLIENTE FROM EMPRESA.FACTURA F WHERE F.ID IN (SELECT D.ID FROM EMPRESA.DETALLE_FACTURA D WHERE D.ARTICULO='10A');
REUNIONES:

SELECT F.ID, F.CLIENTE FROM EMPRESA.FACTURA F, EMPRESA.DETALLE_FACTURA D WHERE F.ID= D.ID AND D.ARTICULO = '10A';

BASE DE DATOS
Byron Cuesta

SUBCONSULTAS ANIDADAS
Esto quiere decir que se puede usar una subconsulta dentro de otra subconsulta. EJEMPLO: Listar los nombres de los clientes cuyas facturas contengan el articulo 09 A

SELECT C.NOMBRE FROM EMPRESA.CLIENTE C WHERE C.DOCUMENTO IN (SELECT F.CLIENTE FROM EMPRESA.FACTURA F WHERE F.ID IN(SELECT D.ID FROM EMPRESA.DETALLE_FACTURA D WHERE D.ARTICULO ='09A'));

Vous aimerez peut-être aussi