Sei sulla pagina 1di 17

Moreno García Luis Eduardo 10/05/16

Fundamentos de Bases de Datos

Unidad 6: Lenguaje SQL


6.1 introducción
El SQL es el lenguaje estándar ANSI/ISO de definición, manipulación y control de bases de datos
relacionales. Es un lenguaje declarativo: sólo hay que indicar qué se quiere hacer. En cambio, en los
lenguajes procedimentales es necesario especificar cómo hay que hacer cualquier acción sobre la base
de datos. El SQL es un lenguaje muy parecido al lenguaje natural; concretamente, se parece al inglés, y
es muy expresivo.
Por estas razones, y como lenguaje estándar, el SQL es un lenguaje con el que se puede acceder a todos
los sistemas relacionales comerciales. Empezamos con una breve explicación de la forma en que el SQL
ha llegado a ser el lenguaje estándar de las bases de datos relacionales de los clientes, queda la relación
marcada (en la caja registradora) que une las tablas artículos, y factura. La operación marcar en la caja
registradora significa que los artículos se incluyen en una factura que se entregará al cliente para su
liquidación.
El lenguaje SQL tiene varios componentes:

 Lenguaje de definición de datos (LDD). El LDD de SQL proporciona comandos para la definición
de esquemas de relación, borrado de relaciones y modificación de los esquemas de relación.
 Lenguaje interactivo de manipulación de datos (LMD). El LMD de SQL incluye un lenguaje de
consultas basado tanto en el álgebra relacional (Capítulo 2) como en el cálculo relacional de
tuplas
 Integridad. El LDD de SQL incluye comandos para especificar las restricciones de integridad que
deben cumplir los datos almacenados en la base de datos. Las actualizaciones que violan las
restricciones de integridad se rechazan.
 Definición de vistas. El LDD de SQL incluye comandos para la definición de vistas.
 Control de transacciones. SQL incluye comandos para especificar el comienzo y el final de las
transacciones.
 SQL incorporado y SQL dinámico. SQL incorporado y SQL dinámico definen cómo se pueden
incorporar instrucciones de SQL en lenguajes de programación de propósito general como C, C++,
Java, PL/I, Cobol, Pascal y Fortran.
 Autorización. El LDD de SQL incluye comandos para especificar los derechos de acceso a las
relaciones y a las vistas.

1
Moreno García Luis Eduardo 10/05/16
Fundamentos de Bases de Datos
6.2 Definición de datos
Conceptualmente, SQL es un lenguaje de definición de datos (LDD), un lenguaje de definiciones de vistas
(LDV) y un lenguaje de manipulación de datos (LMD), que posee también capacidad para especificar
restricciones y evolución de esquemas.

El lenguaje SQL está compuesto por comandos, cláusulas, operadores y funciones de agregado. Estos
elementos se combinan en las instrucciones para crear, actualizar y manipular las bases de datos.
Comandos Existen dos tipos de comandos SQL:

 DLL ==> que permiten crear y definir nuevas bases de datos, campos e índices.
 DML ==> que permiten generar consultas para ordenar, filtrar y extraer datos de la base de datos.
El lenguaje de definición de datos (en inglés Data Definition Language, o DDL), es el que se encarga de la
modificación de la estructura de los objetos de la base de datos. Incluye órdenes para modificar, borrar
o definir las tablas en las que se almacenan la base de datos. Existen cuatro operaciones básicas: CREATE,
ALTER, DROP y TRUNCATE.

Comandos DLL
Comando Descripción
CREATE Utilizado para crear nuevas tablas, campos e índices
DROP Empleado para eliminar tablas e índices
Utilizado para modificar las tablas agregando campos o cambiando la definición de
ALTER
los campos.

Comandos DML
Comando Descripción
Utilizado para consultar registros de la base de datos que satisfagan un criterio
SELECT
determinado
INSERT Utilizado para cargar lotes de datos en la base de datos en una única operación.
UPDATE Utilizado para modificar los valores de los campos y registros especificados
DELETE Utilizado para eliminar registros de una tabla de una base de datos

