universidad don bosco facultad de estudios tecnologicos escuela de

Anuncio
UNIVERSIDAD DON BOSCO
FACULTAD DE ESTUDIOS TECNOLOGICOS
ESCUELA DE COMPUTACION
CICLO 01-2012
GUIA DE LABORATORIO Nº 8
Nombre de la practica: Combinación de tablas
Lugar de ejecución: Laboratorio de Informática
Tiempo estimado: 3 horas
Materia: Base de datos I
I. Objetivos
Qué el estudiante:
• Utilice alias en los nombres de las tablas
•


Combine datos de varias tablas mediante combinaciones
Combinación de varios conjuntos de resultados en un único conjunto de resultado mediante el
operador UNION.
Muestre resultados de varias tablas utilizando subconsultas
II. Introducción Teórica
El uso de alias en los nombres de tablas mejora la legibilidad de las secuencias de comandos, facilita la
escritura de combinaciones complejas y simplifica el mantenimiento de Transact-SQL.
Al escribir secuencias de comandos, puede sustituir un nombre de tabla descriptivo largo y complejo por un
alias sencillo y abreviado. El alias se utiliza en lugar del nombre completo de la tabla.
Sintaxis parcial: SELECT * FROM servidor.baseDeDatos.esquema.tabla AS aliasTabla
Ejemplo 1
En este ejemplo se muestran los nombres de los clientes, el identificador del cliente y la cantidad vendida
de las tablas buyers y sales. Esta consulta no utiliza alias en las tablas de la sintaxis de JOIN.
USE joindb
SELECT buyer_name, sales.buyer_id, qty
FROM buyers
INNER JOIN sales
ON buyers.buyer_id = sales.buyer_id
GO
En este ejemplo se muestran los nombres de los clientes, el identificador del cliente y la cantidad vendida
de las tablas buyers y sales. Esta consulta utiliza alias en las tablas de la sintaxis de JOIN.
NOTA:
Algunas veces, la compleja sintaxis de JOIN y las subconsultas deben usar alias en los nombres de tablas.
Por ejemplo, al combinar una tabla consigo misma deben utilizarse alias.
1
• Combinación de datos de varias tablas
Una combinación es una operación que permite consultar dos o más tablas para producir un conjunto de
resultados que incorpore filas y columnas de cada una de las tablas. Las tablas se combinan en función de
las columnas que son comunes a ambas tablas.
Cuando se combinan tablas, Microsoft® SQL Server™ compara los valores de las columnas especificadas fila
por fila y, después, utiliza los resultados de la comparación para combinar los valores que cumplan los
criterios especificados en nuevas filas.
Hay tres tipos de combinaciones: combinaciones internas, combinaciones externas y combinaciones
cruzadas. Adicionalmente, en una instrucción SELECT se pueden combinar más de dos tablas mediante un
conjunto de combinaciones o se puede combinar una tabla consigo misma mediante una autocombinación.
JOIN
Es una operación que combina registros de dos tablas en una base de datos relacional que resulta en una
nueva tabla (temporal) llamada tabla de JOIN.
Las tablas se combinan para producir un único conjunto de resultados que incorpore filas y columnas de
dos o más tablas.
Sintaxis Parcial
SELECT columna [, columna …] FROM {<tablaOrigen >} [, ...n] <tipoCombinación > ::= [
INNER | { { LEFT | RIGHT | FULL } [OUTER] } ] [ <sugerenciaCombinación> ] JOIN
<tablaCombinada> ::= <tablaOrigen > <tipoCombinación > <tablaOrigen > ON
<condiciónBúsqueda> | <tablaOrigen > CROSS JOIN <tablaOrigen > | <tablaCombinada>

Selección de columnas específicas de varias tablas
Una combinación permite seleccionar columnas de varias tablas al expandir la cláusula FROM de la
instrucción SELECT. En la cláusula FROM se incluyen dos palabras clave adicionales: JOIN y ON.
La palabra clave JOIN especifica qué tablas se van a combinar y cómo.
2
La palabra clave ON especifica las columnas que las tablas tienen en común.
 Consultas de dos o más tablas para producir un conjunto de resultados
