0% encontró este documento útil (0 votos)
59 vistas98 páginas

Cap04. SQL

Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PPT, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
59 vistas98 páginas

Cap04. SQL

Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PPT, PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 98

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, S.importe
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 T.nombre-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 T.nombre-sucursal
from sucursal as T, sucursal as S
where T. activo > S.activo 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 S.nombre-cliente
from impositor as S
where not exists (
(select nombre-sucursal
from sucursal
where ciudad-sucursal = ‘Barcelona’)
except
(select R.nombre-sucursal
from impositor as T, cuenta as R
where T.número-cuenta= R.número-cuenta as and
S.nombre-cliente = T.nombre-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 T.nombre-cliente
from impositor as T
where unique (
select R.nombre-cliente
from cuenta, impositor as R
where T.nombre-cliente = R.nombre-cliente and
R.número-cuenta= cuenta.número-cuenta and
cuenta.nombre-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 T.nombre-cliente


from impositor T
where not unique (
select R. nombre-cliente
from cuenta, impositor as R
where T.nombre-cliente = R.nombre-cliente and
R.número-cuenta= cuenta.número-cuenta and
cuenta.nombre-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 cuenta.saldo = saldo-máximo.valor

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 total-sucursal.valor >= total-media-sucursal.valor

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 sucursal.nombre-sucursal = cuenta.nombre-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 r.horadeinicio)
 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 impositor.nombre-cliente = cliente.nombre-cliente
and impositor número-cuenta= cuenta.número-cuenta
and cuenta.saldo > :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, "aura.bell-labs.com", 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 {
Class.forName ("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection( "jdbc:oracle:thin:@aura.bell-
labs.com:2000:dbbanco", idusuario, contraseña);
Statement stmt = conn.createStatement();
… Hacer el trabajo real ….
stmt.close();
conn.close();
}
catch (SQLException sqle) {
System.out.println("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 {
stmt.executeUpdate( "inserta en los valores de la cuenta
('A-9732', ’Navacerrada', 1200)");
} catch (SQLException sqle) {
System.out.println(”No se pudo insertar la tupla. " + sqle);
}
 Ejecuta la consulta y extrae e imprime los resultados
ResultSet rset = stmt.executeQuery( ”elegir nombre-sucursal, avg(saldo)
from cuenta
group by nombre-sucursal");
while (rset.next()) {
System.out.println(
rset.getString("nombre-sucursal") + " " + rset.getFloat(2));

Fundamentos de bases de datos 3ª Edición 4.75 ©Silberschatz, Korth y Sudarshan


Detalles del código JDBC
 Obtiene campos de resultados:
 rs.getString(“nombresucursal”) y rs.getString(1) son equivalentes si
el nombre de la sucursal es el primer argumento del resultado
seleccionado.
 Trata con valores nulos
int a = rs.getInt(“a”);
if (rs.wasNull()) Systems.out.println(“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 = conn.prepareStatement(
“insert into cuenta values(?,?,?)”);
pStmt.setString(1, "A-9732");
pStmt.setString(2, ”Navacerrada");
pStmt.setInt(3, 1200);
pStmt.executeUpdate();

pStmt.setString(1, "A-9733");
pStmt.executeUpdate();
 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álogo5.esquema-banco.cuenta
 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 = conn.prepareCall( “{call proc (?,?)}” ) ;
Instrucción de Llamadacs2 = conn.prepareCall( “{? = 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 = rs.getMetaData ( );
for ( int i = 1; i <= rsmd.getColumnCount( ); i++ ) {
String name = rsmd.getColumnName(i);
String typeName = rsmd.getColumnTypeName(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 = conn.getMetaData( );
ResultSet rs = dbmd.getColumns( 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 ( rs.next( ) ) {
System.out.println( rs.getString(“COLUMNA_NOMBRE”) ,
rs.getString(“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

También podría gustarte