Está en la página 1de 36

Silberschatz, Korth y Sudarshan 4.

1 Fundamentos de bases de datos 3 Edicin


Captulo 4: SQL
Estructura bsica
Operaciones sobre conjuntos
Funciones de agregacin
Valores nulos
Subconsultas anidadas
Relaciones derivadas
Vistas
Modificacin de la base de datos
Reunin de relaciones
Lenguaje de definicin de datos
SQL, ODBC y JDBC incorporados
Silberschatz, Korth y Sudarshan 4.2 Fundamentos de bases de datos 3 Edicin
Esquema utilizado en los ejemplos
Silberschatz, Korth y Sudarshan 4.3 Fundamentos de bases de datos 3 Edicin
Estructura bsica
SQL est basado en operaciones relacionales y de conjunto
con ciertas modificaciones y mejoras
Una consulta caracterstica de SQL tiene la forma:
select A
1
, A
2
, ..., A
n

from r
1
, r
2
, ..., r
m

where P
A
i
s representa los atributos
r
i
s representa las relaciones
P es un predicado.
Esta consulta es equivalente a la expresin del lgebra
relacional.
[
A1, A2, ..., An
(o
P
(r
1
x r
2
x ... x r
m
))
El resultado de una consulta de SQL es una relacin.
Silberschatz, Korth y Sudarshan 4.4 Fundamentos de bases de datos 3 Edicin
La clusula select
La clusula select corresponde a la operacin de proyeccin del
lgebra. Se utiliza para dar la relacin de los atributos deseados en el
resultado de una consulta.
Obtener los nombres de todas las sucursales en la relacin prstamo
select nombre-sucursal
from prstamo
En la sintaxis del lgebra relacional puro, la consulta debera ser: :
[
nombre-sucursal
(prstamo)
Un asterisco en la clusula select indica todos los atributos
select *
from prstamo
NOTA: SQL no permite el carcter - en nombres, de forma que se
debe utilizar, por ejemplo, nombre_sucursal en vez de nombre-sucursal
en una implementacin real. Utilizamos - puesto que parece ms
bonito!
NOTA: los nombres de SQL son de tipo de letra insensitivo, lo que
significa que se puede utilizar las maysculas o minsculas.
Puede ser deseable utilizar las maysculas en los lugares en los que
utilizamos la fuente en negrita.
Silberschatz, Korth y Sudarshan 4.5 Fundamentos de bases de datos 3 Edicin
La clusula select (Cont.)
SQL permite los duplicados en las relaciones adems de en los
resultados de la consulta.
Para forzar la eliminacin de duplicados, insertar la clave
distinct despus de select.
Obtener los nombres de todas las sucursales en las relaciones
prstamos, y anular los duplicados
select distinct nombre-sucursal
from prstamo
La clave all especifica que los duplicados no se han anulado.
select all nombre-sucursal
from prstamo
Silberschatz, Korth y Sudarshan 4.6 Fundamentos de bases de datos 3 Edicin
La clusula select (Cont.)
La clusula select puede contener expresiones aritmticas que
involucran la operacin, +, , - y /, y que funcionan en las constantes o
en los atributos de las tuplas.
La consulta:
select nmero-prstamo, nombre-sucursal, importe - 100
from prstamo
volver a una relacin que es la misma que las relaciones prstamo,
excepto que el atributo importe se multiplica por 100.
Silberschatz, Korth y Sudarshan 4.7 Fundamentos de bases de datos 3 Edicin
La clusula where
La clusula where corresponde al predicado de la seleccin del
lgebra relacional. Si consta de un predicado que involucra a los
atributos de las relaciones que aparecen en la clusula from.
La bsqueda de todos los nmeros de crdito de los prstamos ha
dado como resultado la sucursal Navacerrada con las cantidades de
prstamos mayores a $1200.
select nmero-prstamo
from prstamo
where nombre-sucursal = Navacerrada and importe > 1200
Los resultados de la comparacin se pueden combinar utilizando las
conectivas lgicas and, or, y not.
Las comparaciones se pueden aplicar a los resultados de las
expresiones aritmticas.
Silberschatz, Korth y Sudarshan 4.8 Fundamentos de bases de datos 3 Edicin
La clusula where (Cont.)
SQL incluye un operador de comparacin between para simplificar
las clusulas where que especifica que un valor es menor o igual
que un valor y mayor o igual que otro.
Obtener el nmero de prstamo de aquellos con cantidades de
crdito entre $90,000 y $100,000 (es decir, >$90,000 y s$100,000)
select nmero-prstamo
from prstamo
where importe between 90000 and 100000
Silberschatz, Korth y Sudarshan 4.9 Fundamentos de bases de datos 3 Edicin
La clusula from
La clusula from corresponde a la operacin del producto Cartesiano
del lgebra relacional. Hace una lista de las relaciones que se van a
explorar en la evaluacin de la expresin.
Buscar el producto cartesiano prestatario x prstamo
select -
from prestatario, prstamo
Buscar el nombre, el nmero de prstamo y la cantidad del prstamo de
todos los clientes que tengan un crdito en la sucursal Navacerrada.
select nombre-cliente, prestatario.nmero-prstamo, importe
from prestatario, prstamo
where prestatario.nmero-prstamo = prstamo.nmero-prstamo
and
nombre-sucursal = Navacerrada
Silberschatz, Korth y Sudarshan 4.10 Fundamentos de bases de datos 3 Edicin
La operacin de renombramiento
(SQL-SERVER-ORACLE)
SQL permite las relaciones y atributos de renombramiento utilizando la
clusula as:
nombre-antiguo as nombre-nuevo
Para PL-SQL(oracle) el renombramiento se hace con un espacio en
blanco
Obtener el nombre, el nmero de prstamo y la cantidad del prstamo de
todos los clientes; renombrar el nombre de la columna nmero-prstamo
como identificacin del prstamo.

select nombre-cliente, prestatario.nmero-prstamo as identificacin del prstamo,
importe
from prestatario, prstamo
where prestatario.nmero-prstamo = prstamo.nmero-prstamo

select nombre-cliente, prestatario.nmero-prstamo identificacin del prstamo,
importe
from prestatario, prstamo
where prestatario.nmero-prstamo = prstamo.nmero-prstamo



Silberschatz, Korth y Sudarshan 4.11 Fundamentos de bases de datos 3 Edicin
Alias
Las variables tupla se definen en la clusula from mediante el uso de
la clusula as.
Obtener los nombres y nmeros de prstamo de todos los clientes que
tengan un prstamo en alguna sucursal.
select nombre-cliente, T.nmero-prstamo, S.importe
from prestatario as T, prstamo as S
where T.nmero-prstamo = S.nmero-prstamo
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
Silberschatz, Korth y Sudarshan 4.12 Fundamentos de bases de datos 3 Edicin
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 carcter % encaja con cualquier subcadena.
Guin bajo (_). El carcter _ encaja con cualquier carcter.
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
concatenacin (que utiliza ||)
conversin de mayscula a inferior (y viceversa)
bsqueda de la longitud de la cadena, extraccin de subcadenas, etc.
Silberschatz, Korth y Sudarshan 4.13 Fundamentos de bases de datos 3 Edicin
Orden en la presentacin de las tuplas
Lista en orden alfabtico los nombres de todos los clientes que tengan un
crdito en la sucursal Navacerrada
select distinct nombre-cliente
from prestatario, prstamo
where prestatario nmero-prstamo - prstamo.nmero- prstamo
and nombre-sucursal = Navacerrada
order by nombre-cliente
Se puede especificar la clusula 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
Silberschatz, Korth y Sudarshan 4.14 Fundamentos de bases de datos 3 Edicin
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
automticamente; para retener todos los duplicados se utilizan
las versiones de multiconjunto correspondientes union all,
intersect all y except all.

Supngase 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
Silberschatz, Korth y Sudarshan 4.15 Fundamentos de bases de datos 3 Edicin
Operaciones con conjuntos
Obtener todos los clientes que tengan un prstamo, una cuenta,
o ambos: (select nombre-cliente from impositor)
union
(select nombre-cliente from prestatario)
Obtener todos los clientes que tengan un prstamo 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
prstamo. (select nombre-cliente from impositor)
except
(select nombre-cliente from prestatario)
PARA PL-SQL
(select nombre-cliente from impositor)
minus
(select nombre-cliente from prestatario)


Silberschatz, Korth y Sudarshan 4.16 Fundamentos de bases de datos 3 Edicin
Funciones de agregacin
Estas funciones operan en el multiconjunto de valores de una
columna de una relacin, y devuelven un valor
avg: valor medio
min: valor mnimo
max: valor mximo
sum: suma de valores
count: nmero de valores
Silberschatz, Korth y Sudarshan 4.17 Fundamentos de bases de datos 3 Edicin
Funciones de agregacin (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 nmero de impositor en el banco.
select count (distinct nombre-cliente)
from impositor
Silberschatz, Korth y Sudarshan 4.18 Fundamentos de bases de datos 3 Edicin
Funciones de agregacin Group By
Obtener el nmero de impositores de cada sucursal.
select nombre-sucursal, count (distinct nombre-cliente)
from impositor, cuenta
where impositor.nmero-cuenta= cuenta. nmero-cuenta
group by nombre-sucursal
Nota: Los atributos de la clusula select fuera de las funciones de
agregacin deben aparecer en la lista group by
Silberschatz, Korth y Sudarshan 4.19 Fundamentos de bases de datos 3 Edicin
Funciones de agregacin
Clusula 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 clusula having se aplican despus
de la formacin de grupos mientras que los predicados de la
clusula where se aplican antes de la formacin de grupos
Silberschatz, Korth y Sudarshan 4.20 Fundamentos de bases de datos 3 Edicin
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 nmeros de prstamos que aparecen
en la relacin prstamo con valores nulos para importe.
select nmero- prstamo
from prstamo
where importe is null
El resultado de la expresin aritmtica que involucra a null es nulo
Por ejemplo 5 + null devuelve nulo
Sin embargo, las funciones de agregacin simplemente ignoran los
valores nulos
Se ofrecer ms sobre esto en breve
Silberschatz, Korth y Sudarshan 4.21 Fundamentos de bases de datos 3 Edicin
Valores nulos y lgica de tres valores
Cualquier comparacin con nulo se convierte en desconocido
Por ejemplo 5 < nulo o nulo <> nulo o nulo = nulo
Lgica 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 evala en cierto si el predicado P se evala en desconocido
El resultado del predicado de la clusula where se toma como falso si se
evala en desconocido
Silberschatz, Korth y Sudarshan 4.22 Fundamentos de bases de datos 3 Edicin
Valores nulos y agregados
El total de todas las cantidades de prstamos
select sum (importe)
from prstamo
la instruccin 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.
Silberschatz, Korth y Sudarshan 4.23 Fundamentos de bases de datos 3 Edicin
Subconsultas anidadas
SQL proporciona un mecanismo para las subconsultas anidadas.
Una subconsulta es una expresin select-from-where que se
anida dentro de otra consulta.
Un uso comn de subconsultas es llevar a cabo comprobaciones
sobre pertenencia a conjuntos, comparacin de conjuntos y
cardinalidad de conjuntos.
Silberschatz, Korth y Sudarshan 4.24 Fundamentos de bases de datos 3 Edicin
Ejemplo de consulta
Obtener todos los clientes que tengan una cuenta y un prstamo
en el banco.
select distinct nombre-cliente
from prestatario
where nombre-cliente in (select nombre-cliente
from depsitor)
Obtener todos los clientes que tengan un prstamo 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)
Silberschatz, Korth y Sudarshan 4.25 Fundamentos de bases de datos 3 Edicin
Ejemplo de consulta
Obtener todos los clientes que tengan both una cuenta and un prstamo en
la sucursal Navacerrada
select distinct nombre-cliente
from prestatario, prstamo
where prestatario.nmero-prstamo = prstamo.nmero-prstamo and
nombre-sucursal = Navacerrada and
(nombre-sucursal, nombre-cliente) in
(select nombre-sucursal, nombre-cliente
from impositor, cuenta
where impositor.nmero-cuenta=
cuenta.nmero-cuenta)
Nota: Se puede escribir la consulta anterior de forma mucho ms simple. La
formulacin anterior es simplemente para ilustrar las caractersticas de SQL.
(Esquema utilizado en este ejemplo)
Silberschatz, Korth y Sudarshan 4.26 Fundamentos de bases de datos 3 Edicin
Comparacin 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 clusula > some
select nombre-sucursal
from sucursal
where activo > some
(select activo
from sucursal
where ciudad-sucursal = Barcelona)

Silberschatz, Korth y Sudarshan 4.27 Fundamentos de bases de datos 3 Edicin
Definition of Some Clause
F <comp> some r - t e r s.t. (F <comp> t)
Donde <comp> puede ser: <, s, >, =, =
0
5
6
(5< some ) = verdadero
0
5
0
) = falso
5
0
5 (5 = some ) = verdadero (ya que 0 = 5)
(leer: 5 < alguna tupla de la relacin)
(5< some
) = verdadero (5 = some
(= some) in
Sin embargo, (= some) not in
Silberschatz, Korth y Sudarshan 4.28 Fundamentos de bases de datos 3 Edicin
Definition of all Clause
F <comp> all r t e r (F <comp> t)
0
5
6
(5< all ) = falso
6
10
4
) = verdadero
5
4
6 (5 = all ) = verdadero (ya que 5 = 4 y 5 = 6)
(5< all
) = falso (5 = all
(= all) not in
Sin embargo, (= all) in
Silberschatz, Korth y Sudarshan 4.29 Fundamentos de bases de datos 3 Edicin
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)
Silberschatz, Korth y Sudarshan 4.30 Fundamentos de bases de datos 3 Edicin
La clusula with
La clusula with permite que las vistas se definan localmente
para una consulta, adems de globalmente. Es anloga a los
procedimientos de un lenguaje de programacin.
Obtener todas las cuentas con el saldo mximo

with saldo-mximo(valor) as
select max (saldo)
from cuenta
select nmero-cuenta
from cuenta, saldo-mximo
where cuenta.saldo = saldo-mximo.valor
Silberschatz, Korth y Sudarshan 4.31 Fundamentos de bases de datos 3 Edicin
Consulta compleja que utiliza la clusula
with
Obtener todas las sucursales donde el depsito total de las
cuentas es mayor que la media del total de depsitos 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
Silberschatz, Korth y Sudarshan 4.32 Fundamentos de bases de datos 3 Edicin
Reunin de relaciones
Las operaciones de reunin toman dos relaciones y las devuelven
como resultado de otra relacin.
Estas operaciones adicionales se utilizan generalmente como
expresiones de subconsulta de la clusula from
Condicin de reunin define que tuplas de las dos relaciones
coinciden, y que atributos estn presentes en el resultado de la
reunin.
Tipo de reunin define como se tratan las tuplas de cada relacin
que no coincide con ninguna tupla de la otra relacin (basada en la
condicin de reunin.
Tipos de reunin
inner join
left outer join
right outer join
full outer join
Condiciones de reunin
natural
on <predicado>
using (A
1
, A
2
, ..., A
n
)

Silberschatz, Korth y Sudarshan 4.33 Fundamentos de bases de datos 3 Edicin
Reunin de relaciones Conjuntos de
datos para ejemplos
Relacin prstamo
importe
3000
4000
1700
Relacin prestatario
nombre-cliente nmero-prstamo
Santos
Gmez
Lpez
P-170
P-230
P-155
nombre-sucursal
Centro
Moralzarzal
Navacerrada
nmero-prstamo
P-170
P-230
P-260
Nota: no se tiene la informacin del prestatario para
P-260 ni la informacin de prstamo para P-155
Silberschatz, Korth y Sudarshan 4.34 Fundamentos de bases de datos 3 Edicin
Reunin de relaciones Ejemplos
prstamo inner join prestatario on
prstamo.nmero-prstamo = prestatario.nmero-prstamo
nombre-sucursal importe
Centro
Moralzarzal
3000
4000
nombre-cliente nmero-prstamo
Santos
Gmez
P-170
P-230
nombre-sucursal importe
Centro
Moralzarzal
Navacerrada
3000
4000
1700
nombre-cliente nmero-prstamo
Santos
Gmez
null
P-170
P-230
null
prstamo left inner join prestatario on
prstamo.nmero-prstamo = prestatario.nmero-prstamo
nmero-prstamo
P-170
P-230
nmero-prstamo
P-170
P-230
P-260
Silberschatz, Korth y Sudarshan 4.35 Fundamentos de bases de datos 3 Edicin
Reunin de relaciones Ejemplos
prstamo natural inner join prestatario
branch-name amount
Downtown
Redwood
3000
4000
prstamo natural right outer join prestatario
nombre-sucursal importe
Centro
Moralzarzal
null
3000
4000
null
nombre-cliente
Santos
Gmez
Lpez
loan-number
L-170
L-230
nmero-prstamo
P-170
P-230
P-155
nombre-sucursal importe
Centro
Moralzarzal
3000
4000
nombre-cliente
Santos
Gmez
nmero-prstamo
P-170
P-230
Silberschatz, Korth y Sudarshan 4.36 Fundamentos de bases de datos 3 Edicin
Reunin de relaciones Ejemplos
prstamo full outer join prestatario using (nmero-prstamo)
nombre-sucursal importe
Centro
Moralzarzal
Navacerrada
null
3000
4000
1700
null
nombre-cliente
Santos
Gmez
null
Lpez
Obtener todos los clientes que tengan una cuenta o un prstamo
(pero no ambos) en el banco.
select nombre-cliente
from (impositor natural full outer join prestatario)
where nmero-cuenta is null or nmero-prstamo is null
nmero-prstamo
P-170
P-230
P-260
P-155

También podría gustarte