You are on page 1of 78

Tema 4: SQL

Bases de Datos

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

Indice
4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9
z

Introduccin Definicin de datos Estructura bsica de consulta Operaciones sobre conjuntos Funciones de agregacin Valores nulos Sub-consultas anidadas Vistas Modificacin de la base de datos

Silberschatz et al., 2006, pp. 61-99

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.1 Introduccin
z

z z

SQL proviene de Structured Query Language, data de principios de los 70, fue creado por IBM y originalmente se denominaba Sequel. Hoy en dia SQL es el estndar para las bases de datos relacionales. En 1986 la ANSI public la norma SQL-86, que fue seguida de la SQL-89, SQL-92, SQL:1999, SQL:2003, SQL:2006 y SQL:2008 que es la ms reciente. Actualmente, muchos sistemas soportan la mayor parte de la norma SQL-92 y algunos constructores de las normas siguientes, aunque ninguno soporta todos los constructores nuevos.

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.1 Introduccin
z

El lenguaje SQL tiene varios componentes:

Lenguaje de Definicin de Datos (LDD): proporciona comandos para la definicin de esquemas de relacin, borrado y modificacin de los esquemas. Lenguaje Interactivo de Manipulacin de Datos (LMD): Es el lenguaje de consultas, est basado principalmente en el lgebra Relacional y tambin el clculo relacional de tuplas. Contiene tambin comandos para insertar, borrar y modificar tuplas. Integridad: El LDD de SQL incluye comandos para especificar las restricciones de integridad que deben cumplir los datos y que hacen que una actualizacin que las viole sea rechazada.
Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.1 Introduccin

Definicin de vistas: El LDD de SQL incluye comandos para la definicin de vistas. Control de transacciones: SQL incluye comandos para especificar el comienzo y final de las transacciones. SQL incorporado y SQL dinmico: definen como se pueden incorporar instrucciones de SQL en otros lenguajes como C++, Java, Fortran Autorizacin: SQL incluye comandos para especificar los derechos de acceso a las relaciones y a las vistas

A continuacin veremos una introduccin al LMS y LDD de SQL.


Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.2 Definicin de datos


z

Las relaciones de una base de datos deben especificarse en trminos de un Lenguaje de Definicin de Datos (LDD) que especifica no slo las relaciones sino tambin:

El esquema de cada relacin El dominio de valores para cada atributo Las restricciones de Integridad El conjunto de ndices para cada relacin La informacin de seguridad y de autorizacin de cada relacin La estructura de almacenamiento fsico de cada relacin en el disco
Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.2 Definicin de datos


z

Tipos bsicos de dominios:


char(n) una cadena de caracteres de longitud fija varchar(n) una cadena de caracteres de longitud variable n especificada por el usuario int un entero, es equivalente a integer smallint un entero pequeo, dependiente de la mquina numeric(p,d) un nmero de coma fija, p es el nmero de dgitos y d de decimales, p.e. numeric(3,1) permite almacenar 44.5 pero no 0.32 o 421.5. Real, double precision, nmeros de coma flotante y coma flotante de doble precisin dependientes de la mquina float(n) un nmero de coma flotante de, al menos, n dgitos.
Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.2 Definicin bsica de esquemas en SQL


z

z z

Las relaciones en SQL se definen mediante el comando create table create table r(A1 D1, A2 D2,,An Dn, <restriccin integridad1>, ., <restriccin integridadk>) Donde r es el nombre de la relacin, cada Ai es el nombre del atributo y Di es el tipo de dominio del atributo Ai. Hay varias restricciones de integridad pero ahora slo consideraremos la clave primaria que adopta la forma primary key (Aj1,Aj2,,Ajm) y que es opcional. Los atributos de la clave primaria deben ser evidentemente no nulos y nicos, es decir dos relaciones no pueden tener exactamente los mismos valores para todos los atributos.
Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.2 Definicin bsica de esquemas en SQL


z

Por ejemplo: create table cliente (nombre_cliente char(20), calle_cliente char(30), ciudad_cliente char(30), primary key (nombre_cliente)) Cuando se inserta una tupla que contiene valores nulos para algn atributo de la clave primaria, SQL notifica el error e impide la actualizacin.
Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.2 Definicin bsica de esquemas en SQL


z

Las relaciones creadas estn inicialmente vacas as que hay que hay que aadir los datos mediante el comando insert, por ejemplo: insert into cuenta values (C-9732,navacerrada,1200) Para borrar tuplas de una relacin empleamos delete, por ejemplo: delete from cuenta
Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

