You are on page 1of 12

Trabajo con

subconsultas

Introduccin

Introduccin a las subconsultas

Uso de una subconsulta como una tabla derivada

Uso de una subconsulta como una expresin

Uso de una subconsulta para correlacionar datos

Uso de las clusulas EXISTS y NOT EXISTS

Introduccin a las subconsultas

Por qu utilizar subconsultas

Para dividir una consulta compleja en varios pasos


lgicos

Para responder una consulta que depende de los


resultados de otra consulta

Por qu utilizar combinaciones en lugar de


subconsultas

SQL Server ejecuta combinaciones ms rpidas que la


subconsultas

Cmo utilizar subconsultas

Uso de una subconsulta como una tabla derivada

Es un conjunto de registros dentro de una consulta que


funciona como una tabla

Ocupa el lugar de la tabla en la clusula FROM

Se optimiza con el resto de la consulta

USE
USE northwind
northwind
SELECT
SELECT T.orderid,
T.orderid, T.customerid
T.customerid
FROM
FROM (( SELECT
SELECT orderid,
orderid, customerid
customerid
FROM
FROM orders
orders )) AS
AS TT
GO
GO

Uso de una subconsulta como una expresin

Se evala y trata como una expresin

Se ejecuta una vez para la instruccin entera

USE
USE pubs
pubs
SELECT
SELECT title,
title, price
price
,(
,( SELECT
SELECT AVG(price)
AVG(price) FROM
FROM titles)
titles) AS
AS average
average
,price-(SELECT
,price-(SELECT AVG(price)
AVG(price) FROM
FROM titles)
titles) AS
AS difference
difference
FROM
FROM titles
titles
WHERE
WHERE type='popular_comp'
type='popular_comp'
GO
GO

Uso de una subconsulta para correlacionar datos

Evaluacin de una subconsulta correlacionada

Simulacin de una clusula JOIN

Simulacin de una clusula HAVING

Evaluacin de una subconsulta correlacionada


La
Laconsulta
consultaexterna
externapasa
pasaun
un
valor
valorde
decolumna
columnaaalala
consulta
consultainterna
interna

La
Laconsulta
consultainterna
internautiliza
utilizalos
los
valores
valoresque
quepasa
pasalalaconsulta
consulta
externa
externa

USE
USE northwind
northwind
SELECT
SELECT orderid,
orderid, customerid
customerid
FROM
FROM orders
orders AS
AS or1
or1
WHERE
WHERE 20
20 << (SELECT
(SELECT quantity
quantity
FROM
FROM [order
[order details]
details] AS
AS od
od
WHERE
WHERE or1.orderid
or1.orderid == od.orderid
od.orderid
AND
AND od.productid
od.productid == 23)
23)
GO
GO

La
Laconsulta
consultainterna
internadevuelve
devuelve
un
unvalor
valoraala
laconsulta
consultaexterna
externa

Ejemplo
Ejemplo 11

Este
Esteproceso
procesose
serepite
repitepara
paralala
fila
filasiguiente
siguientede
delalaconsulta
consulta
externa
externa

Volver
Volveral
alpaso
paso11

Simulacin de una clusula JOIN

Las subconsultas correlacionadas pueden producir el


mismo resultado que una clusula JOIN

Las combinaciones permiten al optimizador de


consultas determinar la manera de correlacionar los
datos de la forma ms eficiente

USE
USE pubs
pubs
SELECT
SELECT DISTINCT
DISTINCT t1.type
t1.type
FROM
FROM titles
titles AS
AS t1
t1
WHERE
WHERE t1.type
t1.type IN
IN
(SELECT
(SELECT t2.type
t2.type
FROM
FROM titles
titles AS
AS t2
t2
WHERE
WHERE t1.pub_id
t1.pub_id <>
<> t2.pub_id)
t2.pub_id)
GO
GO

Ejemplo
Ejemplo 11

Simulacin de una clusula HAVING

Subconsulta con el mismo resultado que una clusula


HAVING

USE
USE pubs
pubs
SELECT
SELECT t1.type,
t1.type,
FROM
FROM titles
titles AS
AS
WHERE
WHERE t1.price
t1.price
GO
GO

Ejemplo
Ejemplo 11

t1.title,
t1.title, t1.price
t1.price
t1
t1
>> (( SELECT
SELECT AVG(t2.price)
AVG(t2.price) FROM
FROM titles
titles AS
AS t2
t2
WHERE
WHERE t1.type
t1.type == t2.type
t2.type ))

Uso de una clusula HAVING sin una subconsulta

USE
USE pubs
pubs
SELECT
SELECT t1.type,
t1.type, t1.title,
t1.title, t1.price
t1.price
FROM
FROM titles
titles AS
AS t1
t1
INNER
INNER JOIN
JOIN titles
titles AS
AS t2
t2 ON
ON t1.type
t1.type == t2.type
t2.type
GROUP
GROUP BY
BY t1.type,
t1.type, t1.title,
t1.title, t1.price
t1.price
HAVING
HAVING t1.price
t1.price >> AVG(t2.price)
AVG(t2.price)
GO
GO

Ejemplo
Ejemplo 22

Uso de una subconsulta correlacionada en una


clusula HAVING

Uso de una subconsulta correlacionada en una clusula


HAVING de una consulta externa

USE
USE pubs
pubs
SELECT
SELECT t1.type
t1.type
FROM
FROM titles
titles t1
t1
GROUP
GROUP BY
BY t1.type
t1.type
HAVING
HAVING MAX(t1.advance)
MAX(t1.advance) >=
>= ALL
ALL
(SELECT
(SELECT 22 ** AVG(t2.advance)
AVG(t2.advance)
FROM
FROM titles
titles t2
t2
WHERE
WHERE t1.type
t1.type == t2.type)
t2.type)

Uso de las clusulas EXISTS y NOT EXISTS

Uso con subconsultas correlacionadas

Determinar si hay datos en una lista de valores

Proceso de SQL Server

La consulta externa prueba la existencia de las filas

La consulta interna devuelve TRUE o FALSE

No se produce ningn dato

Ejemplo
Ejemplo 11
USE
USE northwind
northwind
SELECT
SELECT lastname,
lastname, employeeid
employeeid
FROM
FROM employees
employees AS
AS ee
WHERE
WHERE EXISTS
EXISTS (SELECT
(SELECT ** FROM
FROM orders
orders AS
AS oo
WHERE
WHERE e.employeeid
e.employeeid == o.employeeid
o.employeeid
AND
AND o.orderdate
o.orderdate == 5/9/1997')
5/9/1997')
GO
GO

Recomendaciones

Utilice
Utilice subconsultas
subconsultas para
para dividir
dividir una
una consulta
consulta compleja
compleja
Utilice
Utilice alias
alias de
de nombres
nombres de
de tablas
tablas en
en las
las subconsultas
subconsultas
correlacionadas
correlacionadas
Utilice
Utilice la
la instruccin
instruccin INSERTSELECT
INSERTSELECT para
para agregar
agregar filas
filas de
de
otros
otros orgenes
orgenes aa una
una tabla
tabla existente
existente

You might also like