Está en la página 1de 17

CIFP LA LABORAL BASES DE DATOS

C.F.G.S. DESARROLLO DE APLICACIONES WEB

MÓDULO: BASES DE DATOS

Unidad de trabajo 6

Tratamiento de datos
Inserción, borrado y actualización

CFGS DESARROLLO DE APLICACIONES WEB 1


CIFP LA LABORAL BASES DE DATOS

Manipulación de datos: INSERT, UPDATE y DELETE

Hasta ahora nos hemos dedicado a consultar datos de la base de datos mediante la
sentencia SELECT. Hemos trabajado con tablas que ya tenían datos y hemos estado
seleccionando los datos de estas tablas. Ahora aprenderemos a insertar nuevas filas
en una tabla, a actualizar los valores existentes y a borrar filas enteras.

Inserción de datos: INSERT

Añade filas de datos en una tabla.

INSERT INTO tabla [(col1, col2, ...)] VALUES (valor1, valor2, ...);

Donde:

(col1, col2, ...) representa la columna o columnas donde se van a introducir


valores. Si las columnas no se especifican se consideran, por defecto, todas las
columnas de la tabla.

(valor1, valor2, ...) representan los valores que se van a dar a las columnas. Los
valores se deben corresponder con cada una de las columnas que aparecen;
además, deben coincidir con el tipo de dato definido para cada columna. Cualquier
columna que no se encuentre en la lista de columnas recibirá el valor NULL,
siempre y cuando no esté definida como NOT NULL, en cuyo caso INSERT fallará, o
cuando tenga una restricción de valor por defecto, en cuyo caso tomará ese valor.

Si no se especifica la lista de columnas, deben figurar en VALUES tantos valores


como columnas tenga la tabla y en el mismo orden al especificado en la creación de
la tabla.

Se pueden utilizar como valores a insertar variables como SYSDATE, USER, etc.

INSERT INTO departamentos (dnombre, dep_no)


VALUES ('PERSONAL', 107);

INSERT INTO departamentos VALUES (107, 'PERSONAL', NULL);

Para los campos numéricos los valores que tengan decimales se especifican con
punto como separador decimal:

INSERT INTO artículos (ID, descripción, precio)


VALUES (100,'CD-ROM',20.5);

CFGS DESARROLLO DE APLICACIONES WEB 2


CIFP LA LABORAL BASES DE DATOS

Ejemplos con el siguiente modelo de datos:

La tabla Ventas tiene estas filas:

Ejemplo: añadir una venta con estos datos:

albarán: 9
fecha: 25/10/2010
cliente: 3
artículo: 5
unidades: 5

La sentencia SQL sería:

INSERT INTO ventas (albaran, fecha, cliente, articulo, unidades)


VALUES (9, '25/10/2010', 3, 5, 5);

CFGS DESARROLLO DE APLICACIONES WEB 3


CIFP LA LABORAL BASES DE DATOS

El resultado de su ejecución es que se añade una nueva fila a la tabla con los datos
especificados. Si omitimos algún campo éste adquiere el valor NULL (nulo).

INSERCIÓN DE FILAS TOMADAS DE OTRA TABLA

Hasta ahora sólo hemos insertado una fila con cada orden, pero si añadimos a
INSERT una consulta (una orden SELECT), se añaden tantas filas como devuelva la
consulta.

INSERT INTO tabla [(col1, col2, ...)]


SELECT { [columna1, columna2, ... | * ] }
FROM tabla2 [cláusulas_de_select];

Ejemplos:

A todos los clientes, el día 30/10/2010 les entregamos 3 unidades del artículo con
código 2. Como hay seis clientes generaremos 6 ventas. El número de albarán se
calcula utilizando el contador de filas ROWNUM.
El número de albarán será (9 + rownum), con esta fórmula se obtendrán los
albaranes 10, 11, 12, 13, 14 y 15.

Con la siguiente consulta seleccionamos los valores a insertar:

SELECT (rownum+9),'30/10/2010', codigo, 2, 3


FROM clientes;

Esta consulta devuelve 6 filas, una por cada cliente, en cada fila sólo varía el valor
del código del cliente y el valor generado para el número de albarán.

CFGS DESARROLLO DE APLICACIONES WEB 4


CIFP LA LABORAL BASES DE DATOS

Para insertar las filas en la tabla VENTAS:

INSERT INTO ventas (albaran, fecha, cliente, articulo, unidades)