10

Borrara todas las tuplas de la relacin cuenta

TEMA 4: SQL

4.2 Definicin bsica de esquemas en SQL


Si queremos borrar la relacin de la base de datos empleamos drop table: drop table r z Esta instruccin no es lo mismo que delete from r ya que esta ltima borra todas las tuplas pero conserva la relacin cuenta. z Si se borra una relacin NO se pueden insertar tuplas a menos que se vuelva a crear.
z

11

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.2 Definicin bsica de esquemas en SQL


z

z z

El comando alter table se emplea para aadir atributos a una relacin existente y se asigna el valor nulo a todas las tuplas para el nuevo atributo, su sintaxis es: alter table r add A D Donde r es el nombre de la relacin y A es el nombre del atributo que se desea aadir con dominio D. Si se desea eliminar un atributo A de una relacin r hacemos: alter table r drop A
Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

12

TEMA 4: SQL

4.3 Estructura bsica de consultas en SQL


z

La estructura bsica de una expresin SQL consta de tres clusulas, select, from y where. La clusula select equivale a la operacin proyeccin del lgebra relacional La clusula from equivale a la operacin producto cartesiano del lgebra relacional La clusula where equivale a un predicado seleccin del lgebra relacional

13

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.3 Estructura bsica de consultas en SQL


z

z z

14

Una consulta tpica en SQL tiene la estructura: select A1,A2,...,An (Ai atributos) from r1,r2,...,rm (ri relaciones) where P (P predicado) Es equivalente en lgebra relacional a A1,A2,...,An(P(r1 x r2 x.....x rm)) Si se omite la clusula where, el predicado P es cierto. SQL calcula primero el producto cartesiano sealado en from, luego lleva a cabo la seleccin segn el predicado de where y finalmente proyecta sobre los atributos de la clusula select.

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.3 Estructura bsica de consultas en SQL


Clusula select z Es distinta de la operacin de proyeccin del lgebra relacional en el sentido de que puede producir tuplas repetidas, esto es debido a que eliminarlas es computacionalmente muy costoso

15

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.3 Estructura bsica de consultas en SQL


z

Si se quiere forzar la eliminacin (que acta por defecto) se pone distinct: select distinct A1,A2,...,An from r1,r2,...,rm where P Por ejemplo: select distinct nombre_sucursal from prstamo
Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

16

TEMA 4: SQL

4.3 Estructura bsica de consultas en SQL


z

z z

Si se quiere especificar explcitamente que no se eliminen se pone all: select all A1,A2,...,An from r1,r2,...,rm where P Por ejemplo select all nombre_sucursal from prstamo Puede producir tuplas duplicadas. Obviamente como es la opcin predeterminada NO suele ponerse.
Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

17

TEMA 4: SQL

4.3 Estructura bsica de consultas en SQL


z

z z

Se puede emplear * para denotar todos los atributos, por ejemplo select * indica que se deben seleccionar todos los atributos de todas las relaciones que aparecen en from. Tambin se pueden incluir operaciones aritmticas elementales, por ejemplo select A1*1000 Por ejemplo
select nmero_prstamo, nombre_sucursal, importe*100 from prstamo

18

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.3 Estructura bsica de consultas en SQL


Clusula where z Por ejemplo podramos querer obtener los nmeros de prstamo de todos los prstamos concedidos en la sucursal de Navacerrada, haramos
select distinct numero_prstamo from prstamo where nombre_sucursal=Navacerrada

19

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.3 Estructura bsica de consultas en SQL


z

Se pueden emplear, desigualdades y conectivas lgicas and, or y not, por ejemplo select nmero_prstamo from prstamo where nombre-sucursal=Navacerrada and importe >1200 Existe un operador comparacin between que simplifica las consultas, por ejemplo select nmero_prstamo from prstamo where importe between 600 and 3000

20

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.3 Estructura bsica de consultas en SQL


Clusula from z Equivale a un producto cartesiano de las relaciones que aparecen en la clusula. z Ya que una reunin natural consta de un producto cartesiano, una seleccin y una proyeccin, es muy fcil expresar una reunin natural en SQL:
nombre-cliente, nmero-prstamo, importe(prestatario ZY prstamo)

Sera

