Lenguaje SQL n Lenguaje de definición de datos (DDL) n Consultas: estructura básica n Operaciones de conjuntos n Funciones agregadas n Valores nulos n Subconsultas anidadas n Relaciones derivadas n Vistas n Modificaciones de Bases de Datos n Relaciones unidas (joined) n SQL embebido, ODBC y JDBC Manejadores de bases de datos Esquema utilizado en los ejemplos sucursal cuenta depositante cliente nombre-sucursal numero-cuenta nombre-cliente nombre-cliente ciudad-sucursal nombre-sucursal numero-cuenta calle-cliente activos saldo ciudad-cliente prestamo prestatario numero-prestamo nombre-cliente nombre-sucursal numero-prestamo cantidad Manejadores de Bases de datos Lenguaje de definición de datos (DDL) Permite la especificación de un conjunto de relaciones y además de información sobre cada una de las relaciones, incluyendo: n El esquema de cada relación. n El dominio de los datos asociados a cada atributo. n Restricciones de integridad. n El conjunto de índices que se debe mantener para cada relación. n Información de seguridad y autorización para cada relación. n La estructura de almacenamiento físico de cada relación en disco. Manejadores de Bases de datos Tipos de dominio en SQL n char(n). Cadena de caracteres de longitud fija n indicada por el usuario. n varchar(n). Cadena de caracteres de longitud variable, con una longitud máxima n indicada por el usuario. n int. Entero (un subconjunto finito de enteros dependiente de la máquina). n smallint. Entero corto (un subconjunto del dominio entero cuyo tamaño es dependiente de la máquina). n numeric(p,d). Número en formato de punto fijo, con una precisión indicada por el usuario de p digitos, con n digitos a la derecha del punto decimal. n real, double precision. Numeros en formato de punto flotante y punto flotante de doble precisión, con precisión dependiente de la máquina. n float(n). Númeor en punto flotante, conuna precisión indicada por el usuario de al menos n digitos. n En todos los tipos de dominios se permiten valores nulos. Si un atributose declara not null, se prohiben los valores nulos para ese atributo. n La construcción create domain de SQL-92 permite crear dominios definidos por el usuario: create domain nombre-persona char(20) not null Manejadores de Bases 4 Tipos de Fecha/Hora en SQL (Cont.) n date. Fechas, conteniendo un año (4 dígitos) , mes y día. H P.e. date ‘2007-6-1’ n time. Horas, minutos y segundos. H P.e. time ’09:00:30’ time ’09:00:30.75’ n timestamp: Fecha y hora. H P.e. timestamp ‘2007-6-1 09:00:30.75’ n Interval: periodo de tiempo H P.e. Interval ‘1’ día H Restar un valor date/time/timestamp de otro nos da un valor de tipo intervalo H Valores de tipo intervalo se pueden sumar a valores date/time/timestamp n Podemos extraer valores de campos de date/time/timestamp H P.e. extract (year from r.fechainicio) n Podemos transformar tipos cadena de caracteres a date/time/timestamp H P.e. cast <expresion-tipo-string> as date Manejadores de Bases de datos 5 Comando Create Table n Una relación SQL se define mediante el comando create table: create table r (A1 D1 RI1, A2 D2 RI2, ..., An Dn RIn, (restriccion-integridad1), ..., (restriccion-integridadk)) H r es el nombre de la relación H cada Ai es un nombre de atributo en el esquema de la relación r H Di es el tipo de datos de los valores del dominio del atributo Ai n Ejemplo: Manejadores de Bases create table sucursal (nombre-sucursal ciudad-sucursal activos char(15) not null, char(30), integer) 6 Restricciones de integridad en Create Table n not null n primary key (A1, ..., A n) n check (P), donde P es un predicado n foreign key (A1, ..., A n) references r (B1, ..., B n) Ejemplo: Declarar nombre-sucursal como la clave primaria de sucursal y asegurar que el valor de activos no es negativo. create table sucursal (nombre-sucursal char(15), ciudad-sucursal char(30) activos integer, primary key (nombre-sucursal), check (activos >= 0)) Manejadores de Bases 7 Comandos Drop y Alter Table n El comando drop table borra toda la información referente a la relación eliminada de la base de datos. n El comando alter table se utiliza para añadir atributos a una relación existente. alter table r add A D donde A es el nombre del atributo a añadir a la relación r y D es el dominio de A. H A todas las tuplas de la relación se les asigna null como valor del nuevo atributo. n El comando alter table también se puede utilizar para eliminar atributos de una relación alter table r drop A donde A es el nombre de un atributo de la relación r H Algunos SGBD no soportan la eliminación de atributos Manejadores de Bases 8 Integridad referencial n Asegura que un valor que aparece en una relación para un conjunto de atributos determinado también aparece en un conjunto de atributos de otra relación. H Ejemplo: Si “Centro” es un nombre de sucursal que aparece en una de las tuplas de la relación cuentas, entonces existe una tupla en la relación sucursales para la sucursal “Centro”. n Definición formal H Dadas las relaciones r1(R1) y r2(R2) con claves primarias K1 y K2 respectivamente. H El subconjunto α de R2 es una clave foránea referenciando K1 en la relación r1, si para cada t2 en r2 debe haber una tupla t1 en r1 tal que t1[K1] = t2[α]. H Las restricciones de integridad referencial también se denominan dependencias de subconjunto ya que se pueden expresar como ∏α (r2) ⊆ ∏K1 (r1) Manejadores de Bases 9 Integridad referencial en el modelo E-A n Consideremos el conjunto asociación R entre los conjuntos entidad E1 y E2. El esquema relacional de R incluye las claves primarias K1 de E1 y K2 de E2. Entonces K1 y K2 son claves foráneas sobre los esquemas relacionales de E1 y E2 respectivamente. E1 R E2 n Las asociaciones 1:N se pueden resolver mediante restricciones de integridad, en vez de mediante una nueva asociación n Los jerarquías de especialización/generalización también dan lugar a restricciones de integridad referencial. n Los conjuntos entidad débiles también dan lugar a restricciones de integridad referencial. H El esquema de relación de un conjunto entidad débil debe incluir los atributos que forman la clave primaria del conjunto entidad del que depende Manejadores de Bases 10 Comprobación de integridad referencial durante una modificación n Se deben realizar las siguientes comprobaciones con el fin de preservar la siguiente restricción de integridad referencial: ∏α (r2) ⊆ ∏K (r1) n Insertar. Si una tupla t2 se inserta en r2, el sistema se debe asegurar de que hay una tupla t1 en r1 tal que t1[K] = t2[α]. Es decir t2 [α] ∈ ∏K (r1) n Eliminar. Si se elimina una tupla t1 de r1, el sistema debe hallar el conjunto de tuplas de r2 que referencian t1: σα = t1[K] (r2) Si el conjunto no es vacío H o bien se rechaza el comando como un error, H o bien se deben eliminar las tuplas que referencian a t1 (se permiten eliminaciones en cascada) Manejadores de Bases d 11 Modificaciones de la base de datos (Cont.) n Actualizaciones. Hay dos casos: H Si se actualiza una tupla t2 en la relación r2 y la actualización modifica los valores de la clave foránea α,entonces se debe hacer un test similar al caso de inserción: 4 Si t2’ denota el nuevo valor de la tupla t2, el sistema se debe asegurar de que t2’[α] ∈ ∏K(r1) H Si se actualiza una tupla t1 en r1, y la actualización modifica el valor de la clave primaria (K), entonces se debe realizar un test similar a la del caso de eliminación: 1. El sistema debe calcular σα = t1[K] (r2) utilizando el valor anterior de t1 (el valor antes de hacer la actualización). 2. Si el conjunto no es vacío 1. la actualización se puede rechazar como un error, o 2. La actualización se puede hacer en cascada sobre las tuplas del conjunto, o 3. Las tuplas del conjunto se pueden eliminar. Bases de datos 12 Consultas: Estructura básica n SQL está basado en operaciones sobre relaciones y sobre conjuntos con algunas modificaciones y mejoras n Una consulta típica en SQL tiene la siguiente forma: select A1, A2, ..., An from r1, r2, ..., rm where P H Ais repesentan atributos H ris representan relaciones H P es un predicado. n Esta consulta es equivalente a la expresión de álgebra relacional: ∏A1, A2, ..., An(σP (r1 x r2 x ... x rm)) n El resultado de una consulta SQL es una relación. Bases de datos 13 La cláusula select n La cláusula select lista los atributos que queremos en el resultado de la consulta H Corresponde a la operación de proyección del álgebra de relaciones n P.e. encontrar los nombres de todas las sucursales de la relación prestamo select nombre-sucursal from prestamo n En la sintaxis del álgebra relacional “pura”, la consulta sería: ∏nombre-sucursal(prestamo) Bases de datos 14 La clausula select (Cont.) n SQL permite duplicados tanto en relaciones (tablas) como en los resultados de las consultas. n Para forzar la eliminación de duplicados en los resultados utilizamos distinct después de select. n Encontrar los nombres de todas las sucursales en la relación prestamo eliminando duplicados select distinct nombre-sucursal from prestamo n La palabra reservada all indica que no se eliminen los duplicados (comportamiento por defecto). select all nombre-sucursal from prestamo Bases de datos 15 La clausula select (Cont.) n Un asterisco en la clausula select indica “todos los atributos” select * from prestamo n La clausula select puede contener expresiones aritméticas con las operaciones +, –, ∗, y /, y operar sobre constantes o atributos de tuplas. n La consulta: select numero-prestamo, nombre-sucursal, cantidad ∗ 100 from prestamo devolverá una relación igual a la relación prestamo, excepto que el atributo cantidad estará multiplicado por 100. Bases de datos 16 La clausula where n La clausula where especifica condiciones que debe satisfacer el resultado H Corresponden al predicado de selección del álgebra relacional. n Encontrar todos los números de préstamo hechso en la sucursal de Centro con cantidades prestadas mayores de 1200 pesos. select numero-prestamo from prestamo where nombre-sucursal = ‘Centro’ and cantidad > 1200 n Los resultados lógicos se pueden combinar con las conectivas lógicas and, or y not. n Las comparaciones se pueden aplicar al resultado de expresiones aritméticas. Bases de datos 17 La clausula where (Cont.) n SQL incluye un operador de comparación between n P.e. Encontrar los números de prétamo de aquellos préstamos cuya cantidad esté entre 90,000 y 100,000 pesos (es decir, ≥90,000 y ≤100,000) select numero-prestamo from prestamo where cantidad between 90000 and 100000 Bases de datos 18 La clausula from n La clausula from lista las relaciones involucradas en la consulta H corresponde al producto cartesiano del álgebra relacional. n Encontrar el producto cartesiano prestatario x prestamo select ∗ from prestatario, prestamo n Encontrar el nombre, número de préstamo y cantidad prestada de todos los clientes con un préstamo en la sucursal Centro. select nombre-cliente, prestatario.numero-prestamo, cantidad from prestatario, prestamo where prestatario.numero-prestamo = prestamo.numero-prestamo and nombre-sucursal = ‘Centro’ Bases de datos 19 La operación de renombrado n SQL permite renombrar relaciones y atributos mediante la cláusula as : nombre-antiguo as nombre-nuevo n Encontrar el nombre, número de préstamo y cantidad prestada de todos los clientes; renombrar la columna numero-prestamo como id-prestamo. select nombre-cliente, prestatario.numero-prestamo as id-prestamo, cantidad from prestatario, prestamo where prestatario.numero-prestamo = prestamo.numero-prestamo Bases de datos 20 Variables de tupla n Las variables de tupla se definen en la cláusula from mediante el uso de la cláusula as. n Encontrar los nombres de cliente y sus números de préstamo para todos los clientes que tengan un préstamo en alguna sucursal. select nombre-cliente, T.numero-prestamo, S.cantidad from prestatario as T, prestamo as S where T.numero-prestamo = S.numero-prestamo n Encontrar los nombres de todas las oficinas que tienen unos activos mayores que alguna sucursal de Barcelona. select distinct T.nombre-sucursal from sucursal as T, sucursal as S where T.activos > S.activos and S.ciudad-sucursal = ‘Barcelona’’ Bases de datos 21 Operaciones sobre cadenas de caracteres n SQL incluye un operador de coincidencia para comparar cadenas de caracteres. Los patrones se describen usando dos caracteres especiales: H porcentaje (%). El % representa cualquier subcadena de caracteres. H subrayado (_). El _ representa cualquier caractér. n Encontrar los nombres de los clientes cuya calle incluya la subcadena “Mayor”. select nombre-cliente from cliente where calle-cliente like ‘%Mayor%’ n Para encontrar “Mayor%” like ‘Mayor\%’ escape ‘\’ n SQL soporta diversas operaciones sobre cadenas de caracteres, como H concatenación (utilizando “||”) H convertir de mayúsculas a minúsculas (y viceversa) H calcular la longitud, extraer subcadenas, etc. Bases de datos 22 Ordenar las tuplas obtenidas n Listar en orden alfabético los nombres de todos los clientes que tenganun préstamo en la sucursal Centro select distinct nombre-cliente from prestatario, prestamo where prestatario.numero-prestamo = prestamo.numero-prestamo and nombre-sucursal = ‘Centro’ order by nombre-cliente n Podemos especificar desc para orden descendente o asc para orden ascendente para cada atributo; el orden por defecto es el ascendente. H P.e. order by nombre-cliente desc Bases de datos 23 Operaciones de conjuntos n Las operaciones de conjuntos unión (union), intersección (intersect), y diferencia (except) se pueden aplicar sobre relaciones y equivalen a las operaciones ∪, ∩, − del álgebra de relaciones. n Cada una de las operaciones anteriores elimina dupicados automáticamente; para conservar los duplicados se debe utilizar union all, intersect all and except all. Supongamos que una tupla aparece m veces en r y n veces en s, entonces aparece: H m + n veces en r union all s H min(m,n) veces en r intersect all s H max(0, m – n) veces en r except all s Bases de datos 24 Operaciones de conjuntos n Encontrar todos los clientes que tengan un préstamo, una cuenta o ambas cosas: (select nombre-cliente from depositante) union (select nombre-cliente from prestatario) n Encontrar todos los clientes que tienen tanto una cuenta como un préstamo (select nombre-cliente from depositante) intersect (select nombre-cliente from borrower) n Encontrar todos los clientes que tengan una cuenta pero no un préstamo. (select nombre-cliente from depositante) except (select nombre-cliente from prestatario) Bases de datos 25 Funciones agregadas n Estas funciones operan sobre un conjunto de valores de una columna de una relación y devuelven un valor avg: valor medio min: valor mínimo max: valor máximo sum: suma de valores count: número de valores Bases de datos 26 Funciones agregadas (Cont.) n Encontrar el saldo medio de las cuentas de la sucursal Centro. select avg (saldo) from cuenta where nombre-sucursal = ‘Centro’ n Encontrar el número de tuplas de la relación cliente. select count (*) from cliente n Encontrar el número de depositantes del banco. select count (distinct nombre-cliente) from depositante Bases de datos 27 Funciones agregadas – Group By n Encontrar el número de depositantes de cada sucursal. select nombre-sucursal, count (distinct nombre-cliente) from depositante, cuenta where depositante.numero-cuenta = cuenta.numero-cuenta group by nombre-sucursal Nota: Los atributos en la clausula select fuera de las funciones agregadas deben aparecer en la lista group by Bases de datos 28 Funciones agregadas – cláusula Having n Encontrar los nombres de todas las sucursales donde el saldo medio de las cuentas sea de más de 1,200 pesos. select nombre-sucursal, avg (saldo) from cuenta group by nombre-sucursal having avg (saldo) > 1200 Bases de datos 29 Valores nulos (null) n Las tuplas pueden tener valores nulos, indicado por null, para algunos de sus atributos. n null significa “valor desconocido” o que ese valor no existe. n El predicado is null se utiliza para comprobar valores nulos. H P.e. Encontrar todos los números de préstamo que aparecen en la relación prestamo con un valor nulo en cantidad. select numero-prestamo from prestamo where cantidad is null n El resultado de cualquier expresión aritmética en la que participa null es null H P.e. 5 + null devuelve null n Sin embargo, las funciones agregadas simplemente ignoran los nulos Bases de datos 30 Valores nulos y lógica tri-valorada n Cualquier comparación con null devuelve desconocido H P.e. 5 < null o null <> null o null = null n Lógica tri-valorada utilizando el valor de verdad desconocido: H OR: (desconocido or true) = true, (desconocido or false) = desconocido (desconocido or desconocido) = desconocido H AND: (desconocido and true) = desconocido, (desconocido and false) = false, (desconocido and desconocido) = desconocido H NOT: (not desconocido) = desconocido n Los resultados de los predicados de la cláusula where se tratan como false si toman el valor desconocido Bases de datos 31 Valores nulos y agregados n Total de cantidades de todos los préstamos select sum (cantidad) from prestamo H Esta sentencia ignora las cantidades nulas H El resultado es nulo si no hay cantidades no nulas n Todas las funciones agregadas excepto count(*) ignoran las tuplas con valores nulos en los atributos agregados. Bases de datos 32 Subconsultas anidadas n SQL proporciona un mecanismo para anidar subconsultas. n Una subconsulta es una expresión select-from-where que está anidada en otra consulta. n Un uso habitual de las subconsultas es realizar comprobaciones de pertenencia a un conjunto, comparaciones de conjuntos y de cardinalidades de conjuntos. Bases de datos 33 Ejemplo n Encontrar todos los clientes que tengan tanto una cuenta como un préstamo en el banco. select distinct nombre-cliente from prestatario where nombre-cliente in (select nombre-cliente from depositante) n Encontrar todos los clientes que tienen un préstamo pero no una cuenta en el banco select distinct nombre-cliente from prestatario where nombre-cliente not in (select nombre-cliente from depositante) Bases de datos 34 Ejemplo n Encontrar todos los clientes que tiene tanto una cuenta como un préstamo en la sucursal Centro select distinct nombre-cliente from prestatario, prestamo where prestatario.numero-prestamo = prestamo.numero-prestamo and nombre-sucursal = “Centro” and (nombre-sucursal, nombre-cliente) in (select nombre-sucursal, nombre-cliente from depositante, cuenta where depositante.numero-cuenta = cuenta.numero-cuenta) Bases de datos 35 Comparación de conjuntos n Encontrar todas las sucursales que tienen unos activos mayores que alguna sucursal de Madrid. select distinct T.nombre-sucursal from sucursal as T, sucursal as S where T.activos > S.activos and S.ciudad-sucursal = ‘Veracruz’ n La misma consulta utilizando la cláusula > some select nombre-sucursal from sucursal where activos > some (select activos from sucursal where ciudad-sucursal = ‘Veracruz’) Bases de datos 36 Definición de la cláusula Some n F <comp> some r ⇔ ∃ t ∈ r que cumple (F <comp> t) Donde <comp> puede ser: <, ≤, >, =, ≠ (5< some (5< some (5 = some 0 5 6 0 5 0 5 ) = true (leer: 5 < some tupla de la relación) ) = false ) = true 0 (5 ≠ some 5 ) = true (dado que 0 ≠ 5) (= some) ≡ in Sin embargo, (≠ some) ≡ not in Bases de datos 37 Definición de la cláusula All n F <comp> all r ⇔ ∀ t ∈ r (F <comp> t) (5< all (5< all (5 = all 0 5 6 6 10 4 5 ) = false ) = true ) = false 4 (5 ≠ all 6 ) = true (dado que 5 ≠ 4 y 5 ≠ 6) (≠ all) ≡ not in Sin embargo, (= all) ≡ in Bases de datos 38 Consulta de ejemplo n Encontrar los nombres de todas las sucursales que tengan unos activos mayores que todas las sucursales de Madrid. select nombre-sucursal from sucursales where activos > all (select activos from sucursas where ciudad-sucursal = ‘Veracruz’) Bases de datos 39 Comprobación de relaciones vacías n La construcción exists devuelve el valor true si la subconsulta argumento no está vacía. n exists r ⇔ r ≠ Ø n not exists r ⇔ r = Ø Bases de datos 40 Consulta de ejemplo n Encontrar todos los clientes que tengan una cuenta en todas las sucursales de Madrid. select distinct S.nombre-cliente from depositante as S where not exists ( (select nombre-sucursal from sucursal where ciudad-sucursal = ‘Veracruz’) except (select R.nombre-sucursal from depositante as T, cuenta as R where T.numero-cuenta = R.numero-cuenta and S.nombre-cliente = T.nombre-cliente)) nNotar que X – Y = Ø ⇔ X ⊆ Y n Nota: Esta consulta no se puede escribir con = all y sus variantes Bases de datos 41 Comprobación de ausencia de tuplas duplicadas n La construcción unique comprueba si el resultado de una subconsulta tiene tuplas duplicadas. n Encontrar todos los clientes que tienen como mucho una cuenta en la sucursal Centro. select T.nombre-cliente from depositante as T where unique ( select R.nombre-cliente from cuenta, depositante as R where T.nombre-cliente = R.nombre-cliente and R.numero-cuenta = cuenta.numero-cuenta and cuenta.nombre-sucursal = ‘Centro’ Bases de datos 42 Consulta de ejemplo n Encontrart todos los clientes que tengan al menos dos cuentas en la sucursal de Centro. select distinct T.nombre-cliente from depositante T where not unique ( select R.nombre-cliente from cuenta, depositante as R where T.nombre-cliente = R.nombre-cliente and R.numero-cuenta = cuenta.numero-cuenta and cuenta.nombre-sucursal = ‘Centro’) Bases de datos 43 Vistas n Proporcionan un mecanismo para ocultar ciertos datos a ciertos usuarios. Para crear una vista se usa el comando: create view v as <consulta> donde: H <consulta> es cualquier expresión legal H El nombre de la vista es v Bases de datos 44 Ejemplo n Una vista consistente en las sucursales y sus clientes create view clientes-sucursal as (select nombre-sucursal, nombre-cliente from depositante, cuenta where depositante.numero-cuenta = cuenta.numero-cuenta) union (select nombre-sucursal, nombre-cliente from prestatario, prestamo where prestatario.numero-prestamo = prestamo.numero-prestamo) n Encontrar todos los clientes de la sucursal Centro select nombre-cliente from clientes-sucursal where nombre-sucursal = ‘Centro’ Bases de datos 45 Relaciones derivadas n Encontrar el saldo medio de las cuentas de aquellas sucursales donde el saldo medio de las cuentas es mayor de 1200 pesos. select nombre-sucursal, saldo-medio from (select nombre-sucursal, avg (saldo) from cuenta group by nombre-sucursal) as resultado (nombre-sucursal, saldo-medio) where saldo-medio > 1200 No necesitamos utilizar la cláusula having dado que calculamos una relación temporal (vista) resultado en la cláusula from, y los atributos de resultado se pueden utilizar directamente en la cláusula where. Bases de datos 46 Cláusula With n La cláusula With definir vistas locales a una consulta, en vez de globalmente. n Encontrar todas las cuentas con el saldo máximo with saldo-maximo (valor) as select max (saldo) from cuenta select numero-cuenta from cuenta, saldo-maximo where cuenta.saldo = saldo-maximo.valor Bases de datos 47 Consultas complejas con la cláusula With n Encontrar todas las sucursales donde el total de sus cuentas es mayor que la media del total de cuentas de todas las sucursales. with total-sucursal (nombre-sucursal, valor) as select nombre-sucursal, sum (saldo) from cuenta group by nombre-sucursal with media-total-sucursal(valor) as select avg (valor) from total-sucursal select nombre-sucursal from total-sucursal, media-total-sucursal where total-sucursal.valor >= media-total-sucursal.valor Bases de datos 48 Modificación de datos – Borrado n Borrar todas las cuentas de la sucursal Centro delete from cuenta where nombre-sucursal = ‘Centro’ n Borrar todas las cuentas de todas las sucursales de Veracruz. delete from cuenta where nombre-sucursal in (select nombre-sucursal from sucursal where ciudad-sucursal = ‘Veracruz’) delete from depositante where numero-cuenta in (select numero-cuenta from sucursal, cuenta where ciudad-sucursal = ‘Veracruz’ and sucursal.nombre-sucursal = cuenta.nombresucursal) Bases de datos 49 Ejemplo de borrado n Borrar todas las cuentas con saldos por debajo de la media del banco. delete from cuenta where saldo < (select avg (saldo) from cuenta) H Problema: a medida que borramos tuplas, la media cambia H Solución utilizada en SQL: 1. Primero, calcular avg y encontrar todas las tuplas a borrar 2. Segundo, borrar todas las tuplas encontradas antes (sin recalcular avg ni recomprobar las tuplas) Bases de datos 50 Modificación de Datos - Inserción n Añadir una nueva tupla a cuenta insert into cuenta values (‘A-9732’, ‘Centro’,1200) o, como forma alternativa insert into cuenta (nombre-sucursal, saldo, numero-cuenta) values (‘Centro’, 1200, ‘A-9732’) n Añadir una nueva tupla a cuenta con saldo puesto a nulo insert into cuenta values (‘A-777’,'Centro', null) Bases de datos 51 Modificación de datos – Inserción n Dar como premio a todos los clientes con préstamo en la sucursal de Centro una nueva cuenta de ahorro con 200 pesos de saldo. El número de préstamo servirá como númeor de cuenta para la nueva cuenta de ahorro. insert into cuenta select numero-prestamo, nombre-sucursal, 200 from prestamo where nombre-sucursal = ‘Centro’ insert into depositante select nombre-cliente, numero-prestamo from prestamo, prestatario where nombre-sucursal = ‘Centro’ and prestamo.numero-cuenta = prestatario.numerocuenta n La sentencia select-from-where se evalúa totalmente antes de insertar ninguno de sus resultados en la relación (si no, consultas como insert into tabla1 select * from tabla1 causarían problemas Bases de datos 52 Modificación de datos – Actualizaciones n Incrementar todas las cuentas con más de 10,000 pesos un 6% y el resto de cuentas un 5%. H Escribimos dos sentencias update: update cuentas set saldo = saldo ∗ 1.06 where saldo > 10000 update cuentas set saldo = saldo ∗ 1.05 where saldo ≤ 10000 H El orden es importante H Se puede hacer mejor con la sentencia case Bases de datos 53 Sentencia Case para actualizaciones condicionales n La misma consulta de antes: aumentar los saldos de todas las cuentas de más de 10,000 pesos un 6% y las demás un 5%. update cuenta set saldo = case when saldo <= 10000 then saldo *1.05 else saldo * 1.06 end Bases de datos 54 Actualización a través de vistas n Crear una vista de todos los datos sobre préstamos en la relación prestamo, ocultando el atributo cantidad create view prestamo-sucursal as select nombre-sucursal, numero-prestamo from prestamo n Añadir una nueva tupla a prestamo-sucursal insert into prestamo-sucursal values (‘Centro’, ‘L-307’) Esta inserción se debe transformar en la inserción de la tupla (‘L-307’, ‘Centro’, null) en la relación prestamo n En vistas más complejas las actualizaciones pueden ser más difíciles o imposibles de transformar y no están, por tanto, permitidas. n La mayoría de implementaciónes SQL sólo permiten actualizaciones a través de vistas simples (sin agregaciones) definidas sobre una sola relación. Bases de datos 55 Transacciones n Una transacción es una secuencia de sentencias (normalmente de consulta y actualización) que se ejecutan como una sola unidad. H Las transacciones se inician de manera implícita y se terminan mediante: 4 commit work: hace permanentes en la base de datos todos los cambios 4 rollback work: deshace todos los cambios realizados en la transacción. n Ejemplo: H La transferencia de dinero de una cuenta a otra supone dos pasos: 4 quitarlo de una cuenta y añadirlo a la otra H Si se realiza un paso y falla el otro, la base de datos queda en un estado inconsistente H Por tanto, se deben realizar los dos pasos, o ninguno. n Si cualquier paso de la transacción falla, todo el trabajo realizado por la transacción se puede desahcer mediante rollback work. n El rollback de las transacciones incompletas se hace automáticamente en caso de fallos del sistema. Bases de datos 56 Transacciones (Cont.) n En la mayoría de SGBD, cada sentencia SQL que se ejecuta correctamente se confirma (commit) automáticamente. H En este caso, cada transacción debe consistir en una sola sentencia. H Normalmente se puede deshabilitar la confirmación automática, permitiendo transacciones multi-sentencia, pero cómo se hace esto es dependiente del SGBD. H Otra opción, en SQL:1999: rodear las sentencias de: begin atomic … end Bases de datos 57 Relaciones unidas (join) n Las operaciones join toman dos relaciones y devuelven otra relación. n Estas operaciones normalmente se utilizan como subconsultas en la cláusula from. n Condición del join – define qué tuplas de las dos relaciones coinciden, y qué atributos aparecerán en el resustado del join. n Tipo de join – define como tratar aquellas tuplas de cada relación que no coinciden con ninguna tupla de la otra relación (en base a la condición de join. Tipos de join Condición de join inner join left outer join right outer join full outer join natural on <predicado> using (A1, A2, ..., An) Bases de datos 58 Relaciones unidas – Datos para los ejemplos n Relación prestamo numero-prestamo nombre-sucursal cantidad L-170 Villa 3000 L-230 Centro 4000 L-260 Vargas 1700 n Relación prestatario nombre-cliente numero-prestamo Fernández L-170 Suárez L-230 López L-155 n Nota: falta la información del préstatario del préstamo L-260 y la información del préstamo L-155 Bases de datos 59 Relaciones unidas - Ejemplos n prestamo inner join prestatario on prestamo.numero-prestamo = prestatario.numero-prestamo numero-prestamo nombre-sucursal cantidad nombre-cliente numero-prestamo L-170 Villa 3000 Fernández L-170 L-230 Centro 4000 Suárez L-230 n prestamo left outer join prestatario on prestamo.numero-prestamo = prestatario.numero-prestamo numero-prestamo nombre-sucursal cantidad nombre-cliente numero-prestamo L-170 Villa 3000 Fernández L-170 L-230 Centro 4000 Suárez L-230 L-260 Vargas 1700 null Bases de datos null 60 Relaciones unidas - Ejemplos n prestamo natural inner join prestatario numero-prestamo nombre-sucursal cantidad nombre-cliente L-170 Villa 3000 Fernández L-230 Centro 4000 Suárez n prestamo natural right outer join prestatario numero-prestamo Bases de datos nombre-sucursal cantidad nombre-cliente L-170 Villa 3000 Fernández L-230 Centro 4000 Suárez L-155 null null López 61 Relaciones unidas - Ejemplos n prestamo full outer join prestatario using (numero-prestamo) numero-prestamo nombre-sucursal cantidad nombre-cliente L-170 Villa 3000 Fernández L-230 Centro 4000 Suárez L-260 Vargas 1700 null L-155 null null López n Encontrar todos los clientes que tengan o bien una cuenta o bien un préstamo (pero no ambos) en el banco. select nombre-cliente from (depositante natural full outer join prestatario) where numero-cuenta is null or numero-prestamo is null Bases de datos 62 SQL embebido n El estándar SQL define la inclusión de SQL en diversos lengujes de programación como Pascal, PL/I, Fortran, C, y Cobol. n EL lenguaje en el que se incluyen sentencias SQL se denomina lenguaje anfitrión (host), y las estructuras SQL permitidas en el lenguaje anfitrión se denominan SQL embebido (embedded). n La forma básica de estos lenguajes sigue la utilizada en el Sistema R para incluir SQL en PL/I. n La sentencia EXEC SQL se utiliza para identificar solicitudes embebidas SQL al preprocesador EXEC SQL <sentencia SQL embebida > END-EXEC Nota: en algunos lenguajes esto cambia. P.e. en Java se usa # SQL { …. } ; Bases de datos 63 Ejemplo de consulta Desde un lenguaje anfitrión, encontrar los nombres y ciudades con alguna cuenta que tenga más pesos de la cantidad almacenada en la variable cantidad. n Especificamos la consulta en SQL y declaramos un cursor asociado EXEC SQL declare c cursor for select nombre-cliente, ciudad-cliente from depositante, cuenta, cantidad where depositante.nombre-cliente = cliente.nombre-cliente and depositante.numero-cuenta = cuenta.numero-cuenta and cuenta.saldo > :cantidad END-EXEC Bases de datos 64 SQL embebido (Cont.) n La sentencia open hace que se evalúe la consulta EXEC SQL open c END-EXEC n La sentencia fetch sitúa en variables del lenguaje anfitrión los valores de una tupla del resultado de la consulta. EXEC SQL fetch c into :cn, :cc END-EXEC Repetidas llamadas a fetch devuelve tuplas sucesivas del resultado de la consulta n Una variable denominada SQLSTATE en el área de comunicación de SQL (SQLCA) se pone a ‘02000’ para indicar que no hay más datos n La sentencia close hace que el SGBD elimine la relación temporal que alamcena el resultado de la consulta. EXEC SQL close c END-EXEC Bases de datos 65 Actualizaciones mediante cursores n Declarando que un cursor es para actualizaciones se puede modificar la tupla actual del cursor declare c cursor for select * from cuenta where nombre-sucursal = ‘Centro’ for update n Para actualizar la tupla en la posición actual del cursor: update cuenta set saldo = saldo + 100 where current of c Bases de datos 66 SQL dinámico n Permite a los programas construir y ejecutar sentencias SQL en tiempo de ejecución. n Ejemplo de uso de SQL dinámico desde un programa C. char * consultasql = “update cuenta set saldo = saldo * 1.05 where numero-cuenta = ?” EXEC SQL prepare consultadin from :consultasql; char cuenta [10] = “A-101”; EXEC SQL execute consultadin using :cuenta; n El programa SQL dinámico contiene un ?, que es un “hueco” para el valor que se proporciona cuando se ejecuta el programa SQL. Bases de datos 67 ODBC n Estándar Open DataBase Connectivity (ODBC) H Estándar para programar comunicaciones (accesos) a un servidor de bases de datos desde aplicaciones. H API para 4 abrir una conexión con una base de datos, 4 enviar sentencias, 4 recibir resultados. Bases de datos 68 ODBC (Cont.) n Cada SGBD que soporta ODBC proporciona una librería "driver" que se n n n n debe enlazar con el programa cliente. Cuando el programa cliente hace una llamada al API ODBC, el código de la librería se comunica con el servidor para realizar la acción solicitada y obtener los resultados. El programa ODBC primero asigna un entorno SQL y, a continuacíón, un manejador de conexión a base de datos. Abre una conexión a la base de datos utilizando SQLConnect(). SQLConnect toma como parámetros: H el manejador de la conexión, H el servidor a que conectar, H el identificador del usuario, H su password También debe especificar los tipos de los argumentos: H SQL_NTS indica que el argumento anterior es una cadena de carateres terminado en nulo. Bases de datos 69 Código ODBC n int ejemploODBC() { RETCODE error; HENV env; /* entorno */ HDBC conn; /* conexion a base de datos */ SQLAllocEnv(&env); SQLAllocConnect(env, &conn); SQLConnect(conn, “clave", SQL_NTS, “usuario", SQL_NTS, “usuariopass", SQL_NTS); { …. Realizamos el trabajo … } SQLDisconnect(conn); SQLFreeConnect(conn); SQLFreeEnv(env); } Bases de datos 70 Código ODBC (Cont.) n Los programas envían comandos SQL a la base datos mediante SQLExecDirect n Las tuplas del resultado se acceden mediante SQLFetch() n SQLBindCol() asocia variables C a atributos del resultado de la consulta. 4 Cuando se accede a una tupla, sus valores se almacenan automáticamente a las variables C correspondientes. 4 Argumentos do SQLBindCol() – Variable ODBC stmt, – Posición del atributo en el resultado de la consulta – El tipo de conversión de SQL a C. – La dirección de la variable. – Para tipos de longitud variable, como cadenas de caracteres, » La longitud máxima de la variable. » Lugar para almacenar la longitud actual cuando se acceda a la tupla. Bases de datos 71 Código ODBC (Cont.) n Cuerpo principal del programa char nombresucursal[80]; float saldo; int longOut1, longOut2; HSTMT stmt; SQLAllocStmt(conn, &stmt); char * consultasql = "select nombre_sucursal, sum (saldo) from cuenta group by nombre_sucursal"; error = SQLExecDirect(stmt, consultasql, SQL_NTS); if (error == SQL_SUCCESS) { SQLBindCol(stmt, 1, SQL_C_CHAR, nombresucursal, 80, &longOut1); SQLBindCol(stmt, 2, SQL_C_FLOAT, &saldo, 0, &longOut2); while (SQLFetch(stmt) >= SQL_SUCCESS) { printf (" %s %g\n", nombresucursal, saldo); } } SQLFreeStmt(stmt, SQL_DROP); Bases de datos 72 Más características de ODBC n Sentencias Preparadas H Sentencia SQL preparada: compilada en la base de datos H Puede tener “huecos”: P.e.: insert into cuenta values(?,?,?) H Se ejecuta varias veces con valores concretos para los “huecos” n Manejo de Metadatos H Encontrar todas las relaciones de la base de datos y H encontrar los nombres y tipos de las columnas de un resultado de consulta o una relación de la base de datos. n Por defecto, cada sentencia SQL se trata como una transacción, es decir, se confirma automáticamente. H Se puede desactivar la confirmación automática en una conexión 4 SQLSetConnectOption(conn, SQL_AUTOCOMMIT, 0)} H Y las transacciones de deben confirmar o anular entonces explícitamente mediante 4 SQLTransact(conn, SQL_COMMIT) o 4 SQLTransact(conn, SQL_ROLLBACK) Bases de datos 73 Niveles de conformidad ODBC n Los niveles de conformidad especifican subconjuntos de la funcionalidad definida por el estándar. H Core H Nivel 1: requiere soporte de consulta de metadatos H Nivel 2: requiere capacidad para enviar y obtener cadenas de valores de parámetros e información de catálogo más detallada. n El estándar CLI (SQL Call Level Interface) es similar al interfaz ODBC, con pequeñas diferencias. Bases de datos 74 JDBC n JDBC es una API Java para comunicarse con SGBD que soportan SQL n JDBC soporta diversas características para consultar y actualizar datos y para obtener los resultados de consultas n JDBC también soporta la obtención de metadatos, tales como consultas sobre relaciones de la base de datos y sobre los nombres y tipos de los atributos de las relaciones n Modelo para comunicarse con la base de datos: H Abrir una conexión H Crear un objeto “sentencia” H Ejecutar consultas utilizando el objeto Sentencia para enviar consultas y obtener resultados H Mecanismos de excepción para gestionar errores Bases de datos 75 Código JDBC public static void EjemploJDBC(String idusuario, String passwd) { try { Class.forName ("oracle.jdbc.driver.OracleDriver"); Connection conn = DriverManager.getConnection( "jdbc:oracle:thin:@bd.banco.mx:2000:bdbanco", idusuario, passwd); Statement stmt = conn.createStatement(); …Realizar trabajo …. stmt.close(); conn.close(); } catch (SQLException sqle) { System.out.println(“ExcepciónSQL : " + sqle); } } Bases de datos 76 Código JDBC (Cont.) n Actualizar la base de datos try { stmt.executeUpdate( "insert into cuentas values ('A-9732', ‘Centro', 1200)"); } catch (SQLException sqle) { System.out.println(“No se pudo introducir la tupla. " + sqle); } n Ejecutar una consulta y extraer e imprimir los resultados ResultSet rset = stmt.executeQuery( "select nombre_sucursal, avg(saldo) from cuenta group by nombre_sucursal"); while (rset.next()) { System.out.println( rset.getString(“nombre_sucursal") + " " + rset.getFloat(2)); } Bases de datos 77 Detalles del código JDBC n Obtener campos del resultado: H rs.getString(“nombresucursal”) y rs.getString(1) son equivalentes si nombresucursal es el primer argumento del resultado del select. n Tratamiento de valores Null int a = rs.getInt(“a”); if (rs.wasNull()) Systems.out.println(“Obtenido un valor nulo”); Bases de datos 78 Sentencias preparadas n Las sentencias preparadas permiten que las consultas se compilen y ejecuten varias veces con argumentos distintos PreparedStatement pStmt = conn.prepareStatement( “insert into cuenta values(?,?,?)”); pStmt.setString(1, "A-9732"); pStmt.setString(2, “Cenro"); pStmt.setInt(3, 1200); pStmt.executeUpdate(); pStmt.setString(1, "A-9733"); pStmt.executeUpdate(); Bases de datos 79 Arquitecturas de la aplicación n La aplicaciones se pueden construir siguiendo una de las dos arquitecturas siguientes: H Modelo de dos capas 4 El programa de aplicación en la máquina del usuario utiliza directamente JDBC/ODBC para comunicarse con la base de datos H Modelo de tres capas 4 Los usuarios/programas ejecutándose en la máquina del usuario se comunica con una aplicación del servidor. La aplicación del servidor a su vez se comunica con la base de datos Bases de datos 80 Modelo de dos capas n P.e. código Java se ejecuta en la máquina cliente y utiliza JDBC para comunicarse con el servidor n Beneficios: H flexibilidad, no necesita restringirse a consultas predefinidas n Problemas: H Seguridad: las passwords están disponibles en la máquina cliente; se permiten todas las operaciones sobre la base de datos H Más código en el cliente H No apropiado entre organizaciones, o en aquellas grandes como universidades Bases de datos 81 Modelo de tres capas Programa CGI Servidor de Aplicaciones/HTTP Servlets JDBC Servidor de BD HTTP/Protocolo específico de la aplicación Red Cliente Bases de datos Cliente Cliente 82 Modelo de tres capas (Cont.) n P.e. Cliente Web + Servlet Java utilizando JDBC para comunicarse con el servidor de bases de datos n El cliente envía peticiones vía http o un protocolo específico de la aplicación n La aplicación o el servidor Web recibe la petición n La petición la gestiona un programa CGI program o servlets n La seguridad la gestiona la aplicación en el servidor H Mayor seguridad H Seguridad de grado fino n Cliente simple, pero sólo puede hacer transacciones predefinidas Bases de datos 83 Extensiones Procedimentales y Procedimientos Almacenados n SQL proporciona un lenguaje modular H permite definir procedimientos en SQL, con sentencias if-then-else, bucles for y while, etc. n Procedimientos Almacenados H Se pueden almacenar procedimientos en la base de datos H y ejecutarlos mediante la sentencia call H permite a las aplicaciones externas operar sobre la base de datos sin saber nada sobre detalles internos Bases de datos 84 Fin Bases de datos 85