Está en la página 1de 4

ISQL Session 3 (ClasesInf4) : parte5.

sql

//* ----------------------------------------------------------------------------------
//* Universidad Católica Nuestra Señora de la Asunción
//* Facultad de Ciencias y Tecnología
//* Departamento de Análisis de Sistemas
//* Cátedra de Informática 4
//* Prof: Ing. César Albospino
//* Guía para Clases - Parte 5
//* ----------------------------------------------------------------------------------
//*
//* INTRODUCCIÓN AL LENGUAJE SQL
//*
//* Recuperación de información (SELECT)
//*
//* Estructura Básica del SELECT
//*
/*
Select <lista de atributos>
from <tablas>
where <condiciones>
group by <lista de atributos>
having <condiciones>
order by <lista de atributos>
\

donde la barra inclinada de izquierda a derecha "\" actua


como terminador de la instrucción (caracter que marca el fin de la instrucción).
Puede utilizarse cualquier caracter especial como terminador de instrucción,
como ser; ';' o '?' o '!', etc. Se debe tener cuidado de no elegir caracteres
que sean comunes en las partes de las instrucciones SQL.

Al al conjunto de valores resultantes de un "Select" lo denominamos "conjunto resultado" (CR).

*/
//*
//*--------------------------------------------------------------------------------*
//* Ejercicio 15: Reunión Tablas (JOIN)
//
//* 15.1.a:
// Producto cartesiano de las tablas de "productos" y "depositos", tomando
// todas las columnas de ambas. La tabla "depositos" tiene 3 filas y
// "productos" tiene 9. El CR tiene 3 x 9 = 27 filas.
//
select *
from productos, depositos\
//
//* 15.1.b:
// Idem anterior, pero indicando las columnas a ser mostradas y ordenandolas
// por deposito y producto
//
select productos.producto,
productos.nombre,
depositos.deposito,
depositos.nombre
from productos, depositos
order by productos.producto, depositos.deposito\
//
//* 15.1.c:
// Idem anterior, pero utilizando un alias para cada tabla
//
select p.producto,
p.nombre,
d.deposito,
d.nombre
from productos p, depositos d
order by p.producto, d.deposito\
//
//* 15.1.d:
// Idem anterior, pero utilizando "CROSS JOIN"
// (genera un CR igual al caso 15.3 - equivale a la coma ",")
//
select p.producto,
p.nombre,
d.deposito,
d.nombre
from productos p cross join depositos d
order by p.producto, d.deposito\
//
// Obs: el producto cartesiano de dos tablas debe ser utilizado con mucho cuidado,
// pues puede generar una cantidad enorme de filas, lo cual podría "enlentecer"
// significativamente el funcionamiento general de un computador. Por ejemplo,
// si realizamos el join de dos tablas "pequeñas" de 10.000 y 1.000 filas cada una,
// el CR tendrá: 10.000 x 1.000 = 10.000.000 (diez millones de filas).
// La regla es: nunca usar un producto cartesiano, salvo alguna situación excepcional.
//
//
//* 15.1.e: reunión de tablas con un criterio (where) para filtrar filas.
// Solo muestra todos los productos que pertenecen al deposito uno (1).
//
select p.producto,
p.nombre,
d.deposito,
d.nombre
from productos p, depositos d
where d.deposito = 1
order by p.producto, d.deposito\
//
//* 15.1.f: reunión de tablas con un criterio (where) para filtrar filas.
// Muestra todos los productos vendidos, incluyendo el nombre del producto,
// para aquellas ventas donde se cumpla la condición: <p.producto = v.producto>.
// Notese que "ventas" tiene 10 filas y "productos" tiene 9 filas.
// El CR tiene 10 filas. Porque?
//
Select p.producto, p.nombre, v.venta, v.fecha, v.cantidad, v.total
from productos p, ventas v
where p.producto = v.producto
order by p.producto, v.venta\
//
//
//* 15.2: uso del JOIN
//
//* 15.2.a:
// Equivale al "15.1.f"
//
Select p.producto, p.nombre, v.venta, v.fecha, v.cantidad, v.total
from productos p join ventas v on p.producto = v.producto
order by p.producto, v.venta\
//
//* 15.2.b: uso del INNER JOIN
// Equivale al 15.2.a
//
Select p.producto, p.nombre, v.venta, v.fecha, v.cantidad, v.total
from productos p inner join ventas v on p.producto = v.producto
order by p.producto, v.venta\

