21
Maestría en Bioinformática Bases de Datos y Sistemas de Información SQL: DML Ing. Alfonso Vicente, PMP [email protected]

SQL: DML - PEDECIBA · 2012-06-19 · SQL> insert into elementos values ('H', 'Hidrogeno', 1); insert into elementos values ('H', 'Hidrogeno', 1) * ERROR at line 1: ORA-00001: unique

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: SQL: DML - PEDECIBA · 2012-06-19 · SQL> insert into elementos values ('H', 'Hidrogeno', 1); insert into elementos values ('H', 'Hidrogeno', 1) * ERROR at line 1: ORA-00001: unique

Maestría en Bioinformática

Bases de Datos y Sistemas de Información

SQL: DML

Ing. Alfonso Vicente, PMP [email protected]

Page 2: SQL: DML - PEDECIBA · 2012-06-19 · SQL> insert into elementos values ('H', 'Hidrogeno', 1); insert into elementos values ('H', 'Hidrogeno', 1) * ERROR at line 1: ORA-00001: unique

Agenda

Modificando la instancia DML

Sentencias

Page 3: SQL: DML - PEDECIBA · 2012-06-19 · SQL> insert into elementos values ('H', 'Hidrogeno', 1); insert into elementos values ('H', 'Hidrogeno', 1) * ERROR at line 1: ORA-00001: unique

Agenda

INSERT

UPDATE

DELETE

TRANSACCIONES

DML

Sentencias

Page 4: SQL: DML - PEDECIBA · 2012-06-19 · SQL> insert into elementos values ('H', 'Hidrogeno', 1); insert into elementos values ('H', 'Hidrogeno', 1) * ERROR at line 1: ORA-00001: unique

Agenda

Modificando la instancia DML

Sentencias

Page 5: SQL: DML - PEDECIBA · 2012-06-19 · SQL> insert into elementos values ('H', 'Hidrogeno', 1); insert into elementos values ('H', 'Hidrogeno', 1) * ERROR at line 1: ORA-00001: unique

DML

Modificando la instancia

• Con el Data Definition Language (DDL) creamos y

modificamos el esquema (o estructura) de la base

• Con el Data Manipulation Language (DML) modificamos la

instancia, es decir: insertamos, modificamos y eliminamos

tuplas en las tablas

• Veremos los comandos INSERT, UPDATE y DELETE de

forma muy simplificada

• Pueden surgir errores por intentar violar cualquier constraint

definida: Tipo de datos, NOT NULL, CHECK, PK, UK o FK

Page 6: SQL: DML - PEDECIBA · 2012-06-19 · SQL> insert into elementos values ('H', 'Hidrogeno', 1); insert into elementos values ('H', 'Hidrogeno', 1) * ERROR at line 1: ORA-00001: unique

Agenda

INSERT

UPDATE

DELETE

TRANSACCIONES

DML

Sentencias

Page 7: SQL: DML - PEDECIBA · 2012-06-19 · SQL> insert into elementos values ('H', 'Hidrogeno', 1); insert into elementos values ('H', 'Hidrogeno', 1) * ERROR at line 1: ORA-00001: unique

Sentencias

INSERT

• Permite insertar nuevas tuplas en una tabla existente

INSERT INTO <nombre_tabla> (col1, col2, ..., colN)

VALUES (val1, val2, ..., valN);

• Ejemplo:

INSERT INTO elementos (simbolo, nombre)

VALUES ('H', 'Hidrogeno');

INSERT INTO moleculas (nombre, carga)

VALUES ('Agua', 0);

INSERT INTO elementos_molecula (elemento, molecula, numero)

VALUES ('H', 'Agua', 2);

Page 8: SQL: DML - PEDECIBA · 2012-06-19 · SQL> insert into elementos values ('H', 'Hidrogeno', 1); insert into elementos values ('H', 'Hidrogeno', 1) * ERROR at line 1: ORA-00001: unique

Sentencias

INSERT

• Si se omite el nombre de una columna, se insertará NULL

en esa columna

• Si no se especifican las columnas, se asume que en la

cláusula VALUES vendrán los valores para todas las

columnas en el orden en que fueron definidas en la tabla

• Se considera una buena práctica especificar siempre las

columnas en el INSERT

• Habrá valores nuevos donde antes no había: el RDBMS

debe verificar la integridad

Page 9: SQL: DML - PEDECIBA · 2012-06-19 · SQL> insert into elementos values ('H', 'Hidrogeno', 1); insert into elementos values ('H', 'Hidrogeno', 1) * ERROR at line 1: ORA-00001: unique