SELECT (rownum+9),'30/10/2010', codigo, 2, 3 from clientes;

Para insertar en la tabla EMPLE30 todos los empleados de la tabla EMPLE que
pertenecen al departamento 30:

INSERT INTO emple30(empNo, apellido, oficio, dir, fechAlta, salar)


SELECT empNo, apellido, oficio, director, fechAlta, sala
FROM emple
WHERE deptNo=30;

Para añadir un Nuevo empleado con el mismo oficio, salario, y departamento que el
empleado de código 123.

INSERT INTO emple(empNo, apellido, oficio, fechAlta, salar, deptNo)


SELECT 1111, 'GARCIA', oficio, SYSDATE, salar, deptNo
FROM emple WHERE empNo=123;

CFGS DESARROLLO DE APLICACIONES WEB 5


CIFP LA LABORAL BASES DE DATOS

Modificaciones: UPDATE

Para actualizar los valores de las columnas en una o varias filas de una tabla, se
utiliza la orden UPDATE.

UPDATE tabla
SET columna1=valor1 [, columna2=valor2] ...
[WHERE condicion];

Donde:

SET columna1=valor1, columna2=valor2, ... indica las columnas que se van a


actualizar y sus valores.

[WHERE condicion]; selecciona las filas que se van a actualizar. Si se omite, la


actualización afectará a todas las filas de la tabla.

Con la condición WHERE indicamos a qué registros se les aplica.

UPDATE centros
SET direccion = 'C/ Pilón 13', num_plazas = 295
WHERE cod_centro = 22;

Si no se indica cláusula WHERE, se modifican todas las filas.

UPDATE centros
SET num_plazas = 295;

Sustituir todos los pedidos del artículo con código 1 y convertirlos en pedidos de
artículo 2.

UPDATE pedidos
SET articulo = 2
WHERE articulo=1;

CFGS DESARROLLO DE APLICACIONES WEB 6


CIFP LA LABORAL BASES DE DATOS

Si en lugar de la sentencia anterior hubiéramos puesto ésta, cambiaríamos por el


valor 2 el campo articulo en todos los registros de la tabla.

UPDATE pedidos
SET articulo = 2;

Incrementar los precios de artículos que se refieren a módulos de RAM en un 5%.

UPDATE articulos
SET precio = precio*1.05
WHERE descripcion LIKE 'RAM%';

MODIFICACIONES USANDO SUBCONSULTAS

Podemos incluir una subconsulta SELECT en una sentencia UPDATE.

Ejemplos:

Vamos a actualizar la tabla de ventas para que todos los clientes que sean de
Oviedo que hayan adquirido el artículo 2 éste sea suministrado con fecha
29/1/2014.

UPDATE ventas
SET fecha = '29/1/2014'
WHERE articulo = 2 AND
cliente IN (SELECT codigo FROM clientes WHERE localidad = 'Oviedo');

CFGS DESARROLLO DE APLICACIONES WEB 7


CIFP LA LABORAL BASES DE DATOS

La SELECT puede estar en la cláusula WHERE o puede formar parte de SET.

UPDATE usuarios
SET cuota_socio = cuota_socio * 1.10
WHERE num_socio IN (SELECT codigo_usuario FROM activ_usuario
WHERE codigo_actividad = 'GIM');

UPDATE emple
SET apellido = LOWER(apellido),
salario = (SELECT salario * 2 FROM emple WHERE apellido = 'SANCHEZ')
WHERE dept_no = 20;

Un ejemplo con más complejidad: Actualizar las existencias para cada artículo,
añadiendo a las existencias iniciales la suma de unidades pedidas de ese artículo.

UPDATE articulos
SET existencias_iniciales = existencias_iniciales +
(SELECT NVL(SUM(UNIDADES),0) FROM pedidos WHERE articulo=id);

CFGS DESARROLLO DE APLICACIONES WEB 8


CIFP LA LABORAL BASES DE DATOS

Borrado de filas: DELETE

Para eliminar una o varias filas de una tabla, se usa la orden DELETE.

DELETE [FROM] tabla


[WHERE condicion]

Sin la cláusula WHERE, borrará todas las filas de la tabla. La condición puede incluir
una subconsulta.

DELETE FROM centros WHERE cod_centro = 50;

Borrar los libros que tienen menos ejemplares que la media de ejemplares de su
estante.

DELETE FROM libreria li


