Sie sind auf Seite 1von 9

1

CONSULTAS SQL
CONSULTAS CRUZADAS
La consulta cruzada hace referencia a dos o ms tablas relacionadas cuyos registros se
extraen de la comparacin, generalmente de claves forneas y primarias.
Por ejemplo:
A.

En la base PUBS, mostrar los ttulos de los libros con el nombre de la editorial
que los ha publicado. Se considera la relacin entre la table titles y la tabla
publishers.
Use pubs
Go
select pub_id, pub_name from publishers
select title, pub_id from titles
select title, pub_name from
titles t, publishers p
where t.pub_id = p.pub_id

B. Mostrar el nombre de la tienda y la suma de libros vendida. Considere las


tablas stores y sales.
select * from stores
select * from sales
-- Mostrar el nombre de la tienda y

la suma de libros vendida

select stor_name, sum(qty) as 'libros vendidos'


from sales sa, stores st
where sa.stor_id = st.stor_id
group by stor_name

C. Muestre la lista de autores con los libros que han escrito. Considere la relacin
entre las tablas: titles, titleauthor y authors
select * from titles
select * from titleauthor
select * from authors
select au_lname, au_fname, title
from titleauthor ta, authors a, titles t
where ta.au_id = a.au_id and ta.title_id = t.title_id
order by au_lname, au_fname
BASES DE DATOS

Ing. Rosa Navarrete

JOIN
Las condiciones JOIN se pueden especificar en las clusulas FROM o WHERE, aunque se
recomienda que se especifiquen en la clusula FROM. Las clusulas WHERE y HAVING
pueden contener tambin condiciones de bsqueda para filtrar an ms las filas
seleccionadas por las condiciones del JOIN.
Los JOIN pueden ser:

Internos (la operacin de combinacin tpica, que usa algunos operadores de


comparacin como = o <>). En este tipo se incluyen las combinacin
equivalente y las combinaciones naturales.
Los JOIN internos usan un operador de comparacin para hacer coincidir las
filas de dos tablas segn los valores de las columnas comunes de cada tabla.

Externos.- Pueden ser un JOIN externo izquierdo, derecho o completo.


Los JOIN externos se especifican en la clusula FROM con uno de los siguientes
conjuntos de palabras clave:

LEFT JOIN o LEFT OUTER JOIN.


El conjunto de resultados de un JOIN externo izquierdo incluye todas las
filas de la tabla de la izquierda especificada en la clusula LEFT OUTER,
y no slo aquellas en las que coincidan las columnas combinadas.
Cuando una fila de la tabla de la izquierda no tiene filas coincidentes en
la tabla de la derecha, la fila asociada del conjunto de resultados
contiene valores NULL en todas las columnas de la lista de seleccin que
procedan de la tabla de la derecha.

RIGHT JOIN o RIGHT OUTER JOIN.


Un JOIN externo derecho es el inverso de un JOIN externo izquierdo. Se
devuelven todas las filas de la tabla de la derecha. Cada vez que una
fila de la tabla de la derecha no tenga correspondencia en la tabla de la
izquierda, se devuelven valores NULL para la tabla de la izquierda.

FULL JOIN o FULL OUTER JOIN.


Un JOIN externo completo devuelve todas las filas de las tablas de la
izquierda y la derecha. Cada vez que una fila no tenga coincidencia en
la otra tabla, las columnas de la lista de seleccin de la otra tabla
contendrn valores NULL. Cuando haya una coincidencia entre las
tablas, la fila completa del conjunto de resultados contendr los valores
de datos de las tablas base.

Join cruzados
Los join cruzados devuelven todas las filas de la tabla izquierda y cada fila de
la tabla izquierda se combina con todas las filas de la tabla de la derecha. Son
los productos cartesianos.

BASES DE DATOS

Ing. Rosa Navarrete

JOIN INTERNO
Lo ms usual es que el join interno se compare con el operador igual (=) para cruzar
los registros de dos o ms tablas.
Resolviendo con join interno las consultas cruzadas iniciales:
A. En la base PUBS, mostrar los ttulos de los libros con el nombre de la editorial
que los ha publicado. Se considera la relacin entre la table titles y la tabla
publishers.
Use pubs
Go
select pub_id, pub_name from publishers
select title, pub_id from titles
select title, pub_name
from titles t join publishers p
on (t.pub_id = p.pub_id)