select nombre_cliente, prestatario.nmero_prstamo,importe from prestatario, prstamo where prestatario.nmero_prstamo= prstamo.nmero_prstamo

21

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.3 Estructura bsica de consultas en SQL


Otro ejemplo: Obtener los nombres, nmeros de prstamo e importes de todos los clientes que tienen un prstamo en la sucursal de Navacerrada

select nombre_cliente, prestatario.nmero_prstamo, importe from prestatario, prstamo where prestatario.nmero_prstamo=prstamo.nmero_prstamo and nombre-sucursal=Navacerrada

22

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.3 Estructura bsica de consultas en SQL


Operacin renombramiento z Se emplea la clusula as que se puede poner tanto en select como en from, la estructura bsica es: nombre_antiguo as nombre_nuevo z Por ejemplo si queremos renombrar el atributo nmero de prstamo llamndole id_prstamo haramos:
select nombre_cliente, prestatario.nmero_prstamo as id_prstamo, importe from prestatario, prstamo where prestatario.nmero_prstamo= prstamo.nmero_prstamo and nombre_sucursal=Navacerrada

23

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.3 Estructura bsica de consultas en SQL


Variables tupla La clusula as resulta muy til para definir las variables tupla que permiten comparar tuplas de la misma relacin que antes resolvimos empleando el renombramiento. Las variables tupla se definen en la clusula from mediante el uso de la clusula as, por ejemplo: obtener los nombres de los clientes, nmero de prstamo e importe de todos los clientes con un prstamo en el banco select nombre_cliente,T. numero_prestamo,S.importe from prestatario as T, prstamo as S where T.nmero_prstamo=S.nmero_prstamo

24

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.3 Estructura bsica de consultas en SQL


Operaciones sobre cadenas
z

Se pueden encajar patrones de una cadena mediante el operador like.


El (%) encaja con cualquier subcadena El (_) encaja con cualquier carcter

z z z z

Por ejemplo, Nava% encaja con cualquier subcadena que empiece por Nava %cer% encaja con cualquier subcadena que incluya cer, por ejemplo Navacerrada, Caceres y Becerril. _ _ _ encaja con cualquier cadena de tres caracteres _ _ _% encaja con cualquier cadena de al menos tres caracteres
Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

25

TEMA 4: SQL

4.3 Estructura bsica de consultas en SQL


Ejemplo: obtener los nombres de todos los clientes cuyas calles contengan la subcadena Mayor Select nombre_cliente From cliente Where calle_cliente like %Mayor% Para que se puedan incluir en el encaje los caracteres especiales % y _ se puede emplear la palabra escape.
Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

26

TEMA 4: SQL

4.3 Estructura bsica de consultas en SQL


z

27

El carcter de escape se utiliza inmediatamente antes de un carcter especial para indicar que ese carcter especial debe ser tratado como un carcter normal. Por ejemplo, si empleamos (\) como carcter de escape: like ab\%cd% escape \, encaja con todas las cadenas que empiezan con ab%cd like ab\\cd% escape \, encaja con todas las cadenas que empiezan con ab\cd Se pueden buscar discordancias con not like

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.3 Estructura bsica de consultas en SQL


z

SQL tambin incluye otros operadores sobre cadenas y que permiten concatenar (), transformar maysculas a minsculas (upper()) o al revs (lower()), calcular la longitud de cadenas, u operaciones ms sofisticadas como similar to mas potente que like.

28

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.3 Estructura bsica de consultas en SQL


Orden de presentacin de las tuplas z Para que presenten en cierto orden se emplea order by, (ascendente por defecto) z Ejemplo: queremos listar en orden alfabtico todos los clientes que tienen un prstamo en la sucursal de Navacerrada
Select distinct nombre_cliente From prestatario, prestamo Where prestatario.numero-prestamo = prestamo.numero-prestamo and nombre-sucursal = Navacerrada order by nombre_cliente

29

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.3 Estructura bsica de consultas en SQL


z z

Si queremos descendente se emplea desc Si hay varias tuplas con igual valor del atributo se pueden elegir distintos subrdenes, por ejemplo listar por importe descendente y en caso de igualdad por nmero de prstamo ascendente:
select * from prstamo order by importe desc, nmero prstamo asc

30

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.4 Operaciones sobre conjuntos


Union, intersect y except corresponden a las operaciones del lgebra relacional , y z Las relaciones involucradas han de ser compatibles, es decir, deben tener el mismo conjunto de atributos. Operacin union z Por ejemplo, si queremos obtener los clientes con cuenta o prstamo o ambos:
z

