Está en la página 1de 36

1

GESTIN DE DATOS 2012


- Clase 5 -

Esquema del banco


2

Sucursal = (nombreSucursal, ciudad, activos) Cliente= (idCliente, nombre, calle, ciudad) Cuenta= (nroCuenta, nombreSucursal, saldo) PoseeCuenta= (idCliente, nroCuenta) Prstamo= (nroPrstamo, nombreSucursal, importe) PoseePrstamo= (idCliente, nroPrstamo)

Esquema del banco


3

Tabla Cliente
idCliente 19.283.746 1.928.374 nombre Gonzalez Gmez calle Arenal Carretas ciudad La Granja Junn nroPrstamo P-15 P-10

Tabla Prstamo
nombreSucursal Ro Centro importe 50000 7000

Tabla PoseeCuenta
idCliente 19.283.746 19.283.746 1.928.374 67.789.901 nroCuenta C-101 C-201 C-215 C-102

67.789.901 18.273.609
32.112.312 33.666.999 25.123.456 23.928.374

Lpez Abril
Santos Ruprez Daz Prez

Mayor Preciados
Mayor Ramblas Corrientes Maip

Pergamino Valsain
Pergamino Len La Plata Junn

P-30 P-20

Centro Sur

40000 3500

18.273.609
32.112.312 23.928.374

C-305
C-217 C-201

Tabla Sucursal
nombreSucursal ciudad Crdoba Paran Neuqun Paran Paran La Plata activos 50.000.000 38.000.000 16.000.000 33.000.000 65.000.000 55.000.000

Tabla Cuenta
nroCuenta nombreSucursal saldo

Centro Ro Sur Avenida Casino Este

Tabla PoseePrstamo
idCliente 19.283.746 1.928.374 18.273.609 33.666.999 23.928.374 nroPrstamo P-30 P-10 P-20 P-15 P-10

C-101
C-215 C-102 C-305 C-201 C-217

Centro
Ro Centro Centro Sur Ro

500
700 400 350 900 750

Oeste

La Plata

43.000.000

Operaciones sobre conjuntos


4

Las operaciones de SQL UNION, INTERSECT Y


EXCEPT operan sobre relaciones y se corresponden con las operaciones del lgebra relacional U, y .
U

Las relaciones que participan deben ser compatibles, o sea, deben tener el mismo conjunto de atributos. Las tres operaciones eliminan los valores duplicados automticamente.

Operaciones sobre conjuntos: Unin


5

Ejemplo: Determinar los identificadores de los clientes que tienen un prstamo, una cuenta o las dos cosas en el banco. (SELECT idCliente FROM PoseeCuenta) UNION (SELECT idCliente FROM PoseePrstamo)

Operaciones sobre conjuntos: Interseccin


6

Ejemplo: Determinar los identificadores de los clientes que tienen tanto un prstamo como una cuenta en el banco. (SELECT idCliente FROM PoseeCuenta) INTERSECT (SELECT idCliente FROM PoseePrstamo)

Operaciones sobre conjuntos: Excepto


7

Ejemplo: Determinar los identificadores de los clientes que tienen cuenta en el banco pero notienen ningn prstamo. (SELECT idCliente FROM PoseeCuenta) EXCEPT (SELECT idCliente FROM PoseePrstamo)

Subconsultas anidadas
8

SQL presenta un mecanismo para anidar consultas.

Las subconsultas son expresiones select-from-where que estn anidadas dentro de otra consulta. Habitualmente se usan para comprobaciones de pertenencia a conjuntos, para hacer comparaciones de conjuntos y para determinar cardinalidades de conjuntos.

Subconsultas anidadas: Pertenencia a conjuntos


9

SQL permite comprobar la pertenencia de las tuplas a una relacin. La conectiva IN comprueba la pertenencia a un conjunto, donde el conjunto es la coleccin de valores resultado de una clusula SELECT. La conectiva NOT IN comprueba la no pertenencia a un conjunto. Se denota: SELECT lista de atributos FROM lista de tablas WHERE atributoi IN/ NOT IN (SUBCONSULTA)

Subconsultas anidadas: Pertenencia a conjuntos


10

Ejemplo: Determinar los identificadores de los clientes que tienen tanto un prstamo como una cuenta en el banco.
Tabla PoseeCuenta
idCliente 19.283.746 19.283.746 1.928.374 67.789.901 18.273.609 32.112.312 23.928.374 nroCuenta C-101 C-201 C-215 C-102 C-305 C-217 C-201

Tabla PoseePrstamo
idCliente 19.283.746 1.928.374 18.273.609 33.666.999 23.928.374 nroPrstamo P-30 P-10 P-20 P-15 P-10

idCliente 19.283.746 1.928.374 18.273.609

23.928.374

