0506 Sql Subconsultas

  • 6,267 views
Uploaded on

 

More in: Technology , Travel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
6,267
On Slideshare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
188
Comments
0
Likes
4

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. S QL SUBCONSULTAS Subconsultas Definición y clasificaciones Donde emplearlas Condiciones de comparación y subconsultas Ejemplos Definición y clasificaciones Una subconsulta es una instrucción SQL llamada desde otra instrucción o desde otra subconsulta. Las subconsultas pueden devolver varios conjuntos de resultados, pudiéndose clasificar basándose en estos conjuntos como: Una fila/una columna Múltiples filas/una única columna Múltiples columnas/una única o múltiples filas Una subconsulta puede tener un formato regular o correlacionado. Subconsulta regular. Un consulta contenida dentro de otra sin que haya relación entre ambas. Subconsulta correlacionadas: Correlacionado implica una conexión entre la consulta –o subconsulta- que invoca la subconsulta y la propia subconsulta. Hay que tener en cuenta, que la columna correlacionada puede ser pasada de la consulta superior (la externa) a la inferior (la subconsulta interna) y NO al revés. La subconsulta correlacionada depende siempre de la consulta externa. Las subconsultas pueden definirse también como anidadas o vistas en línea. Subconsulta anidada: Las subconsultas pueden llamar a otras subconsultas, y estas a su vez a otras, así sucesivamente, sin limitación. Subconsulta vista en línea: Es una subconsulta embebida dentro de la cláusula FROM de la instrucción SELECT que invoca la subconsulta. Las subconsultas pueden pertenecer a la combinación de varios tipos de clasificaciones. Donde emplearlas Las subconsultas pueden emplearse en casi todas las instrucciones SQL, en cualquier comando SQL donde se pueda emplear una expresión. El siguiente listado muestra las instrucciones SQL donde puede emplearse una subconsulta: Cláusula SELECT Cláusula WHERE Cláusula ORDER BY Cláusula FROM (vista en línea) CURSO 2005-06 19
  • 2. S QL SUBCONSULTAS Cláusula VALUES de la instrucción INSERT Cláusula SET de la instrucción UPDATE Condiciones de comparación y subconsultas Las subconsultas pueden aplicarse a muchas condiciones de comparación. Dependiendo del tipo de operador que empleemos, estará permitido un tipo de subconsulta u otro, en función del tipo de resultados que esta devuelva. SIMPLE (subconsulta) {= | != } (subconsulta) LIKE (subconsulta) LIKE (subconsulta) PERTENENCIA (subconsulta)[NOT] IN (subconsulta) EXISTENCIA [NOT] EXIST (subconsulta) RANGO (subconsulta) BETWEEN (subconsulta) AND (subconsulta) AGRUPACIÓN (subconsulta) {= | != | > | < | >= | <= } {ANY | SOME | ALL} (subconsulta) Los operadores marcados, requieren subconsultas que devuelvan una única fila, como son la igualdad/desigualdad, los operadores de comparación (<,>,>=,<=), así como los operadores LIKE y BETWEEN. El resto de operadores permiten como resultado de la subconsulta múltiples filas: IN, NOT IN, EXIST, NOT EXIST, además de los operadores de comparación combinados con ANY, SOME o ALL. Una subconsulta en si misma, es generalmente equivalente sintácticamente a una instrucción SELECT. Ejemplos: A continuación vamos a ver unos ejemplos de subconsultas: Subconsultas de una única fila: Es una subconsulta que devuelve como resultado una única fila. Ejemplo: SELECT * FROM estudiantes WHERE población= (SELECT población FROM estudiantes WHERE dni=’33445667’); Subconsultas de una múltiples filas: Son subconsultas que devuelven como resultado múltiples filas. Es importante tener en cuenta que pueden no devolver ninguna fila, y que el conjunto vacío es un resultado válido en la pertenencia, existencia o condiciones de agrupación de comparación. 20 CURSO 2005-06
  • 3. S QL SUBCONSULTAS Ejemplos: SELECT * FROM profesores WHERE población IN (SELECT población FROM estudiantes WHERE edad>25); SELECT * FROM estudiantes WHERE edad > ALL (SELECT edad FROM profesores WHERE dpto=’Matemáticas’); Subconsultas de múltiples columnas: Una subconsulta de múltiples columnas, puede devolver una única o múltiples filas. Devuelve más de una columna para cada fila. Suele emplearse para validar un conjunto de columnas con otro en la cláusula WHERE, o como vista en línea en la cláusula FROM. Ejemplos: SELECT * FROM profesores WHERE (nombre, apellidos) IN (SELECT nombre, apellidos FROM estudiantes WHERE edad>25); SELECT E.nia, nombre, apellidos, media FROM estudiantes E, (SELECT nia, AVG(nota) MEDIA FROM suspendidos GROUP BY nia HAVING AVG(nota)<3) SUSP3 WHERE E.nia=SUSP3.nia; CREATE TABLE medias AS (SELECT dni, AVG(notas) media FROM estudiantes GROUP BY dni); Subconsultas correlacionadas: Las subconsultas correlacionadas permiten la correlación o coincidencia de valores entre las columnas de la consulta externa y la subconsulta. La consulta externa puede pasar el valor de una columna a la subconsulta, no siendo posible al revés. Las consultas se van ejecutando de izquierda a derecha y de arriba abajo. Las subconsultas internas se ejecutan antes que las invoquen las externas. Ejemplo: SELECT nombre FROM estudiante E WHERE ‘01/01/02’ > ALL (SELECT fecha_matricula FROM asigunaturas A WHERE A.nia=E.nia); CURSO 2005-06 21
  • 4. S QL SUBCONSULTAS Subconsultas anidadas: Una subconsulta anidada es una subconsulta embebida dentro de otra subconsulta. Ejemplo: SELECT nombre, apellidos FROM estudiante E WHERE nia IN (SELECT nia FROM matricula WHERE codasig IN (SELECT codasig FROM asignaturas GROUP BY codasig HAVING COUNT(DISTINCT nia)>100)); Subconsultas vista en línea: Una subconsultas llamada vista en línea, es una subconsulta embebida en la cláusula FROM de una instrucción SELECT, como si de una tabla o vista se tratara. Ejemplos: SELECT E.nia, nombre, apellidos, Num_asig “Número asignaturas” FROM estudiante E, (SELECT nia, count(*) Num_asig FROM matricula GROUP BY nia HAVING COUNT(*)>10) AUX WHERE E.nia=AUX.nia; UPDATE facturas SET total=(SELECT importe FROM (SELECT Fac.codfac codigo, total_fac+total_fac*iva/100-total_fac*dto/100 Importe FROM facturas Fac, (SELECT F.codfac, SUM(L.subtotal) Total_Fac FROM facturas F, (SELECT codfac, (precio*cant)-(precio*cant*dto/100) Subtotal FROM lineas_fac) L WHERE F.codfac=L.codfac GROUP BY F.codfac) Fac_Tot WHERE Fac.codfac=Fac_Tot.codfac) AUX WHERE Aux.codigo=facturas.codfac) 22 CURSO 2005-06