Capítulo 4: SQL
Estructura básica
Operaciones sobre conjuntos
Funciones de agregación
Valores nulos
Subconsultas anidadas
Relaciones derivadas
Vistas
Modificación de la base de datos
Reunión de relaciones
Lenguaje de definición de datos
SQL, ODBC y JDBC incorporados
Fundamentos de bases de datos 3ª Edición 4.1 ©Silberschatz, Korth y Sudarshan
Esquema utilizado en los ejemplos
Fundamentos de bases de datos 3ª Edición 4.2 ©Silberschatz, Korth y Sudarshan
Estructura básica
SQL está basado en operaciones relacionales y de conjunto con
ciertas modificaciones y mejoras
Una consulta característica de SQL tiene la forma:
select A1, A2, ..., An
from r1, r2, ..., rm
where P
Ais representa los atributos
ris representa las relaciones
P es un predicado.
Esta consulta es equivalente a la expresión del álgebra relacional.
A1, A2, ..., An(P (r1 x r2 x ... x rm))
El resultado de una consulta de SQL es una relación.
Fundamentos de bases de datos 3ª Edición 4.3 ©Silberschatz, Korth y Sudarshan
La cláusula select
La cláusula select corresponde a la operación de proyección del álgebra. Se
utiliza para dar la relación de los atributos deseados en el resultado de una
consulta.
Obtener los nombres de todas las sucursales en la relación préstamo
select nombre-sucursal
from préstamo
En la sintaxis del álgebra relacional “puro”, la consulta debería ser: :
nombre-sucursal(préstamo)
Un asterisco en la cláusula select indica “todos los atributos”
select *
from préstamo
NOTA: SQL no permite el carácter ‘-’ en nombres, de forma que se debe
utilizar, por ejemplo, nombre_sucursal en vez de nombre-sucursal en una
implementación real. ¡Utilizamos ‘-’ puesto que parece más bonito!
NOTA: los nombres de SQL son de tipo de letra insensitivo, lo que significa
que se puede utilizar las mayúsculas o minúsculas.
Puede ser deseable utilizar las mayúsculas en los lugares en los que utilizamos la
fuente en negrita.
Fundamentos de bases de datos 3ª Edición 4.4 ©Silberschatz, Korth y Sudarshan
La cláusula select (Cont.)
SQL permite los duplicados en las relaciones además de en los
resultados de la consulta.
Para forzar la eliminación de duplicados, insertar la clave
distinct después de select.
Obtener los nombres de todas las sucursales en las relaciones
préstamos, y anular los duplicados
select distinct nombre-sucursal
from préstamo
La clave all especifica que los duplicados no se han anulado.
select all nombre-sucursal
from préstamo
Fundamentos de bases de datos 3ª Edición 4.5 ©Silberschatz, Korth y Sudarshan
La cláusula select (Cont.)
La cláusula select puede contener expresiones aritméticas que
involucran la operación, +, –, y /, y que funcionan en las constantes o
en los atributos de las tuplas.
La consulta:
select número-préstamo, nombre-sucursal, importe 100
from préstamo
volverá a una relación que es la misma que las relaciones préstamo,
excepto que el atributo importe se multiplica por 100.
Fundamentos de bases de datos 3ª Edición 4.6 ©Silberschatz, Korth y Sudarshan
La cláusula where
La cláusula where corresponde al predicado de la selección del
álgebra relacional. Si consta de un predicado que involucra a los
atributos de las relaciones que aparecen en la cláusula from.
La búsqueda de todos los números de crédito de los préstamos ha
dado como resultado la sucursal Navacerrada con las cantidades de
préstamos mayores a $1200.
select número-préstamo
from préstamo
where nombre-sucursal = ‘Navacerrada’ and importe > 1200
Los resultados de la comparación se pueden combinar utilizando las
conectivas lógicas and, or, y not.
Las comparaciones se pueden aplicar a los resultados de las
expresiones aritméticas.
Fundamentos de bases de datos 3ª Edición 4.7 ©Silberschatz, Korth y Sudarshan
La cláusula where (Cont.)
SQL incluye un operador de comparación between para simplificar
las cláusulas where que especifica que un valor es menor o igual
que un valor y mayor o igual que otro.
Obtener el número de préstamo de aquellos con cantidades de
crédito entre $90,000 y $100,000 (es decir, $90,000 y $100,000)
select número-préstamo
from préstamo
where importe between 90000 and 100000
Fundamentos de bases de datos 3ª Edición 4.8 ©Silberschatz, Korth y Sudarshan
La cláusula from
La cláusula from corresponde a la operación del producto Cartesiano
del álgebra relacional. Hace una lista de las relaciones que se van a
explorar en la evaluación de la expresión.
Buscar el producto cartesiano prestatario x préstamo
select
from prestatario, préstamo
Buscar el nombre, el número de préstamo y la cantidad del préstamo de
todos los clientes que tengan un crédito en la sucursal Navacerrada.
select nombre-cliente, prestatario.número-préstamo, importe
from prestatario, préstamo
where prestatario.número-préstamo = préstamo.número-préstamo
and
nombre-sucursal = ‘Navacerrada’
Fundamentos de bases de datos 3ª Edición 4.9 ©Silberschatz, Korth y Sudarshan
La operación de renombramiento
SQL permite las relaciones y atributos de renombramiento
utilizando la cláusula as:
nombre-antiguo as nombre-nuevo
Obtener el nombre, el número de préstamo y la cantidad del
préstamo de todos los clientes; renombrar el nombre de la
columna número-préstamo como identificación del préstamo.
select nombre-cliente, prestatario.número-préstamo as
identificación del préstamo, importe
from prestatario, préstamo
where prestatario.número-préstamo = préstamo.número-préstamo
Fundamentos de bases de datos 3ª Edición 4.10 ©Silberschatz, Korth y Sudarshan
Variables tupla
Las variables tupla se definen en la cláusula from mediante el uso de
la cláusula as.
Obtener los nombres y números de préstamo de todos los clientes
que tengan un préstamo en alguna sucursal.
select nombre-cliente, T.número-préstamo, [Link]
from prestatario as T, préstamo as S
where T.número-préstamo = S.número-préstamo
Obtener los nombres de todas las sucursales que tengan activos
mayores que las sucursales situadas en Barcelona.
select distinct [Link]-sucursal
from sucursal as T, sucursal as S
where activos de T. > activos de S.
and ciudad-sucursal de S. = ‘Barcelona’
Fundamentos de bases de datos 3ª Edición 4.11 ©Silberschatz, Korth y Sudarshan
Operaciones con cadenas
SQL incluye un operador de coincidencia de cadenas para
comparaciones de cadenas de caracteres. Las configuraciones se
describen utilizando dos caracteres especiales:
Tanto por ciento (%). El carácter % encaja con cualquier subcadena.
Guión bajo (_). El carácter _ encaja con cualquier carácter.
Obtener los nombres de todos los clientes cuyas calles incluyan la
subcadena “Mayor”.
select nombre-cliente
from cliente
where calle-cliente like ‘%Mayor %’
Coincide el nombre “Mayor %”
like ‘Mayor \%’ escape ‘\’
SQL soporta una variedad de operaciones con cadenas como
concatenación (que utiliza “||”)
conversión de mayúscula a inferior (y viceversa)
búsqueda de la longitud de la cadena, extracción de subcadenas, etc.
Fundamentos de bases de datos 3ª Edición 4.12 ©Silberschatz, Korth y Sudarshan
Orden en la presentación de las tuplas
Lista en orden alfabético los nombres de todos los clientes que tengan un
crédito en la sucursal Navacerrada
select distinct nombre-cliente
from prestatario, préstamo
where prestatario número-préstamo - préstamo.número- préstamo
and nombre-sucursal = ‘Navacerrada’
order by nombre-cliente
Se puede especificar la cláusula desc para orden descendente o asc
para orden ascendente, de cada atributo; el orden ascendente es el orden
por defecto.
Por ejemplo order by nombre-cliente desc
Fundamentos de bases de datos 3ª Edición 4.13 ©Silberschatz, Korth y Sudarshan
Duplicados
En las relaciones con duplicados, SQL definir cuantas copias de
las tuplas aparecen en el resultado.
Las versiones multiconjuntos de algunos de los operadores del
álgebra relacional – dadas las relaciones multiconjunto r1 y r2:
1. Si hay c1 copias de la tupla t1 en r1, y t1 satisface las selecciones ,,
entonces hay c1 copias de t1 en (r1).
2. Para cada copia de la tupla t1 en r1, hay una copia de la tupla A(t1)
en A(r1) en la que A(t1) denota la proyección de la tupla singular t1.
3. Si hay c1 copias de la tupla t1 en r1 y c2 copias de la tupla t2 en r2,
hay c1 x c2 copias de la tupla t1. t2 en r1 x r2
Fundamentos de bases de datos 3ª Edición 4.14 ©Silberschatz, Korth y Sudarshan
Duplicados (Cont.)
Ejemplo: Supóngase que las relaciones multiconjunto r1 (A, B)
y r2 (C) son las siguientes:
r1 = {(1, a) (2,a)} r2 = {(2), (3), (3)}
Entonces B(r1) debería ser {(a), (a)}, mientras B(r1) x r2
debería ser
{(a,2), (a,2), (a,3), (a,3), (a,3), (a,3)}
SQL duplica la semántica:
select A1,, A2, ..., An
from r1, r2, ..., rm
where P
es equivalente a la versión multiconjunto de la expresión:
A1,, A2, ..., An(P (r1 x r2 x ... x rm))
Fundamentos de bases de datos 3ª Edición 4.15 ©Silberschatz, Korth y Sudarshan
Operaciones con conjuntos
Las operaciones de conjunto union, intersect, y except operan
sobre relaciones y corresponden a las operaciones de álgebra
relacional
Cada una de las operaciones antes citadas elimina duplicados
automáticamente; para retener todos los duplicados se utilizan
las versiones de multiconjunto correspondientes union all,
intersect all y except all.
Supóngase que una tupla se produce m veces en r y n veces en
s, entonces, se produce:
m + n veces en r union all s
min(m,n) veces en r intersect all s
max(0, m – n) veces en r except all s
Fundamentos de bases de datos 3ª Edición 4.16 ©Silberschatz, Korth y Sudarshan
Operaciones con conjuntos
Obtener todos los clientes que tengan un préstamo, una cuenta, o
ambos:
(select nombre-cliente from impositor)
union
(select nombre-cliente from prestatario)
Obtener todos los clientes que tengan un préstamo y una cuenta.
(select nombre-cliente from impositor)
intersect
(select nombre-cliente from prestatario)
Obtener todos los clientes que tengan una cuenta pero no un
préstamo.
(select nombre-cliente from impositor)
except
(select nombre-cliente from prestatario)
Fundamentos de bases de datos 3ª Edición 4.17 ©Silberschatz, Korth y Sudarshan
Funciones de agregación
Estas funciones operan en el multiconjunto 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
Fundamentos de bases de datos 3ª Edición 4.18 ©Silberschatz, Korth y Sudarshan
Funciones de agregación (Cont.)
Obtener el saldo medio de las cuentas de la sucursal
Navacerrada.
select avg (saldo)
from cuenta
where nombre-sucursal = ‘Navacerrada’
Find the number of tuples in the customer relation.
select count (*)
from cliente
Obtener el número de impositor en el banco.
select count (distinct nombre-cliente)
from impositor
Fundamentos de bases de datos 3ª Edición 4.19 ©Silberschatz, Korth y Sudarshan
Funciones de agregación – Group By
Obtener el número de impositores de cada sucursal.
select nombre-sucursal, count (distinct nombre-cliente)
from impositor, cuenta
where impositor.número-cuenta= cuenta. número-cuenta
group by nombre-sucursal
Nota: Los atributos de la cláusula select fuera de las funciones de
agregación deben aparecer en la lista group by
Fundamentos de bases de datos 3ª Edición 4.20 ©Silberschatz, Korth y Sudarshan
Funciones de agregación –
Cláusula Having
Obtener los nombres de todas las sucursales en las que el saldo
medio de las cuentas es mayor de $1.200.
select nombre-sucursal, avg (saldo)
from cuenta
group by nombre-sucursal
having avg (saldo) > 1200
Nota: los predicados de la cláusula having se aplican después
de la formación de grupos mientras que los predicados de la
cláusula where se aplican antes de la formación de grupos
Fundamentos de bases de datos 3ª Edición 4.21 ©Silberschatz, Korth y Sudarshan
Valores nulos
Es posible que las tuplas tengan un valor nulo, indicado por medio de
null, en alguno de sus atributos
null significa un valor desconocido o que un valor no existe.
El predicado is null se puede utilizar para comprobar los valores nulos.
Por ejemplo, obtener todos los números de préstamos que aparecen en la
relación préstamo con valores nulos para importe.
select número- préstamo
from préstamo
where importe is null
El resultado de la expresión aritmética que involucra a null es nulo
Por ejemplo 5 + null devuelve nulo
Sin embargo, las funciones de agregación simplemente ignoran los
valores nulos
Se ofrecerá más sobre esto en breve
Fundamentos de bases de datos 3ª Edición 4.22 ©Silberschatz, Korth y Sudarshan
Valores nulos y lógica de tres valores
Cualquier comparación con nulo se convierte en desconocido
Por ejemplo 5 < nulo o nulo <> nulo o nulo = nulo
Lógica de tres valores que utiliza el valor real desconocido:
OR: (desconocido or cierto) = cierto, (desconocido or falso) = desconocido
(desconocido or desconocido) = desconocido
AND: (cierto and desconocido) = desconocido, (falso and desconocido) = falso,
(desconocido and desconocido) = desconocido
NOT: (not desconocido) = desconocido
“P is unknown” se evalúa en cierto si el predicado P se evalúa en desconocido
El resultado del predicado de la cláusula where se toma como falso si se
evalúa en desconocido
Fundamentos de bases de datos 3ª Edición 4.23 ©Silberschatz, Korth y Sudarshan
Valores nulos y agregados
El total de todas las cantidades de préstamos
select sum (importe)
from préstamo
la instrucción anterior ignora las cantidades nulas
el resultado es nulo si no hay cantidad no nula, es decir
Todas las operaciones agregadas excepto count(*) ignoran las
tuplas con valores nulos de los atributos agregados.
Fundamentos de bases de datos 3ª Edición 4.24 ©Silberschatz, Korth y Sudarshan
Subconsultas anidadas
SQL proporciona un mecanismo para las subconsultas anidadas.
Una subconsulta es una expresión select-from-where que se
anida dentro de otra consulta.
Un uso común de subconsultas es llevar a cabo comprobaciones
sobre pertenencia a conjuntos, comparación de conjuntos y
cardinalidad de conjuntos.
Fundamentos de bases de datos 3ª Edición 4.25 ©Silberschatz, Korth y Sudarshan
Ejemplo de consulta
Obtener todos los clientes que tengan una cuenta y un préstamo
en el banco.
select distinct nombre-cliente
from prestatario
where nombre-cliente in (select nombre-cliente
from depósitor)
Obtener todos los clientes que tengan un préstamo en el banco
pero que no tengan una cuenta en dicho banco
select distinct nombre-cliente
from prestatario
where nombre-cliente not in (select nombre-cliente
from impositor)
Fundamentos de bases de datos 3ª Edición 4.26 ©Silberschatz, Korth y Sudarshan
Ejemplo de consulta
Obtener todos los clientes que tengan both una cuenta and un préstamo en la
sucursal Navacerrada
select distinct nombre-cliente
from prestatario, préstamo
where prestatario.número-préstamo = préstamo.número-préstamo and
nombre-sucursal = “Navacerrada” and
(nombre-sucursal, nombre-cliente) in
(select nombre-sucursal, nombre-cliente
from impositor, cuenta
where impositor.número-cuenta=
cuenta.número-cuenta)
Nota: Se puede escribir la consulta anterior de forma mucho más simple. La
formulación anterior es simplemente para ilustrar las características de SQL.
(Esquema utilizado en este ejemplo)
Fundamentos de bases de datos 3ª Edición 4.27 ©Silberschatz, Korth y Sudarshan
Comparación de conjuntos
Obtener los nombres de todas las sucursales que tengan activos
mayores que al menos una sucursal situada en Barcelona.
select distinct [Link]-sucursal
from sucursal as T, sucursal as S
where T. activo > [Link] and
S. ciudad-sucursal = ‘Barcelona’
La misma consulta utilizando la cláusula > some
select nombre-sucursal
from sucursal
where activo > some
(select activo
from sucursal
where ciudad-sucursal = ‘Barcelona’)
Fundamentos de bases de datos 3ª Edición 4.28 ©Silberschatz, Korth y Sudarshan
Definition of Some Clause
F <comp> some r t r s.t. (F <comp> t)
Donde <comp> puede ser:
0
(5< some 5 ) = verdadero
(leer: 5 < alguna tupla de la relación)
6
0
(5< some 5 ) = falso
0
(5 = some 5 ) = verdadero
0
(5 some 5 ) = verdadero (ya que 0 5)
(= some) in
Sin embargo, ( some) not in
Fundamentos de bases de datos 3ª Edición 4.29 ©Silberschatz, Korth y Sudarshan
Definition of all Clause
F <comp> all r t r (F <comp> t)
0
(5< all 5 ) = falso
6
6
(5< all 10 ) = verdadero
4
(5 = all 5 ) = falso
4
(5 all 6 ) = verdadero (ya que 5 4 y 5 6)
( all) not in
Sin embargo, (= all) in
Fundamentos de bases de datos 3ª Edición 4.30 ©Silberschatz, Korth y Sudarshan
Consulta ejemplo
Obtener los nombres de todas las sucursales que tienen activos
mayores que todas las sucursales situadas en Barcelona.
select nombre-sucursal
from sucursal
where activo> all
(select activo
from sucursal
where ciudad-sucursal = ‘Barcelona’)
Fundamentos de bases de datos 3ª Edición 4.31 ©Silberschatz, Korth y Sudarshan
Comprobación de relaciones vacías
La constructora exists devuelve el valor true si la subconsulta
argumento no es vacía.
exists r r Ø
not exists r r = Ø
Fundamentos de bases de datos 3ª Edición 4.32 ©Silberschatz, Korth y Sudarshan
Consulta ejemplo
Obtener todos los clientes que tengan una cuenta en todas las
sucursales situadas en Barcelona.
select distinct [Link]-cliente
from impositor as S
where not exists (
(select nombre-sucursal
from sucursal
where ciudad-sucursal = ‘Barcelona’)
except
(select [Link]-sucursal
from impositor as T, cuenta as R
where T.número-cuenta= R.número-cuenta as and
[Link]-cliente = [Link]-cliente))
(Esquema utilizado en este ejemplo)
Téngase en cuenta que X – Y = Ø X Y
Nota: No se puede escribir esta consulta utilizando = all y sus variantes
Fundamentos de bases de datos 3ª Edición 4.33 ©Silberschatz, Korth y Sudarshan
Comprobación de ausencia de tuplas
duplicadas
La constructora unique comprueba si una subconsulta tiene
alguna tupla duplicada en sus resultados.
Obtener todos los clientes que sólo tengan una cuenta en la
sucursal Navacerrada.
select [Link]-cliente
from impositor as T
where unique (
select [Link]-cliente
from cuenta, impositor as R
where [Link]-cliente = [Link]-cliente and
R.número-cuenta= cuenta.número-cuenta and
[Link]-sucursal = ‘Navacerrada’)
(Esquema utilizado en este ejemplo)
Fundamentos de bases de datos 3ª Edición 4.34 ©Silberschatz, Korth y Sudarshan
Consulta ejemplo
Obtener todos los clientes que tengan al menos dos cuentas en
la sucursal Navacerrada.
select distinct [Link]-cliente
from impositor T
where not unique (
select R. nombre-cliente
from cuenta, impositor as R
where [Link]-cliente = [Link]-cliente and
R.número-cuenta= cuenta.número-cuenta and
[Link]-sucursal = ‘Navacerrada’)
(Esquema utilizado en este ejemplo)
Fundamentos de bases de datos 3ª Edición 4.35 ©Silberschatz, Korth y Sudarshan
Vistas
Proporcionan un mecanismo para esconder ciertos datos a la
vista de ciertos usuarios. Para crear una vista se utiliza el
comando:
create view v as <expresión de consulta>
donde:
<expresión de consulta> es cualquier expresión válida
El nombre de la vista se representa por medio de v
Fundamentos de bases de datos 3ª Edición 4.36 ©Silberschatz, Korth y Sudarshan
Consultas ejemplo
Una vista que consta de sucursales y sus clientes
create view todos-los clientes as
(select nombre-sucursal, nombre-cliente
from impositor, cuenta
where impositor.número-cuenta= cuenta.número-cuenta)
union
(select nombre-sucursal, nombre-cliente
from prestatario, préstamo
where prestatario.número- préstamo = préstamo.número- préstamo)
Obtener todos los clientes de la sucursal Navacerrada
select nombre-cliente
from todos-los-clientes
where nombre-sucursal = ‘Navacerrada’
Fundamentos de bases de datos 3ª Edición 4.37 ©Silberschatz, Korth y Sudarshan
Relaciones derivadas
Obtener el saldo promedio de las cuentas en las que dicho saldo
sea mayor de $1200.
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
Téngase en cuenta que no es necesario utilizar la cláusula
having, puesto que se calcula la relación temporal (vista)
resultado en la cláusula from, y los atributos de resultado se
pueden utilizar directamente en la cláusula where.
Fundamentos de bases de datos 3ª Edición 4.38 ©Silberschatz, Korth y Sudarshan
La cláusula with
La cláusula with permite que las vistas se definan localmente
para una consulta, además de globalmente. Es análoga a los
procedimientos de un lenguaje de programación.
Obtener todas las cuentas con el saldo máximo
with saldo-máximo(valor) as
select max (saldo)
from cuenta
select número-cuenta
from cuenta, saldo-máximo
where [Link] = saldo-má[Link]
Fundamentos de bases de datos 3ª Edición 4.39 ©Silberschatz, Korth y Sudarshan
Consulta compleja que utiliza la
cláusula with
Obtener todas las sucursales donde el depósito total de las
cuentas es mayor que la media del total de depósitos de
cuentas en todas las sucursales
with total-sucursal(nombre-sucursal, valor) as
select nombre-sucursal, sum (saldo)
from cuenta
group by nombre-sucursal
with total-media-sucursal(valor) as
select avg (valor)
from total-sucursal
select nombre-sucursal
from total-sucursal, total-media-sucursal
where [Link] >= [Link]
Fundamentos de bases de datos 3ª Edición 4.40 ©Silberschatz, Korth y Sudarshan
Modificación de la base de datos–
Borrado
Borrar todos los registros de cuentas de la sucursal Navacerrada
delete from cuenta
where nombre-sucursal = ‘Navacerrada’
Borrar todas las cuentas de cada sucursal situada en la ciudad de
Navacerrada.
delete from cuenta
where nombre-sucursal in (select nombre-sucursal
from sucursal
where ciudad-sucursal = ‘Navacerrada’)
delete from impositor
where número-cuenta in
(select número-cuenta
from sucursal, cuenta
where ciudad-sucursal = ‘Navacerrada’
and [Link]-sucursal = [Link]-sucursal)
(Esquema utilizado en este ejemplo)
Fundamentos de bases de datos 3ª Edición 4.41 ©Silberschatz, Korth y Sudarshan
Consulta ejemplo
Borrar el registro de todas las cuentas con saldos inferiores a la
media del banco.
delete from cuenta
where saldo < (select avg (saldo)
from cuenta)
Problema: al borrar tuplas de depósito, el saldo medio cambia
La solución utilizada en SQL:
1. Primero, calcular el saldo avg (medio) y buscar todas las tuplas que
se van a borrar
2. Después, borrar todas las tuplas encontradas antes (sin recalcular
avg (media) o recomprobando las tuplas)
Fundamentos de bases de datos 3ª Edición 4.42 ©Silberschatz, Korth y Sudarshan
Modificación de la base de datos–
Inserción
Añadir una nueva tupla a cuenta
insert into cuenta
values (‘A-9732’, ‘Navacerrada’,1200)
o equivalentes
insert into cuenta (nombre-sucursal, saldo, número-cuenta)
values (‘Navacerrada’, 1200, ‘A-9732’)
Añadir una nueva tupla a la cuenta con saldo establecido en
nulo
insert into cuenta
values (‘A-777’,‘Navacerrada’, nulo)
Fundamentos de bases de datos 3ª Edición 4.43 ©Silberschatz, Korth y Sudarshan
Modificación de la base de datos–
Inserción
Se proporciona como regalo a todos los clientes que tengan un préstamo
en la sucursal Navacerrada, una cuenta de ahorro de $200. Permite que
el número de préstamo sirva como número de cuenta de la nueva cuenta
de ahorro
insert into cuenta
select número-préstamo, nombre-sucursal, 200
from préstamo
where nombre-sucursal = ‘Navacerrada’
insert into impositor
select nombre-cliente, número-préstamo
from préstamo, prestatario
where nombre-sucursal = ‘Navacerrada’
and préstamo.número-cuenta= prestatario.número-cuenta
La selección en la que se evalúa la instrucción completamente, es anterior
a que cualquiera de sus resultados se inserte dentro de la relación (de lo
contrario las consultas como
insert into table1 select * from table1
podrían ocasionar problemas).
Fundamentos de bases de datos 3ª Edición 4.44 ©Silberschatz, Korth y Sudarshan
Modificación de la base de datos–
Actualizaciones
Aumentar todas las cuentas con saldos por encima de $10.000 con
el 6%, todas las demás cuentas reciben un 5%.
Escribir dos instrucciones update:
update cuenta
set saldo = saldo 1,06
where saldo > 10000
update cuenta
set saldo = saldo 1,05
where saldo 10000
El orden es importante
Se puede hacer utilizando la instrucción case (siguiente transparencia)
Fundamentos de bases de datos 3ª Edición 4.45 ©Silberschatz, Korth y Sudarshan
Instrucción case para actualizaciones
condicionales
Algunas consultas como la anterior: Aumentan todas las cuentas
con saldos por encima de $10.000 con el 6%, todas las otras
cuentas reciben el 5%.
update cuenta
set saldo = case
when saldo <= 10000 then saldo *1,05
else saldo * 1,06
end
Fundamentos de bases de datos 3ª Edición 4.46 ©Silberschatz, Korth y Sudarshan
Actualización de una vista
Crear una vista de todos los datos de préstamos en la relación
préstamo, ocultando el atributo importe
create view préstamo-sucursal as
select nombre-sucursal, número-préstamo
from préstamo
Añadir una tupla nueva a préstamo-sucursal
insert into préstamo-sucursal
values (‘Navacerrada’, ‘L-307’)
Esta inserción se debe representar mediante la inserción de la tupla
(‘L-307’, ‘Navacerrada’, null)
dentro de la relación préstamo
Las actualizaciones de vistas más complejas son difíciles o imposibles
de traducir, y consecuentemente se desaprueban.
La mayoría de las implementaciones de SQL permiten actualizaciones
sólo de las vistas simples (sin añadidos) definidas en una relación única
Fundamentos de bases de datos 3ª Edición 4.47 ©Silberschatz, Korth y Sudarshan
Transacciones
Una transacción es una secuencia de instrucciones de consulta y
actualizaciones ejecutadas como una unidad singular
Las transacciones se inician implícitamente y se terminan por medio de
commit work: hace que todas las actualizaciones de la transacción sean
permanentes en la base de datos
rollback work: deshace todas las actualizaciones realizadas por la transacción.
Ejemplo de motivación
Transferencia de dinero de una cuenta a otra que implica dos pasos:
Deducir de una cuenta y abonar a la otra
Si uno de los pasos tiene éxito y el otro falla, la base de datos está en un estado
inconsistente
Por lo tanto, deberían tener éxito ambos pasos o no tenerlo ninguno
Si falla alguno de los pasos de una transacción, todo el trabajo hecho por la
transacción se puede deshacer por medio de rollback work.
El retroceso de transacciones incompletas se hace automáticamente, en caso
de fallos en el sistema
Fundamentos de bases de datos 3ª Edición 4.48 ©Silberschatz, Korth y Sudarshan
Transacciones (Cont.)
En la mayoría de los sistemas de bases de datos, cada
instrucción de SQL que se ejecuta con éxito se compromete
automáticamente.
Cada transacción constaría sólo de una única instrucción
El compromiso automático puede desconectarse normalmente,
permitiendo transacciones que consten de varias instrucciones,
pero como hacerlo depende del sistema de la base de datos
Otra opción de SQL:1999: encerrar instrucciones entre
begin atomic
…
end
Fundamentos de bases de datos 3ª Edición 4.49 ©Silberschatz, Korth y Sudarshan
Reunión de relaciones
Las operaciones de reunión toman dos relaciones y las devuelven
como resultado de otra relación.
Estas operaciones adicionales se utilizan generalmente como
expresiones de subconsulta de la cláusula from
Condición de reunión – define que tuplas de las dos relaciones
coinciden, y que atributos están presentes en el resultado de la
reunión.
Tipo de reunión – define como se tratan las tuplas de cada relación
que no coincide con ninguna tupla de la otra relación (basada en la
condición de reunión.
Tipos de reunión Condiciones de reunión
inner join natural
left outer join on <predicado>
right outer join using (A1, A2, ..., An)
full outer join
Fundamentos de bases de datos 3ª Edición 4.50 ©Silberschatz, Korth y Sudarshan
Reunión de relaciones – Conjuntos de
datos para ejemplos
Relación préstamo
número-préstamo nombre-sucursal importe
P-170 Centro 3000
P-230 Moralzarzal 4000
P-260 Navacerrada 1700
Relación prestatario
nombre-cliente número-préstamo
Santos P-170
Gómez P-230
López P-155
Nota: no se tiene la información del prestatario para
P-260 ni la información de préstamo para P-155
Fundamentos de bases de datos 3ª Edición 4.51 ©Silberschatz, Korth y Sudarshan
Reunión de relaciones – Ejemplos
préstamo inner join prestatario on
préstamo.número-préstamo = prestatario.número-préstamo
número-préstamo nombre-sucursal importe nombre-cliente número-préstamo
P-170 Centro 3000 Santos P-170
P-230 Moralzarzal 4000 Gómez P-230
préstamo left inner join prestatario on
préstamo.número-préstamo = prestatario.número-préstamo
número-préstamo nombre-sucursal importe nombre-cliente número-préstamo
P-170 Centro 3000 Santos P-170
P-230 Moralzarzal 4000 Gómez P-230
P-260 Navacerrada 1700 null null
Fundamentos de bases de datos 3ª Edición 4.52 ©Silberschatz, Korth y Sudarshan
Reunión de relaciones – Ejemplos
préstamo natural inner join prestatario
número-préstamo
loan-number
nombre-sucursal
branch-name
importe amount
nombre-cliente
P-170 L-170
Centro Downtown3000 Santos
3000
P-230 MoralzarzalRedwood 4000
L-230 Gómez
4000
préstamo natural right outer join prestatario
número-préstamo nombre-sucursal importe nombre-cliente
P-170 Centro 3000 Santos
P-230 Moralzarzal 4000 Gómez
P-155 null null López
Fundamentos de bases de datos 3ª Edición 4.53 ©Silberschatz, Korth y Sudarshan
Reunión de relaciones – Ejemplos
préstamo full outer join prestatario using (número-préstamo)
número-préstamonombre-sucursal importe nombre-cliente
P-170 Centro 3000 Santos
P-230 Moralzarzal 4000 Gómez
P-260 Navacerrada 1700 null
P-155 null null López
Obtener todos los clientes que tengan una cuenta o un préstamo
(pero no ambos) en el banco.
select nombre-cliente
from (impositor natural full outer join prestatario)
where número-cuenta is null or número-préstamo is null
Fundamentos de bases de datos 3ª Edición 4.54 ©Silberschatz, Korth y Sudarshan
Lenguaje de definición de datos (DDL)
Permite la especificación, no sólo de un conjunto de relaciones, sino
de la información acerca de cada relación, incluyendo:
El esquema de cada relación.
El dominio de valores asociado a cada atributo.
Restricciones de integridad
El conjunto de índices que se van a mantener por cada relación.
Información de seguridad y autorización para cada relación.
La estructura de almacenamiento físico de cada relación en el
disco.
Fundamentos de bases de datos 3ª Edición 4.55 ©Silberschatz, Korth y Sudarshan
Tipos de dominios en SQL
char(n). Cadena de caracteres de longitud fija, con una longitud n especificada por el
usuario.
varchar(n). Cadenas de caracteres de longitud variable, con una longitud máxima n
especificada por el usuario.
int. Entero (un subconjunto finito de los enteros, que es dependiente de la máquina).
smallint. Entero pequeño (un subconjunto de tipo del dominio de los enteros dependiente
de la máquina).
numeric(p,d). Número en coma fijo, con la precisión especificada por el usuario de p
dígitos, con n dígitos a la derecha del punto decimal.
real, double precision. Números en coma flotante y números en coma flotante de doble
precisión, con precisión dependiente de la máquina.
float(n). Número en coma flotante, con precisión especificada por el usuario de al menos
n dígitos.
Los valores nulos se permiten en todos los tipos de dominio. Al declarar un atributo como
not null se prohiben los valores nulos para dicho atributo.
La constructora create domain de SQL-92 crea tipos de dominio definidos por el usuario
create domain nombre-persona char(20) not null
Fundamentos de bases de datos 3ª Edición 4.56 ©Silberschatz, Korth y Sudarshan
Tipos date/time en SQL (Cont.)
date. Fechas, contiene un año (4 dígitos), mes y día
Por ejemplo date ‘2001-7-27’
time. Hora del día, en horas, minutos y segundos.
Por ejemplo time ’09:00:30’ time ’09:00:30.75’
timestamp: fecha y hora del día
Por ejemplo timestamp ‘2001-7-27 09:00:30.75’
interval: periodo de tiempo
Por ejemplo interval ‘1’ día
Al substraer un valor de fecha/hora/fecha y hora de otro da un valor de intervalo
Los valores del intervalo se pueden añadir a los valores de date/time/timestamp
Puede extraer valores de campos individuales de date/time/timestamp
Por ejemplo extract (year from [Link])
Puede fundir tipos de cadenas a date/time/timestamp
Por ejemplo cast <expresión-valor-cadena> as date
Fundamentos de bases de datos 3ª Edición 4.57 ©Silberschatz, Korth y Sudarshan
Constructora create table
Una relación SQL se define utilizando el comando create
table:
create table r (A1 D1, A2 D2, ..., An Dn,
(restricción-integridad1),
...,
(restricción-integridadk))
r es el nombre de la relación
cada Ai es un nombre de un atributo del esquema de relación r
Di es el tipo de datos de los valores en el domino del atributo Ai
Ejemplo:
create table sucursal
(nombre-sucursal char(15) not null,
ciudad-sucursal char (30),
activo integer)
Fundamentos de bases de datos 3ª Edición 4.58 ©Silberschatz, Korth y Sudarshan
Restricciones de integridad de create
table
not null
primary key (A1, ..., An)
check (P), donde P es un predicado
Ejemplo: Declarar nombre-sucursal como clave primaria
de sucursal y asegurar que los valores de activos son
positivos.
create table sucursal
(nombre-sucursal char(15),
ciudad-sucursal char(30)
activos integer,
primary key (nombre-sucursal),
check (activos >= 0))
La declaración como clave primaria de un atributo asegurando
not null en SQL-92 y siguientes, necesita especificarse
explícitamente en SQL-89
Fundamentos de bases de datos 3ª Edición 4.59 ©Silberschatz, Korth y Sudarshan
Constructoras drop y after table
La orden drop table borra toda la información sobre la relación
eliminada de la base de datos.
La orden after table se utiliza para añadir atributos a una
relación existente. A todas las tuplas de la relación se les
asigna nulo como el valor del atributo nuevo. La forma del
comando alter table es
alter table r add A D
donde A es el nombre del atributo que se va a añadir a la
relación r y D es el dominio de A.
La orden alter table puede utilizarse también para eliminar
atributos de una relación
alter table r drop A
donde A es el nombre de un atributo de relación r
La eliminación de atributos no la soportan muchas bases de datos
Fundamentos de bases de datos 3ª Edición 4.60 ©Silberschatz, Korth y Sudarshan
SQL incorporado
El estándar SQL define incorporaciones de SQL en una
variedad de lenguajes de programación tales como Pascal, PL/I,
Fortran, C y Cobol.
Un lenguaje al que se incorporan consultas SQL se denomina
lenguaje host (anfitrión), y las estructuras SQL permitidas en el
lenguaje anfitrión constituyen el SQL incorporado.
La forma básica de estos lenguajes es la continuación del
Sistema R incorporando SQL dentro de PL/I.
La instrucción EXEC SQL se utiliza para identificar la petición
del SQL incorporado al procesador anterior
EXEC SQL <instrucción SQL incorporado > END-EXEC
Nota: esto varía según el lenguaje. Por ejemplo el lenguaje
Java incorporado utiliza # SQL { …. } ;
Fundamentos de bases de datos 3ª Edición 4.61 ©Silberschatz, Korth y Sudarshan
Consulta ejemplo
Desde un lenguaje anfitrión, obtener los nombres y las
cuidades de los clientes con una cantidad superior a la
variable importe en alguna cuenta.
Especificar la consulta en SQL y declarar un cursor para ello
EXEC SQL
select nombre-cliente, ciudad-cliente
from impositor, cliente, cuenta
where [Link]-cliente = [Link]-cliente
and impositor número-cuenta= cuenta.número-cuenta
and [Link] > :importe
END-EXEC
Fundamentos de bases de datos 3ª Edición 4.62 ©Silberschatz, Korth y Sudarshan
SQL incorporado (Cont.)
La instrucción open ocasiona la consulta que se va a evaluar
EXEC SQL open c END-EXEC
La instrucción fetch ocasiona los valores de una tupla en el resultado de la consulta
que va a tener lugar en las variables del lenguaje anfitrión.
EXEC SQL fetch c into :cn, :cc END-EXEC
Las llamadas repetidas a fetch obtienen tuplas sucesivas del resultado de la consulta
Una variable llamada SQLSTATE del área de comunicación de SQL, (SQLCA)
consigue establecer a ‘02000’ para indicar que no están disponibles más datos
La instrucción close ocasiona que el sistema de la base de datos borre la relación
temporal que mantiene el resultado de la consulta.
EXEC SQL close c END-EXEC
Nota: los detalles anteriores varían según el lenguaje. Por ejemplo el lenguaje Java
incorporado define iteradores de Java para avanzar a través de las tuplas de
resultados.
Fundamentos de bases de datos 3ª Edición 4.63 ©Silberschatz, Korth y Sudarshan
Actualizaciones por medio de cursores
Puede actualizar tuplas tomadas con el cursos declarando que
el cursor es para actualizar
declare c cursor for
select *
from cuents
where nombre-sucursal = ‘Navacerrada’
for update
Para actualizar la tuple en la ubicación actual del cursor
update cuenta
set saldo = saldo + 100
where current of c
Fundamentos de bases de datos 3ª Edición 4.64 ©Silberschatz, Korth y Sudarshan
SQL dinámico
Permite que los programas se construyan y se hagan consultas de
SQL en tiempo de ejecución.
Ejemplo del uso del SQL dinámico desde dentro de un programa en
C.
char * prog_sql = “update cuenta
set saldo = saldo * 1.05
where número-cuenta= ?”
EXEC SQL prepare prog_din from :prog_sql;
char cuenta [10] = “A-101”;
EXEC SQL execute prog_din using :cuenta;
El programa de SQL dinámico contiene una interrogación “? ”, que es
una variable que se proporciona cuando se ejecuta el programa SQL.
Fundamentos de bases de datos 3ª Edición 4.65 ©Silberschatz, Korth y Sudarshan
ODBC
Estándar de Open Database Connectivity (ODBC, Conectividad
abierta de base de datos)
estándar del programa de aplicación para comunicarse con un
servidor de bases de datos.
Application Program Interface (API, Interfaz para programas de
aplicación) para
abrir una a conexión con una base de datos,
enviar consultas y actualizaciones,
obtener resultados.
Las aplicaciones tales como GUI, hojas de cálculo, etc. pueden
utilizar ODBC
Fundamentos de bases de datos 3ª Edición 4.66 ©Silberschatz, Korth y Sudarshan
ODBC (Cont.)
Cada sistema de bases de datos que sea compatible con ODBC proporciona
una biblioteca "controladora" que debe enlazarse con el programa cliente.
Cuando el programa cliente realiza una llamada a API ODBC, el código de la
biblioteca se comunica con el servidor para realizar la acción solicitada y
obtener los resultados.
El programa ODBC asigna en primer lugar un entorno SQL, después un
manejador para la conexión a la base de datos.
Abre la conexión a la base de datos utilizando SQLConnect(). Los
parámetros para SQLConnect son:
manejador de conexión,
el servidor al que se conecta
el identificador de usuario,
contraseña
También debe especificar los tipos de argumentos:
SQL_NTS indica que un argumento previo es una cadena no terminada.
Fundamentos de bases de datos 3ª Edición 4.67 ©Silberschatz, Korth y Sudarshan
Código ODBC
int ODBCexample()
{
RETCODE error;
HENV env; /* entorno */
HDBC conn; /* conexión de la base de datos */
SQLAllocEnv(&env);
SQLAllocConnect(env, &conn);
SQLConnect(conn, "[Link]", SQL_NTS, "avi", SQL_NTS,
"avipasswd", SQL_NTS);
{ …. Hacer el trabajo real … }
SQLDisconnect(conn);
SQLFreeConnect(conn);
SQLFreeEnv(env);
}
Fundamentos de bases de datos 3ª Edición 4.68 ©Silberschatz, Korth y Sudarshan
Código ODBC (Cont.)
El programa envía comandos de SQL a la base de datos utilizando SQLExecDirect
Se obtienen tuplas de resultado utilizando SQLFetch()
SQLBindCol() aglutina las variables del lenguaje C en atributos del resultado de la
consulta
Cuando se obtiene una tupla, sus valores de atributos se almacenan automáticamente en
las variables C correspondientes.
Argumentos de SQLBindCol()
– La variable stmt de ODBC, posición de atributo en resultados de consulta
– La conversión de tipo de SQL a C.
– La dirección de la variable.
– Para tipos de longitud variable como arrays de caracteres,
» La longitud máxima de la variable
» Ubicación para almacenar la longitud real cuando se obtengan tuplas.
» Nota: Un valor negativo devuelto en el campo de longitud indica que el valor es nulo
Una buena programación requiere que se comprueben los resultados de cada función
para asegurarse de que no hay errores; se han omitido la mayoría de las comprobaciones
por brevedad.
Fundamentos de bases de datos 3ª Edición 4.69 ©Silberschatz, Korth y Sudarshan
Código ODBC (Cont.)
Cuerpo principal del programa
char nombresucursal [80];
float saldo;
int lenOut1, lenOut2;
HSTMT stmt;
SQLAllocStmt(conn, &stmt);
char * consulta sql = "select nombre_sucursal, sum (saldo)
from cuenta
group by nombre_sucursal";
error = SQLExecDirect(stmt, consulta sql, SQL_NTS);
if (error == SQL_SUCCESS) {
SQLBindCol(stmt, 1, SQL_C_CHAR, nombresucursal , 80, &lenOut1);
SQLBindCol(stmt, 2, SQL_C_FLOAT, &saldo, 0 , &lenOut2);
while (SQLFetch(stmt) >= SQL_SUCCESS) {
printf (" %s %g\n", nombresucursal, saldo);
}
}
SQLFreeStmt(stmt, SQL_DROP);
Fundamentos de bases de datos 3ª Edición 4.70 ©Silberschatz, Korth y Sudarshan
Más características de ODBC
Instrucciones prepared
Instrucción SQL prepared: compilada en la base de datos
Puede tener resguardos: por ejemplo insertar dentro de los valores de la
cuenta(?,?,?)
Ejecutadas repetidamente con valores reales para los resguardos
Características de metadatos
hallar todas las relaciones en la base de datos y
hallar los nombres y tipos de las columnas del resultado de una consulta o una
relación de la base de datos.
Por defecto, cada instrucción SQL se trata como una transacción separada
que se compromete automáticamente.
Puede desactivar el compromiso automático en una conexión
SQLSetConnectOption(conn, SQL_AUTOCOMMIT, 0)}
las transacciones se deben comprometer o retroceder explícitamente mediante
SQLTransact(conn, SQL_COMMIT) o
SQLTransact(conn, SQL_ROLLBACK)
Fundamentos de bases de datos 3ª Edición 4.71 ©Silberschatz, Korth y Sudarshan
Niveles de acuerdo de ODBC
Los niveles de acuerdo especifican subconjuntos de la
funcionalidad definida por el estándarstandard.
Básico
El Nivel1 requiere soporte para la consulta de metadatos
El Nivel2 requiere la capacidad de enviar y obtener arrays de
valores de parámetros y para obtener información del catálogo más
detallada.
El estándar del Interfaz en el Call Level Interface (CLI, Interfaz
en el nivel de llamada) de SQL es similar a la interfaz de ODBC,
pero con algunas pequeñas diferencias.
Fundamentos de bases de datos 3ª Edición 4.72 ©Silberschatz, Korth y Sudarshan
JDBC
JDBC es una API de Java para comunicarse con sistemas de
base de datos que soportan SQL
JDBC soporta una variedad de características de consulta y
actualización de datos, y de recuperación de resultados de
consultas
JDBC también soporta recuperación de metadatos, tales como
consulta sobre relaciones presentes en la base de datos y los
nombres y tipos de atributos de relación
Modelo para comunicar con la base de datos:
Abrir una conexión
Crear un objeto de “instrucción”
Ejecutar consultas utilizando el objeto de Instrucción para enviar
consultas y resultados de extracciones
Mecanismo de excepción para manejar los errores
Fundamentos de bases de datos 3ª Edición 4.73 ©Silberschatz, Korth y Sudarshan
Código JDBC
public static void ejemploJDBC(String iddb, String idusuario, String contraseña)
{
try {
[Link] ("[Link]");
Connection conn = [Link]( "jdbc:oracle:thin:@[Link]-
[Link]:dbbanco", idusuario, contraseña);
Statement stmt = [Link]();
… Hacer el trabajo real ….
[Link]();
[Link]();
}
catch (SQLException sqle) {
[Link]("SQLException : " + sqle);
}
}
Fundamentos de bases de datos 3ª Edición 4.74 ©Silberschatz, Korth y Sudarshan
Código JDBC (Cont.)
Actualiza la base de datos
try {
[Link]( "inserta en los valores de la cuenta
('A-9732', ’Navacerrada', 1200)");
} catch (SQLException sqle) {
[Link](”No se pudo insertar la tupla. " + sqle);
}
Ejecuta la consulta y extrae e imprime los resultados
ResultSet rset = [Link]( ”elegir nombre-sucursal, avg(saldo)
from cuenta
group by nombre-sucursal");
while ([Link]()) {
[Link](
[Link]("nombre-sucursal") + " " + [Link](2));
Fundamentos de bases de datos 3ª Edición 4.75 ©Silberschatz, Korth y Sudarshan
Detalles del código JDBC
Obtiene campos de resultados:
[Link](“nombresucursal”) y [Link](1) son equivalentes si
el nombre de la sucursal es el primer argumento del resultado
seleccionado.
Trata con valores nulos
int a = [Link](“a”);
if ([Link]()) [Link](“Obtuvo valor nulo”);
Fundamentos de bases de datos 3ª Edición 4.76 ©Silberschatz, Korth y Sudarshan
Instrucción prepared
La instrucción preparada permite consultas que se van a recopilar y
ejecutar muchas veces con argumentos distintos
PreparedStatement pStmt = [Link](
“insert into cuenta values(?,?,?)”);
[Link](1, "A-9732");
[Link](2, ”Navacerrada");
[Link](3, 1200);
[Link]();
[Link](1, "A-9733");
[Link]();
NOTA: ¡Si el valor que se va a almacenar en la base de datos contiene
unas comillas simples u otro carácter especial, las instrucciones
preparadas funcionan bien, pero si crean una cadena y la ejecutan
directamente podría producirse un error de sintaxis!
Fundamentos de bases de datos 3ª Edición 4.77 ©Silberschatz, Korth y Sudarshan
Otras características de SQL
Sesiones de SQL
el cliente se conecta a un servidor SQL, estableciendo
una sesión
ejecuta una serie de instrucciones
desconecta la sesión
puede comprometer o retroceder el trabajo realizado en
la sesión
Un entorno SQL contiene varios componentes,
incluyendo un identificador de usuario, y un esquema,
que identifica cual de los distintos esquemas está
utilizando una sesión.
Fundamentos de bases de datos 3ª Edición 4.78 ©Silberschatz, Korth y Sudarshan
Esquemas, catálogos y entornos
Jerarquía de tres niveles para denominar las relaciones.
la base de datos contiene múltiples catálogos
cada catálogo puede contener múltiples esquemas
los objetos SQL tales como las relaciones y las vistas están contenidos
en un esquema
por ejemplo catá[Link]
Cada usuario tiene un catálogo y un esquema por defecto, y la
combinación es única para dicho usuario.
Se establece para una conexión el catálogo y el esquema por
defecto.
El catálogo y el esquema pueden omitirse, se asumen los valores
por defecto.
Pueden funcionar bajo esquemas separados, múltiples versiones de
una aplicación (por ejemplo producción y prueba).
Fundamentos de bases de datos 3ª Edición 4.79 ©Silberschatz, Korth y Sudarshan
Extensiones procedimentales y
procedimientos almacenados
SQL proporciona un lenguaje de módulos
permite definir los procedimientos en SQL, con instrucciones if-then-
else, bucles for y while, etc.
véase con mayor detalle en el Capitulo 9
Procedimientos almacenados
Pueden almacenar procedimientos en la base de datos
Después los ejecutan utilizando la instrucción call
Permiten aplicaciones externas para operar en la base de datos sin
conocer detalles internos
Estas características aparecen descritas en el Capítulo 9 (Bases
de datos relacionales orientadas a objetos)
Fundamentos de bases de datos 3ª Edición 4.80 ©Silberschatz, Korth y Sudarshan
Material extra de JDBC y arquitecturas
de aplicación
Transacciones en JDBC
Como con ODBC, en JDBC cada instrucción se compromete
automáticamente
Para desactivar auto compromiso utilizar
conn . setAutoCommit (falso);
Para comprometer o abortar las transacciones utilizar
conn .commit() o conn .rollback()
Para activar auto compromiso de nuevo, utilizar
conn . setAutoCommit (falso);
Fundamentos de bases de datos 3ª Edición 4.82 ©Silberschatz, Korth y Sudarshan
Llamadas de procedimiento y
funcionales en JDBC
JDBC proporciona una clase de Instrucción de Llamada que permite que
se invoquen los procedimientos/funciones almacenados de SQL.
Instrucción de Llamadacs2 = [Link]( “{call proc (?,?)}” ) ;
Instrucción de Llamadacs2 = [Link]( “{? = call func
(?,?)}” );
Fundamentos de bases de datos 3ª Edición 4.83 ©Silberschatz, Korth y Sudarshan
Metadatos del conjunto de resultados
La clase ResultSetMetaData proporciona información sobre
todas las columnas de ResultSet.
Se consigue un ejemplo de esta clase por medio de la función
getMetaData( ) de ResultSet.
Proporciona las Funciones para obtener número de columnas,
nombre de columnas, tipo, precisión, escala, tablas de las que
se derivan las columnas etc.
ResultSetMetaData rsmd = [Link] ( );
for ( int i = 1; i <= [Link]( ); i++ ) {
String name = [Link](i);
String typeName = [Link](i);
}
Fundamentos de bases de datos 3ª Edición 4.84 ©Silberschatz, Korth y Sudarshan
Metadatos de la base de datos
La clase DatabaseMetaData proporciona información sobre las relaciones de las bases de
datos
Tiene funciones de obtención de tablas, todas las columnas de la tabla, claves primarias etc.
Por ejemplo para imprimir nombres de columnas y tipos de una relación
DatabaseMetaData dbmd = [Link]( );
ResultSet rs = [Link]( null, “DB-BANCO”, “cuenta”, “%” );
//Argumentos: catálogo, configuración-esquema, configuración-tabla, configuración
columna
// Retornos: 1 fila por cada columna, con varios atributos como
// COLUMNA_NOMBRE, TIPO_NOMBRE, etc.
while ( [Link]( ) ) {
[Link]( [Link](“COLUMNA_NOMBRE”) ,
[Link](“TIPO_NOMBRE”);
}
Hay también funciones para obtener información como
Referencias de clave externa en el esquema
Límites de bases de datos como tamaño máximo de la fila, máximo no. de conexiones, etc
Fundamentos de bases de datos 3ª Edición 4.85 ©Silberschatz, Korth y Sudarshan
Arquitecturas de aplicación
Se pueden construir aplicaciones utilizando uno de las dos
construcciones
Modelo de dos niveles
El programa de aplicación que funciona en el sitio del usuario
directamente utiliza JDBC/ODBC para comunicarse con la base
de datos
Modelo de tres niveles
Los usuarios/programas que funcionan en los sitios del usuario
se comunican con un servidor de la aplicación. El servidor de la
aplicación de vuelta se comunica con la base de datos
Fundamentos de bases de datos 3ª Edición 4.86 ©Silberschatz, Korth y Sudarshan
Modelo de dos niveles
Por ejemplo el código Java funciona en sitios de clientes y utiliza
JDBC para comunicarse con el servidor de retorno
Beneficios:
flexible, no necesita restringirse a consultas predefinidas
Problemas:
Seguridad: contraseñas disponibles en el sitio de clientes, son
posibles todas las operaciones de la base de datos
Más códigos enviados a los clientes
No es apropiado para organizaciones, o para grandes superficies
como las universidades
Fundamentos de bases de datos 3ª Edición 4.87 ©Silberschatz, Korth y Sudarshan
Modelo de tres niveles
Programa CGI
Servidor de JDBC Servidor de
Servlets base de datos
aplicación/HTTP
Protocolo específico de la aplicación/HTTP
Red
Cliente Cliente Cliente
Fundamentos de bases de datos 3ª Edición 4.88 ©Silberschatz, Korth y Sudarshan
Modelo de tres niveles (Cont.)
Por ejemplo Web client + Java Servlet utilizan JDBC para
comunicarse con el servidor de la base de datos
Los clientes envían peticiones en http o el protocolo de
especificación de la aplicación
La aplicación o el servidor Web recibe la petición
La petición se maneja mediante el programa CGI o con servlets
La seguridad se controla por medio de la aplicación del servidor
Mejor seguridad
Seguridad de granularidad precisa
Cliente único, pero sólo transacciones empaquetadas
Fundamentos de bases de datos 3ª Edición 4.89 ©Silberschatz, Korth y Sudarshan
Fin del Capítulo
Las relaciones préstamo y prestatario
Fundamentos de bases de datos 3ª Edición 4.91 ©Silberschatz, Korth y Sudarshan
Resultado de préstamo inner join
prestatario sobre préstamo.número-
préstamo = prestatario. número-
préstamo
Fundamentos de bases de datos 3ª Edición 4.92 ©Silberschatz, Korth y Sudarshan
Resultado de préstamo left outer join
prestatario sobre número-préstamo
Fundamentos de bases de datos 3ª Edición 4.93 ©Silberschatz, Korth y Sudarshan
Resultado de préstamo natural inner
join prestatario
Fundamentos de bases de datos 3ª Edición 4.94 ©Silberschatz, Korth y Sudarshan
Tipos y condiciones de reunión
Fundamentos de bases de datos 3ª Edición 4.95 ©Silberschatz, Korth y Sudarshan
Resultado de préstamo natural right
outer join prestatario
Fundamentos de bases de datos 3ª Edición 4.96 ©Silberschatz, Korth y Sudarshan
Resultado de préstamo full outer join
prestatario utilizando
(número-préstamo)
Fundamentos de bases de datos 3ª Edición 4.97 ©Silberschatz, Korth y Sudarshan
Definición de datos de SQL para la parte de la base de
datos de bancos
Fundamentos de bases de datos 3ª Edición 4.98 ©Silberschatz, Korth y Sudarshan