31

(select nombre_cliente from impositor) union (select nombre_cliente from prestatario)

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.4 Operaciones sobre conjuntos


A diferencia de select, union elimina duplicados, si se quieren conservar se emplea union all. (select nombre_cliente from impositor) union all (select nombre_cliente from prestatario)

32

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.4 Operaciones sobre conjuntos

Operacin interseccin
z z

Se emplea la clusula intersect Por ejemplo, supongamos que queremos obtener los clientes con cuenta y prstamo a la vez: (select distinct nombre_cliente from impositor) intersect (select distinct nombre_cliente from prestatario)

33

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.4 Operaciones sobre conjuntos

A diferencia de select, intersect tambin elimina duplicados, si se quieren conservar se emplea intersect all. (select nombre_cliente from impositor) intersect all (select nombre_cliente from prestatario)
Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

34

TEMA 4: SQL

4.4 Operaciones sobre conjuntos


Operacin excepto z Se emplea la clusula except z Por ejemplo, deseamos obtener los clientes con cuenta pero que no tengan ningn prstamo: (select distinct nombre_cliente from impositor) except (select distinct nombre_cliente from prestatario)

35

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.4 Operaciones sobre conjuntos


z

La operacin except elimina duplicados automticamente, si se quieren conservar los duplicados se emplea except all (select distinct nombre_cliente from impositor) except all (select distinct nombre_cliente from prestatario)
Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

36

TEMA 4: SQL

4.4 Operaciones sobre conjuntos


z

El nmero de copias es igual al nmero de copias duplicadas de dicha tupla en impositor menos el nmero de tuplas duplicadas en prestatario, siempre que sea positivo. Por ejemplo si Santos tiene tres cuentas y un prstamo aparecer dos veces, si tiene dos cuentas y tres prstamos no aparecer ninguna tupla.

37

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.5 Funciones de agregacin


z

Hay cinco funciones de agregacin primitivas


Media: avg Mnimo: min Mximo: max Total, sum Cuenta: count

Las entradas de sum y avg deben ser de tipo numrico pero los otros operadores pueden actuar tambin sobre cadenas de caracteres.
Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

38

TEMA 4: SQL

4.5 Funciones de agregacin


Por ejemplo obtener el saldo medio de las cuentas de Navacerrada
select avg (saldo) from cuenta where nombre_sucursal=Navacerrada
z

Opcionalmente se podra dar un nombre al atributo de la relacin resultante con la clusula as.

39

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.5 Funciones de agregacin


z z z

Se puede agrupar por conjunto de tuplas segn el atributo o atributos especificados en group by. Las tuplas con el mismo valor en todos los atributos especificados en group by se situarn en dicho grupo. Ejemplo: obtener el saldo medio de las cuentas de cada sucursal.
select nombre_sucursal avg (saldo) from cuenta group by nombre_sucursal

40

Obsrvese que el hecho de que select no elimine duplicados es esencial ya que, en otro caso, por ejemplo las medias seran errneas.

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.5 Funciones de agregacin


z

A veces hay que eliminar los duplicados antes de calcular una funcin de agregacin, para ello empleamos la palabra clave distinct. Por ejemplo determinar el nmero de clientes de cada sucursal
select nombre_sucursal, count (distinct nombre_cliente) from impositor, cuenta where impositor.nmero_cuenta=cuenta.nmero_cuenta group by nombre_sucursal
Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

41

TEMA 4: SQL

4.5 Funciones de agregacin


A veces es til emplear una condicin sobre los grupos, no sobre las tuplas, para esto se emplea la clusula having Por ejemplo podemos estar interesados slo en aqullas sucursales donde el saldo medio de las cuentas es mayor que 1200 select nombre_sucursal, avg (saldo) from cuenta group by nombre_sucursal having avg(saldo)>1200

42

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.5 Funciones de agregacin


Es muy comn la necesidad de contar el nmero de tuplas de una relacin, esto lo hacemos como: select count (*) from cliente
z

SQL NO permite el uso de distinct con count(*).

43

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.5 Funciones de agregacin


z

Si en una consulta aparece una clusula where y una clusula having se aplica primero el predicado de where. Las clusulas que satisfagan la clusula where se colocan en los grupos definidos por group by y despus se aplica having a cada grupo.

44

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.5 Funciones de agregacin