B. Mostrar el nombre de la tienda y la suma de libros vendida. Considere las


tablas stores y sales.
select * from stores
select * from sales
-- Mostrar el nombre de la tienda y

la suma de libros vendida

select stor_name, sum(qty) as 'libros vendidos'


from sales sa join stores st
on (sa.stor_id = st.stor_id)
group by stor_name

C. Muestre la lista de autores con los libros que han escrito. Considere la relacin
entre las tablas: titles, titleauthor y authors
select au_lname, au_fname, title
from titleauthor ta join authors a
on (ta.au_id = a.au_id)
join titles t
on (ta.title_id = t.title_id)
order by au_lname, au_fname

D. En este JOIN interno recupera los autores que viven en la misma ciudad y
estado que un editor:
USE pubs
BASES DE DATOS

Ing. Rosa Navarrete

1
SELECT a.au_fname, a.au_lname, p.pub_name
FROM authors AS a INNER JOIN publishers AS p
ON a.city = p.city
AND a.state = p.state
ORDER BY a.au_lname ASC, a.au_fname ASC

Las tablas o vistas de la clusula FROM se pueden especificar en cualquier orden en las
combinaciones internas o externas completas; sin embargo, el orden de las tablas o
vistas especificado s es importante si utiliza un JOIN externo izquierda o derecha.
Utilizar combinaciones internas
Una combinacin interna es aquella en la que los valores de las columnas que se estn
combinando se comparan mediante un operador de comparacin.
Esta consulta de Transact-SQL es un ejemplo de una combinacin interna.
USE PUBS
SELECT *
FROM authors AS a INNER JOIN publishers AS p
ON a.city = p.city
ORDER BY a.au_lname DESC

Esta combinacin interna se conoce como una combinacin equivalente. Devuelve


todas las columnas de ambas tablas y slo devuelve las filas en las que haya un valor
igual en la columna de la combinacin.
En el conjunto de resultados, la columna city aparece dos veces. Puesto que no tiene
sentido repetir la misma informacin, una de estas dos columnas idnticas puede ser
eliminada si se cambia la lista de seleccin. El resultado se llama combinacin natural.
La consulta anterior de Transact-SQL se puede volver a formular para que forme una
combinacin natural de la siguiente forma:
USE pubs
SELECT p.pub_id, p.pub_name, p.state, a.*
FROM publishers p INNER JOIN authors a
ON p.city = a.city
ORDER BY a.au_lname ASC, a.au_fname ASC

En este ejemplo, publishers.city no aparece en los resultados.


Combinaciones con el operador no igual
En el siguiente ejemplo de Transact-SQL se usa una combinacin no igual que se
combina con una autocombinacin para buscar todas las filas de la tabla titleauthor
en la que dos o ms filas tengan la misma title_id pero distintos nmeros de au_id (es
decir, libros con ms de un autor).
USE pubs
select * from titleauthor
USE pubs
SELECT DISTINCT t1.au_id, t1.title_id
BASES DE DATOS

Ing. Rosa Navarrete

1
FROM titleauthor t1 INNER JOIN titleauthor t2
ON t1.title_id = t2.title_id
WHERE t1.au_id <> t2.au_id
ORDER BY t1.au_id

JOIN EXTERNO
Las combinaciones internas slo devuelven filas cuando hay una fila de ambas tablas,
como mnimo, que coincide con la condicin de la combinacin. Las combinaciones
internas eliminan las filas que no coinciden con alguna fila de la otra tabla. Sin
embargo, las combinaciones externas devuelven todas las filas de una de las tablas o
vistas mencionadas en la clusula FROM, como mnimo, siempre que tales filas
cumplan con alguna de las condiciones de bsqueda de WHERE o HAVING. Todas las
filas se recuperarn de la tabla izquierda a la que se haya hecho referencia con una
combinacin externa izquierda, y de la tabla derecha a la que se haya hecho
referencia con una combinacin externa derecha. En una combinacin externa
completa, se devuelven todas las filas de ambas tablas.
SQL Server usa las siguientes palabras clave de para las combinaciones externas
especificadas en una clusula FROM:

LEFT OUTER JOIN o LEFT JOIN


RIGHT OUTER JOIN o RIGHT JOIN
FULL OUTER JOIN o FULL JOIN

Utilizar combinaciones exteriores izquierdas