Sentencias

INSERT

• Ejemplos de error

SQL> desc elementos

Name Null? Type

------------------------ -------- ----------------------------

SIMBOLO NOT NULL CHAR(2)

NOMBRE NOT NULL VARCHAR2(20)

NUMERO_ATOMICO NUMBER(10,2)

SQL> insert into elementos values ('He', null, null);

insert into elementos values ('He', null, null)

*

ERROR at line 1:

ORA-01400: cannot insert NULL into ("ALFONSO"."ELEMENTOS"."NOMBRE")

Page 10: SQL: DML - PEDECIBA · 2012-06-19 · SQL> insert into elementos values ('H', 'Hidrogeno', 1); insert into elementos values ('H', 'Hidrogeno', 1) * ERROR at line 1: ORA-00001: unique

Sentencias

INSERT SQL> insert into elementos values ('He', 'Helio', 'desconozco');

insert into elementos values ('He', 'Helio', 'desconozco')

*

ERROR at line 1:

ORA-01722: invalid number

SQL> insert into elementos values ('H', 'Hidrogeno', 1);

insert into elementos values ('H', 'Hidrogeno', 1)

*

ERROR at line 1:

ORA-00001: unique constraint (ALFONSO.SYS_C0029000) violated

SQL> insert into elementos_molecula values ('C', 'Metano', 1);

insert into elementos_molecula values ('C', 'Metano', 1)

*

ERROR at line 1:

ORA-02291: integrity constraint (ALFONSO.FK_MOLECULAS_ELEMENTOS)

violated - parent key not found

Page 11: SQL: DML - PEDECIBA · 2012-06-19 · SQL> insert into elementos values ('H', 'Hidrogeno', 1); insert into elementos values ('H', 'Hidrogeno', 1) * ERROR at line 1: ORA-00001: unique

Sentencias

UPDATE

• Permite modificar tuplas existentes en una tabla existente

UPDATE <nombre_tabla>

SET col1 = val1, col2 = val2, ..., colN = valN

WHERE <predicado>;

• Ejemplo:

UPDATE elementos

SET nombre = 'Hidrógeno‘

WHERE nombre = 'Hidrogeno‘;

Page 12: SQL: DML - PEDECIBA · 2012-06-19 · SQL> insert into elementos values ('H', 'Hidrogeno', 1); insert into elementos values ('H', 'Hidrogeno', 1) * ERROR at line 1: ORA-00001: unique

Sentencias

UPDATE

• Todas las tuplas que cumplen el predicado se modifican con

los valores del set

• El predicado (por ahora) debe versar sobre las columnas de

la tabla, y puede contener:

• Comparaciones simples: =, <, >, <>

• Comparaciones por rango: between

• Expresiones regulares: like

• Comparación con null: is null, is not null

• Expresiones lógicas: AND, OR, NOT

Page 13: SQL: DML - PEDECIBA · 2012-06-19 · SQL> insert into elementos values ('H', 'Hidrogeno', 1); insert into elementos values ('H', 'Hidrogeno', 1) * ERROR at line 1: ORA-00001: unique

Sentencias

UPDATE

• Como en el INSERT, pueden ocurrir errores porque habrá

valores nuevos donde antes no había, pero además, valores

que existen pueden dejar de existir

• Un UPDATE podría modificar el padre de una FK definida

con la cláusula “ON UPDATE RESTRICT”

SQL> update elementos set simbolo = 'Z' where simbolo = 'H';

update elementos set simbolo = 'Z' where simbolo = 'H'

*

ERROR at line 1:

ORA-02292: integrity constraint (ALFONSO.FK_MOLECULAS_ELEMENTOS)

violated - child record found

Page 14: SQL: DML - PEDECIBA · 2012-06-19 · SQL> insert into elementos values ('H', 'Hidrogeno', 1); insert into elementos values ('H', 'Hidrogeno', 1) * ERROR at line 1: ORA-00001: unique

Sentencias

DELETE

• Permite eliminar tuplas de una tabla existente

DELETE FROM <nombre_tabla>

WHERE <predicado>;

• Ejemplo:

DELETE FROM elementos WHERE simbolo = 'H';

DELETE FROM movimientos WHERE fecha_mov < '15/05/2002';

• Posibilidad de integrity constraint violated - child record

found en FKs con la cláusula “ON DELETE RESTRICT”

Page 15: SQL: DML - PEDECIBA · 2012-06-19 · SQL> insert into elementos values ('H', 'Hidrogeno', 1); insert into elementos values ('H', 'Hidrogeno', 1) * ERROR at line 1: ORA-00001: unique