z

Ejemplo: obtener el nombre del cliente y saldo medio de cada cliente que vive en Madrid y tiene como mnimo tres cuentas.
select impositor.nombre_cliente, avg(saldo) from impositor, cuenta, cliente where impositor.nmero_cuenta=cuenta.nmero_cuenta and impositor.nombre_cliente=cliente.nombre_cliente and ciudad_cliente=madrid group by impositor.nombre_cliente having count(distinct impositor.nmero_cuenta)>=3

45

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.6 Valores nulos


z z

z z

En un predicado se puede emplear la palabra clave is null para comprobar si un valor es nulo. Por ejemplo, encontrar los nmeros de prstamo con importes nulos select nmero_prstamo from prestamo where importe is null El predicado is not null se emplea para preguntar por la ausencia de un valor nulo El resultado de cualquier comparacin que involucre un valor nulo es falso.

46

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.6 Valores nulos


El resultado de cualquier operacin aritmtica es nulo si cualquiera de los valores de entrada lo es. Para las operaciones de agregacin, todas ellas excepto count ignoran los valores nulos El clculo de count para una coleccin vaca es 0 SQL permite averiguar si una comparacin es desconocida en vez de cierto o falso empleando la clusula is unknown o bien is not unknown

z z z z

47

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.7 Subconsultas anidadas


SQL permite anidar consultas dentro de otras. z Usualmente se emplean para efectuar comprobaciones sobre pertenencia a conjuntos, comparacin de conjuntos y cardinalidad de conjuntos Pertenencia a conjuntos z Se puede emplear la conectiva in para comprobar la pertenencia de tuplas a una relacin. z La no pertenencia a un conjunto se comprueba con not in.
z

48

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.7 Subconsultas anidadas


Si queremos encontrar, de otra forma, los clientes de un banco que tienen un prstamo y una cuenta en el banco, primero podemos encontrar todos los titulares de las cuentas (select nombre_cliente from impositor)

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.7 Subconsultas anidadas


Y a continuacin ver los titulares de prstamos que aparecen en la lista de titulares de cuentas encontrada anterioremente: select distinct nombre_cliente from prestatario where nombre_cliente in (select nombre_cliente from impositor) Titulares de cuentas

50

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.7 Subconsultas anidadas

Si queremos encontrar, los clientes de un banco que tienen un prstamo pero no una cuenta en el banco, podemos hacer
select distinct nombre_cliente from prestatario where nombre_cliente not in (select nombre_cliente from impositor)

51

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.7 Subconsultas anidadas

SQL tambin permite emplear in y not in sobre conjuntos enumerados, por ejemplo, si queremos encontrar los clientes que tienen concedido un prstamo distintos de Santos y Gmez, hacemos:
select distinct nombre_cliente from prestatario where nombre_cliente not in (Santos, Gmez)

52

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.7 Subconsultas anidadas


Comparacin de conjuntos z Se puede emplear una forma alternativa a la anteriormente vista con la expresin > some (equivalente a mayor que, al menos, una). z Por ejemplo obtener los nombres de todas las sucursales que poseen un activo mayor que, al menos, una sucursal situada en Barcelona, primero, con variables tupla haramos: select distinct T. nombre_sucursal from sucursal as T, sucursal as S where T.activos>S.activos and S.ciudad_sucursal=Barcelona

53

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.7 Subconsultas anidadas


z

Empleando some podemos hacer la misma consulta con select nombre_sucursal from sucursal where activos > some (select activos from sucursal where ciudad_sucursal=Barcelona)

54

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.7 Subconsultas anidadas


z

La subconsulta (select activos from sucursal where ciudad_sucursal=Barcelona)

General los valores de los activos de todas las sucursales situadas en Barcelona, la comparacin > some en el where es cierta si el valor del atributo activos de en una tupla es mayor que, al menos, el de una de la tuplas de las sucursales en Barcelona

55

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.7 Subconsultas anidadas


z z z

Tambin podemos emplear >some,< some, >= some, <= some, = y <> some. Obsrvese que = some es idntico a in pero <>some no es lo mismo que not in. Finalmente, tambin existe la expresin all que corresponde con a todas (por ejemplo >all, superior a todas).

56

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.7 Subconsultas anidadas


z

Por ejemplo, si queremos obtener los nombres de todas las sucursales que tienen un activo superior al de todas las sucursales de Barcelona select nombre_sucursal from sucursal where activos> all (select activos from sucursal where ciudad_sucursal=Barcelona)