Una combinación permite consultar dos o más tablas para producir un único conjunto de resultados. Al
implementar combinaciones, tenga en cuenta los siguientes hechos e instrucciones:
1. Especifique la condición de combinación en función de claves principales y externas.
2. Si una tabla tiene una clave principal compuesta, cuando combine tablas debe hacer referencia a
toda la clave en la cláusula ON.
3. Para combinar tablas, utilice columnas comunes a las tablas especificadas. Dichas columnas deben
tener tipos de datos iguales o similares.
4. Haga referencia al nombre de la tabla si las columnas de las tablas que va a combinar tienen el
mismo nombre. Califique los nombres de las columnas con el formato tabla.columna.
5. Limite el número de tablas de las combinaciones porque cuantas más tablas combine, mayor será la
duración del proceso de la consulta.
6. Puede incluir varias combinaciones en una instrucción SELECT.

Uso de combinaciones internas
Las combinaciones internas combinan tablas mediante la comparación de los valores de las columnas que
son comunes a ambas tablas. SQL Server sólo devuelve las filas que cumplen las condiciones de la
combinación.
3
• Por qué se utilizan combinaciones internas
Utilice combinaciones internas para obtener información de dos tablas independientes y combinar dicha
información en un conjunto de resultados. Al utilizar combinaciones internas, tenga en cuenta los
siguientes hechos e instrucciones:
1. Las combinaciones internas son el tipo predeterminado de SQL Server. Puede abreviar la cláusula
INNER JOIN como JOIN.
2. Para especificar las columnas que desea presentar en el conjunto de resultados, incluya los
nombres calificados de las columnas en la lista de selección.
3. Incluya una cláusula WHERE para restringir las filas que se devuelven en el conjunto de resultados.
4. No utilice valores NULL como condición de combinación, ya que no se evalúan como iguales entre
sí.
Ejemplo 1
Supongamos que tenemos dos tablas: una de películas y otra de directores relacionadas entre sí:
Si quiero obtener todas las películas y el nombre de su director haría lo siguiente:
USE MOVIES
SELECT m.title, d.name
FROM movies m
INNER JOIN directors d ON m.director = d.id
Donde los campos a seleccionar son title que está en la tabla movies y name que está en la tabla directores,
como movies tiene el alias m, podemos anteponer ese alias a los campos que queramos seleccionar de la
tabla movies, esto se hace para no causar ambigüedad en caso que hallan 2 campos con nombres iguales
en cada tabla.
Ejemplo 2
Este ejemplo devuelve los valores buyer_name, buyer_id y qty de los clientes que han adquirido algún
producto. Los clientes que no hayan adquirido nada no se incluyen en el conjunto de resultados. Los
clientes que han adquirido más de un producto aparecen una vez por cada compra realizada.
Las columnas buyer_id de las dos tablas pueden especificarse en la lista de selección.
4
USE joindb
SELECT buyer_name, sales.buyer_id, qty
FROM buyers
INNER JOIN sales
ON buyers.buyer_id = sales.buyer_id
GO
RESULTADO
Ejemplo 3
En este ejemplo se devuelven los nombres de los productos y de las compañías que los suministran. Los
productos sin suministradores asignados y los suministradores sin productos asignados no se incluyen en el
conjunto de resultados.
USE northwind
SELECT productname, companyname
FROM products
INNER JOIN suppliers
ON products.supplierid = suppliers.supplierid
GO
RESULTADO
Ejemplo 4
En este ejemplo se devuelven los nombres de los clientes que han hecho pedidos después del 1/1/98.
Observe que se utiliza una cláusula WHERE para restringir las filas devueltas en el conjunto de resultados.
USE northwind
SELECT DISTINCT companyname, orderdate
FROM orders INNER JOIN customers
5
ON orders.customerid = customers.customerid
WHERE orderdate > '1/1/98'
GO
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:
Comparación: Es una expresión y un operador de comparación que compara la expresión con el resultado
de la subconsulta.
expresión : Es una expresión por la que se busca el conjunto resultante de la subconsulta.
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.
El ejemplo siguiente devuelve todos los productos cuyo precio unitario es mayor que el de cualquier
producto vendido con un descuento igual o mayor al 25 por ciento:
SELECT *FROM Productos
WHERE PrecioUnidad ANY (
SELECT PrecioUnidad FROM DetallePedido WHERE Descuento = 0 .25 )
El predicado ALL se utiliza para recuperar únicamente aquellos registros de la consulta principal que
satisfacen la comparación con todos los registros recuperados en la subconsulta. Si se cambia ANY por ALL
en el ejemplo anterior, la consulta devolverá únicamente aquellos productos cuyo precio unitario sea
mayor que el de todos los productos vendidos con un descuento igual o mayor al 25 por ciento. Esto es
mucho más restrictivo.
6
El predicado IN se emplea para recuperar únicamente aquellos registros de la consulta principal para los
que algunos registros de la subconsulta contienen un valor igual. El ejemplo siguiente devuelve todos los
productos vendidos con un descuento igual o mayor al 25 por ciento:
SELECT * FROM Productos WHERE IDProducto IN
(SELECT IDProducto FROM DetallePedido WHERE Descuento = 0.25 )
Inversamente se puede utilizar NOT IN para recuperar únicamente aquellos registros de la consulta
principal para los que no hay ningún registro de la subconsulta que contenga un valor igual.
El predicado EXISTS (con la palabra reservada NOT opcional) se utiliza en comparaciones de verdad/falso
para determinar si la subconsulta devuelve algún registro. Supongamos que deseamos recuperar todos
aquellos clientes que hayan realizado al menos un pedido:
SELECT Clientes.Compañía, Clientes.Teléfono
FROM Clientes WHERE EXISTS ( SELECT FROM Pedidos WHERE Pedidos.IdPedido = Clientes.IdCliente
)
Esta consulta es equivalente a esta otra:
SELECT Clientes.Compañía, Clientes.Teléfono
FROM Clientes WHERE IdClientes IN ( SELECT Pedidos.IdCliente FROM Pedidos )
III. Requerimientos
•
•
Microsoft SQL Server 2008 R2
Guía Número 8
IV. Procedimiento
Realice los siguientes ejercicios.
Ejercicio 1
USE NORTHWIND
GO
SELECT o.OrderDate, od.ProductID
FROM Orders o
INNER JOIN [Order Details] od
ON o.OrderID = od.OrderID
WHERE OrderDate = '1996/07/04'
Usando subconsultas
SELECT o.OrderDate, od.ProductID
FROM Orders o
INNER JOIN [Order Details] od
ON o.OrderID = od.OrderID
WHERE OrderDate = (SELECT MIN(OrderDate) FROM Orders)
7
Ejercicio 2
USE PUBS
go
SELECT s.stor_id, stor_name
FROM Stores s
INNER JOIN discounts d
on s.stor_id=d.stor_id
Usando subconsultas
SELECT stor_id, stor_name
FROM Stores
WHERE stor_id IN (SELECT stor_id FROM Discounts)
SELECT stor_id, stor_name
FROM Stores
WHERE EXISTS(SELECT stor_id FROM Discounts WHERE
stores.stor_id=discounts.stor_id)
Ejercicio 3
En este ejercicio, va a escribir y ejecutar consultas que combinan tablas en la base de datos library.
1. Abra una sesión del SQL Server Management Studio e ingrese su número de carné en el usuario y
password.
2. En la lista de BD, haga clic en library.
3. Utilice las tablas member y adult para realizar una consulta que devuelva los campos firstname,
middleinitial, lastname, street, city, state y zip.
Ejercicio 4
Concatene las columnas firstname, middleinitial y lastname en una cadena de texto y asigne a la columna el
alias name.
Ejecute la consulta para comprobar que devuelve los resultados deseados (ver figura 1).
8
Ejercicio 5
Para este ejercicio va utilizar las tablas title, item y copy, y va a generar una consulta que devuelva isbn,
copy_no, on_loan, title, translation y cover, y valores para las filas de la tabla copy cuyo ISBN sea 1 (uno),
500 (quinientos) o 1000 (mil). Ordene los resultados por la columna isbn. Para cada tabla debe utilizar un
alias.
1. Escriba la lista de selección de la consulta.
2. Escriba una cláusula FROM que cree una combinación interna entre las tablas title y copy sobre las
columnas title_no. En la cláusula FROM, establezca los alias de las tablas que haya utilizado en la
lista de selección.
3. Agregue una segunda cláusula INNER JOIN para crear la combinación entre las tablas item
4. y copy sobre las columnas isbn.
5. Componga una cláusula WHERE que restrinja las filas de la tabla copy obtenidas de aquéllas cuyo
ISBN sea 1 (uno), 500 (quinientos) o 1000 (mil).
6. Escriba la cláusula ORDER BY para ordenar el resultado por el ISBN.
7. Ejecute la secuencia de comandos (ver figura2).
Ejercicio 6
En la base de datos Library (biblioteca) se tienen las siguientes tablas
En la tabla member están los miembros que están afiliados a la biblioteca, en la tabla reservation están las
reservaciones de libros que han realizado los miembros de la biblioteca, la reserva se realiza por el
isbn(número de identificación de los libros), la tabla title esta los títulos de los libros el autor y la sinopsis y
la tabla ítem están las traducciones que se les ha realizado a los libros que están en la tabla title, cada libro
9
solo puede tener un isbn, por ende si hay un libro traducido en 4 lenguajes tiene isbn diferentes para cada
uno.
Se pide una consulta que muestra el nombre y apellido (firstname y el lastname) de los cliente que han
reservado libros, la consulta debe contener los siguientes campos: Firstname, lastname, log_date,title,
translation.
Uso de combinaciones externas
use northwind
go
Verificar datos
select lastname,employeeid from Employees order by employeeid
select employeeid from Orders order by employeeid
select LastName, Employees.employeeid,orderdate from Orders
inner join Employees
on orders.EmployeeID=Employees.EmployeeID
order by employeeid
Ingrese un nuevo empleado a la tabla Employees, para que vea los resultados de las siguientes
combinaciones
Uso del right join
select LastName, Employees.employeeid,orderdate from Orders
right join Employees
on orders.EmployeeID=Employees.EmployeeID
order by employeeid
Uso del left join
select LastName, Employees.employeeid,orderdate from Employees
left join orders
on orders.EmployeeID=Employees.EmployeeID
order by employeeid
Uso del full join
select LastName, Employees.employeeid,orderdate from Employees
full outer join orders
on orders.EmployeeID=Employees.EmployeeID
order by employeeid
Uso del cross join
10
select LastName, Employees.employeeid,orderdate from Employees
cross join orders
where orders.EmployeeID=Employees.EmployeeID
order by employeeid
V. Ejercicio complementario
Cree una nueva Base de datos con el nombre (“empresa”) y luego cree las siguientes tablas:
TRABAJADOR (ID_T, NOMBRE, TARIFA , OFICIO, ID_SUPV)
Cada fila representa un trabajador, identificado por su ID_T (pk). Su nombre es NOMBRE; su tarifa por hora,
en dólares; su oficio y el identificador de su supervisor.
EDIFICIO (ID_E, DIR, TIPO, NIVEL_CALIDAD, CATEGORIA)
Cada fila representa un edificio, que se identifica por su ID_E(pk). Se guarda su dirección, el tipo de edificio;
su nivel de calidad y su categoría.
ASIGNACION (ID_T, ID_E, FECHA_INICIO, NUM_DIAS)
Una fila por cada vez que un trabajador es asignado a un edificio.
Las sentencias de creación de las tablas son:
CREATE TABLE TRABAJADOR (
ID_T
INT
NOT NULL
NOMBRE
CHAR(20)
NOT NULL,
TARIFA
DECIMAL
NOT NULL,
OFICIO
CHAR(15)
NOT NULL
PRIMARY KEY,
)
ALTER TABLE TRABAJADOR
ADD ID_SUPV INT NULL REFERENCES TRABAJADOR
CREATE TABLE EDIFICIO(
ID_E
INT
NOT NULL
DIR
CHAR(15)
NOT NULL,
TIPO
CHAR(10)
NOT NULL,
NIVEL_CALIDAD
INT
NOT NULL,
CATEGORIA
INT
NOT NULL
PRIMARY KEY,
)
11
CREATE TABLE ASIGNACION(
ID_T
INT
NOT NULL
REFERENCES TRABAJADOR,
ID_E
INT
NOT NULL
REFERENCES
FECHA_INICIO
DATETIME
NOT NULL,
NUM_DIAS
INT,
EDIFICIO,
PRIMARY KEY (ID_T, ID_E, FECHA_INICIO)
)
Inserte los siguientes registros a cada una de las tablas.
TRABAJADOR
ID_T
NOMBRE
TARIFA
OFICIO
ID_SUP
1235
M. FARADAY
12.5
ELECTRICISTA
1311
1311
C. COULOMB
15.5
ELECTRICISTA
1311
1412
C. NEMO
13.75
FONTANERO
1520
1520
H. RICKOVER
11.75
FONTANERO
1520
2920
R. GARRET
10.0
ALBAÑIL
2920
3001
K. BARRISTER
8.2
CARPINTERO
3231
3231
P. MASON
17.4
CARPINTERO
3231
EDIFICIO
ID_E
DIR
TIPO
NIVEL_CALIDAD
CATEGORIA
111
1213 ASPEN
OFICINA
4
1
210
1011 BIRCH
OFICINA
3
1
312
123 ELM
OFICINA
2
2
435
456 MAPLE
COMERCIO
1
1
460
1415 BEACH
ALMACEN
3
3
515
789 OAK
RESIDENCIA
3
2
ASIGNACION
ID_T
ID_E
FECHA_INICIO
NUM_DIAS
1235
312
2001-10-10
5
1235
515
2001-10-17
22
1311
435
2001-10-08
12
1311
460
2001-10-23
24
1412
111
2001-12-01
4
1412
210
2001-11-15
12
12
1412
312
2001-10-01
10
1412
435
2001-10-15
15
1412
460
2001-10-08
18
1412
515
2001-11-05
8
1520
312
2001-10-30
17
1520
515
2001-10-09
14
2920
210
2001-11-10
15
2920
435
2001-10-28
10
2920
460
2001-10-05
18
3001
111
2001-10-08
14
3001
210
2001-10-27
14
3231
111
2001-10-10
8
3231
312
2001-10-24
20
Después de ingresar los registros proceda a realizar las siguientes consultas (querys)
1. Nombre de los trabajadores cuya tarifa este entre 10 y 12 dólares.
2. ¿Cuáles son los oficios de los trabajadores asignados al edificio 435?
3. Mostrar el nombre de los trabajadores y el de su supervisor.
4. Nombre de los trabajadores asignados a oficinas.
5. ¿Qué trabajadores reciben una tarifa por hora mayor que la de su supervisor?
VI. Investigación complementaria
•
•
Investigue sobre INTERSECT, EXCEPT y UNION, deberá realizar ejemplos, para ello deben utilizar la
base de datos northwind.
Investigue las instrucciones SOME, ALL , NOT IN, NOT EXISTS, haciendo uso de las subconsultas,
para ello deben utilizar la base de datos northwind.
VII. Referencia Bibliográfica
Microsoft SQL Server 2008, Guía Práctica, Francisco Charte Ojeda; Anaya Multimedia.
13
Descargar