Beruflich Dokumente
Kultur Dokumente
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
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
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:
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
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)
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
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
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 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
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
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
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
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
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