//* 15.2.c: uso del KEY JOIN (reunión por clave externa)
// Equivale al 15.2.a
// Observe que ya no se escribe la condición de emparejamiento de filas
// pues, cuando existe una relación de integridad referencia (FK=foreign key)
// entre las tablas, el "key join" la reconoce automáticamente.
//
// 1ro: agreguemos una relación de integridad referencial entre "ventas" y "productos"
// haciendo:
//
alter table ventas
add foreign key producto references productos(producto)\
//
// 2do: ejecutemos la siguiente instrucción (con KEY JOIN) y obtendremos
// el mismo CR que en el caso 15.2.a
//
Select p.producto, p.nombre, v.venta, v.fecha, v.cantidad, v.total
from productos p key join ventas v
order by p.producto, v.venta\
//
// Nota: cuando existe un FK entre las tablas, también podemos
// utilizar INNER JOIN (genera un CR igual)
//
Select p.producto, p.nombre, v.venta, v.fecha, v.cantidad, v.total
from productos p inner join ventas v
order by p.producto, v.venta\
//
// 3ro: pero si eliminamos la relación de integridad referencial entre
// las tablas, el KEY JOIN produce un error!! (idem para el INNER JOIN).
//
alter table ventas
delete foreign key producto\

Select p.producto, p.nombre, v.venta, v.fecha, v.cantidad, v.total


from productos p key join ventas v
order by p.producto, v.venta\
//
// Nota: el error indica que no hay manera de reunir productos con ventas.
//
//* 15.2.d: uso del NATURAL JOIN
// Reune dos tablas vinculandolas por columnas que tengan el mismo nombre
//
Select p.producto, p.nombre, v.venta, v.fecha, v.cantidad, v.total
from productos p natural join ventas v
order by p.producto, v.venta\
//
// Nota: se debe tener mucho cuidado con el NATURAL JOIN pues es fuente
// de resultados "imprevistos" o errados, ya que es el sistema
// (y no el programador) quien toma la decisión de cuales son
// las columnas que utilizará como criterio para reunir las tablas.
//
//
//
//* 15.3: OUTER JOIN
//* Manejaremos dos tipos: el LEFT y el RIGHT OUTER JOIN.
// Actuan incluyendo en el CR todas las filas de ambas tablas que verifican
// la condición de vinculación o reunión, más todas las
// filas de la tabla ubicada a la izquierda (LEFT) o derecha(RIGHT)
// del "join" que no cumplen la condición de vinculación.
//
//* 15.3.a: Uso del LEFT OUTER JOIN
// Muestra todos los productos que tienen ventas, más todos aquellos
// que no tuvieron venta alguna.

Select p.producto, p.nombre, v.venta, v.fecha, v.cantidad, v.total


from productos p left outer join ventas v on p.producto = v.producto
order by p.producto, v.venta\

//* 15.3.b: Uso del RIGHT OUTER JOIN


// Produce el mismo resulta que el 15.2.a
// Observe que la tabla "productos" se encuentra a la derecha del join.

Select p.producto, p.nombre, v.venta, v.fecha, v.cantidad, v.total


from ventas v right outer join productos p on p.producto = v.producto
order by p.producto, v.venta\

//*--------------------------------------------------------------------------------*
//* Ejercicio 16: UNION (unión de Tablas)
// Concatena dos (o más) conjuntos resultado (CR), generados por "select's"
// acoplados mediante la cláusula UNION o UNION ALL.
// Para que sea posible lo anterior, debe cumplirse:
// a) La cantidad de columnas de los CR debe ser igual.
// b) Los tipos de datos de cada columna de los CR deben ser iguales
// y estar dispuestos en la misma secuencia.
// Nota:los "select" que originan cada CR no pueden tener ORDER BY.
// Se puede incluir un ORDER BY, pero el actua sobre el CR resultante
// de la unión de todos los demás CR. Se lo debe ubicar al final.

//* 16.1: UNION (muestra todas las filas distintas de ambos CR)

select producto, compra, fecha, cantidad, total


from compras
UNION
select producto, venta, fecha, cantidad, total
from ventas
\

//* 16.2: idem anterior, pero ordenados por producto y fecha

select producto, compra as movto, fecha, cantidad, total


from compras
UNION
select producto, venta, fecha, cantidad, total
from ventas
ORDER BY 1, 3
\

//* 16.3: UNION ALL (idem anterior, pero mostrando tambien la filas duplicadas.

select producto, compra as movto, fecha, cantidad, total


from compras
UNION ALL
select producto, venta, fecha, cantidad, total
from ventas
ORDER BY 1, 3
\

/* Nota: se recomienda el uso de UNION ALL en general.


El UNION (sin ALL) solo debe usarse cuando explícitamente se desea
que no se incluyan las filas duplicadas.
*/

//* 16.4: UNION con atributos virtuales


// Muestra todas las compras y ventas ordenadas por producto, aclarando
// mediante el caracter 'C' si el movimiento es de compras o 'V' si es
// de ventas.

select producto, 'C' as tipo, compra as movto, fecha, cantidad, total


from compras
UNION ALL
select producto, 'V', venta, fecha, cantidad, total
from ventas
ORDER BY 1, 4
\

También podría gustarte