Imagine una combinacin de la tabla authors y de la tabla publishers en sus columnas
city. Los resultados slo muestran los autores que viven en ciudades donde haya algn
editor (en este caso, Abraham Bennet y Cheryl Carson).
Para incluir todos los autores en el resultado, con independencia de que un editor se
encuentre o no en la misma ciudad, use una combinacin exterior izquierda de SQL-92.
A continuacin se muestra la consulta y los resultados de la combinacin externa
izquierda de Transact-SQL:
USE pubs
SELECT a.au_fname, a.au_lname, p.pub_name
FROM authors a LEFT OUTER JOIN publishers p
ON a.city = p.city
ORDER BY p.pub_name ASC, a.au_lname ASC, a.au_fname ASC

LEFT OUTER JOIN incluye en el resultado todas las filas de la tabla authors, tanto si
hay una coincidencia en la columna city de la tabla publishers como si no la hay.
Observe que, en los resultados, no hay datos coincidentes con la mayor parte de los
autores enumerados, con lo que estas filas contienen valores NULL en la columna
pub_name.
Utilizar combinaciones exteriores derechas
Imagine una combinacin de la tabla authors y de la tabla publishers en sus columnas
city. Los resultados slo muestran los autores que viven en ciudades donde haya algn
BASES DE DATOS

Ing. Rosa Navarrete

editor (en este caso, Abraham Bennet y Cheryl Carson). El operador de combinacin
exterior derecha de SQL-92, RIGHT OUTER JOIN, indica que todas las filas de la
segunda tabla se deben incluir en los resultados, con independencia de si hay datos
coincidentes en la primera tabla.
Para incluir todos los editores en los resultados, sin tener en cuenta si hay un editor en
la ciudad, use una combinacin externa derecha de SQL-92. A continuacin se muestra
la consulta de Transact-SQL y los resultados de la combinacin externa derecha:
USE pubs
SELECT a.au_fname, a.au_lname, p.pub_name
FROM authors AS a RIGHT OUTER JOIN publishers AS p
ON a.city = p.city
ORDER BY p.pub_name ASC, a.au_lname ASC, a.au_fname ASC

Una combinacin externa se puede restringir an ms si se utiliza un predicado (como


comparar la combinacin con una constante). En este ejemplo se muestra la misma
combinacin externa derecha, pero se eliminan todos los ttulos de los que se han
vendido menos de 50 copias:
USE pubs
SELECT s.stor_id, s.qty, t.title
FROM sales s RIGHT OUTER JOIN titles t
ON s.title_id = t.title_id
AND s.qty > 50
ORDER BY s.stor_id ASC

Utilizar combinaciones externas completas


Para retener la informacin que no coincida al incluir las filas no coincidentes en los
resultados de una combinacin, utilice una combinacin externa completa. SQL Server
proporciona el operador de combinacin externa completa, FULL OUTER JOIN, que
incluye todas las filas de ambas tablas, con independencia de que la otra tabla tenga
un valor coincidente o no.
Imagine una combinacin de la tabla authors y de la tabla publishers en sus columnas
city. Los resultados slo muestran los autores que viven en ciudades donde hay algn
editor (en este caso, Abraham Bennet y Cheryl Carson). El operador de combinacin
externa completa de SQL-92, FULL OUTER JOIN, indica que todas las filas de ambas
tablas se van a incluir en los resultados, con independencia de que haya datos
coincidentes en las tablas.
Para incluir todos los editores y todos los autores en el resultado, sin tener en cuenta
si una ciudad tiene un editor que se encuentra en la misma ciudad, o si un editor se
encuentra en la misma ciudad, use una combinacin externa completa. A continuacin
se muestran la consulta y los resultados de la combinacin externa completa de
Transact-SQL:
USE pubs
SELECT a.au_fname, a.au_lname, p.pub_name
FROM authors a FULL OUTER JOIN publishers p
ON a.city = p.city
BASES DE DATOS

Ing. Rosa Navarrete

1
ORDER BY p.pub_name ASC, a.au_lname ASC, a.au_fname ASC

JOIN CRUZADOS
Una combinacin cruzada que no tenga una clusula WHERE produce el producto
cartesiano de las tablas involucradas en la combinacin.
Sin embargo, si se agrega una clusula WHERE, la combinacin cruzada se comporta
como una combinacin interna. Por ejemplo, las siguientes consultas de Transact-SQL
producen el mismo conjunto de resultados:
USE pubs
SELECT au_fname, au_lname, pub_name
FROM authors CROSS JOIN publishers
WHERE authors.city = publishers.city
ORDER BY au_lname DESC