2
Moreno García Luis Eduardo 10/05/16
Fundamentos de Bases de Datos
6.3 Estructura básica de las consultas
La estructura básica de una expresión SQL consiste en tres cláusulas: select, from y where.

• La cláusula select corresponde a la operación proyección del álgebra relacional. Se usa para listar los
atributos deseados del resultado de una consulta.

• La cláusula from corresponde a la operación producto cartesiano del álgebra relacional. Lista las
relaciones que deben ser analizadas en la evaluación de la expresión.

• La cláusula where corresponde al predicado selección del álgebra relacional. Es un predicado que
engloba a los atributos de las relaciones que aparecen en la cláusula from.

Una consulta típica en SQL tiene la forma


select A1, A2,…, An from r1, r2,…, rm where P

Cada Ai representa un atributo, y cada ri una relación.

P es un predicado. La consulta es equivalente a la expresión del álgebra relacional


Π A1, A2,…, An (σP (r1 × r2 ×… × rm ))

CLAUSULAS

Las cláusulas son condiciones de modificación utilizadas para definir los datos que desea seleccionar o
manipular.

Cláusula Descripción
FROM Utilizada para especificar la tabla de la cual se van a seleccionar los registros
Utilizada para especificar las condiciones que deben reunir los registros que se
WHERE
van a seleccionar
GROUP BY Utilizada para separar los registros seleccionados en grupos específicos
HAVING Utilizada para expresar la condición que debe satisfacer cada grupo
Utilizada para ordenar los registros seleccionados de acuerdo con un orden
ORDER BY
específico

3
Moreno García Luis Eduardo 10/05/16
Fundamentos de Bases de Datos
Ejemplos:
La sintaxis básica de una consulta de selección es la siguiente:
SELECT
Campos
FROM
Tabla
En donde campos es la lista de campos que se deseen recuperar y tabla es el origen de los mismos, por
ejemplo:
SELECT Nombre, Teléfono FROM Clientes

Esta sentencia devuelve un conjunto de resultados con el campo nombre y teléfono de la tabla
clientes.
En determinadas ocasiones nos puede interesar incluir una columna con un texto fijo en una consulta
de selección, por ejemplo, supongamos que tenemos una tabla de empleados y deseamos recuperar las
tarifas semanales de los electricistas, podríamos realizar la siguiente consulta:
SELECT Empleados.Nombre, 'Tarifa semanal: ', Empleados.TarifaHora *
40 FROM Empleados WHERE Empleados.Cargo = 'Electricista
Operadores Lógicos

Operador Uso
Es el "y" lógico. Evalúa dos condiciones y devuelve un valor de verdad sólo si ambas son
AND
ciertas.
Es el "o" lógico. Evalúa dos condiciones y devuelve un valor de verdad si alguna de las dos
OR
es cierta.
NOT Negación lógica. Devuelve el valor contrario de la expresión.
Operadores de Comparación
Operador Uso
< Menor que
> Mayor que
<> Distinto de
<= Menor o igual que
>= Mayor o igual que
= Igual que
BETWEEN Utilizado para especificar un intervalo de valores.
LIKE Utilizado en la comparación de un modelo
In Utilizado para especificar registros de una base de datos

4
Moreno García Luis Eduardo 10/05/16
Fundamentos de Bases de Datos

Ejemplos:
select número-préstamo from préstamo where nombre-sucursal = ‘Navacerrada’ and importe > 1200
SELECT *
FROM
Empleados
WHERE
(Sueldo > 100 AND Sueldo < 500)
OR
(Provincia = 'Madrid' AND Estado = 'Casado')
select número-préstamo
from préstamo
where importe between 90000 and 100000

La cláusula from define por sí misma un producto cartesiano de las relaciones que aparecen en la
cláusula.

