Professional Documents
Culture Documents
Bases de datos 1
Esquema utilizado en los ejemplos
prestamo prestatario
numero-prestamo nombre-cliente
nombre-sucursal numero-prestamo
cantidad
Bases de datos 2
Lenguaje de definición de datos (DDL)
Bases de datos 3
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
Bases de datos 4
Tipos de Fecha/Hora en SQL (Cont.)
Bases de datos 5
Comando Create Table
Bases de datos 7
Comandos Drop y Alter Table
Bases de datos 9
Integridad referencial en el modelo E-A
E1 R E2
Bases de datos 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)
Bases de datos 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
Bases de datos 13
La cláusula select
Bases de datos 14
La clausula select (Cont.)
Bases de datos 15
La clausula select (Cont.)
Bases de datos 16
La clausula where
Bases de datos 17
La clausula where (Cont.)
Bases de datos 18
La clausula from
Bases de datos 19
La operación de renombrado
Bases de datos 20
Variables de tupla
Bases de datos 21
Operaciones sobre cadenas de caracteres
Bases de datos 22
Ordenar las tuplas obtenidas
Bases de datos 23
Operaciones de conjuntos
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
Bases de datos 26
Funciones agregadas (Cont.)
Bases de datos 27
Funciones agregadas – Group By
Bases de datos 28
Funciones agregadas – cláusula Having
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
Bases de datos 32
Subconsultas anidadas
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)
Bases de datos 34
Ejemplo
n Encontrar todos los clientes que tiene tanto una cuenta como un
préstamo en la sucursal de Vigo
select distinct nombre-cliente
from prestatario, prestamo
where prestatario.numero-prestamo = prestamo.numero-prestamo
and nombre-sucursal = “Vigo”
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
select nombre-sucursal
from sucursal
where activos > some
(select activos
from sucursal
where ciudad-sucursal = ‘Madrid’)
Bases de datos 36
Definición de la cláusula Some
0
(5< some 5 ) = true
(leer: 5 < some tupla de la relación)
6
0
(5< some 5 ) = false
0
(5 = some 5 ) = 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
0
(5< all 5 ) = false
6
6
(5< all 10 ) = true
4
(5 = all 5 ) = 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
select nombre-sucursal
from sucursales
where activos > all
(select activos
from sucursas
where ciudad-sucursal = ‘Madrid’)
Bases de datos 39
Comprobación de relaciones vacías
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 = ‘Madrid’)
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 de Vigo.
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 = ‘Vigo’
Bases de datos 42
Consulta de ejemplo
Bases de datos 43
Vistas
donde:
H <consulta> es cualquier expresión legal
H El nombre de la vista es v
Bases de datos 44
Ejemplo
select nombre-cliente
from clientes-sucursal
where nombre-sucursal = ‘Vigo’
Bases de datos 45
Relaciones derivadas
Bases de datos 46
Cláusula With
Bases de datos 47
Consultas complejas con la cláusula With
Bases de datos 48
Modificación de datos – Borrado
n Borrar todas las cuentas de la sucursal de Vigo
delete from cuenta
where nombre-sucursal = ‘Vigo’
n Borrar todas las cuentas de todas las sucursales de Madrid.
delete from cuenta
where nombre-sucursal in (select nombre-sucursal
from sucursal
where ciudad-sucursal = ‘Madrid’)
delete from depositante
where numero-cuenta in
(select numero-cuenta
from sucursal, cuenta
where ciudad-sucursal = ‘Madrid’
and sucursal.nombre-sucursal = cuenta.nombre-
sucursal)
Bases de datos 49
Ejemplo de borrado
n Borrar todas las cuentas con saldos por debajo de la media del
banco.
Bases de datos 50
Modificación de Datos - Inserción
n Añadir una nueva tupla a cuenta
insert into cuenta
values (‘A-9732’, ‘Vigo’,1200)
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 Vigo una nueva cuenta de ahorro con 200 euros 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 = ‘Vigo’
insert into depositante
select nombre-cliente, numero-prestamo
from prestamo, prestatario
where nombre-sucursal = ‘Vigo’
and prestamo.numero-cuenta = prestatario.numero-
cuenta
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 euros 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 euros 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 (‘Vigo’, ‘L-307’)
Esta inserción se debe transformar en la inserción de la tupla
(‘L-307’, ‘Vigo’, 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 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.)
Bases de datos 57
Relaciones unidas (join)
Bases de datos 58
Relaciones unidas – Datos para los
ejemplos
n Relación prestamo
n Relación prestatario
nombre-cliente numero-prestamo
Fernández L-170
Suárez L-230
López L-155
Bases de datos 59
Relaciones unidas - Ejemplos
Bases de datos 60
Relaciones unidas - Ejemplos
Bases de datos 61
Relaciones unidas - Ejemplos
Bases de datos 62
SQL embebido
Bases de datos 63
Ejemplo de consulta
Bases de datos 64
SQL embebido (Cont.)
Bases de datos 65
Actualizaciones mediante cursores
Bases de datos 66
SQL dinámico
Bases de datos 67
ODBC
Bases de datos 68
ODBC (Cont.)
n Cada SGBD que soporta ODBC proporciona una librería "driver" que se
debe enlazar con el programa cliente.
n 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.
n El programa ODBC primero asigna un entorno SQL y, a continuacíón,
un manejador de conexión a base de datos.
n 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
n 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.det.uvigo.es", SQL_NTS, “mramos",
SQL_NTS, “mramospass", SQL_NTS);
{ …. Realizamos el trabajo … }
SQLDisconnect(conn);
SQLFreeConnect(conn);
SQLFreeEnv(env);
}
Bases de datos 70
Código ODBC (Cont.)
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
Bases de datos 74
JDBC
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.uvigo.es: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', ‘Vigo', 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
Bases de datos 78
Sentencias preparadas
pStmt.setString(1, "A-9733");
pStmt.executeUpdate();
Bases de datos 79
Arquitecturas de la aplicación
Bases de datos 80
Modelo de dos capas
Bases de datos 81
Modelo de tres capas
Programa CGI
Red
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