57

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.7 Subconsultas anidadas


z z

En SQL no se pueden componer las funciones de agregacin, por lo que no es posible expresiones del tipo max(avg(...)). Consultas como determinar la sucursal que tiene el saldo medio mximo se pueden hacer determinando primero los saldos medios y despus anidar dicha consulta dentro de otra que determine las sucursales en las que el saldo medio es mayor que todas las sucursales: select nombre_sucursal from cuenta group_by nombre_sucursal having avg (saldo) >= all (select avg (saldo) from cuenta group by nombre_sucursal)

58

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.7 Subconsultas anidadas


Comprobacin de relaciones vacas z SQL permite comprobar si una subconsulta no produce ninguna tupla como resultado. z La constructora exists devuelve el valor cierto si la subconsulta argumento es no vaca. z Por ejemplo obtener los clientes que tienen tanto una cuenta como un prstamo
select nombre_cliente from prstamo where exists (select * from impositor where impositor.nombre_cliente= prestatario.nombre_cliente)

59

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.7 Subconsultas anidadas

Utilizando not exists se puede comprobar la no existencia de tuplas en el resultado de una consulta. Tambin se puede expresar que la relacin A contiene a la relacin B como not exists (B except A).

60

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.7 Subconsultas anidadas


Comprobacin de tuplas duplicadas z SQL permite ver si una consulta ofrece duplas duplicadas mediante la constructora unique que devuelve el valor true si la consulta que se le pasa como argumento no contiene tuplas duplicadas.

61

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.7 Subconsultas anidadas


z

Por ejemplo, obtener todos los clientes que tienen a lo sumo una cuenta en la sucursal de nombre 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.nmero_cuenta=cuenta.nmero_cuenta and cuenta.nombre_sucursal= Navacerrada)

62

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.8 Vistas
z

Las vistas se utilizan, entre otros motivos, porque a menudo no es deseable que algunos usuarios vean el modelo lgico completo, por ejemplo, un usuario puede tener que ver el nmero de prstamos y el nombre de una sucursal de un cliente pero no tiene por qu ver su saldo. Adems de esto, puede que se desee crear un conjunto personalizado de relaciones adaptado a un usuario particular. Las relaciones que no forman parte del diseo lgico pero se hacen visibles a los usuarios como relaciones virtuales se denominan vistas.

63

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.8 Vistas
z z z

Una vista en SQL se define utilizando la orden create view. Para definir una vista hay que construir la consulta que genere dicha vista. La forma de la orden create view es create view v as <expresin de consulta>

64

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.8 Vistas
Ejemplo: definir una vista que incorpore los nombres de sucursales, y de clientes que tienen una cuenta o prstamo en esa sucursal: create view todos_los_clientes as
z

(select nombre_sucursal, nombre_cliente from impositor, cuenta where impositor.numero_cuenta=cuenta.numero_cuenta) union (select nombre sucursal, nombre_cliente from prestatario, prestamo where prestatario.numero_prestamo=prestamo.numero_prestamo)

65

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.8 Vistas
z

Una vez definida la vista se puede hacer referencia a la misma, por ejemplo, podemos querer ver los nombres de todos los clientes de la sucursal de Navacerrada: create view cliente_navacerrada as select nombre_cliente from todos_los_clientes where nombre_sucursal=Navacerrada

66

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.8 Vistas
zz

Las dependencias entre vistas se presentan mediante grafos de dependencia, de la forma:


cliente-navacerrada todos-los-clientes prestatario prstamo

Se dice que una relacin de vistas v1 depende de otra v2 si hay un camino en el grafo de dependencia de v2 a v1.
Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

67

TEMA 4: SQL

4.8 Vistas
zz

Se dice que una relacin de vistas es recursiva si depende de s misma, por ahora emplearemos slo vistas que no lo sean. La expansin de vistas es una manera de ver vistas definidas en trminos de otras vistas. Las relaciones de vistas sustituyen a las expresiones que definen las vistas y por tanto se pueden sustituir por las expresiones que las definen.
Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

68

TEMA 4: SQL

4.8 Vistas
zz

Si se modifica una expresin sustituyendo la relacin de vistas por su definicin, la nueva relacin puede seguir conteniendo otras relaciones de vistas que pueden tambin ser expandidas. Por tanto, la expansin de vistas puede ser definida: repeat
buscar todas las relaciones de vistas vi de ei sustituir la relacin de vistas vi por la expresin que define vi