Escribir una expresión SQL para la reunión natural es una tarea relativamente fácil, puesto que la reunión
natural se define en términos de un producto cartesiano, una selección y una proyección. La expresión
del álgebra relacional se escribe como sigue:

Πnombre-cliente, número-préstamo,importe (prestatario |x| préstamo)

Para la consulta «Para todos los clientes que tienen un préstamo en el banco, obtener los nombres,
números de préstamo e importes». Esta consulta puede escribirse en SQL como
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

Para asegurar la eliminación de duplicados en el resultado de los ejemplos de consultas, se usará la


cláusula distinct siempre que sea necesario. En la mayoría de las consultas donde no se utiliza distinct,
el número exacto de copias duplicadas de cada tupla que resultan de la consulta no es importante.

Podemos ver cómo funciona en el siguiente ejemplo, en el que preguntamos por los distintos oficios de
nuestros empleados.

select oficio from emp

Sin utilizar la cláusula DISTINCT obtendremos la siguiente respuesta OFICIO


-----------
Presidente

5
Moreno García Luis Eduardo 10/05/16
Fundamentos de Bases de Datos
Director
Secretario
Contable
Comercial
Comercial
Director
Analista
Programador
Programador
Director
Analista
Programador
Programador

14 rows selected.

Pero si incluimos la cláusula DISTINCT la respuesta varía para adecuarse más a nuestras espectativas.
select distinct oficio from emp

OFICIO
-----------
Analista
Comercial
Contable
Director
Presidente
Programador
Secretario
7 rows selected.

SQL proporciona un mecanismo para renombrar tanto relaciones como atributos. Para ello utiliza la
cláusula as, que tiene la forma siguiente: nombre-antiguo as nombre-nuevo la cláusula as puede
aparecer tanto en select como en from.

select nombre-cliente, prestatario.número-préstamo


as id-préstamo, importe
from prestatario, préstamo
where prestatario.número-préstamo =
préstamo.número-préstamo

La cláusula order by hace que las tuplas resultantes de una consulta se presenten en un cierto orden. Si
deseamos seleccionar todos los empleados que residen en el estado de Hidalgo ordenados por edad.
Select * from empleados where estado='Hidalgo' order by edad.
La operación renombramiento
6
Moreno García Luis Eduardo 10/05/16
Fundamentos de Bases de Datos
SQL proporciona un mecanismo para renombrar tanto relaciones como atributos. Utiliza la cláusula as
de la forma siguiente:
nombre-antiguo as nombre-nuevo

La cláusula as puede aparecer tanto en la cláusula select como en la cláusula from.


Considérese de nuevo la consulta anterior:
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

6.4 Operaciones sobre conjuntos


Las operaciones de SQL union, intersect y except operan sobre relaciones y corresponden a las
operaciones del álgebra relacional ∪, ∩ y –. Al igual que la unión, intersección y diferencia de conjuntos
en el álgebra relacional, las relaciones que participan en las operaciones han de ser compatibles; esto
es, deben tener el mismo conjunto de atributos.
UNION

La operación de unión permite combinar datos de varias relaciones. Supongamos que una determinada
empresa internacional posee una tabla de empleados para cada uno de los países en los que opera. Para
conseguir un listado completo de todos los empleados de la empresa tenemos que realizar una unión de
todas las tablas de empleados de todos los países.

No siempre es posible realizar consultas de unión entre varias tablas, para poder realizar esta operación
es necesario e imprescindible que las tablas a unir tengan las mismas estructuras, que sus campos sean
iguales.

La operación unión
Para determinar todos los clientes del banco que tienen un préstamo, una cuenta o las dos cosas en el
banco, hay que escribir:
(select nombre_cliente
from impositor)
union
(select nombre_cliente
from prestatario)
A diferencia de la cláusula select, la operación union (unión) elimina los valores duplicados
automáticamente.
Así, en la consulta anterior, si un cliente—por ejemplo, Santos—tiene varias cuentas o préstamos
(O ambas cosas) en el banco, sólo aparecerá una vez en el resultado.
Si se desea conservar todos los duplicados hay que escribir union all en lugar de union:
(select nombre_cliente
from impositor)

