Clase SQL Subconsultas
Clase SQL Subconsultas
5.6 SUBCONSULTAS
Una subconsulta es una instrucción SELECT anidada dentro de una instrucción SELECT, SELECT...INTO,
INSERT...INTO, DELETE, o UPDATE o dentro de otra subconsulta. Puede utilizar tres formas de sintaxis
para crear una subconsulta:
comparación [ANY | ALL | SOME] (instrucción sql) expresión [NOT] IN (instrucción sql) [NOT] EXISTS
(instrucción sql)
En donde:
instrucción SQL: Es una instrucción SELECT, que sigue el mismo formato y reglas que cualquier otra
instrucción SELECT. Debe ir entre paréntesis.
Se puede utilizar una subconsulta en lugar de una expresión en la lista de campos de una instrucción
SELECT o en una cláusula WHERE o HAVING. En una subconsulta, se utiliza una instrucción SELECT para
proporcionar un conjunto de uno o más valores especificados para evaluar en la expresión de la cláusula
WHERE o HAVING.
Se puede utilizar el predicado ANY o SOME, los cuales son sinónimos, para recuperar registros de la
consulta principal, que satisfagan la comparación con cualquier otro registro recuperado en la
subconsulta.
Una subconsulta tiene la misma sintaxis que una sentencia SELECT normal exceptuando que aparece
encerrada entre paréntesis.
SQl proporciona un mecanismo para las sub consultas anidadas. Una sub consulta es una expresión SQL
de la forma select-from-where que está dentro de otra consulta SQL. Un uso común de esta sub
consultas es posibilitar al SQL el poder decidir si una determinada salida se encuentra ó no en un
conjunto de valores generados por esta sub consulta, poder comparar una salida con un conjunto de
valores ó comparar la cardinalidad de dos conjuntos de datos.
En este caso con la cláusula conectiva in se comprueba la pertenencia a un conjunto donde este
conjunto es generado por la sub consulta, al contrario si se desea generar filas en que el resultado de
una condición no se encuentra en un conjunto generado por la sub consulta se utiliza la cláusula not in.
1
Introducción a SQL
Ejemplo: “Encontrar todos los clientes que tienen tanto un préstamo como una cuenta en el banco”
Este ejemplo, muestra que es posible escribir la misma consulta de diferentes formas en SQL. Esta
flexibilidad es de gran importancia puesto que permite al usuario pensar en una consulta del modo que
le parezca más natural. Asi mismo, se demuestra la partencia a un conjunto en una relación de un solo
atributo.
Ejemplo: “Listar los clientes que tienen tanto una cuenta como un préstamo en la sucursal
Subtiava”.
En este caso la consulta involucra directamente a dos relaciones ó tablas Impositor (clientes con
cuentas) y Prestatario (clientes con préstamos), es posible acceder al Nombre de la Sucursal desde
Prestatario y desde Impositor por medio de las relaciones Prestamo y Cuenta respectivamente.
♦ Conectiva not in
Ejemplo: “Encontrar todos los clientes que tienen un préstamo en el banco pero no tienen una cuenta”.
Ejemplo: “Seleccionar todos los nombres de los clientes que tienen un préstamo en el banco y cuyos
nombres no son ni “Pedro” ni “Héctor”.
♦ Solución: select distinct nombre_cliente from Prestatario where nombre_cliente not in (‘Pedro’,
‘Héctor’)
La comparación de conjuntos en SQL, se realiza utilizando una sub consulta dentro de un comando
select vinculadas las dos expresiones select por la cláusula some ó por la cláusula all.
Sea x un elemento del conjunto generado por la cláusula select principal sean {Y1, Y2,...Yn} el conjunto
generado por la subconsulta, sea comp una expresión de comparación;
2
Introducción a SQL
Entonces si existe Yi, i=1...n ∋ x comp Yi es verdadero para algún i entre 1 y n, la tupla donde se
encuentra el valor x en la relación generada por la cláusula select principal será parte de la consulta.
Ejemplo:
♦ Sea X = {5,18,10,24,33,1} el conjunto principal de comparación (el generado por el select principal)
♦ Sea Y= {13,2,1,8,5,4,9} el conjunto definido por la sub consulta, sea comp la expresión <=, entonces
X <= some Y es verdadero para los siguientes valores del conjunto X: 5,10,1 pues 5<13; 10 <13; 1<13, así
mismo no se incluye a 18 por ejemplo pues no existe un elemento en Y tal que 18 sea <= a ese
elemento.
Ejemplo en SQL: “Obtener los nombres de todas las sucursales que poseen un activo mayor que al
menos una sucursal situada en Granada”.
♦ Solución: select nombre_sucursal from Sucursal where activo >some (select activo from Sucursal
where ciudad_sucursal= ‘Granada’)
La sub consulta (select activo from Sucursal where ciudad_sucursal= ‘Granada’) genera el conjunto de
todos los valores de activo para todas las sucursales situadas en Granada. La comparación >some, en la
cláusula where de la cláusula select más externa, es verdadera si el valor del atributo activo de la tupla
es mayor que al menos un miembro del conjunto de todos los valores de activo de las sucursales de
Granada.
SQL permite realizar las comparaciones <some, <=some, >=some, =some y <>some. Se puede notar
que =some es equivalente a in, mientras que <=some no es lo mismo que not in.
Esta cláusula compara dos conjuntos definidos de forma similar que en el caso de la cláusula some con
la diferencia de que la tupla generada por la cláusula select principal será parte de la consulta de salida
si la comparación X comp yi; i = 1...n es verdadera ∀ yi, i = 1... n
Ejemplo:
♦ Sea x = {5,18,10,24,33,1} el conjunto generado por la cláusula select principal y sea
Y={13,2,1,8,5,4,9} el conjunto definido por la subconsulta; sea comp la expresión >=, encontrar los
elementos de x para los cuales x >=all Y es verdadero.
Estos son: 18, 24, 33 pues 18 es mayor que todos los elementos del conjunto Y, igual ocurre con 24 y 33
por el contrario la desigualdad no es válida para 5 pues 5 no es mayor que todos los elementos en Y.
Ejemplo en SQL: “Obtener los nombres de todas las sucursales que tienen un activo superior al de
todas las sucursales de Granada”.
♦ Solución: select nombre_sucursal from Sucursal where activo >all (select activo from Sucursal
where ciudad_sucursal= ‘Granada’)
Al igual que some, SQL también permite utilizar las comparaciones <all, <=all, >=all, =all y <>all.
3
Introducción a SQL
Para resolver esta consulta utilizará la siguiente estrategia: Se formula una consulta para encontrar
todos los saldos promedios y luego se anida ésta como subconsulta de una consulta que encuentre
aquellas sucursales para las que el saldo promedio es mayor o igual que todos los saldos promedios.
♦ Solución: select nombre_sucursal from Cuenta group by nombre_sucursal having avg (saldo) >= all
(select avg(saldo) from Cuenta group by nombre_sucursal)