Está en la página 1de 4

Instituto Técnico Superior Comunitario

(ITSC)

Nombre:
Rosaly Dorali

Apellido:
Muñoz Rodríguez

Matrícula:
2020-0563

Carrera:
Soporte Informático

Materia:
Fundamentos de Base de Datos 105

Sección:
01

Maestro:
Luis Bessewell Féliz

Tema:
Lenguaje SQL (Parte 4)

Fecha:
Viernes 20 Nov. 2020
Fundamentos de Bases de Datos
Tema Lenguaje SQL

6.9 Consultas Anidadas Complejas en SQL


Las consultas complejas son a menudo difíciles o imposibles de escribir como un único bloque SQL o una
unión, intersección o diferencia de bloques SQL (un bloque SQL consiste en una única instrucción select from
where, posiblemente con cláusulas group by y having). Aquí se estudian dos formas de componer varios
bloques SQL para expresar una consulta compleja: las relaciones derivadas y la cláusula with.

Relaciones derivadas
SQL permite el uso de una expresión de subconsulta en la cláusula from. Si se usa una expresión de este tipo
se debe dar un nombre a la relación resultado y se pueden renombrar los atributos usando la cláusula as.

Ejemplo
Considérese la subconsulta:

(select nombre-sucursal, avg (saldo)


from cuenta
group by nombre-sucursal)
as media-sucursal (nombre-sucursal, saldo-medio)

Esta subconsulta produce una relación consistente en los nombres de todas las sucursales y sus
correspondientes saldos de cuenta medios. El resultado de la subconsulta recibe el nombre de media-sucursal
y contiene los atributos nombre-sucursal y saldo-medio.

Para ilustrar el uso de una expresión de subconsulta en la cláusula from considérese la consulta “Obtener el
saldo medio de las cuentas de aquellas sucursales donde dicho saldo medio sea superior a $1.200”. Se
formulaba esta consulta utilizando la cláusula having. Ahora se puede reescribir dicha consulta sin usar esta
cláusula de la siguiente forma:

select nombre-sucursal, saldo-medio


from (select nombre-sucursal, avg (saldo)
from cuenta
group by nombre-sucursal)
as resultado (nombre-sucursal, saldo-medio)
where saldo-medio > 1200

En esta formulación no es necesario el uso de la cláusula having puesto que la relación temporal resultado se
calcula en la cláusula from, y los atributos de resultado se pueden usar directamente en la cláusula where.

Supóngase como otro ejemplo que se desea hallar el máximo del total de saldos de todas las sucursales. La
cláusula having no sirve en este caso, pero se puede escribir fácilmente esta consulta usando una subconsulta
en la cláusula from, como se muestra a continuación:

select max(saldo-total)
from (select nombre-sucursal, sum(saldo)
from cuenta
group by nombre-sucursal)
as total-sucursal(nombre-sucursal, saldo-total)
La cláusula with
Las consultas complicadas son mucho más fáciles de formular y de entender si se descomponen en vistas más
simples y después se combinan, al igual que se estructuran los programas, descomponiendo sus tareas en
procedimientos. Sin embargo, son distintas a la definición de procedimientos en cuanto a que una cláusula
create view crea una definición de vista en la base de datos y esa definición de vista permanece en la base de
datos hasta que se ejecuta una orden drop view nombre-vista.

La cláusula with proporciona una forma de definir una vista temporal cuya definición está disponible sólo
para la consulta en la que aparece esta cláusula. Considérese la siguiente consulta, que selecciona cuentas con
el saldo máximo; si hay muchas cuentas con el mismo saldo máximo, todas ellas se seleccionan.

with saldo-máximo(valor) as
select max (saldo)
from cuenta
select número-cuenta
from cuenta, saldo-máximo
where cuenta.saldo = saldo-máximo.valor

La cláusula with introducida en SQL:1999 se incluye actualmente sólo en algunas bases de datos.

Se podría haber escrito la consulta anterior usando una subconsulta anidada tanto en la cláusula from como
en la where. Sin embargo, el uso de subconsultas anidadas hace que la consulta sea más difícil de leer y
entender. La cláusula with hace que la lógica de la consulta sea más clara; también permite usar una definición
de vista en varios lugares de una consulta.

Ejemplo

Supóngase que se desea encontrar todas las sucursales donde el depósito de cuentas es mayor que la media
del total de depósitos de cuentas en todas las sucursales. Se puede escribir la consulta con la cláusula with
como se muestra a continuación.

with total-sucursal(nombre-sucursal,valor) as
select nombre-sucursal, sum(saldo)
from cuenta
group by nombre-sucursal
with total-media-sucursal(valor) as
select avg(sa valor ldo)
from total-sucursal
select nombre-sucursal
from total-sucursal, total-media-sucursal
where total-sucursal.valor > = total-mediasucursal.valor

Por supuesto, se puede crear una consulta equivalente sin la cláusula with, pero sería más complicada y difícil
de entender. Como ejercicio, se puede escribir la consulta equivalente.
Bibliografía:
file:///C:/Users/Sane/Pictures/Bases%20de%20Datos/Libro%20Fundamentos%20de%20Bas
es%20de%20Datos.pdf

También podría gustarte