until no queden mas vistas en ei

69

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.9 Modificacin de la Base de Datos


Borrado z Se expresa igual que una consulta z Se pueden borrar slo tuplas completas, no valores de atributos z Se realiza con delete, la sintaxis es: delete from r where P z Donde P es un predicado y r una relacin, se puede prescindir de where, en cuyo caso se borran todas las tuplas de la relacin. z Delete opera sobre una sola relacin, si hay que borrar en varias hay que utilizar varias rdenes delete.
Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

70

TEMA 4: SQL

4.9 Modificacin de la Base de Datos


z

Por ejemplo, borrar todas las cuentas de todas las sucursales de Navacerrada
delete from cuenta where nombre_sucursal in (select nombre_sucursal from sucursal where ciudad_sucursal=Navacerrada)

Por ejemplo, borrar todas las cuentas con saldos inferiores a la media del banco
delete from cuenta where saldo< (select avg (saldo) from cuenta)

71

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.9 Modificacin de la Base de Datos


Insercin z Para insertar datos podemos especificar una tupla completa o bien una consulta cuyo resultado sea el conjunto de tuplas a insertar. z Se hace con la instruccin insert, por ejemplo insert into cuenta values (Navacerrada, C-9732, 240) z Si no recordamos el orden de los atributos podemos especificar el nombre de los atributos: insert into cuenta (saldo,nombre_sucursal, nmero_cuenta) values (240, Navacerrada, C-9732)

72

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.9 Modificacin de la Base de Datos


z

z z

Antes de llevar a cabo ninguna insercin es importante que haya finalizado la evaluacin de la orden select, por ejemplo: insert into cuenta select * from cuenta Podra insertar un nmero infinito de tuplas!!! Si desconocemos algn valor podemos hacer insert into cuenta values (null, C-9732, 240)
Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

73

TEMA 4: SQL

4.9 Modificacin de la Base de Datos


Actualizaciones
z

z z

En ocasiones queremos cambiar algun valor dentro de una tupla sin cambiar todos los valores de la misma. En este tipo de situaciones se emplea update por ejemplo Si queremos incrementar los saldos el 5%:
update cuenta set saldo=saldo*1.05
Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

74

TEMA 4: SQL

4.9 Modificacin de la Base de Datos


z

Otro ejemplo: pagar mas a las cuentas superiores a 2000:


update cuenta set saldo=saldo*1.06 where saldo>2000 update cuenta set saldo=saldo*1.05 where saldo<2000

El orden es muy importante: cul es el inters de una cuenta de 1990? y si se invierte el orden de las actualizaciones?).

75

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.9 Modificacin de la Base de Datos


Actualizacin de vistas z Las vistas tienen algunos problemas si con ellas se emplean actualizaciones, inserciones o borrados, por ejemplo, definamos la vista prstamo-sucursal:
create view prstamo_sucursal as select nombre_sucursal, nmero_prstamo from prstamo
z

podramos querer hacer


insert into prstamo_sucursal values (navacerrada, P-307)

76

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

TEMA 4: SQL

4.9 Modificacin de la Base de Datos


z

Sin embargo, esta insercin presenta problemas ya que obligara e introducir un importe nulo en el atributo importe en la relacin prstamo, lo cual produce problemas. SQL no permite la introduccin de actualizaciones de vistas salvo casos concretos, en aquellos qie la vista se define en trminos de una relacin real de la BD, es decir, al nivel lgico. Estas vistas sobre las cuales son posibles las inserciones son denominadas vistas actualizables.
Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

77

TEMA 4: SQL

4.9 Modificacin de la Base de Datos


Transacciones z Una transaccin consiste en una secuencia de instrucciones de consulta o actualizacin. z La norma SQL especifica que una transaccin comienza implcitamente cuando se ejecuta cualquier instruccin de SQL. z Unas de las siguientes instrucciones debe finalizar la transaccin:

78

Commit work: compromete la transaccin actual, las actualizaciones ejecutadas pasan a ser permanentes. Rollback work: provoca el retroceso de la transaccin actual, la base de datos se restaura al estado inicial antes de la ejecucin de la primera instruccin de la transaccin.

Ignacio Olmeda Dpto. Ciencias de la Computacin Universidad de Alcal

You might also like