Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Sucursal = (nombreSucursal, ciudad, activos) Cliente= (idCliente, nombre, calle, ciudad) Cuenta= (nroCuenta, nombreSucursal, saldo) PoseeCuenta= (idCliente, nroCuenta) Prstamo= (nroPrstamo, nombreSucursal, importe) PoseePrstamo= (idCliente, nroPrstamo)
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
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
Las relaciones que participan deben ser compatibles, o sea, deben tener el mismo conjunto de atributos. Las tres operaciones eliminan los valores duplicados automticamente.
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)
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)
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
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.
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)
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
23.928.374
SELECT DISTINCT idCliente FROM PoseeCuenta WHERE idCliente IN (SELECT idCliente FROM PoseePrstamo)
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)
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)
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)
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)
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)
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
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
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.
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)
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).
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.
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
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.
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.
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
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
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.
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
activos
50.000.000 38.000.000 16.000.000 33.000.000 65.000.000 55.000.000 43.000.000
P-10
P-30 P-20
Centro
Centro Sur
7000
40000 3500
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}
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}
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