7
Moreno García Luis Eduardo 10/05/16
Fundamentos de Bases de Datos
union all
(select nombre_cliente
from prestatario)

El número de tuplas duplicadas en el resultado es igual al número total de valores duplicados que
aparecen en i y p. Así, si Santos tiene tres cuentas y dos préstamos en el banco, en el resultado
aparecerán cinco tuplas con el nombre de Santos.

La operación intersección

Para encontrar todos los clientes que tienen tanto un préstamo como una cuenta en el banco, hay que
escribir:
(select distinct nombre_cliente
from impositor)
intersect
(select distinct nombre_cliente
from prestatario)
La operacion intersect (intersección) elimina los valores duplicados automáticamente. Así, en la consulta
anterior, si un cliente—por ejemplo, Santos—tiene varias cuentas o préstamos en el banco, sólo
aparecerá una vez en el resultado.

Si se desean conservar todos los valores duplicados hay que escribir intersect all en lugar de intersect:
(select nombre_cliente
from impositor)
intersect all
(select nombre_cliente
from prestatario)

El número de tuplas duplicadas que aparecen en el resultado es igual al número mínimo de valores
duplicados que aparecen en i y p. Por tanto, si Santos tiene tres cuentas y dos préstamos en el banco, en
el resultado de la consulta aparecerán dos tuplas con el nombre de Santos.

La operación excepto
Para determinar todos los clientes que tienen cuenta en el banco pero no tienen ningún préstamo
concedido hay que escribir:

(select distinct nombre_cliente


from impositor)
except
(select nombre_cliente

8
Moreno García Luis Eduardo 10/05/16
Fundamentos de Bases de Datos
from prestatario)
La operación except (excepto) elimina los valores duplicados automáticamente. Así, en la consulta
anterior, sólo aparecerá en el resultado (exactamente una vez) una tupla con el nombre de Santos si
Santos tiene una cuenta en el banco pero no tiene ningún préstamo concedido.

Si se desea conservar todos los valores duplicados hay que escribir except all en lugar de except:
select nombre_cliente
from impositor)
except all
(select nombre_cliente
from prestatario)

El número de copias duplicadas de una tupla en el resultado es igual al número de copias duplicadas de
dicha tupla en impositor menos el número de copias duplicadas de la misma tupla en prestatario,
siempre que la diferencia sea positiva. Así, si Santos tiene tres cuentas y un préstamo en el banco, en el
resultado aparecerán dos tuplas con el nombre de Santos. Si, por el contrario, ese cliente tiene dos
cuentas y tres préstamos en el banco, en el resultado no habrá ninguna tupla con el nombre de Santos.

6.5 Funciones de agregación


Las funciones de agregación son funciones que toman una colección (un conjunto o multiconjunto) de
valores como entrada y devuelven un solo valor. SQL ofrece cinco funciones de agregación incorporadas:
Media: avg
Mínimo: min
Máximo: max
Total: sum
Recuento: count

Los datos de entrada para sum y avg deben ser una colección de números, pero los otros operadores
también pueden operar sobre colecciones de datos de tipo no numérico como las cadenas de caracteres.
A modo de ejemplo, considérese la consulta “Determinar el saldo medio de las cuentas de la sucursal de
Navacerrada”. Esta consulta se puede formular del modo siguiente:
select avg (saldo)
from cuenta
where nombre_sucursal = ’Navacerrada’

6.6 Valores nulos


SQL permite el uso de valores nulos para indicar la ausencia de información sobre el valor de un
atributo. Se puede utilizar la palabra clave especial null en un predicado para comprobar si un valor es
nulo.