WHERE ejemplares <
(SELECT AVG(ejemplares) FROM libreria
WHERE estante = li.estante);

Borrar todas las filas de artículos que sean de módulos RAM:

DELETE FROM articulos


WHERE descripcion LIKE 'RAM%';

Borrar todas las filas de ventas de clientes que sean de Oviedo:

DELETE FROM ventas


WHERE cliente IN
(select codigo from clientes where localidad = 'Oviedo');

CFGS DESARROLLO DE APLICACIONES WEB 9


CIFP LA LABORAL BASES DE DATOS

Integridad en actualizaciones y borrados

La relación existente entre la clave ajena y la clave principal de la que procede


tiene implicaciones en el borrado y modificación de filas.

Recordemos que cuando se borran registros, se puede configurar la clave ajena de


tres formas:
• No permitir supresión
• Supresión en cascada (ON DELETE CASCADE)
• Supresión con puesta a nulo (ON DELETE SET NULL)

Control de transacciones: COMMIT y ROLLBACK

Se define una transacción como una unidad atómica de trabajo que contiene una
o más sentencias DML (INSERT, UPDATE, DELETE).

Para que los cambios producidos durante la transacción se hagan permanentes (no
puedan deshacerse), se dispone de las siguientes opciones:
• Utilizar la sentencia COMMIT, que ordena a la base de datos que haga
permanentes las acciones incluidas en la transacción.
• Ejecutar una sentencia DDL (como CREATE, DROP, RENAME, o ALTER). La
base de datos ejecuta implícitamente una orden COMMIT antes y después de
cada sentencia DDL.
• Si el usuario cierra adecuadamente las aplicaciones de gestión de las bases
de datos Oracle, se produce un volcado permanente de los cambios efectuados
por la transacción.

La sentencia ROLLBACK permite deshacer los cambios efectuados por la


transacción actual, dándola además por finalizada.

COMMIT
Cuando se produce un COMMIT se validan todos los cambios pendientes,
haciéndose permanentes.
En SQL Developer tenemos el icono y podemos utilizar la función
que realizan la misma función que la orden COMMIT.

COMMIT;

CFGS DESARROLLO DE APLICACIONES WEB 10


CIFP LA LABORAL BASES DE DATOS

ROLLBACK
Permite deshacer las actualizaciones realizadas hasta el momento por la
transacción actual.

ROLLBACK [TO [SAVEPOINT] punto_de_salvaguarda];

Al usar TO SAVEPOINT se deshacen todas las actualizaciones realizadas después de


establecer el punto de salvaguarda hasta el que se efectúa el ROLLBACK.

En SQL Developer tenemos el icono y podemos utilizar la función

SAVEPOINT
Permite definir puntos intermedios dentro de una transacción. Al establecer un
SAVEPOINT, se puede ejecutar un ROLLBACK que haga referencia a él, con lo cual
únicamente deshará los cambios posteriores al SAVEPOINT especificado.

SAVEPOINT punto_de_salvaguarda;

Se pueden crear tantos puntos de salvaguarda como se considere necesario.

CFGS DESARROLLO DE APLICACIONES WEB 11


CIFP LA LABORAL BASES DE DATOS

CAMPOS AUTONUMÉRICOS

Es muy habitual que los campos que definimos como clave primaria estén sujetos a
una secuencia autonumérica.

Los SGBD disponen de mecanismos para automatizar esta secuencia y usarla en las
inserciones de datos en las tablas. A partir de la versión Oracle 12c se puede definir
una columna identidad (IDENTITY COLUMN) o en cualquier versión se pueden
utilizar una secuencia (SEQUENCE).

SECUENCIAS

Una secuencia es un objeto de base de datos que sirve para generar enteros
únicos. La sintaxis simplificada para crear una secuencia es:

CREATE SEQUENCE nombre_secuencia


[INCREMENT BY entero]
[START WITH entero]
[MAXVALUE entero | NOMAXVALUE ]
[MINVALUE entero] | NOMINVALUE ]
[CYCLE | NOCYCLE ]
[CACHE entero | NOCACHE ]

Donde:

INCREMENT BY entero
Especifica el intervalo de crecimiento de la secuencia. Si se omite, su valor es 1. Si
es negativo produce un decremento de la secuencia.

START WITH entero


Es el número con el que comienza la secuencia.

MAXVALUE entero | NOMAXVALUE


Es el número más alto que generará la secuencia. NOMAXVALUE señala que el
valor máximo para una secuencia ascendente es 1027 y para una descendente –1.