-- O
USE pubs
SELECT au_fname, au_lname, a.city as "authors.city",p.city as
"publishers.city", pub_name
FROM authors as a CROSS JOIN publishers as p
WHERE a.city = p.city
ORDER BY au_lname DESC

Utilizar autocombinaciones
Una tabla se puede combinar consigo misma en una autocombinacin. Por ejemplo,
puede usar una autocombinacin para averiguar qu autores de Oakland, California,
viven en la misma rea de cdigo postal.
Puesto que esta consulta conlleva una combinacin de la tabla authors consigo misma,
la tabla authors aparece en dos funciones. Para distinguir estas funciones, debe dar a
la tabla authors dos alias distintos (au1 y au2) en la clusula FROM. Estos alias se usan
para calificar los nombres de columna del resto de la consulta.
USE pubs
SELECT au1.au_fname, au1.au_lname, au2.au_fname, au2.au_lname
FROM authors au1 INNER JOIN authors au2
ON au1.zip = au2.zip
WHERE au1.city = 'Oakland'
ORDER BY au1.au_fname ASC, au1.au_lname ASC

Para eliminar las filas del conjunto de resultados en las que los autores coinciden
consigo mismos y eliminar las filas que son idnticas, salvo en que el orden de los
autores est invertido, realice este cambio a la consulta de autocombinacin de
Transact-SQL:
USE pubs
SELECT au1.au_fname, au1.au_lname, au2.au_fname, au2.au_lname
FROM authors au1 INNER JOIN authors au2
ON au1.zip = au2.zip
BASES DE DATOS

Ing. Rosa Navarrete

1
WHERE au1.city = 'Oakland'
AND au1.state = 'CA'
AND au1.au_id < au2.au_id
ORDER BY au1.au_lname ASC, au1.au_fname ASC

Combinar tres tablas o ms


Si bien cada especificacin de combinacin slo combina dos tablas, las clusulas
FROM pueden contener mltiples especificaciones de combinaciones. Esto permite que
se combinen muchas tablas en una consulta nica.
La tabla titleauthor de la base de datos pubs ofrece un buen ejemplo de una situacin
en la que resulta til combinar ms de dos tablas. En la consulta siguiente de TransactSQL se buscan los ttulos de todos los libros de un tipo particular y los nombres de sus
autores.
USE pubs
SELECT a.au_lname, a.au_fname, t.title
FROM authors a INNER JOIN titleauthor ta
ON a.au_id = ta.au_id JOIN titles t
ON ta.title_id = t.title_id
WHERE t.type = 'trad_cook'
ORDER BY t.title ASC

o su equivalente,
SELECT a.au_lname, a.au_fname, t.title
FROM authors a, titleauthor ta, titles t
where a.au_id = ta.au_id and ta.title_id = t.title_id and t.type =
'trad_cook'
order by t.title ASC
Otros ejemplos
Utilizar SELECT con encabezados de columna y clculos

En los siguientes ejemplos se devuelven todas las filas de la tabla Product. En el primer
ejemplo se devuelven las ventas totales y los descuentos de cada producto. En el segundo
ejemplo se calculan los beneficios totales de cada producto.
USE AdventureWorks ;
GO
select productID,Name from production.product
select productID, OrderQty, UnitPrice, UnitPriceDiscount from
sales.salesorderdetail
SELECT p.Name AS 'Nombre del Producto',
'ventas sin descuento' = (OrderQty * UnitPrice),
'descuentos' = ((OrderQty * UnitPrice) * UnitPriceDiscount)
FROM Production.Product p
INNER JOIN Sales.SalesOrderDetail sod
BASES DE DATOS

Ing. Rosa Navarrete

1
ON p.ProductID = sod.ProductID
ORDER BY p.name DESC ;
GO

sta es la consulta que calcula el beneficio de cada producto de cada pedido de venta.
USE AdventureWorks ;
GO
SELECT 'Total income is', ((OrderQty * UnitPrice) * (1.0 UnitPriceDiscount)), ' for ',
p.Name AS ProductName
FROM Production.Product p
INNER JOIN Sales.SalesOrderDetail sod
ON p.ProductID = sod.ProductID
ORDER BY ProductName ASC ;
GO

BASES DE DATOS

Ing. Rosa Navarrete

Das könnte Ihnen auch gefallen