9
Moreno García Luis Eduardo 10/05/16
Fundamentos de Bases de Datos
Así, para determinar todos los números de préstamo que aparecen en la relación préstamo con valores
nulos para importe hay que escribir:

select número_préstamo
from préstamo
where importe is null

El predicado is not null comprueba la ausencia de valores nulos. El uso de valores nulos en las
operaciones aritméticas y de comparación causa algunos problemas. El resultado de las expresiones
aritméticas (que incluyan por ejemplo +, ¡, ¤ o =) es nulo si cualquiera de los valores de entrada es nulo.
SQL trata como unknown (desconocido) el resultado de cualquier comparación que implique un valor
nulo (excepto con is null y is not null).

Dado que el predicado de las cláusulas where puede incluir operaciones booleanas como and, or y not
sobre los resultados de las comparaciones, se amplían las definiciones de las operaciones booleanas para
que manejen el valor unknown.

 and. El resultado de cierto and desconocido es desconocido, falso and desconocido es falso,
mientras que desconocido and desconocido es desconocido.
 or. El resultado de cierto or desconocido es cierto, falso or desconocido es desconocido,
mientras que desconocido or desconocido es desconocido.
 not. El resultado de not desconocido es desconocido.

6.7 Consultas anidadas


SQL proporciona un mecanismo para anidar subconsultas. Las subconsultas son expresiones selectfrom-
where que están anidadas dentro de otra consulta. Una finalidad habitual de las subconsultas es llevar
a cabo comprobaciones de pertenencia a conjuntos, hacer comparaciones de conjuntos y determinar
cardinalidades de conjuntos. Estos usos se estudian en los apartados siguientes.

Una subconsulta anidada en la instrucción externa SELECT tiene los componentes siguientes:

 Una consulta SELECT normal, que incluye los componentes normales de la lista de selección.
 Una cláusula normal FROM que incluye uno o varios nombres de tablas o vistas.
 Una cláusula opcional WHERE.
 Una cláusula opcional GROUP BY.
 Una cláusula opcional HAVING.

10
Moreno García Luis Eduardo 10/05/16
Fundamentos de Bases de Datos

La consulta SELECT de una subconsulta se presenta siempre entre paréntesis. No puede incluir una
cláusula COMPUTE o FOR BROWSE y sólo puede incluir una cláusula ORDER BY cuando se especifica
también una cláusula TOP.

Una subconsulta puede anidarse en la cláusula WHERE o HAVING de una instrucción externa SELECT,
INSERT, UPDATE o DELETE, o bien en otra subconsulta. Se puede disponer de hasta 32 niveles de
anidamiento, aunque el límite varía dependiendo de la memoria disponible y de la complejidad del resto
de las expresiones de la consulta. Las consultas individuales no permiten anidamientos de más de 32
niveles. Una subconsulta puede aparecer en cualquier parte en la que se pueda usar una expresión, si
devuelve un solo valor.

Si una tabla sólo aparece en una subconsulta y no en la consulta externa, las columnas de esa tabla no
se podrán incluir en la salida (la lista de selección de la consulta externa).

Las instrucciones que incluyen una subconsulta normalmente tienen uno de estos formatos:
 WHERE expression [NOT] IN (subquery)
 WHERE expression comparison_operator [ANY | ALL] (subquery)
 WHERE [NOT] EXISTS (subquery)

En algunas instrucciones Transact-SQL, la subconsulta se puede evaluar como si fuera una consulta
independiente. Conceptualmente, los resultados de la subconsulta se sustituyen en la consulta externa,
aunque en realidad ésta no es la forma en la que Microsoft SQL Server procesa las instrucciones Transact-
SQL con subconsultas.

Hay tres tipos básicos de subconsultas, que son las siguientes:


 Las que operan en listas especificadas con IN o modificadas por un operador de comparación
mediante ANY o ALL.
 Las que se especifican con un operador de comparación sin modificar y deben devolver un solo
valor.
 Las que son pruebas de existencia especificadas con EXISTS.

