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