SELECT DISTINCT idCliente FROM PoseeCuenta WHERE idCliente IN (SELECT idCliente FROM PoseePrstamo)

Subconsultas anidadas: Pertenencia a conjuntos


11

Ejemplo: Determinar los identificadores de los clientes que tienen prstamo pero no tienen cuenta en el banco.
Tabla PoseePrstamo
idCliente 19.283.746 1.928.374 18.273.609 33.666.999 23.928.374 nroPrstamo P-30 P-10 P-20 P-15 P-10

Tabla PoseeCuenta
idCliente
19.283.746 19.283.746 1.928.374 67.789.901

idCliente 33.666.999

nroCuenta
C-101 C-201 C-215 C-102

18.273.609
32.112.312 23.928.374

C-305
C-217 C-201

SELECT DISTINCT idCliente FROM PoseePrstamo WHERE idCliente NOT IN (SELECT idCliente FROM PoseeCuenta)

Subconsultas anidadas: Pertenencia a conjuntos


12

Ejemplo: Determinar los identificadores de los clientes que tienen tanto un prstamo como una cuenta en la sucursal Centro.
Sucursal = (nombreSucursal, ciudad, activos) Cliente= (idCliente, nombre, calle, ciudad) Cuenta= (nroCuenta, nombreSucursal, saldo) PoseeCuenta= (idCliente, nroCuenta) Prstamo= (nroPrstamo, nombreSucursal, importe) PoseePrstamo= (idCliente, nroPrstamo)

SELECT distinct idCliente FROM PoseePrstamo, Prestamo WHERE PoseePrstamo.nroPrstamo = Prestamo.nroPrstamo AND nombreSucursal = Centro AND (nombreSucursal, idCliente) IN (SELECT nombreSucursal, idCliente FROM PoseeCuenta, cuenta WHERE PoseeCuenta.nroCuenta = Cuenta.nroCuenta)

Subconsultas anidadas: Comparacin de conjuntos


13

Se utilizan las conectivas >SOME, <SOME, >=SOME, <=SOME, =SOME y <>SOME. Se utilizan las conectivas >ALL, <ALL, >=ALL, <=ALL, =ALL y <>ALL. Se denota: SELECT lista de atributos FROM lista de tablas WHERE atributoi {<,>,}SOME/ALL (SUBCONSULTA)

Subconsultas anidadas: Comparacin de conjuntos


14

Ejemplo: Determinar el nombre de todas las sucursales que tienen activos mayores que, al menos, una sucursal de la ciudad de Paran. SELECT nombreSucursal FROM sucursal WHERE activos >SOME (SELECT activos FROM sucursal WHERE ciudad = Paran)

Subconsultas anidadas: Comparacin de conjuntos


15

Ejemplo: Determinar el nombre de todas las sucursales que tienen activos superiores al de todas las sucursales de la ciudad de Paran. SELECT nombreSucursal FROM sucursal WHERE activos >ALL (SELECT activos FROM sucursal WHERE ciudad = Paran)

Subconsultas anidadas: Comparacin de conjuntos


16

Ejemplo: Determinar el nombre de la sucursal que tiene el saldo mximo promedio. Obs.: En SQL las funciones de agregacin no se pueden componer, no se puede usar MAX (AVG ()).

SELECT nombreSucursal FROM cuenta GROUP BY nombreSucursal HAVING AVG (saldo) >= ALL (SELECT AVG (saldo) FROM cuenta GROUP BY nombreSucursal)

17

Subconsultas anidadas: Comprobacin de relaciones vacas

El constructor EXIST devuelve el valor verdadero si su argumento subconsulta no resulta vaca. Mediante el constructor NOT EXIST se puede comprobar la inexistencia de tuplas en el resultado de la subconsulta. Se denota: SELECT lista de atributos FROM lista de tablas WHERE EXIST (SUBCONSULTA)

18

Subconsultas anidadas: Comprobacin de relaciones vacas

Ejemplo: Determinar los identificadores de los clientes que tienen tanto un prstamo como una cuenta en el banco. SELECT idCliente FROM PoseeCuenta WHERE EXIST (SELECT * FROM PoseePrstamo WHERE PoseeCuenta.idCliente = PoseePrstamo.idCliente)

Vistas
19

Una VISTA es una relacin que no forma parte del modelo lgico pero se hace visible a los usuarios como relaciones virtuales. Las vistas son tiles para ocultar informacin innecesaria y para recopilar informacin de ms de una relacin en una nica vista.

Se denota: CREATE VIEW nombreVista AS <expresin de consulta>

Vistas
20

Ejemplo: Crear una vista consistente en los nombres de las sucursales junto a sus identificadores de clientes.
CREATE VIEW todosLosClientes AS
(SELECT nombreSucursal, idCliente FROM PoseeCuenta, Cuenta WHERE PoseeCuenta.nroCuenta = Cuenta.nroCuenta) UNION (SELECT nombre, idCliente FROM PoseePrstamo, Prstamo WHERE PoseePrstamo.nroPrstamo = Prstamo.nroPrstamo)

