Tema II: El Lenguaje Estándar SQL (2.5) El modelo relacional de datos Objetivos: conocer las estructuras de datos del modelo: la tupla y la relación conocer básicamente la forma de modelar la realidad utilizando el modelo relacional conocer los mecanismos del modelo relacional para expresar restricciones de integridad conocer los lenguajes de manipulación propuestos para este modelo de datos: Álgebra Relacional y Cálculo Relacional de Tuplas conocer mecanismos de vistas conocer el mecanismo de disparadores El modelo relacional de datos 2.1 Modelo relacional de datos (Aproximación algebraica) 2.2 Esquema relacional: representación de la realidad 2.3 Modelo relacional de datos (Aproximación lógica) 2.4 Restricciones de integridad 2.5 El lenguaje estándar SQL 2.6 Vistas 2.7 Disparadores 2.5 El Lenguaje Estándar SQL Lenguaje estándar actual para los SGBDs Desarrollado por IBM a mediados de los años 70. Es un híbrido entre el Álgebra Relacional y el Cálculo Relacional de tuplas. Permite tanto el uso explícito de operadores algebraicos (UNION, DIFERENCIA, etc) como el uso de expresiones lógicas de cualquier complejidad (variables-tupla, cuantificador existencial, etc.). Proporciona un sublenguaje de definición de datos (DDL) y un sublenguaje de manipulación de datos (DML), así como otros componentes de control de datos. 2.5.1 El Lenguaje de definición de Datos (DDL) Define el esquema de la BD El sublenguaje DDL del SQL, proporciona sentencias para realizar las siguientes funciones: Definición del esquema: CREATE SCHEMA Definición de dominios: CREATE DOMAIN Definición de relaciones (esquema de relación y restricciones): CREATE TABLE Definición de restricciones generales: CREATE ASSERTION. Definición de relaciones derivadas (vistas): CREATE VIEW . (se verá en el punto 2.6.3 del tema) Definición de permisos a usuarios: GRANT (se verá en el tema III) Asociada a cada sentencia CREATE existe una sentencia DROP que permite eliminar el correspondiente elemento del esquema. 2.5.1 El Lenguaje de definición de Datos (DDL) Definición del esquema: esquema ::= CREATE SCHEMA AUTHORIZATION usuario elemento_esquema1, elemento_esquema2, … elemento_esquema ::= definición_dominio | definición_tabla | definición_restricción | definición_vista | definición_operación_grant 2.5.1 El Lenguaje de definición de Datos (DDL) Definición de dominios: definición_dominio ::= CREATE DOMAIN nom_dominio [AS] tipo_dato [DEFAULT {NULL | valor}] [restricción_dominio1, restricción_dominio2, …] restricción_dominio ::= [CONSTRAINT nombre_restricción] CHECK (condición) [cuando_comprobar] 2.5.1 El Lenguaje de definición de Datos (DDL) Definición de relaciones: definición_tabla ::= CREATE TABLE nom_tabla (elemento_tabla1, elemento_tabla2, … ) elemento-tabla ::=definición_columna | restricción_tabla definición_columna ::= nom_columna { tipo _datos | nom_dominio } [DEFAULT {valor | NULL}] [restricción_columna1, restricción_columna2, …] 2.5.1 El Lenguaje de definición de Datos (DDL) Definición de relaciones: restricción_columna ::= [CONSTRAINT nombre_restricción] {NOT NULL | UNIQUE | PRIMARY KEY | REFERENCES nom_tabla [(nom_columna)] [MATCH {FULL | PARTIAL | SIMPLE}] [ON DELETE {CASCADE | SET NULL | SET DEFAULT| NO ACTION}] [ON UPDATE {CASCADE | SET NULL | SET DEFAULT| NO ACTION}] | CHECK (condición) } [cuándo_comprobar] 2.5.1 El Lenguaje de definición de Datos (DDL) Definición de relaciones: restricción_tabla ::= [CONSTRAINT nombre-restricción] { UNIQUE (nom-columna1, nom-columna2, … ) | PRIMARY KEY (nom-columna1, nom-columna2, …) | FOREIGN KEY (nom-columna1, nom-columna2, …) REFERENCES nom-tabla [(nom-columna1, nom-columna2, …)] [MATCH {FULL | PARTIAL | SIMPLE}] [ON DELETE {CASCADE | SET NULL| SET DEFAULT | NO ACTION}] [ON UPDATE {CASCADE| SET NULL| SET DEFAULT | NO ACTION}] | CHECK (condición)} [cuando-comprobar] 2.5.1 El Lenguaje de definición de Datos (DDL) Definición de restriciones (generales): adecuada para restricciones que afectan a varias tablas. definición_restricción::= CREATE ASSERTION nombre_restricción CHECK (condición) [cuando-comprobar] cuando_comprobar:= [[NOT] {IMMEDIATE | DEFERRED}] DEFERRABLE] [INITIALLY 2.5.1 El Lenguaje de definición de Datos (DDL) Modificación de una relación: modificación_tabla::= ALTER TABLE nombre_tabla {ADD (definición_columna) |ALTER [COLUMN] (nombre_columna) {DROP DEFAULT | SET DEFAULT {literal | funcion_sistema | NULL} } |DROP [COLUMN] nombre_columna {RESTRICT | CASCADE} } Borrado de una relación: borrado_tabla::= DROP TABLE nombre_tabla {RESTRICT | CASCADE} 2.5.1 El Lenguaje de definición de Datos (DDL) Sea el siguiente esquema relacional: Departamento (código: tira(5), nombre: tira(100), director: tira(5), teléfono: tira(11)) CP = {código}, VNN={nombre}, UNI={director} Caj= {director} → Profesor f(director)=código Borrado NULOS Modificación CASCADA Asignatura (código: tira(5), nombre: tira(100), semestre: tira(2), teo: real, prac: real, dep: tira(5)) CP={código}, VNN={nombre, teo, prac, semestre, dep} CAj={dep} →Departamento f(dep)=código Modificación CASCADA Profesor (código : tira(5), nombre: tira(50), teléfono: tira(11), categoría: tira(3), dep: tira(5) ) CP={código}, VNN={nombre, categoría, dep} CAj={dep} → Departamento f(dep)=código Modificación CASCADA Docencia ( cod_pro: tira(3), cod_asg: tira(3), gteo: entero, gprac: entero) CP={cod_pro, cod_asg}, VNN={gteo, gprac} CAj={cod_asg} → Asignatura f(cod_asg)=código Modificación CASCADA CAj={cod_pro} → Profesor f(cod_pro)=código Borrado CASCADA Modificación CASCADA 2.5.1 El Lenguaje de definición de Datos (DDL) Y las siguientes restricciones de integridad adicionales: los créditos deben ser valores reales positivos. los grupos de clase deben ser enteros positivos. las categorías de un profesor son: TEU, TU, CEU y CU Un profesor con categoría TEU no puede dar mas de 33 créditos y un profesor con categoría TU no puede dar mas de 22 créditos. 2.5.1 El Lenguaje de definición de Datos (DDL) El esquema en SQL se definiría: CREATE SCHEMA Docencia-UPV CREATE DOMAIN créditos AS NUMBER(1,1) CHECK (value>=0) CREATE DOMAIN grupos AS INTEGER CHECK (value>=0) CREATE TABLE Departamento (código CHAR(5), nombre VARCHAR(100) NOT NULL, director CHAR(5) UNIQUE REFERENCES Profesor (codigo) ON UPDATE CASCADE ON DELETE SET NULL, teléfono CHAR(11), CONSTRAINT CP_dpto PRIMARY KEY (código) ) 2.5.1 El Lenguaje de definición de Datos (DDL) El esquema en SQL se definiría: CREATE TABLE Profesor ( codigo CHAR(5), nombre VARCHAR(50) NOT NULL, teléfono CHAR(11), categoría CHAR(3) NOT NULL CHECK categoría IN (‘TEU’, ‘TU’, ‘CEU’, ‘CU’) dep CHAR(5) NOT NULL, CONSTRAINT CP_prof PRIMARY KEY (codigo), CONSTRAINT CAj_prof_dpto FOREIGN KEY (dep) REFERENCES Departamento (codigo) ON UPDATE CASCADE ) 2.5.1 El Lenguaje de definición de Datos (DDL) El esquema en SQL se definiría: CREATE ASSERTION RI_docencia CHECK (NOT EXISTS ( SELECT * FROM PROFESOR P WHERE (P.categoría=“TEU” AND (SELECT SUM (gteo*teo + gprac*prac) FROM Docencia, Asignatura WHERE cod_pro = P.cod_pro) >33) OR (P.categoría=“TU” AND (SELECT SUM (gteo*teo + gprac*prac) FROM Docencia, Asignatura WHERE cod_pro=P.cod_pro) >22 ) ) ) 2.5.1 El Lenguaje de definición de Datos (DDL) Restricciones (Check y Assertion) - Verificación (CHECK): Comprueba, en toda operación de actualización, si el predicado es cierto o falso y, en el segundo caso, rechaza la operación. La restricción de verificación se define sobre un único elemento (dentro de un CREATE TABLE) y puede o no tener nombre. Sintaxis: CREATE TABLE <nombre_tabla> …. [CONSTRAINT <nombre>] CHECK (<condición>) donde: <nombre> Nombre de la restricción <condición> una expresión que debe ser cierta para todas las filas de la tabla. A nivel de columna sólo puede referir a dicha columna. A nivel de tabla puede referir a otras columnas, pero a los valores de la misma fila. Restricciones (Check y Assertion) Ejemplo a nivel de columna: CREATE TABLE Empleados ( … salario NUMBER(8,2) CONSTRAINT CHECK (salario>0) … ); Ejemplo a nivel de tabla: CREATE TABLE Empleados ( … salario NUMBER(8,2), neto NUMBER(8,2), … CONSTRAINT neto_max CHECK (neto<=salario*0,8) ); Ejemplo de Restricciones (Check y Assertion) Ejemplo de Restricciones (Check y Assertion) El usuario formula una condición mediante un predicado definido sobre un conjunto de atributos, tuplas o dominios, que debe ser verificado en toda operación de actualización para que el nuevo estado constituya una ocurrencia válida del esquema. - Verificación (CHECK): Comprueba, en toda operación de actualización, si el predicado es cierto o falso y, en el segundo caso, rechaza la operación. CHECK N_HORAS > 30 en CURSO_DOCTORADO - Aserción (ASSERTION): Actúa de forma idéntica a la anterior, pero se diferencia de ella en que puede afectar a varios elementos (por ejemplo, a dos tablas distintas). Por tanto, su definición no va unida a la de un determinado elemento del esquema y siempre ha de tener un nombre. CREATE ASSERTION CONCEDE_SOLICITA AS CHECK (SELECT Cod_Estudiante, Cod_Beca FROM CONCEDE) IN (SELECT Cod_Estudiante, Cod_Beca FROM SOLICITA)); 2.5.2 El Lenguaje de manipulación de Datos (DML) Proporciona sentencias de consulta (SELECT) y sentencias de actualización (INSERT, DELETE y UPDATE) 2.5.2.1 La sentencia SELECT Sentencia de consulta del lenguaje. Su estructura básica es: SELECT R1X.Ai, R2X.Bj,..., RnX.Ck FROM R1 [AS] R1X, R2 [AS] R2X, ..., Rn [AS] RnX WHERE F(R1X, R2X,..., RnX) Donde, R 1 R2, ..., R n son relaciones, Ai Bj, ..., Ck son respectivamente atributos de los esquemas de R1 R 2, ..., Rn, R1X, R2 X,..., RnX son nombres alternativos (alias) de R1 R2, ..., R n y F(R1X, R2 X,..., RnX) es una condición. Se puede interpretar desde una perspectiva lógica o algebraica. 2.5.2 El Lenguaje de manipulación de Datos (DML) Perspectiva Lógica Se ha justificado la utilidad del lenguaje de la Lógica de 1er orden como lenguaje relacional (apartado 2.3.2). En esa aproximación, una consulta (sentencia SELECT) a una base de datos relacional consiste en una fórmula lógica escrita en un lenguaje L derivado del esquema de la base de datos. Perspectiva Algebraica Además de la estructura básica de la sentencia SELECT, el SQL proporciona los siguientes operadores adicionales de carácter algebraico: Operador Unión: Select1 UNION Select2 Operador Intersección: Select1 INTERSECT Select2 Operador Diferencia: Select1 EXCEPT Select2 2.5.2 El Lenguaje de manipulación de Datos (DML) Perspectiva Algebraica (2) Operadores adicionales de carácter algebraico: Operador Producto Cartesiano: SELECT .... FROM tabla1 CROSS JOIN tabla2 WHERE .... Operador Concatenación: SELECT .... FROM tabla1 NATURAL JOIN tabla2 WHERE .... 2.5. El Lenguaje Estándar SQL Operador Álgebra Relacional SQL Selección R Donde F SELECT ... FROM R WHERE F Proyección R [Ai , Aj ..., Ak] SELECT Ai , Aj ..., Ak FROM R Producto Cartesiano R1 x R2, ... x Rn SELECT ... FROM R1, R2, ..., Rn, o SELECT...FROM R1 CROSS JOIN R2, ..., CROSS JOIN Rn Concatenación R1 R2 SELECT... FROM R1 NATURAL JOIN R2 Unión R1 ∪ R2 SELECT * FROM R1 UNION SELECT * FROM R2 Diferencia R1 - R2 SELECT * FROM R1 EXCEPT SELECT * FROM R2 Intersección R 1 ∩ R2 SELECT * FROM R1 INTERSECT SELECT * FROM R2 2.5.2.2 Sentencias de Actualización: INSERT, DELETE, UPDATE INSERT Permite insertar tuplas en una relación: Inserción simple: INSERT INTO R [(A1, A2, ... Ak)] {DEFAULT VALUES | VALUES (v1, v2, ..., vk) }. Ejemplo 2.8. La inserción de una nueva tupla en la relación Río, correspondiente al río Ebro, se realizaría de la forma: INSERT INTO Río VALUES (r3, 'Ebro'). Inserción Múltiple: INSERT INTO R [(A1, A2, ... Ak)] sentencia_SELECT Ejemplo 2.8. Se desea insertar en la relación Río todos los ríos almacenados en la relación Otros_Ríos. La inserción se realizaría de la forma: INSERT INTO Río SELECT * FROM Otros_ríos 2.5.2.2 Sentencias de Actualización: INSERT, DELETE, UPDATE DELETE Permite borrar tuplas en una relación: DELETE FROM R [WHERE condición] Ejemplo 2.8. Se desean borrar las tuplas de la relación Pasa_por con información sobre los ríos que pasan por la provincia de código 16. DELETE FROM Pasa_por WHERE pcod=16 2.5.2.2 Sentencias de Actualización: INSERT, DELETE, UPDATE UPDATE Permite actualizar tuplas en una relación: UPDATE R SET A1 = {DEFAULT| NULL | expresión1}, A2 = {DEFAULT| NULL | expresión2}, ....... [WHERE condición ] Sea el esquema del Ejemplo 2.8. Se desea actualizar el nombre del río de código 'r2', con el nuevo valor ‘Turia'. UPDATE Río SET nombre = ‘Turia' WHERE rcod='r2' Ejercicio 1: Definir la base de datos del sistema de información geográfica usando el sublenguaje de definición de datos de Requisitos de SQL. Información: De cada mar: código, nombre, detalles y ríos que desembocan en él. De cada río: código, nombre, longitud, mar en el que desemboca y provincias por las que pasa, indicando los kilómetros. De cada provincia: código, nombre, extensión, y límites entre provincias. Solución Ejercicio 1: CREATE TABLE Rio ( rcod CHAR(3) PRIMARY KEY , nombre VARCHAR(30), longitud CHAR(5), mcod CHAR(3) REFERENCES Mar (mcod) ) CREATE TABLE Mar ( mcod CHAR(3) PRIMARY KEY , nombre VARCHAR(30), detalles VARCHAR(15) ) CREATE TABLE Provincia ( pcod CHAR(3) PRIMARY KEY , nombre VARCHAR(30), extensión integer ) CREATE TABLE Pasa_por ( rcod CHAR(3) REFERENCES Rio (mcod), pcod CHAR(3) REFERENCES Provincia (pcod), km INTEGER, CONSTRAINT CP_pasa_por PRIMARY KEY (rcod, pcod) ) CREATE Limita_con ( pcod1 CHAR(3) REFERENCES Provincia (pcod), pcod2 CHAR(3) REFERENCES Provincia (pcod) CONSTRAINT CP_limita_con PRIMARY KEY (pcod1, pcod2) ) Ejercicio 2: Considere las siguientes relaciones: Mascota (nro_chip, nombre, raza, peligrosidad, fecha_nacimiento, dni) Caj= {dni} → Propietario Propietario (dni, fecha_alta) Persona (dni, fecha_nacimiento, lugar_nacimiento, nombre, direccion) Indique cómo definiría las siguientes restricciones de integridad: 1. 2. 3. 4. 5. 6. No puede haber dos mascotas con el mismo número de chip Todo propietario es una persona El campo peligrosidad sólo puede tomar los valores 0 (falso) o 1(verdadero) Los propietarios pueden serlo de varias mascotas Las mascotas no tienen porque vivir en la misma dirección que sus propietarios Se quiere almacenar más información sobre las razas de los animales de forma que, para cada raza, se almacena un identificador (para distinguir una raza de todas las demás), el nombre de la raza, el tipo (perro, gato, reptil, equino), el color, el tipo de pelo (largo, corto), y su peligrosidad (0 para las no peligrosas y 1 para las peligrosas) 7. No todas las personas deben ser propietarias de mascotas 8. Sólo pueden ser propietarios de mascotas las personas mayores de 18 años 9. Cuando una mascota muere (se eliminan sus datos de la tabla mascota), tiene que dejar de estar asociada a su propietario 10. Toda mascota tiene que tener un nombre