MINVALUE entero] | NOMINVALUE


Es el número más bajo que generará la secuencia. NOMINVALUE indica que el valor
mínimo para una secuencia ascendente es 1 y para una descendente es -1026. El
valor por defecto es NOMINVALUE.

CYCLE | NOCYCLE
Especifica si la secuencia continúa generando valores después de alcanzar su
máximo valor. El valor por defecto es NOCYCLE.

CACHE entero | NOCACHE


Indica cuántos valores de la secuencia preasigna la BD y mantiene en memoria
para un acceso más rápido. El valor por defecto es CACHE 20. Si indicamos
NOCACHE no se preasignan valores a la secuencia.

CFGS DESARROLLO DE APLICACIONES WEB 12


CIFP LA LABORAL BASES DE DATOS

El nombre de la secuencia debe ser único para cada tabla de la que se quiera
automatizar la generación de valores. Por lo tanto, se crearán tantas secuencias
como columnas se quieran automatizar. El campo en el que se insertarán los
valores generados por la secuencia debe ser de tipo numérico.

Una vez creada la secuencia accedemos a ella mediante las pseudocolumnas


CURRVAL y NEXTVAL:

CURRVAL: devuelve el valor actual de la secuencia.

NEXTVAL: devuelve el siguiente valor e incrementa la secuencia.

Ejemplo. Uso de una secuencia para insertar valores en una tabla:

• Crear una secuencia empezando en el 10 y cuyos valores crecen de 5 en 5, su


valor máximo será 100:

CREATE SEQUENCE seq_codigos


START WITH 10
INCREMENT BY 5
MAXVALUE 100
NOCACHE;

• Insertar datos en la tabla FRUTAS utilizando la secuencia SEQ_CODIGOS:

INSERT INTO frutas(codigo, nombre)


VALUES (seq_codigos.NEXTVAL, 'manzanas');

INSERT INTO frutas(codigo, nombre)


VALUES (seq_codigos.NEXTVAL, 'peras');

• Alternativamente, a partir de Oracle 12c también es posible usar una secuencia


como valor predeterminado (DEFAULT) de una columna:

CREATE TABLE frutas(


codigo NUMBER(3) DEFAULT codigos.NEXTVAL PRIMARY KEY,
nombre VARCHAR2(30));

INSERT INTO frutas(nombre) VALUES ('manzanas');


INSERT INTO frutas(nombre) VALUES ('peras');

Para eliminar una secuencia de la BD utilizaremos la orden:

DROP SEQUENCE nombre_secuencia;

CFGS DESARROLLO DE APLICACIONES WEB 13


CIFP LA LABORAL BASES DE DATOS

COLUMNAS DE IDENTIDAD

Cuando se inserta una fila en una columna de este tipo, Oracle genera
automáticamente un valor secuencial y lo inserta en la columna.

Para definir una columna de identidad, utilizamos la cláusula GENERATED de la


orden CREATE TABLE:

GENERATED [ ALWAYS | BY DEFAULT [ON NULL] ] AS IDENTITY


[ (identity options) ]

ALWAIS
Oracle siempre genera un valor. Si intentamos insertar un valor en la columna de
identidad, se produce un error.

BY DEFAULT
Oracle genera un valor para la columna de identidad si no se proporciona ningún
valor. Si se proporciona un valor, es éste el que se inserta. Si se inserta un valor
NULL genera un error.

BY DEFAULT ON NULL
Oracle genera un valor para la columna de identidad si no se proporciona ningún
valor o se proporciona un valor NULL.

Identity options
Son las mismas que para crear una secuencia: START WITH, INCREMENT BY, etc.
Por defecto se inicial en 1 y crecen de 1 en uno sin valor máximo.

Ejemplos:

En este caso siempre se generan valores para la secuencia, no podemos introducir


valores en este campo, si lo intentamos da error. Como no indicamos Identity
options, genera valores empezando por 1, que crecen de 1 en 1.

CREATE TABLE frutas(


codigo NUMBER(3) GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
nombre VARCHAR2(30));

INSERT INTO frutas(nombre) VALUES ('manzanas');


INSERT INTO frutas(nombre) VALUES ('peras');

INSERT INTO frutas(codigo, nombre) VALUES (3,'naranjas');

CFGS DESARROLLO DE APLICACIONES WEB 14


CIFP LA LABORAL BASES DE DATOS