Vistas
21

Una vez definida la vista se puede utilizar su nombre para hacer referencia a la relacin virtual que genera. Ejemplo: Utilizando la vista todosLosClientes, determinar los identificadores de los clientes de la sucursal Centro.
SELECT idCliente FROM todosLosClientes WHERE nombreSucursal = Centro

Vistas: Actualizacin
22

Las vistas son tiles para las consultas, pero presentan serios problemas si se expresa con ellas actualizaciones, inserciones o borrados. La dificultad radica en que las modificaciones de la base de datos expresadas en trminos de vistas deben traducirse en modificaciones de las relaciones reales del modelo lgico de la base de datos.

Vistas: Actualizacin
23

Consideremos el caso de un empleado del banco que se le permite trabajar con todos los datos del prstamos menos el importe. Se podra crear la siguiente vista:
CREATE VIEW sucursalPrstamo AS (SELECT nmeroPrstamo, nombreSucursal FROM Prstamo)

A continuacin, el empleado escribe:


INSERT INTO sucursalPrstamo VALUES (P-40, Ro)

Vistas: Actualizacin
24

La insercin anterior debe representarse mediante una insercin en la relacin Prstamo, sin embargo falta el valor para el atributo importe. Hay dos enfoques para tratar esta insercin:

Rechazar la insercin y devolver al usuario un mensaje de error. Insertar la tupla (P-40, Ro, null) en la relacin Prstamo.

Vistas: Actualizacin
25

En general se dice que una vista de SQL es actualizable si se cumplen todas las condiciones siguientes:

La clusula FROM slo tiene una relacin de la base de datos. La clusula SELECT slo contiene atributos de la relacin y no tiene ninguna expresin, valor agregado ni especificacin DISTINCT. Cualquier atributo que no aparezca en la clusula SELECT puede definirse como nulo. La consulta no tiene clusulas GROUP ni HAVING.

Reunin de relaciones
26

SQL no slo proporciona el mecanismo bsico del producto cartesiano para reunir las tuplas de las relaciones, tambin ofrece otros mecanismos. Estas operaciones adicionales se utilizan como expresiones de subconsulta en la clusula FROM. Cada una de las variantes de las operaciones de reunin consiste en:

Un tipo de reunin (INNER JOIN, LEFT JOIN y RIGHT JOIN). Una condicin de reunin (NATURAL, ON).

Reunin de relaciones: INNER JOIN


27

Sintaxis general:

SELECT listaAtributos FROM tabla1 INNER JOIN tabla2 ON (atributo de tabla1 = atributo de T2)

Resultado: Retorna las filas de ambas tablas que cumplen con la/s condicin/es dadas.

Reunin de relaciones: INNER JOIN


28

Ejemplo: Obtener el nombre y nmeros de prstamo de los clientes que tienen un prstamo en el banco.

SELECT nombre, nroPrstamo FROM Cliente INNER JOIN PoseePrstamo ON (Cliente.idCliente = PoseePrstamo.idCliente)
Tabla Cliente
idCliente
19.283.746 1.928.374 67.789.901 18.273.609 32.112.312 33.666.999 25.123.456 23.928.374

Tabla PoseePrstamo
ciudad
La Granja Junn Pergamino Valsain Pergamino Len La Plata Junn idCliente 19.283.746 1.928.374 18.273.609 nroPrstamo P-30 P-10 P-20 nombre nroPrstamo

nombre
Gonzalez Gmez Lpez Abril Santos Ruprez Daz Prez

calle
Arenal Carretas Mayor Preciados Mayor Ramblas Corrientes Maip

Gonzalez
Gmez Abril Ruprez

P-30
P-10 P-20 P-15

33.666.999
23.928.374

P-15
P-10

Prez

P-10

Reunin de relaciones: INNER JOIN


29

La palabra clave NATURAL aparece delante del tipo de reunin y debe usarse si hay atributos de las relaciones iguales. Ejemplo: Obtener el nombre y nmeros de prstamo de los clientes que tienen un prstamo en el banco.

SELECT nombre, nroPrstamo FROM Cliente NATURAL INNER JOIN PoseePrstamo

Reunin de relaciones: LEFT JOIN


30

Sintaxis general:

SELECT listaAtributos FROM tabla1 LEFT JOIN tabla2 ON (atributo de tabla1 = atributo de T2)

Resultado: Se compone de todas la filas de la primera tabla que cumplen con la condicin indicada en la clusula ON, adicionando las filas de la primera tabla que no se relacionan con ninguna fila de la segunda tabla completando los valores de la segunda tabla con nulos.