6.8 Consultas complejas


Las consultas complejas a menudo resultan difíciles o imposibles de escribir como un único bloque de
SQL o como unión, intersección o diferencia de bloques de SQL (cada bloque de SQL consta de una sola
instrucción select-from-where, posiblemente con cláusulas group by y having). En este apartado se
estudian dos formas de componer varios bloques de SQL para expresar consultas complejas: las
relaciones derivadas y la cláusula with.

11
Moreno García Luis Eduardo 10/05/16
Fundamentos de Bases de Datos
Relaciones derivadas
SQL permite el uso de expresiones de subconsulta en las cláusulas from. Si se utiliza una expresión de
este tipo, hay que proporcionar un nombre a la relación resultado y será posible renombrar los atributos
mediante la cláusula as. Por ejemplo, considérese la subconsulta:

(select nombre_sucursal, avg (saldo)


from cuenta
group by nombre_sucursal)
as media_sucursal (nombre_sucursal, saldo_medio)

Esta subconsulta genera una relación consistente en los nombres de todas las sucursales y sus
correspondientes saldos de cuenta medios. El resultado de la subconsulta recibe el nombre de
media_sucursal, con los atributos nombre_sucursal y saldo_medio.

Para ilustrar el uso de una expresión de subconsulta en la cláusula from, considérese la consulta
“Determinar el saldo medio de las cuentas de las sucursales en las que el saldo medio de las cuentas sea
superior a 1.200 e”. En el Apartado 3.5 se formulaba esta consulta utilizando la cláusula having. Ahora
se puede reescribir sin utilizar esa cláusula, de la siguiente forma:

select nombre_sucursal, avg_saldo


from (select nombre_sucursal, avg (saldo)
from cuenta
group by nombre_sucursal)
as media_sucursal (nombre_sucursal, saldo_medio)
where saldo_medio > 1200

La cláusula with
Las consultas complicadas son mucho más fáciles de formular y de entender si se estructuran
descomponiéndolas en vistas más simples que luego se combinan, igual que se estructuran los
programas descomponiendo sus tareas en procedimientos.

Sin embargo, a diferencia de la definición de procedimientos, las cláusulas create view crean definiciones
de vistas en la base de datos y esa definición de vista sigue en la base de datos hasta que se ejecuta una
orden drop view nombre_vista.

La cláusula with proporciona una forma de definir vistas temporales cuya definición sólo está disponible
para la consulta en la que aparece la cláusula. Considérese la siguiente consulta, que selecciona cuentas
con el saldo máximo; si hay muchas cuentas con el mismo saldo máximo, se seleccionan todas.

with saldo_máximo (valor) as


select max(saldo)
from cuenta

12
Moreno García Luis Eduardo 10/05/16
Fundamentos de Bases de Datos
select número_cuenta
from cuenta, saldo_máximo
where cuenta.saldo = saldo_máximo.valor

6.9 Vistas
Hasta este momento los ejemplos se han limitado a operar en el nivel de los modelos lógicos. Es decir,
se ha dado por supuesto que las relaciones facilitadas son las relaciones reales almacenadas en la base
de datos.

No resulta deseable que todos los usuarios vean el modelo lógico completo. Las consideraciones de
seguridad pueden exigir que se oculten ciertos datos a los usuarios. Considérese una persona que
necesita saber el número de préstamo y el nombre de la sucursal de un cliente, pero no necesita ver el
importe de ese préstamo. Esa persona debería ver una relación descrita (módulo renombramiento de
atributos) en SQL mediante:

select nombre_cliente, prestatario.número_préstamo, nombre_sucursal


from prestatario, préstamo
where prestatario.número_préstamo = préstamo.número_préstamo

Aparte de las consideraciones de seguridad, puede que se desee crear un conjunto personalizado de
relaciones que se adapte mejor a la intuición de un usuario determinado que el modelo lógico.