En este caso se generarán valores cuando no indicamos valores en INSERT para la


columna codigo. La secuencia se inicia en 100 y crece de 10 en 10. Si indicamos un
valor, se insertará el valor indicado.

CREATE TABLE frutas(


codigo NUMBER(3) GENERATED BY DEFAULT AS IDENTITY
START WITH 100 INCREMENT BY 10 PRIMARY KEY,
nombre VARCHAR2(30));

INSERT INTO frutas(nombre) VALUES ('manzanas');


INSERT INTO frutas(nombre) VALUES ('peras');
INSERT INTO frutas(codigo, nombre) VALUES (3,'naranjas');

SQL Developer incluye un nodo en el que podemos ver las secuencias creadas por
el usuario, o generadas de forma automática al definir una columna de identidad
con la cláusula GENERATED.

CFGS DESARROLLO DE APLICACIONES WEB 15


CIFP LA LABORAL BASES DE DATOS

CREACIÓN Y USO DE VISTAS

Una vista es una tabla virtual que almacena una consulta. Los datos accesibles a
través de la vista no están almacenados en la base de datos, en la base de datos se
guarda la definición de la vista y no el resultado de ella.

Una vista suele llamarse también tabla virtual porque los resultados que retorna y
la manera de referenciarla son los mismos que para una tabla.

Las vistas permiten:

• Simplificar la administración de los permisos de usuario: se pueden dar al


usuario permisos para que solamente pueda acceder a los datos a través de
vistas, en lugar de concederle permisos para acceder a ciertos campos, así se
protegen las tablas base de cambios en su estructura.

• Mejorar el rendimiento: se puede evitar escribir instrucciones repetidamente


almacenando en una vista el resultado de una consulta compleja que incluya
información de varias tablas.

Podemos crear vistas con: un subconjunto de registros y campos de una tabla; una
unión de varias tablas; una combinación de varias tablas; un subconjunto de otra
vista, combinación de vistas y tablas.

La sintaxis básica para crear una vista es la siguiente:

CREATE [OR REPLACE] VIEW nombre_vista [(col1 [,col2, ...])]


AS consulta;

[(col1 [,col2, ...])] permiten renombrar las columnas que va a contener la vista.
Si no se ponen, se asumen los nombres de columna devueltos por la consulta.
Si alguna de las columnas incluye una expresión, deberemos obligatoriamente
definir alias para esa columna o indicar la lista de columnas.

OR REPLACE crea de nuevo la vista si ya existía.

AS consulta determina las columnas y las tablas que aparecerán en la vista.

CREATE OR REPLACE VIEW aprobados (nom, ap1, ap2)


AS
SELECT nombre, apellido1, apellido2
FROM alumnos
WHERE dni IN (SELECT dni FROM matriculas WHERE nota >=5);

La consulta se ejecuta cada vez que se usa la vista. Por ejemplo:

SELECT ap1, ap2, nombre FROM aprobados;

CFGS DESARROLLO DE APLICACIONES WEB 16


CIFP LA LABORAL BASES DE DATOS

La vista devuelve los valores actuales que devolvería la consulta declarada después
de AS en la vista aprobados.

OPERACIONES SOBRE VISTAS

Son las mismas que se pueden hacer sobre tablas: SELECT, INSERT, UPDATE y
DELETE aunque hay que tener en cuenta una serie de restricciones:

BORRADO:
- Con filas de una sola tabla.
- Sin utilizar GROUP BY ni DISTINCT.
- Sin usar funciones de grupo o referencias a SYSDATE ni USER.

ACTUALIZACIONES:
Todas las restricciones de borrado y además:
- Ninguna columna a actualizar se habrá definido como una expresión.

INSERCIONES:
Todas las restricciones de borrado y además:
- Todas las columnas obligatorias (NOT NULL) de la tabla asociada deben
estar presentes en la vista.

CREATE OR REPLACE VIEW vehiculosVolvo AS


SELECT codVeh, codFab, codMarca, modelo
FROM vehiculos
WHERE codFab = 'VOLVO';

INSERT INTO vehiculosVolvo (codVeh, codFab, comarca, modelo)


VALUES (100, 'VOLVO', 2, 'Serie 5');

BORRADO DE VISTAS: DROP VIEW

DROP VIEW nombre_vista;

DROP VIEW vehiculosVolvo;

CFGS DESARROLLO DE APLICACIONES WEB 17

También podría gustarte