Reunin de relaciones: LEFT JOIN


31

Ejemplo: Obtener el nombre y el nmero de prstamo de los clientes que tienen un prstamo en el banco, como as tambin los que no lo poseen.

SELECT nombre, nroPrstamo FROM Cliente LEFT JOIN PoseePrstamo ON (Cliente.idCliente = PoseePrstamo.idCliente)
Tabla Cliente
idCliente 19.283.746 nombre Gonzalez calle Arenal ciudad La Granja

Tabla PoseePrstamo
idCliente
19.283.746 1.928.374 18.273.609 33.666.999

nombre Gonzalez Gmez Abril Ruprez Prez Lpez Santos Daz

nroPrstamo P-30 P-10 P-20 P-15 P-10 null null null

nroPrstamo
P-30 P-10 P-20 P-15

1.928.374
67.789.901 18.273.609 32.112.312 33.666.999 25.123.456 23.928.374

Gmez
Lpez Abril Santos Ruprez Daz Prez

Carretas
Mayor Preciados Mayor Ramblas Corrientes Maip

Junn
Pergamino Valsain Pergamino Len La Plata Junn

23.928.374

P-10

Reunin de relaciones: RIGHT JOIN


32

Sintaxis general:

SELECT listaAtributos FROM tabla1 RIGHT JOIN tabla2 ON (atributo de tabla1 = atributo de T2)

Resultado: Se compone de todas la filas de la segunda tabla que cumplen con la condicin indicada en la clusula ON, adicionando las filas de la segunda tabla que no se relacionan con ninguna fila de la primera tabla completando los valores de la primera tabla con nulos.

Reunin de relaciones: RIGHT JOIN


33

Ejemplo: Obtener todas las ciudades (que tienen prstamos) y nmeros de prstamo, incluyendo aquellas ciudades que no los tengan.

SELECT nroPrstamo, ciudad FROM Prstamo RIGHT JOIN Sucursal ON (Prstamo.nombreSucursal = Sucursal.nombreSucursal)
Tabla Prstamo
nroPrstamo P-15 nombreSucursal Ro importe 50000 Centro Ro Sur Avenida Casino Este Oeste

Tabla Sucursal
nombreSucursal ciudad
Crdoba Paran Neuqun Paran Paran La Plata La Plata

nroPrstamo

ciudad Paran Crdoba Crdoba Neuqun La Plata

activos
50.000.000 38.000.000 16.000.000 33.000.000 65.000.000 55.000.000 43.000.000

P-15 P-10 P-30 P-20 null

P-10
P-30 P-20

Centro
Centro Sur

7000
40000 3500

Reunin de relaciones: RIGHT JOIN


34

Ejemplo: Obtener slo las ciudades que no tengan prstamos otorgados.

SELECT ciudad FROM Prstamo RIGHT JOIN Sucursal ON (Prstamo.nombreSucursal = Sucursal.nombreSucursal) WHERE nroPrstamo IS null
Tabla Prstamo
nroPrstamo P-15 nombreSucursal Ro importe 50000 Centro Ro Sur Avenida Casino Este Oeste

Tabla Sucursal
nombreSucursal ciudad
Crdoba Paran Neuqun Paran Paran La Plata La Plata

ciudad

activos
50.000.000 38.000.000 16.000.000 33.000.000 65.000.000 55.000.000 43.000.000

La Plata

P-10
P-30 P-20

Centro
Centro Sur

7000
40000 3500

Ejercitacin

a) b)

Personas (codigo, nombre) Autos (patente, modelo, ao, dueo, idAgencia) {el atributo
dueo contiene el cdigo de la persona}

Agencia (idAgencia, localidad, aoApertura)

Obtener para cada modelo la cantidad de autos vendidos. Obtener nombre de las personas que tienen autos modelo Fiesta. Obtener nombre de la persona y modelo de auto que posee, listando adems aquellas personas que no poseen autos. Obtener los nombres de las personan que no poseen autos. Listar informacin de aquellos autos cuya fecha de fabricacin coincida con alguna de las fechas de apertura de la agencia del vendedor.

c)

d) e)

35

Ejercitacin

f)

Personas (codigo, nombre) Autos (patente, modelo, ao, dueo, idAgencia) {el atributo
dueo contiene el cdigo de la persona}

Agencia (idAgencia, localidad, aoApertura)

Retornar aquellos autos cuya fecha de fabricacin sea mayor o igual a todas las fechas de apertura de las agencias vendedoras. Obtener el nombre de aquellas agencias que no tienen registrados autos vendidos por ellas (nombre de las agencias tales que no existen autos vendidos por ellas). Obtener las localidades de las agencias que no vendieron autos fabricados en el ao 2000.

g)

h)

i)
36

Obtener la localidad que ms autos vendi.

También podría gustarte