Puede que a un usuario del departamento de publicidad, por ejemplo, le guste ver una relación que
consista en los clientes que tienen o bien cuenta abierta o bien préstamo concedido en el banco y las
sucursales con las que trabajan. La relación que se crearía para ese empleado es la siguiente:
(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)

Las relaciones que no forman parte del modelo lógico pero se hacen visibles a los usuarios como
relaciones virtuales se denominan vistas. Es posible definir un gran número de vistas de cualquier
conjunto dado de relaciones reales.

13
Moreno García Luis Eduardo 10/05/16
Fundamentos de Bases de Datos
6.10 Modificación de las bases de datos
Hasta ahora se ha estudiado la extracción de información de las bases de datos. A continuación se
mostrará cómo añadir, eliminar y modificar información utilizando SQL.
Borrado

Las solicitudes de borrado se expresan casi igual que las consultas. Sólo se pueden borrar tuplas
completas; no se pueden borrar sólo valores de atributos concretos. SQL expresa los borrados mediante:
delete from r
where P

donde P representa un predicado y r representa una relación. La declaración delete busca primero todas
las tuplas t en r para las que P(t) es cierto y a continuación las borra de r. La cláusula where se puede
omitir, en cuyo caso se borran todas las tuplas de r.

Obsérvese que cada comando delete sólo opera sobre una relación. Si se desea borrar tuplas de varias
relaciones hay que utilizar una orden delete por cada relación. El predicado de la cláusula where puede
ser tan complicado como la cláusula where de cualquier orden select. En el otro extremo, la cláusula
where puede estar vacía. La consulta delete from préstamo borra todas las tuplas de la relación
préstamo (los sistemas bien diseñados exigen una confirmación del usuario antes de ejecutar una
petición tan devastadora).

A continuación se muestra una serie de ejemplos de peticiones de borrado en SQL:


Borrar todas las tuplas de cuentas de la sucursal de Navacerrada.
delete from cuenta
where nombre_sucursal = ’Navacerrada’

Borrar todos los préstamos con importe comprendido entre 1.300 e y 1.500 e.

delete from préstamo


where importe between 1300 and 1500

Borrar todas las tuplas de cuenta de todas las sucursales de Arganzuela.


delete from cuenta
where nombre_sucursal in (select nombre_sucursal
from sucursal
where ciudad_sucursal = ’Arganzuela’)

Esta solicitud de borrado busca primero todas las sucursales de Arganzuela y luego borra todas las
tuplas cuenta correspondientes a esas sucursales.

Inserción
Para insertar datos en una relación, se especifica la tupla que se desea insertar o se formula una
consulta cuyo resultado sea el conjunto de tuplas que se desea insertar. Obviamente, los valores de los

14
Moreno García Luis Eduardo 10/05/16
Fundamentos de Bases de Datos
atributos de las tuplas que se inserten deben pertenecer al dominio de los atributos. De igual modo, las
tuplas insertadas deben ser de la aridad correcta.

La instrucción insert más sencilla es una solicitud de inserción de una tupla. Supóngase que se desea
insertar el hecho de que hay una cuenta C-9732 en la sucursal de Navacerrada y que tiene un saldo de
1.200 e.

Hay que escribir:

insert into cuenta


values (’C-9732’, ’Navacerrada’, 1200)

Actualizaciones
En determinadas situaciones puede ser deseable modificar un valor dentro de una tupla sin cambiar
todos los valores de la misma. Para este tipo de situaciones se puede utilizar la instrucción update. Al
igual que ocurre con insert y delete, se pueden elegir las tuplas que se van a actualizar mediante una
consulta.

Supóngase que se va a realizar el pago anual de intereses y que hay que incrementar todos los saldos en
un 5 por ciento. Hay que escribir:

update cuenta
set saldo = saldo * 1.05

Esta instrucción de actualización se aplica una vez a cada tupla de la relación cuenta. Si sólo se paga el
interés a las cuentas con un saldo de 1.000 e o superior, se puede escribir:

update cuenta
set saldo = saldo * 1.05
where saldo >= 1000

En general, la cláusula where de la instrucción update puede contener cualquier constructor permitido
en la cláusula where de la instrucción select (incluyendo instrucciones select anidadas). Al igual que
ocurre con insert y con delete, un select anidado en una instrucción update puede hacer referencia a la
relación que se esté actualizando.

Al igual que antes, SQL primero comprueba todas las tuplas de la relación para determinar si se deben
actualizar y después realiza la actualización. Por ejemplo, se puede escribir la solicitud “Pagar un interés
del 5 por ciento a las cuentas cuyo saldo sea mayor que la media” como sigue:
update cuenta
set saldo = saldo * 1.05
where saldo > (select avg (saldo)
from cuenta)

15
Moreno García Luis Eduardo 10/05/16
Fundamentos de Bases de Datos
Actualización de vistas
Aunque las vistas resultan una herramienta útil para las consultas, presentan serios problemas si se
expresa con ellas actualizaciones, inserciones o borrados. La dificultad radica en que las modificaciones
de la base de datos expresadas en términos de vistas deben traducirse en modificaciones de las
relaciones reales del modelo lógico de la base de datos.

Para ilustrar el problema, considérese un empleado que necesita ver todos los datos de préstamos de la
relación préstamo, excepto importe_préstamo. Sea sucursal_préstamo la vista ofrecida al empleado.
Esta vista se define como:

create view sucursal_préstamo as


select número_préstamo, nombre_sucursal
from préstamo

Como se permite que el nombre de la vista aparezca en cualquier lugar en el que pueda aparecer el
nombre de una relación, el empleado puede escribir

insert into sucursal_préstamo


values (’P-37’, ’Navacerrada’)

Esta inserción debe representarse mediante una inserción en la relación préstamo, puesto que préstamo
es la relación real a partir de la cual el sistema de bases de datos construye la vista sucursal_préstamo.
Sin embargo, para insertar una tupla en préstamo hay que tener algún valor para importe. Hay dos
enfoques razonables para tratar esta inserción:

 Rechazar la inserción y devolver al usuario un mensaje de error.


 Insertar la tupla (P-37, “Navacerrada”, null) en la relación préstamo.

Transacciones

Una transacción consiste en una secuencia de instrucciones de consulta o de actualización. La norma


SQL especifica que una transacción comienza implícitamente cuando se ejecuta una instrucción SQL.
Una de las siguientes instrucciones SQL debe finalizar la transacción:

 Commit work compromete la transacción actual; es decir, hace que las actualizaciones
realizadas por la transacción pasen a ser permanentes en la base de datos. Una vez
comprometida la transacción, se inicia de manera automática una nueva transacción.
 Rollback work provoca el retroceso de la transacción actual; es decir, deshace todas las
actualizaciones realizadas por las instrucciones SQL de la transacción. Por tanto, el estado de la
base de datos se restaura al que tenía antes de la ejecución de la primera instrucción de la
transacción. La palabra clave work es opcional en ambas instrucciones.

El retroceso de transacciones resulta útil si se detecta alguna condición de error durante la ejecución de
la transacción. El compromiso es parecido, en cierto sentido, a guardar los cambios de un documento

16
Moreno García Luis Eduardo 10/05/16
Fundamentos de Bases de Datos
que se esté editando, mientras que el retroceso es como abandonar la sesión de edición sin guardar los
cambios.

Una vez que la transacción ha ejecutado commit work, sus efectos ya no se pueden deshacer con
rollback work. El sistema de bases de datos garantiza en caso de fallo (como puede ser un error en una
de las instrucciones SQL, una caída de tensión o una caída del sistema) provocar el retroceso de los
efectos de la transacción si todavía no se había ejecutado commit work. En caso de caída de tensión o
caída del sistema, el retroceso ocurre cuando el sistema se reinicia.

17

Potrebbero piacerti anche