Modificación de la Base de Datos en SQL TEMA 6: MODIFICACIÓN DE LA BASE DE DATOS EN SQL 5.6 MODIFICACIÓN DE LA BASE DE DATOS SQL posee comandos destinados también para modificar la base de datos, entre estos se tienen operaciones de borrado, inserción y actualización. 5.6.1 BORRADO La operación de borrado se expresa de igual manera que una consulta. Se pueden borrar sólo tuplas completas, es decir, no se pueden borrar valores de atributos concretos. La expresión SQL relacionada con el borrado es: ♦ delete from r where p Donde r es una relación y p es una condición lógica que determina las tuplas a ser eliminadas de r, si la condición p es omitida, se eliminan todas la tuplas de r. Hay que señalar que una orden delete opera sólo sobre una relación. Si se desea borrar tuplas de varias relaciones, se deberá utilizar una orden delete por cada relación. El predicado de la cláusula where puede ser tan complicado como el where de cualquier cláusula select, o tan simple como una cláusula where vacía. Ejemplo: Borrar todas las tuplas de la relación Prestamo (Los sistemas bien diseñados requerirán una confirmación del usuario antes de ejecutar una consulta como esta). ♦ Solución: delete from Prestamo Ejemplo: Borrar todas las cuentas de la Sucursal ‘Subtiava’ ♦ Solución: delete from Cuenta where nombre_sucursal=’Subtiava’ Ejemplo: Borrar todas las cuentas de la Sucursal ‘Subtiava’ ♦ Solución: delete from Cuenta where nombre_sucursal=’Subtiava’ Ejemplo: Borrar todos los préstamos en los que el monto del préstamo esté entre C$ 5,000 y C$ 10,000 córdobas. ♦ Solución: delete from Prestamo where importe between 5000 and 10000 Ejemplo: Borrar las cuentas de todas las sucursales de Granada En este caso la solución se genera mediante una subconsulta que muestra los nombres de las sucursales ubicadas en Masaya. De modo que la expresión SQL requerida es: ♦ Solución: delete from Cuenta where nombre_sucursal in (select nombre_sucursal from Sucursal where ciudad_sucursal = ‛Granada‛) 1 Modificación de la Base de Datos en SQL En este borrado se selecciona primero todas las sucursales con sede en Granada y a continuación borra todas las tuplas Cuenta pertenecientes a esas sucursales. 5.6.1.1 Uso de funciones de agregación en una subconsulta de borrado. Ejemplo: Borrar todas las cuentas cuyos saldos sean inferiores a la media del banco ♦ Solución: delete from Cuenta where saldo <(select avg (saldo) from Cuenta) La orden delete comprueba primero que cada tupla de la relación Cuenta para comprobar si la cuenta tiene un saldo inferior a la media del banco. A continuación se borran todas las tuplas que no cumplan la condición anterior, es decir, las que representan una cuenta con un saldo menor que la media. Es importante realizar todas las comprobaciones antes de llevar a cabo ningún borrado. 5.6.2 INSERCIÓN El comando SQL encargado de realizar la inserción de una ó más tuplas en una relación es el comando insert, este tiene dos variantes: ♦ Una para insertar una sola tupla indicando los valores de los atributos de forma explícita, la forma general en este caso es insert into r values (tupla a insertar) en el caso de que se respete el orden de los atributos en la relación r, ♦ En caso de que la tupla a insertar no respete ese orden, el nombre de los atributos se debe listar también en el comando insert. Para insertar datos en una relación, o bien se especifica la tupla que se desea insertar o se formula una consulta cuyo resultado sea el conjunto de tuplas que se desean insertar. Obviamente, los valores de los atributos de las tuplas que se inserten deben pertenecer al dominio de los atributos. De igual manera, las tuplas insertadas deberán ser de la aridad correcta. La instrucción insert más sencilla corresponde a la de inserción de una tupla. Ejemplo: Insertar en la base los datos asociados a la cuenta C-0045 en la Sucursal Léon y que tiene como saldo C$ 6000.00 ♦ Solución Caso 1: insert into Cuenta values ( ‛C-0045‛, ‛León‛, 6000) En este ejemplo los valores se especifican en el mismo orden en que los atributos se listan en el esquema de la relación Cuenta. Para beneficio de los usuarios que no pueden recordar el orden de los atributos se especifican en la cláusula insert. ♦ Solución Caso 2: insert into Cuenta (nombre_sucursal, numero_cuenta, saldo) values (‛León‛,‛C-0045‛,6000) ♦ Solución: insert into Cuenta (numero_cuenta, nombre_sucursal, saldo) values (‛C0045‛,‛León‛,6000) 2 Modificación de la Base de Datos en SQL El efecto es similar al ejemplo anterior con la diferencia de que se han listado explicitamente los nombres de los atributos, esto debido a que en la cláusula values no se ha guardado el orden que estos tienen en la estructura de la tabla. ♦ Generalmente se desea insertar las tuplas que resultan de una consulta. Ejemplo: Si a todos los clientes que tienen un préstamo en la sucursal Subtiava se les quisiera regalar, como gratificación una cuenta de ahorro con C$ 5000.00 por cada cuenta de préstamo que posee. ♦ Solución: insert into Cuenta select nombre_sucursal,numero_prestamo, 1000 from Prestamo where nombre_sucursal = ‘Subtiava’ La instrucción select se evalúa primero, produciendo un conjunto de tuplas que a continuación se insertan en la relación Cuenta. Cada tupla tiene un nombre_sucursal (Subtiava), un numero_prestamo (que sirve como número para la nueva cuenta) y un saldo inicial de la cuenta (C$ 1000). Es necesario añadir tuplas a la relación Impositor, a través de la siguiente consulta: ♦ Solución: insert into Impositor select nombre_cliente, numero_prestamo from Prestatario, Prestamo where Prestatario.numero_prestamo = Préstamo.numero_prestamo and nombre_sucursal = ‘Subtiava‛ Esta consulta inserta en la relación Impositor una tupla (nombre_cliente, numero_prestamo) por cada nombre_cliente que posea un préstamo en la sucursal Subtiva, con número de préstamo numero_prestamo. 5.6.3 ACTUALIZACIONES En determinadas situaciones puede ser necesario cambiar un valor dentro de una tupla, sin cambiar todos los valores de la misma. Para este tipo de situaciones se utiliza la instrucción update. Al igual que ocurre con insert y delete, se puede elegir las tuplas que van a ser actualizadas mediante una consulta. Forma general: Sea r una relación y sea exp la expresión de actualización, entonces la forma general del comando de actualizaciones: ♦ update r set exp Ejemplo: Realizar el pago de intereses anuales y todos los saldos se incrementen en un 5%, habría que formular la siguiente consulta de actualización: ♦ Solución: update Cuenta set saldo=saldo * 1.05 Esta actualización se aplica una vez a cada tupla de la relación Cuenta. Ejemplo: Si se paga el interés sólo a las cuentas con un saldo de C$ 1000 o superior, se puede escribir la siguiente consulta. ♦ Solución: update Cuenta set saldo=saldo * 1.05 where saldo >=1000 3 Modificación de la Base de Datos en SQL En general la cláusula where de la instrucción update puede contener cualquier constructor legal en la cláusula where de una instrucción select (incluyendo instrucciones select anidadas). Como con delete e insert, un select anidado en una instrucción update puede referenciar la relación que se esté actualizando. SQL, primero comprueba todas las tuplas de la relación para determinar las que deberían actualizar y después la actualización. Ejemplo: Pagar un interés del 5% a las cuentas cuyo saldo sea mayor que la media. ♦ Solución: update Cuenta set saldo=saldo * 1.05 where (saldo > select avg(saldo) from Cuenta) Ejemplo: Suponer que las cuentas con saldos superiores a C$ 5000 reciben un 6% de interés, mientras que las demás cuentas recibirán un 5%. ♦ Solución: update Cuenta set saldo=saldo * 1.06 where saldo > 5000 ♦ Solución: update Cuenta set saldo=saldo * 1.05 where saldo <= 5000 Tomar en cuenta, que el orden en el que se ejecutan dos instrucciones de actualización es importante. Este tipo de solución tiene el inconveniente de que si se modifica el orden de las consultas de actualización se pueden generar actualizaciones erróneas. Así si se realiza primero el incremento del 5%, valores cercanos a 1000 pasarían a ser valores mayores de 1000 con lo cual se les aplicaría el 6% de incremento, llegándose a un incremento neto del 1.05 * 1.06 = 1.113 es decir el 11.3%, en lugar del 5% para evitar esta problemática SQL cuenta con el comando case muy similar al comando de los lenguajes de propósito general, así la expresión del ejemplo anterior utilizando case es: SQL ofrece una constructora case, que se puede usar para formular las dos instrucciones de actualización en una instrucción de actualización. Solución: update Cuenta set saldo = case when saldo <= 10000 then saldo * 1,05 else saldo * 1.06 end ♦ La forma general de la cláusula case es: case when pred1 then result1 when pred2 then result2 … when predn then resultn else result0 end En este caso se analizan cada uno de los predicados y si predi es verdadero entonces se ejecuta resulti. Por otra parte si ninguno es verdadero se ejecuta result0. 4 Modificación de la Base de Datos en SQL 5.7 TRANSACCIONES Una transacción es un conjunto de instrucciones SQL de consultas y actualizaciones que deben de ejecutarse todas de forma exitosa o no ejecutar ninguna. La norma SQL especifica que una transacción comienza de forma implícita (no hay comando de comienzo) cuando se ejecuta una instrucción SQL, la transacción finaliza con cualquiera de las siguientes opciones dependiendo de la decisión del usuario. Commit: Compromete la Transacción actual, es decir hace que los cambios realizados por la transacción sean permanentes en la base de datos. Después de ejecutarse este comando comienza una nueva transacción de forma automática RollBack: Su efecto es retroceder la transacción actual es decir deshace todas las actualizaciones realizadas por las instrucciones SQL, de tal forma que la base de datos se restaura al estado que existía previo a la primera instrucción de la transacción. 5