Sentencias

UPDATE y DELETE

• Cuidado con los predicados: un predicado mal escrito puede

modificar (o eliminar) tuplas que no se pretendían modificar

(o eliminar)

• El predicado vacío se evalúa TRUE para todas las tuplas !

UPDATE elementos set simbolo = 'H';

DELETE FROM elementos;

• ¿Qué hacemos si nos equivocamos?

Page 16: SQL: DML - PEDECIBA · 2012-06-19 · SQL> insert into elementos values ('H', 'Hidrogeno', 1); insert into elementos values ('H', 'Hidrogeno', 1) * ERROR at line 1: ORA-00001: unique

Sentencias

TRANSACCIONES

• Los RDBMS implementan transacciones ACID

• Atomicity (se hacen en su totalidad o no se hacen)

UPDATE cuentas set saldo = saldo-500 where cuenta = 15263;

UPDATE cuentas set saldo = saldo+500 where cuenta = 9935;

INSERT INTO transferencias (fecha, desde, hacia, monto)

VALUES (SYSDATE, 15263, 9935, 500);

COMMIT; -- Aquí se confirma la transacción

Page 17: SQL: DML - PEDECIBA · 2012-06-19 · SQL> insert into elementos values ('H', 'Hidrogeno', 1); insert into elementos values ('H', 'Hidrogeno', 1) * ERROR at line 1: ORA-00001: unique

Sentencias

TRANSACCIONES

• Los RDBMS implementan transacciones ACID

• Consistency (cualquier intento de violar una constraint

termina en un error)

• Isolation (mientras la transacción no se confirmó

mediante COMMIT nadie más ve los datos intermedios y

las transacciones no se afectan unas a otras)

• Durability (después del COMMIT los cambios perduran)

Page 18: SQL: DML - PEDECIBA · 2012-06-19 · SQL> insert into elementos values ('H', 'Hidrogeno', 1); insert into elementos values ('H', 'Hidrogeno', 1) * ERROR at line 1: ORA-00001: unique

Sentencias

TRANSACCIONES

• ¿Qué sucede si nos equivocamos u obtenemos un error?

SQL> create table cuentas (

2 cuenta integer not null primary key,

3 saldo number(10, 2) not null

4 );

Table created.

SQL> alter table cuentas add constraint check_saldo_positivo

2 check ( saldo >= 0);

Table altered.

SQL> insert into cuentas values (15263, 400);

1 row created.

SQL> commit;

Commit complete.

Page 19: SQL: DML - PEDECIBA · 2012-06-19 · SQL> insert into elementos values ('H', 'Hidrogeno', 1); insert into elementos values ('H', 'Hidrogeno', 1) * ERROR at line 1: ORA-00001: unique

Sentencias

TRANSACCIONES

• ¿Qué sucede si nos equivocamos u obtenemos un error?

SQL> UPDATE cuentas set saldo = saldo-500 where cuenta = 15263;

UPDATE cuentas set saldo = saldo-500 where cuenta = 15263

*

ERROR at line 1:

ORA-02290: check constraint (ALFONSO.CHECK_SALDO_POSITIVO)

violated

• No podemos continuar la transacción

SQL> rollback;

Rollback complete.

Page 20: SQL: DML - PEDECIBA · 2012-06-19 · SQL> insert into elementos values ('H', 'Hidrogeno', 1); insert into elementos values ('H', 'Hidrogeno', 1) * ERROR at line 1: ORA-00001: unique

Sentencias

TRANSACCIONES

• Algunos RDBMSs tienen un modo autocommit, donde cada

sentencia termina con un commit implícito

• Todos tienen el modo opuesto, donde hay transacciones

• Las transacciones comienzan / terminan:

• Al iniciar la sesión

• Al ejecutar commit / rollback

• Al ejecutar DDLs o algunos comandos (según RDBMS)

• Al terminar la sesión

Page 21: SQL: DML - PEDECIBA · 2012-06-19 · SQL> insert into elementos values ('H', 'Hidrogeno', 1); insert into elementos values ('H', 'Hidrogeno', 1) * ERROR at line 1: ORA-00001: unique

Sentencias

LOCKING

• Es la forma general de lograr Isolation, cuando hay

competencia por los mismos recursos

Sesión 1

SQL> UPDATE cuentas

2 set saldo = saldo – 200

3 where cuenta = 15263;

1 row updated.

Sesión 2

SQL> UPDATE cuentas

2 set saldo = saldo – 200

3 where cuenta = 15263;

lock wait