You are on page 1of 35

SQL: Origen

El SQL ha sido adoptado como un estándar oficial en


los Estados Unidos de América por el American
National Standards Institute (ANSI), y como un
estándar internacional por la International Standards
Organization (ISO)

Structured Query Language La versión original fue la desarrollada en el San Jose


Research Laboratory de IBM a partir del proyecto
( SQL ) System R a principios de 1970.

97 98

¿Por qué SQL? SQL: Evolución


SQL es un lenguaje de alto nivel, con el cual Definición de un lenguaje estándar para SGBDR
ANSI (American National Standards Institute)
los programadores pueden evitar especificar + ISO (International Standardization Organization)
muchos detalles de la manipulación de SQL1 (ANSI 1986), extendido en 1989 (SQL-89)

datos que serían necesarios en lenguajes SQL-92 (SQL2), y


SQL:1999 (extensiones de Orientación a Objetos, disparadores, …)
como C++ por ejemplo. SQL:2003 (incluye XML y otros conceptos recientes)

Lo que hace a SQL viable es que sus Primeras implementaciones:


ORACLE (finales 70) y poco después INGRES
consultas se optimizan de manera
adecuada produciendo una ejecución de
consultas más eficiente.
99 100
SQL: Evolución SQL: Características
Año Nombre Alias Comentarios
1986 SQL-86 SQL-87 First published by ANSI. Ratified by ISO in 1987.
Lenguaje de bases de datos completo (no sólo «de consulta»)
Definición y Manipulación de Datos (LDD + LMD)
1989 SQL-89 FIPS 127-1 Minor revision, adopted as FIPS 127-1.
Definición y destrucción de Vistas (LDV)
1992 SQL-92 SQL2, FIPS 127-2 Major revision (ISO 9075), Entry Level SQL-92 adopted as FIPS 127-2. Creación y destrucción de índices (aunque en SQL-92 «ya no existen»)
Incorporación de SQL dentro de código escrito con un Lenguaje de
1999 SQL:1999 SQL3 Added regular expression matching, recursive queries, triggers, support for
procedural and control-of-flow statements, non-scalar types, and some object- Programación de propósito general (Pascal, C, etc.)
oriented features.
2003 SQL:2003 Introduced XML-related features, window functions, standardized sequences, and
columns with auto-generated values (including identity-columns). Los proveedores de SGBDR comerciales (Oracle) implementan variaciones
de SQL
2006 SQL:2006 ISO/IEC 9075-14:2006 defines ways in which SQL can be used in conjunction with
XML. It defines ways of importing and storing XML data in an SQL database, Algunas incluyen características que no están estandarizadas
manipulating it within the database and publishing both XML and conventional (triggers /reglas activas incluidos en la versión SQL:1999)
SQL-data in XML form. In addition, it provides facilities that permit applications to
integrate into their SQL code the use of XQuery, the XML Query Language
published by the World Wide Web Consortium (W3C), to concurrently access
ordinary SQL-data and XML documents. Niveles de compatibilidad con el estándar de SQL
Entry SQL
The SQL standard is not freely available. SQL:2003 and SQL:2006 may be purchased from ISO or ANSI. A late draft of SQL:2003 is freely available as a zip Intermediate SQL
archive, however, from Whitemarsh Information Systems Corporation. The zip archive contains a number of PDF files that define the parts of the SQL:2003
101 102
specification. Full SQL

Abordaremos Principalmente SQL92 SQL-92 vs. Modelo Relacional Formal


Temas a tratar...
No utiliza los términos formales relación, atributo, tupla…,
Consultas o Selección de datos sino tabla, columna, fila…
Modificación de datos Permite que las tablas tengan 2 o más filas idénticas en todos
Vistas los valores de sus columnas
Definición y Alteración de datos
En general, tabla SQL ≠ conjunto de filas, sino que
Esquemas, Dominios, Tablas
Tabla SQL = Multiconjunto de filas (saco, bag)
Restricciones de Integridad Generales (Asertos)
Procedimientos y funciones
Es posible forzar que las tablas SQL sean conjuntos de filas:
Seguridad y Control de Acceso - con restricciones de clave o
- mediante opción DISTINCT en una SELECT (*se verá*)
Las columnas de una tabla están ordenadas, y es posible
indicar un orden de visualización de las filas
Una clave ajena puede referenciar a una clave candidata

103 104
SQL-92: Consultas Básicas

EMPLEADO • Orden SELECT: SELECT <lista columnas>


NOMBRE APELLIDO NSS RFC FECHAN DIRECCION SEXO SALARIO NSSJEFE ND Instrucción básica de FROM <lista tablas>
obtención de
información
WHERE <condición>
DEPARTAMENTO donde:
NOMBRED NUMEROD NSSDIRE FECHAINICDIRE <lista columnas> columnas cuyos valores va a obtener la consulta
<lista tablas> tablas necesarias para realizar la consulta
OFICINA_DEPTO <condición> expresión booleana para identificar filas que obtendrá la consulta
NUMEROD OFICINA (expresión de reunión y/o de selección)
PROYECTO
Fecha de nacimiento y dirección del empleado llamado José Silva
NOMBREP NUMEROP LUGARP NUMEROD SELECT fechan, direccion
TRABAJA_EN FROM Empleado
NSSE NUMP HORAS Base Datos WHERE nombre = ‘José’ AND apellido = ‘Silva’;
ejemplo: COMPAÑÍA
FAMILIAR • La consulta selecciona las filas de <lista tablas>
NSSE NOMBRE_FAMILIAR SEXO FECHAN PARENTESCO que satisfacen <condición> y
105
proyecta el resultado sobre las columnas de <lista columnas>106

SQL-92: Consultas Básicas SQL-92: Consultas Básicas


• La orden SELECT ... FROM ... WHERE... • Cualquier nº de condiciones selección/reunión en SELECT
No es igual a la operación restricción σ del Álgebra Relacional
* Para cada proyecto ubicado en Santiago, obtener el nº del proyecto, nº del departamento que lo

controla y el apellido, dirección y fecha de nacimiento del gerente de ese departamento
– SELECT de SQL tiene muchas más opciones y matices
SELECT numerop, numd, apellido, direccion, fechan
– En caso de una única tabla T en <lista tablas>
FROM Proyecto, Departamento, Empleado
SELECT <lista columnas>
WHERE numd=numerod AND nssdire=nss AND lugarp=‘Santiago’;
FROM T
WHERE <condición>
es equivalente a... Una SELECT puede obtener filas repetidas
Π <lista columnas>(σ<condición> ( T )) * Salario de los empleados de los departamentos de Administración y de Investigación
SELECT salario
* Nombre, apellido y dirección de los empleados del departamento de Investigación FROM Empleado, Departamento
SELECT nombre, apellido, direccion WHERE (nombred = ‘Administración’ OR nombred = ‘Investigación’)
FROM Empleado, Departamento → reunión o join de tablas AND numerod=nd;
WHERE nombred=‘Investigación’ → condición de selección
AND numerod=nd; → condición de reunión entre tablas
107 108
SQL-92: Consultas Básicas SQL-92: Consultas Básicas
uso de * omisión de WHERE

• Obtención de los valores de todas las columnas de las filas • Selección incondicional
seleccionadas – Equivale a una condición TRUE para todas las filas
– No es necesario listar todos los nombres tras cláusula SELECT selección de todas las filas de...
una tabla (si la cláusula FROM sólo contiene una tabla), o
– Uso del símbolo * (todas las columnas) el producto cartesiano entre varias tablas (si FROM incluye más de una)
SELECT *
FROM Empleado * Seleccionar todos los nss de empleados
WHERE nd=5; SELECT nss
SELECT * FROM Empleado;
FROM Departamento
WHERE nombred=‘Investigación’; * Obtener todas las combinaciones de nss de empleados y nombres de departamentos
SELECT * SELECT nss, nombred
FROM Empleado, Departamento FROM Empleado, Departamento;
WHERE nombred=‘Investigación’ AND nd=númerod;
109 110

SQL-92: Consultas Básicas SQL-92: Consultas Básicas


cadenas de caracteres aritmética y tiempo
• Operador LIKE • Operaciones aritméticas
– Comparación de cadenas de caracteres – Aplicación de operadores aritméticos ( + - * / ) sobre valores numéricos
– Caracteres reservados: ‘%’ y ‘_’ (comodines)
* Salarios de los empleados que trabajan en el proyecto ProductoX, tras un aumento del 10%
*Nombres y apellidos de los empleados cuya dirección esté en Higueras, estado de México SELECT apellido, nombre, 1.1*salario
SELECT nombre, apellido FROM Empleado, Trabaja_en, Proyecto
FROM Empleado WHERE nss=nsse AND nump=numerop AND nombrep=‘ProductoX’ ;
WHERE direccion LIKE ‘%Higueras, MX%’ ; 1 el valor real de los salarios en la tabla EMPLEADO no cambia
• Operador ||
• Operaciones con fechas, horas, marcas de tiempo e
– Concatenación de cadenas de caracteres
intervalos
* Nombres completos en una sola columna de empleados con dirección en Higueras (México) – Especificación del valor de un INTERVAL
SELECT nombre || ‘ ’ || apellido como diferencia de dos valores DATE, TIME o TIMESTAMP
FROM Empleado
– Incremento y Decremento de valores de columnas de tipo DATE, TIME,
WHERE direccion LIKE ‘%Higueras, MX%’ ;
TIMESTAMP en un intervalo compatible con el tipo
111 112
SQL-92: Consultas Básicas SQL-92: Consultas Básicas
calificación seudónimos
• En SQL los nombres de las columnas deben ser únicos • Puede utilizarse seudónimos para acortar nombres de tabla
dentro de cada tabla dentro de las consultas con calificación:
• Consulta que referencia a varias columnas de igual SELECT nombred, D.numerod, oficina
nombre, pero de tablas distintas... FROM Departamento AS D, Oficina_depto L ← ‘AS’ es opcional
WHERE D.nombred IN (‘Marketing’, ‘Investigación’)
AMBIGÜEDAD --------------Solución: CALIFICACIÓN AND D.numerod = L.numerod;

El esquema COMPAÑÍA incluye las siguientes tablas:


Consulta que se refiere dos veces a la misma tabla
DEPARTAMENTO (nombred, numerod, nssdire, fechainicdire) AMBIGÜEDAD ------------------- Solución: SEUDÓNIMOS
OFICINA_DEPTO (numerod, oficina)
* Código, nombre y lugares de los departamentos de Marketing y de Investigación * Obtener nombre y apellido de cada empleado y de su supervisor inmediato
SELECT Departamento.numerod, nombred, oficina SELECT E.nombre, E.apellido, S.nombre, S.apellido
FROM Departamento, Oficina_depto FROM Empleado E, Empleado S
WHERE Departamento.nombred IN (‘Marketing’, ‘Investigación’) 113
WHERE E.nssjefe=S.nss; 114

AND Departamento.numerod = Oficina_depto.numerod;

SQL-92: Consultas Básicas SQL-92: Consultas Básicas


renombrar columnas orden de presentación
• SQL permite presentar las filas resultado de una consulta
• En el resultado de evaluar la consulta
de forma ordenada: Cláusula ORDER BY
* Nombres de cada empleado y su supervisor, cambiando al mismo tiempo los nombres de las – Ordenación según valores de una o varias columnas
columnas resultantes a ‘nom_empleado’ y ‘nom_supervisor’ – Ascendente ASC (por defecto) o Descendente DESC
SELECT E.nombre AS nom_empleado, – Suele ser una operación muy costosa
S.nombre AS nom_supervisor
FROM Empleado E, Empleado S las filas no se ordenan en disco: se ven ordenadas, pero no lo están
WHERE E.nssjefe = S.nss;
Nueva cabecera para la tabla resultado *Nombre y apellido de los empleados, y proyectos en los que trabajan, en orden descendente por
departamentos y, dentro de cada departamento, en orden alfabético ascendente por apellido y
• Seudónimos de columnas (y/o tablas) en cláusula FROM nombre

SELECT nom, num, oficina SELECT nombred, apellido, nombre, nombrep


FROM Departamento D(nom, num, dire, inidire), Oficina_depto FROM Departamento, Empleado, Trabaja_en, Proyecto
WHERE nom IN (‘Marketing’, ‘Investigación’) AND num = numerod; WHERE numerod=nd AND nss=nsse AND nump=numerop
ORDER BY nombred DESC, apellido ASC, nombre ASC;
115 116
SQL-92: Consultas Básicas SQL-92: Consultas Básicas
Tablas como conjuntos Tablas como conjuntos
• SQL no elimina filas repetidas del resultado de una • Operaciones de conjuntos
– UNION( ∪ ), INTERSECT( ∩ ), EXCEPT ( — ) (minus en ORACLE)
consulta, porque... – Resultado: conjunto de filas las filas repetidas se eliminan
– Eliminación de duplicados costosa (ordenar+recorrer+eliminar) – Las tablas operando han de ser compatibles en tipo:
– El usuario puede desear ver las filas repetidas en el resultado – igual nº de columnas, y
– Si se aplica una función agregada a filas, rara vez deben eliminarse las – columnas “correspondientes” con el mismo dominio
duplicadas
* Nombres de los proyectos en que participa el empleado de apellido ‘Silva’, ya sea como trabajad
• Operador DISTINCT: o como gerente del departamento que controla el proyecto
– Para eliminar duplicados del resultado de una consulta SQL ( SELECT nombrep FROM Proyecto, Trabaja_en, Empleado
» Resultado = Relación del Modelo Relacional Formal (conjunto de filas) WHERE numerop=nump AND nsse=nss AND apellido=‘Silva’ )
UNION
* Salarios de todos los empleados ( SELECT nombrep FROM Proyecto, Departamento, Empleado
SELECT salario FROM Empleado; WHERE numd=numerod AND nssdire=nss AND apellido=‘Silva’ );

* Salarios distintos de empleados, sin importar cuántos perciban cada cantidad • Para no eliminar duplicados...
SELECT DISTINCT salario 117
– UNION ALL, INTERSECT ALL, EXCEPT ALL
118

FROM Empleado;

SQL-92: Consultas Básicas SQL-92: Consultas Básicas


conjuntos explícitos conjuntos explícitos
• Un conjunto explícito de valores es una lista de valores • Operador ANY (o SOME)
encerrada entre paréntesis v <op> ANY V o v <op> SOME V ,, <op> ∈ { >, ≥, <, ≤, <>, = }
– Compara un valor individual v con los elementos de un conjunto V
• Puede aparecer en la cláusula WHERE – Devuelve TRUE si algún elemento e de V cumple que v <op> e
* nss de los empleados que trabajan en los proyectos 1, 2 ó 3 * nss de los empleados que trabajan en alguno de los proyectos 1, 2 ó 3
SELECT DISTINCT nsse FROM Trabaja_en SELECT DISTINCT nsse FROM Trabaja_en
WHERE nump IN (1, 2, 3); WHERE nump = ANY (1, 2, 3);

• Operador IN • Operador ALL


v IN V v <op> ALL V,, <op> ∈ { >, ≥, <, ≤, <>, = }
– Indica si el valor v pertenece al conjunto de valores V – Compara un valor v con los elementos de un conjunto V
– Devuelve TRUE si algún elemento e de V cumple que v = e – Devuelve TRUE si para todo elemento e de V se cumple v <op> e
* nss de los empleados que no trabajan en ninguno de los proyectos 1, 2 y 3
* nss de los empleados que trabajan en algún proyecto que no sea el 4 ni el 6 SELECT DISTINCT nsse FROM Trabaja_en
SELECT DISTINCT nsse FROM Trabaja_en 119 WHERE nump <> ALL (1, 2, 3); 120

WHERE nump NOT IN (4, 6);


SQL-92: Consultas Básicas SQL-92: Consultas Básicas
Consultas anidadas comparar conjuntos
• Es una consulta SELECT completa, dentro de cláusula • Operador IN (otro uso del mismo operador)
WHERE de otra consulta (consulta exterior) t IN S
• Obtiene valores de la BD que se usan en la condición de otra – indica si la fila t pertenece al conjunto de filas S (subconsulta)
consulta, para obtener otros datos
* Nombre y dirección de los empleados que trabajan en algún proyecto.
* Números de los proyectos en que participa el empleado de apellido ‘Silva’, sea como trabajador o SELECT nombre, dirección FROM Empleado
como gerente del departamento que controla el proyecto
WHERE nss IN ( SELECT nsse FROM TRABAJA_EN );
SELECT DISTINCT numerop FROM PROYECTO
WHERE numerop IN ( SELECT nump
FROM Trabaja_en, Empleado * Números de seguridad social de aquellos empleados que trabajan en algún proyecto en el que
WHERE nsse=nss AND apellido=‘Silva’ ) trabaje el empleado ‘José B. Silva’, de forma que ambos tengan la misma combinación (proyecto,
OR numerop IN ( SELECT numerop horas); es decir, todo empleado que trabaje las mismas horas que ‘José B. Silva’, en cada proyecto
en el que trabajen ambos. El nss de ‘José B. Silva’ es ‘123456789’.
FROM Proyecto, Departamento, Empleado
WHERE numd=númerod SELECT DISTINCT nsse FROM Trabaja_en
AND nssdire=nss AND apellido=‘Silva’ ) ; WHERE (númp, horas) IN ( SELECT númp, horas
121
FROM Trabaja_en 122

• Es posible tener varios niveles de consultas anidadas WHERE nsse=‘123456789’);

SQL-92: Consultas Básicas SQL-92: Consultas Básicas


comparar conjuntos columnas ambiguas
• Coincidencia de nombres de columnas en las consultas
• Operador ANY o SOME (otro uso del mismo operador)
exterior y anidada Ambigüedad
t <op> ANY S o t <op> SOME S,, <op> ∈ { >, ≥, <, ≤, ≠, = }
* Nombre y apellidos de cada empleado con familiares de igual nombre y sexo que él
– Compara una fila t con las filas resultado de una consulta anidada S SELECT nombre, apellido FROM Empleado
– Devuelve TRUE si alguna fila e de S cumple que t <op> e WHERE nss IN ( SELECT nsse FROM Familiar
WHERE nsse=nss AND nombre_familiar=nombre
• Operador ALL (otro uso del mismo operador) AND sexo=sexo ); ¿cómo evitar esta ambigüedad?

t <op> ALL S,, <op> ∈ { >, ≥, <, ≤, ≠, = } Regla: Una columna no calificada se refiere a la tabla
– Compara una fila t con filas resultado de una consulta anidada S declarada en la consulta anidada más interior
– Devuelve TRUE si para toda fila e de S se cumple que t <op> e
Si en una consulta anidada es necesario usar columnas de
* Nombres y apellidos de los empleados cuyo salario es menor que el de todos los empleados de tablas declaradas en una consulta exterior calificar
departamento 5
SELECT nombre, apellido FROM Empleado * Nombre y apellidos de cada empleado con familiares de igual nombre y sexo que él
SELECT nombre, apellido FROM Empleado E
WHERE salario < ALL ( SELECT salario
WHERE nss IN ( SELECT nsse FROM Familiar
FROM Empleado ¿”Mejor” con DISTINCT 123 WHERE nss=nsse AND nombre_familiar=nombre 124
WHERE nd=5 ); en la subconsulta? AND sexo= E.sexo );
SQL-92: Consultas Básicas SQL-92: Consultas Básicas
correlación EXISTS
• Una consulta exterior y otra anidada están correlacionadas si una
condición de la anidada contiene columnas de una tabla declarada en • Operador EXISTS (S): comprobación de tablas vacías
la consulta exterior – Devuelve TRUE si la tabla S contiene al menos una fila
SELECT nombre, apellido FROM Empleado – Devuelve FALSE si S es una tabla vacía (sin filas)
WHERE nss IN ( SELECT nsse FROM Familiar L S suele ser una consulta anidada correlacionada
WHERE nss=nsse AND sexo=‘F’ );
* Nombre y apellido de cada empleado con familiares de igual nombre y sexo que él
• La consulta anidada se evalúa una vez para cada fila (o combinación
SELECT E.nombre, E.apellido FROM Empleado E
de filas) de la consulta exterior
WHERE EXISTS ( SELECT * FROM Familiar
– Evalúa la consulta anidada para cada fila de EMPLEADO,
WHERE nsse=nss AND nombre_familiar=nombre
– Si el valor de nss de la fila EMPLEADO está en el resultado de la consulta anidada,
selecciona la fila EMPLEADO para el resultado final AND sexo=E.sexo );

• Una consulta anidada que use el operador = o IN siempre puede * Nombres de empleados sin familiares
expresarse como una reunión (join) SELECT nombre, apellido FROM Empleado E
SELECT E.nombre, E.apellido WHERE NOT EXISTS (SELECT * FROM Familiar WHERE nsse=nss);
FROM Empleado, Familiar D 125 126
WHERE nss=nsse AND D.sexo=‘F’;

SQL-92: Consultas Básicas SQL-92: Consultas Básicas


UNIQUE Nulos
• Operador UNIQUE (S): Comprobación de filas duplicadas • Null
– Devuelve TRUE si NO hay filas repetidas en S – Ausencia o desconocimiento de información
L S suele ser una consulta anidada correlacionada – Comparar NULL con cualquier cosa da FALSE

* Nombres y apellidos de los empleados que trabajan en un único proyecto • Operador IS NULL ,, IS NOT NULL
SELECT nombre, apellido FROM Empleado v IS NULL
WHERE UNIQUE ( SELECT nsse – es TRUE si v es NULL
FROM Trabaja_en v IS NOT NULL
WHERE nsse = nss );
– es TRUE si v es un valor no NULL
* Nombres, apellidos y salario de los empleados con un solo familiar
SELECT nombre, apellido, salario FROM Empleado * Nombres de empleados sin supervisores
WHERE UNIQUE ( SELECT *
SELECT nombre, apellido FROM Empleado
FROM Familiar
127 WHERE nssjefe IS NULL; 128
WHERE nsse = nss );
SQL-92: Consultas Básicas SQL-92: Consultas Básicas
Funciones agregadas uso de * y de DISTINCT
• Función COUNT( ) • Uso de *
– Cuenta el número de filas o de valores especificados en una consulta * Número total de empleados de la compañía
• Funciones SUM( ), MAX( ), MIN( ), AVG( ) SELECT COUNT(*) FROM Empleado ( cuenta filas)
– Suma, máximo, mínimo y media aritmética (promedio) * Contar el número de empleados de la compañía que tienen un jefe
– Aplicadas a un multiconjunto (saco, bag) de valores numéricos SELECT COUNT(nssjefe) FROM Empleado;
( cuenta filas con nssjefe no NULL
L Pueden aparecer en cláusula SELECT * Número de empleados en el departamento de Investigación
* Suma de los salarios y salario máximo, mínimo y medio de los empleados SELECT COUNT(*) FROM Empleado, Departamento
SELECT SUM(salario), MAX(salario), MIN(salario), AVG(salario) WHERE nd=númerod AND nombred=‘Investigación’;
FROM EMPLEADO;
* Suma de los salarios y salario máximo, mínimo y medio de empleados del depto. de Investigación • Uso de DISTINCT
SELECT SUM(salario), MAX(salario), MIN(salario), AVG(salario) * Contar el nº de valores distintos de salario que pueden cobrar los empleados
FROM Empleado, Departamento SELECT COUNT(salario) FROM Empleado;
WHERE nd=númerod AND nombred=‘Investigación’; Error: NO se eliminan duplicados, así que COUNT(salario) ≡ COUNT(
129 130
L También pueden aparecer en cláusula HAVING (*se verá*) SELECT COUNT(DISTINCT salario) FROM Empleado; OK !!

SQL-92: Consultas Básicas SQL-92: Consultas Básicas


Funciones agregadas y correlación Agrupación
• Cláusula GROUP BY
• Es posible que una consulta anidada y correlacionada con – Para formar subgrupos de filas dentro de una tabla
– Los grupos se forman según el valor de las columnas de agrupación
otra exterior, incluya una función agregada – Las filas de cada grupo tendrán el mismo valor en las columnas de
agrupación
* Nombres de los empleados con 2 o más familiares • Aplicación de funciones agregadas a grupos de filas
SELECT apellido, nombre FROM Empleado
* Para cada departamento, obtener su número, cuántos empleados tiene dicho departamento y el
WHERE 2 ≤ ( SELECT COUNT(*)
salario medio de los empleados del mismo
FROM Familiar SELECT nd, COUNT(*), AVG(salario)
WHERE nss=nsse ); FROM Empleado
GROUP BY nd ; ← una columna de agrupación

Las columnas de agrupación deben aparecer en la cláusula SELECT,


antes de cualquier función agregada, para que su valor (único para cada
131
grupo) aparezca junto al resultado de aplicar la función al grupo 132
SQL-92: Consultas Básicas SQL-92: Consultas Básicas
Agrupación Agrupación
• Cláusula HAVING
• WHERE... se aplica a filas individuales
– Siempre junto a GROUP BY
– Condición que deben cumplir los grupos de filas asociados a cada valor • HAVING... se aplica a grupos de filas
de las columnas de agrupación
* Nº de empleados cuyos salarios superan los $15,000 en cada departamento, pero sólo en el caso
– Un grupo que no cumple la condición, no es seleccionado para el resultado
de departamentos en los que trabajen más de 5 empleados
* Para cada proyecto en el que trabajen más de dos empleados, obtener el número y nombre
del proyecto, y el nº de empleados que trabajan en él (* Consulta incorrecta ¿por qué? *) (* Consulta correcta *)
SELECT numerop, nombrep, COUNT(*)
SELECT nombred, COUNT(*) SELECT nombred, COUNT(*)
FROM Proyecto, Trabaja_en FROM Departamento, Empleado
FROM Departamento, Empleado
WHERE numerop=nump WHERE númerod=nd
WHERE númerod=nd AND salario>15000
GROUP BY numerop, nombrep AND salario>15000 AND nd IN (SELECT nd
HAVING COUNT(*) > 2 ; GROUP BY nombred FROM Empleado
HAVING COUNT(*) > 5 ; GROUP BY nd
133 HAVING COUNT(*) > 5)134
(* pista: orden de ejecución *) GROUP BY nombred ;

SQL-92: Consultas Básicas SQL-92: Consultas Básicas


Tablas reunidas Tablas reunidas: anidamiento
• Reunión especificada en la cláusula FROM de una consulta
• Hasta ahora la hemos especificado en cláusulas FROM y • Es posible anidar varias especificaciones de reunión de
WHERE tablas
* Nombres y dirección de empleados del departamento de Investigación
SELECT nombre, apellido, direccion * Para cada proyecto ubicado en ‘Santiago’, obtener el nº de proyecto, el nº del departamento que
FROM Empleado, Departamento ← reunión de tablas lo controla y el apellido, dirección y fecha de nacimiento del gerente de ese departamento
WHERE nombred=‘Investigacion’
AND nd=numerod; ← condición de reunión SELECT númerop, númd, apellido, dirección, fechan
FROM ( ( Proyecto JOIN Departamento ON númd=númerod )
• Consultas más comprensibles: separa condiciones de reunión JOIN Empleado ON nssdire=nss )
y de selección WHERE lugarp=‘Santiago’;
* Nombres y dirección de empleados del departamento de Investigación
SELECT nombre, apellido, direccion
← tabla reunida
135 136
FROM (Empleado JOIN Departamento ON nd=numerod)
WHERE nombred=‘Investigacion’;
SQL-92: Consultas Básicas SQL-92: Consultas Básicas
Reunión Interna de tablas (inner join) Reunión Natural de tablas (natural join)
• Es el tipo de reunión “por defecto” • Sin condición de reunión explícita
SELECT ... SELECT ...
FROM ( R1 JOIN R2 ON <condición_reunión> ) FROM ( R1 NATURAL JOIN R2 )
WHERE ... WHERE ...

• Si existe una fila t1 en R1 y otra fila t2 en R2, tales que • Equi-reunión implícita para cada par de columnas con
cumplen la condición de reunión, la tabla resultado (reunida) igual nombre en una y otra tabla
incluirá la fila obtenida al combinar t1 y t2 ̶ Sólo se incluye una de estas columnas en el resultado
̶ Si no coinciden los nombres de las columnas, es necesario
SELECT E.nombre AS nom_empleado, S.nombre AS nom_supervisor RENOMBRAR una de ellas mediante AS en la cláusula FROM
FROM (Empleado E JOIN Empleado S ON E.nssjefe = S.nss);
– Son excluidas las filas EMPLEADO con NULL en nssjefe SELECT nombre, apellido, direccion
FROM ( Empleado NATURAL JOIN (Departamento AS DEP(nombred, nd, dire, fech)) )
• También puede especificarse como
WHERE nombred=‘Investigacion’;
R1 INNER JOIN R2 ON <condición_reunión> 137 138

SQL-92: Consultas Básicas SQL-92: Consultas Básicas


Reunión Externa de tablas (outer join) Evaluación de consultas
• Útil si en una reunión se necesita obtener las filas… • En una consulta SQL hay un máximo de 6 cláusulas
– con valor NULL en las columnas de reunión, o • Sólo son obligatorias SELECT y FROM
– sin correspondencia en la otra tabla
• Orden de especificación de las cláusulas:
• Tipos de reunión externa:
– LEFT [OUTER] JOIN Reunión externa izquierda SELECT <lista columnas> columnas o funciones que se van a
– RIGHT [OUTER] JOIN Reunión externa derecha obtener

– FULL [OUTER] JOIN Reunión externa completa o total FROM <lista tablas> tablas necesarias (incluso las reunidas)
WHERE <condición para filas> condiciones para selección de filas

SELECT E.nombre AS nom_empleado, S.nombre AS nom_supervisor GROUP BY <lista columnas agrupación> especificación del agrupamiento de filas

FROM (Empleado E LEFT OUTER JOIN Empleado S ON E.nssjefe=S.nss); HAVING <condición para grupos> condición para selección de grupos de filas
̶ Obtiene también los empleados sin supervisor (con NULL en nssjefe) ORDER BY <lista columnas ordenación> orden de presentación del resultado
139 140
SQL-92: Consultas Básicas SQL-92: Consultas Básicas
Evaluación de consultas (2) Evaluación de consultas (y 3)
• Orden de evaluación de las cláusulas: • Ventajas e inconvenientes de esta flexibilidad:
1) FROM (es decir, la reunión o join de tablas, si se especifica más de una) ☺ – el usuario elige la técnica o enfoque más cómodo
2) WHERE – Confusión del usuario: ¿qué técnica uso?
3) GROUP BY – Algunas técnicas son más eficientes que otras
4) HAVING el usuario debe determinar cuál
5) SELECT
6) ORDER BY • En condiciones ideales...
– Usuario: se preocupa sólo de especificar la consulta correctamente
– SGBD: se ocupa de ejecutar la consulta de manera eficiente

• Diversas formas de especificar una misma consulta • Pero en la práctica no suele ser así...
conviene saber qué tipos de consulta son más y menos costosos
Ejemplo: es posible expresar una consulta utilizando...
a) condiciones de reunión en cláusula WHERE, o
b) tablas reunidas en la cláusula FROM, o Recomendación (optimización de consultas):
c) consultas anidadas y el operador de comparación IN ... 141 Consultas con mínimo anidamiento correlacionado
142

Flexibilidad y mínimo ordenamiento implícito

SQL-92: Inserción de datos SQL-92: Inserción de datos


• Orden INSERT • Inserción de varias filas en una sola orden INSERT
– Añade una fila completa a una tabla – Filas separadas por comas
– Incluye nombre de la tabla y lista de valores para las columnas, escritos en – Cada fila se encierra entre paréntesis
igual orden al especificado en la orden CREATE TABLE

INSERT INTO Empleado • Especificación explícita de algunas columnas (y no todas)


VALUES ( 'Ricardo', ‘C’, 'Martínez', '653298653123', ‘987654321’, '30-DIC-52', – Omisión de columnas cuyo valor se desconoce
'Olmo 98, Cedros, MX', ‘M’, 37000, '987654321321', 4 ) ;
– Cada columna no especificada tomará el...
– Si se desea poner los valores de las columnas en cualquier orden, hay que · valor por omisión: valor tomado de su cláusula DEFAULT, o
especificar los nombres de las columnas en dicho orden · NULL: si la columna permite nulos y no se definió cláusula DEFAULT para la
misma
INSERT INTO Empleado ( nombre, apellido, nss, nif, nd, salario, * Inserción de un empleado del que sólo se conoce su nombre, apellidos, nss y nif
nssjefe, direccion, fechan, sexo )
INSERT INTO Empleado (nombre, apellido, nss, nif)
VALUES ( 'Ricardo', ‘C’, 'Martínez', '653298653123', ‘987654321’, 4, 37000,
'987654321321', 'Olmo 98, Cedros, MX', '30-DIC-52', ‘M’ ) ; VALUES ( 'Rubén', 'Ripoll', '553298653111‘, ‘11222333R’ ) ;

143 144
SQL-92: Inserción de datos SQL-92: Inserción de datos
Restricciones de Integridad filas resultado de una consulta
• Si SGBD con implementación total de SQL-92 • Carga de una tabla con información sinóptica de la BD
- El SGBD maneja e impone toda RI definida en esquema de BD (LDD) Sea una tabla INFO_DEPTOS vacía. En ella queremos almacenar los nombres de cada
• Si SGBD con implementación de algunas RI departamento, su nº de empleados y el salario conjunto de los empleados del mismo.
- Menor complejidad, mayor eficiencia INFO_DEPTOS ( nombre_depto, num_emps, sal_total)
- SGBD implementa comprobaciones para imponer RI que sí maneja INSERT INTO Info_deptos ( nombre_depto, num_emps, sal_total )
INSERT INTO Empleado (nombre, apellido, nd) VALUES ( 'Roberto', 'Huertas', 2 ) ; SELECT nombred, COUNT(*), SUM(salario)
 Inserción rechazada: no se incluye valor para nss, que debe ser NOT NULL FROM Departamento, Empleado
- Programador debe asegurar la no violación de las RI no manejadas por el WHERE númerod=nd
SGBD GROUP BY nombred ;
LSupongamos que no existe departamento con numerod=8
– Es posible hacer SELECT ... FROM Info_deptos ...
INSERT INTO Empleado (nombre, apellido, nss, nif, nd)
VALUES ( 'Roberto', 'Huertas', '980760540222', ‘22333444H’, 8 ) ; – 1 INFO_DEPTOS puede contener información no actualizada
Si el SGBD sí maneja la Integridad Referencial Si se modifica información en EMPLEADO y/o DEPARTAMENTO, los cambios no
 Inserción rechazada se reflejarán en la tabla INFO_DEPTOS
Si el SGBD NO soporta la Integridad Referencial
Una vista sí “contiene” siempre los datos más actuales (*se verá*)
 Inserción permitida ¡el programador debe asegurar que esto no pase! 145 146

SQL-92: Eliminación de datos SQL-92: Actualización de datos


• Orden DELETE • Orden UPDATE
– Elimina filas completas de una tabla – Modifica valores de columnas en una o más filas de una tabla
– Sólo una tabla en cláusula FROM – Se modifican filas de una sola tabla a la vez
– Cláusula WHERE para seleccionar las filas que eliminar – Cláusula SET especifica columnas que modificar y nuevos valores
Si no hay WHERE, se eliminan todas las filas – Cláusula WHERE para seleccionar filas que actualizar
La tabla permanece, pero queda vacía Si no hay WHERE, se aplica la modificación a todas las filas
DELETE FROM Empleado ; todas las filas
DELETE FROM Empleado WHERE apellido=‘Bojórquez’; 0 filas * Para el proyecto 10, cambiar el lugar a Belén y el nº de depto controlador al 5
DELETE FROM Empleado WHERE nss=‘123456789012’ ; 1 fila
UPDATE Proyecto SET lugarp = ‘Belen’, númd = 5
WHERE numerop=10 ;
DELETE FROM Empleado
WHERE nd IN ( SELECT numerod FROM Departamento
WHERE nombre=‘Investigación’) ; 4 filas • Propagación de modificaciones
– Si cambia un valor de clave candidata, este cambio se propaga a valores
• Propagación de eliminaciones de clave ajena de filas de otras tablas, si así se especificó en las acciones de
– Según acciones de mantenimiento de la Integridad Referencial especificadas con LDD mantenimiento de la Integridad Referencial en la definición de la tabla con CREATE
en los CREATE TABLE (esquema de BD) TABLE
147 148
SQL-92: Actualización de datos SQL-92: LDD – Definición de Datos
• Modificación de varias filas a la vez con UPDATE Esquema de Base de Datos Relacional
- Agrupa tablas y otros elementos, de una misma aplicación
- 1as versiones de SQL: todas las tablas dentro de un esquema único y global a
* Conceder a todo empleado del departamento de Investigación un aumento salarial del 10%
todas las aplicaciones que accedían a la BD
UPDATE Empleado SET salario = salario*1.1
WHERE nd IN (SELECT númerod • Orden CREATE SCHEMA: definición/creación de esquemas
FROM Departamento CREATE SCHEMA <nombre de esquema>
AUTHORIZATION <identificador de autorización>
WHERE nombred=‘Investigación’) ; <nombre de esquema> identifica el esquema
<identificador de autorización> usuario/cuenta propietaria del esquema
CREATE SCHEMA Compañía AUTHORIZATION JSILVA ;
• NULL o DEFAULT como nuevo valor de una columna – A continuación puede especificarse las definiciones de los elementos contenido
UPDATE Empleado SET salario = DEFAULT; en dicho esquema
UPDATE Empleado SET nssjefe = NULL Elementos del esquema:
WHERE ... ; Tablas, Vistas, Dominios, Autorizaciones, Restricciones, etc.

149 150

SQL-92: Catálogo de BD relacional SQL-92: LDD – Definición de Datos


Conjunto nombrado de esquemas de BD en un entorno SQL LDD: definición de tablas
Contiene un esquema especial, INFORMATION_SCHEMA, que Orden CREATE TABLE
almacena datos sobre la definición de todos los elementos
de todos los esquemas existentes en el catálogo Define (crea) una tabla: nombre, columnas y restricciones
El Diccionario de Datos (Data Dictionary) de ORACLE se corresponde con el Nombre único dentro del esquema
INFORMATION_SCHEMA del estándar SQL-92 CREATE TABLE Empleado (
Para cada Columna... nombre ...
nombre, apellido ...
- Es posible compartir elementos (dominios, etc.) entre diferentes tipo de datos (dominio)
esquemas del mismo catálogo restricciones de columna
nss ...
nif ...
- Sólo pueden definirse restricciones de integridad referencial entre Restricciones de tabla... fechan ...
tablas que existan en esquemas dentro del mismo catálogo de clave candidata, direccion ...
Concepto incorporado en la versión SQL-92 del estándar de integridad de entidad,
sexo ...
de integridad referencial, o
restricciones de otro tipo salario ...
nssjefe ...
151 nd … 152

);
SQL-92: LDD – Definición de Datos SQL-92: LDD – Definición de Datos
LDD: definición de tablas LDD: definición de tablas
Indicación del esquema al que pertenece una tabla
Esquema Explícito
Especificación del tipo de datos de una columna
1. Especificar directamente el tipo de datos tras nombre de la columna
CREATE TABLE Compañia.Empleado ...
CREATE TABLE Empleado (
Esquema Implícito en el contexto
nombre VARCHAR(15) ...
CREATE TABLE Empleado ... ... );

2. Definir un dominio y usar su nombre como tipo de datos


Ordenamiento de columnas y filas
– Facilita cambio del tipo de datos usado por muchas columnas
Columnas ordenadas tal como aparecen en CREATE TABLE
– Esquema más comprensible
Las filas no están ordenadas
CREATE DOMAIN Nombres VARCHAR(15);
...
Las tablas creadas con CREATE TABLE son tablas BASE CREATE TABLE Empleado (
El SGBD las almacena físicamente en algún fichero de la BD nombre NOMBRES ...
153 ... ); 154

SQL-92: LDD – Definición de Datos SQL-92: LDD – Definición de Datos


LDD: definición de tablas: tipos de datos LDD: definición de tablas: tipos de datos
Numéricos Temporales
– Enteros y Reales · DATE (10 posiciones) = YEAR, MONTH, DAY (yyyy-mm-dd)
· INTEGER (también INT), SMALLINT,
· TIME (8 posiciones) = HOUR, MINUTE, SECOND (hh:mm:ss)
· FLOAT, REAL, DOUBLE PRECISION
– Sólo permitidas fechas y horas válidas
– Con formato
· DECIMAL(p,e) ( también DEC(p,e) ó NUMERIC(p,e) ) · TIMESTAMP (marca de tiempo)
p: precisión, e: escala. El valor por omisión de la escala es e = 0 – DATE, TIME, fracciones de segundo y desplazamiento respecto al huso
horario estándar (WITH TIME ZONE)
• Cadena de caracteres · INTERVAL
– Longitud fija CHAR(n) ( n: nº caracteres ) – Período de tiempo, para incrementar/decrementar el valor actual de una
– Longitud variable VARCHAR(n) ( n: máximo nº caracteres ) fecha, hora o marca de tiempo
– Se califica con YEAR/MONTH ó DAY/TIME para indicar su naturaleza
• Cadena de Bits
– Longitud fija BIT(n) (n: nº bits)
– Longitud variable BIT VARYING(n) n:máx nº bits. Por omisión n=1 155 156
SQL-92: LDD – Definición de Datos SQL-92: LDD – Definición de Datos
LDD: definición de tablas: tipos de datos: LDD: definición de tablas
definición de dominios de datos Especificación de restricciones de columna
CREATE DOMAIN <nombre dominio> <tipo de datos> Cláusula NULL o NOT NULL
[ DEFAULT <valor defecto> ] Opción de nulo: indica si una columna puede contener o no NULL
[ <lista de definición de restricciones de dominio> ] ; CREATE TABLE Empleado (...
- <tipo de datos>: uno de los proporcionados por el SGBD (built-in) nombre VARCHAR(15) NOT NULL, ... );
- <valor defecto>: (opcional) Por omisión, se asume NULL
- Especifica el valor por omisión para columnas definidas de este dominio La restricción NOT NULL es obligatoria para columnas componentes de una
- Será asignado a cada columna con dicho dominio, si no tiene ya su propia cláusula clave primaria
DEFAULT Cláusula DEFAULT <valor>
- <lista de definición de restricciones de dominio>: (opcional) Valor por omisión (o por defecto)
- Restric. Integridad que se aplican a toda columna definida sobre el dominio CREATE TABLE Empleado ( ...
- Cada RI puede tener un nombre: cláusula CONSTRAINT <nombre_RI> salario DECIMAL(5,2) DEFAULT 1000 NULL,... );
Si una columna no tiene DEFAULT, su valor por defecto es...
* Ejemplo: enumeración de posibles valores componentes del dominio El de su dominio, si su tipo es un dominio que incluye DEFAULT
CREATE DOMAIN Color VARCHAR(8) DEFAULT ‘sinColor’ NULL en cualquier otro caso, siempre que la columna permita NULL
CONSTRAINT color_valido 157 158

CHECK (VALUE IN ( ‘rojo’, ‘amarillo’, ‘azul’, ‘verde’, ‘sinColor’ ) ) ;

SQL-92: LDD – Definición de Datos SQL-92: LDD – Definición de Datos


LDD: definición de tablas LDD: definición de tablas
• Especificación de restricciones de tabla CREATE TABLE Empleado (
Cláusula PRIMARY KEY (<lista_columnas>) nombre VARCHAR(15) NOT NULL,
Columnas que componen la clave primaria
apellido VARCHAR(15) NOT NULL,
nss CHAR(12) NOT NULL,
Cláusula UNIQUE (<lista_columnas>) nif CHAR(9) NOT NULL,
Columnas que forman una clave alternativa fechan DATE NULL,
Cláusula FOREIGN KEY (<lista_columnas>) direccion VARCHAR(30) ,
sexo CHAR(1) ,
REFERENCES <tabla>(<lista_columnas>) salario DECIMAL(5,2) DEFAULT 1000 NULL,
Columnas clave externa (Integridad Referencial) nssjefe CHAR(12) ,
SQL-92 permite que una clave externa se refiera a una clave primaria o una nd NUMERIC(2) NOT NULL,
clave alternativa PRIMARY KEY ( nss ),
Cláusula CHECK (<expresión>) UNIQUE ( nif ),
CHECK ( nssjefe <> nss ),
Condición sobre los valores de las columnas que debe cumplir toda fila de CHECK ( sexo IN (‘H’, ‘M’) ),
la tabla FOREIGN KEY (nssjefe) REFERENCES Empleado(nss),
159 FOREIGN KEY (nd) REFERENCES Departamento(numerod) 160

);
SQL-92: LDD – Definición de Datos SQL-92: LDD – Definición de Datos
LDD: definición de tablas LDD: definición de tablas
• Especificación de restricciones de tabla (cont.) • Especificación de restricciones de tabla (cont.)
- Si la restricción afecta sólo a una columna, puede especificarse en la
- Dar nombre a una restricción es opcional, pero muy conveniente
definición de dicha columna (en la misma línea)
CONSTRAINT <nombre_RI> <restricción> - Por ejemplo, si una clave externa no es compuesta, no se necesita la
cláusula FOREIGN KEY
- El nombre de restricción debe ser único dentro del mismo esquema
- Identifica una restricción, por si después debe ser eliminada o sustituida por CREATE TABLE Empleado (
otra nombre VARCHAR(15) NOT NULL,
nss CHAR(12) PRIMARY KEY,
CREATE TABLE Empleado ( nif CHAR(9) NOT NULL UNIQUE,
..., nssjefe CHAR(12) NULL REFERENCES Empleado(nss),
CONSTRAINT pk_empleado PRIMARY KEY ( nss ), nd NUMERIC(2) NOT NULL REFERENCES Departamento(numerod),
CONSTRAINT nif_unico UNIQUE ( nif ), ...,
CONSTRAINT jefe_ok CHECK ( nssjefe <> nss ), CONSTRAINT jefe_ok CHECK ( nssjefe <> nss ),
... );
161
... ); 162

SQL-92: LDD – Definición de Datos SQL-92: LDD – Definición de Datos


LDD: definición de tablas LDD: definición de vistas
• Una vista es una tabla derivada de otras tablas
• Acciones de mantenimiento de la integridad referencial
• Son tablas virtuales, pues no necesariamente existen en
Cláusulas ON DELETE <acción> forma física
y ON UPDATE <acción>
• Sentencia de definición o creación de una vista
<acción> ∈ { NO ACTION, CASCADE, SET NULL, SET DEFAULT } CREATE VIEW <nombre_vista> [ (<lista_nombres_columnas>) ]
AS <consulta_de_definición>
CREATE TABLE Empleado (
..., • La consulta de definición…
CONSTRAINT jefe_emp FOREIGN KEY (nssjefe) determina el contenido de la vista
REFERENCES Empleado(nss) contiene las tablas base: tablas o vistas de las que se deriva la vista
ON DELETE SET NULL (también llamadas tablas de definición)
ON UPDATE CASCADE,
CONSTRAINT dep_emp FOREIGN KEY (nd)
REFERENCES Departamento(numerod) CREATE VIEW Familiar_de_Empleado (empleado, familiar, parentesco)
ON DELETE NO ACTION AS SELECT nombre, nombre_familiar, parentesco
ON UPDATE CASCADE FROM Empleado, Familiar
);
163
WHERE nss = nsse; 164
SQL-92: LDD – Definición de Datos SQL-92: LDD – Definición de Datos
LDD: definición de vistas LDD: definición de vistas
• Por defecto, la vista ‘hereda’ los nombres de las columnas...
- seleccionadas desde las tablas base
• Un estado de la vista EMPLEADO_EN_PROYECTO
- siempre que ninguna columna sea el resultado de una operación aritmética o
función de agregados Empleado_en_Proyecto nombre apellido nombrep horas
CREATE VIEW Empleado_en_Proyecto nombres que José Silva ProductoX 32.5
AS SELECT nombre, apellido, nombrep, horas hereda la vista
Ramón Nieto ProductoZ 40.0
FROM Empleado, Proyecto, Trabaja_en
WHERE nss = nsse AND nump = numerop ; José Silva ProductoY 07.5
Josefa Barceló ProductoX 20.0
• Definición de nuevos nombres para columnas de la vista Federico Vizcarra ProductoY 10.0
CREATE VIEW Info_Depto (nombre_depto, num_de_emps, sal_total) Federico Vizcarra ProductoZ 10.0
AS SELECT nombred, COUNT(*), SUM(salario) Josefa Barceló ProductoY 20.0
FROM Departamento, Empleado
... ... ... ...
WHERE numerod = nd
GROUP BY nombred ; 165 166

SQL-92: LDD – Definición de Datos SQL-92: LDD – Definición de Datos


LDD: definición de vistas LDD: definición de vistas
• El SGBD traduce cualquier sentencia SQL sobre la vista a
• Las vistas pueden utilizarse como mecanismo de...
una expresión equivalente sobre sus tablas base: reemplaza
- Simplificación de consultas
el nombre de la vista por su consulta de definición y ejecuta
- Seguridad (*se verá en el tema de seguridad*)
CREATE VIEW Veterano AS
- Adaptación de la información a las necesidades de cada usuario o SELECT nombre, nif, nss, fechan, nd FROM Empleado WHERE fechan<’01/01/1970’;
grupo de usuarios
Sentencia de usuario Traducción
• Característica fundamental de las vistas SELECT * FROM VETERANO SELECT nombre, nif, nss, fechan, nd FROM EMPLEADO
Actualización Permanente WHERE nombre LIKE ‘G%’; WHERE fechan < ‘01/01/1970’ AND nombre LIKE ‘G%’;
- El responsable de esta característica es el SGBD INSERT INTO VETERANO INSERT INTO EMPLEADO (nombre, nif, nss, fechan, nd)
VALUES (‘Eva’, ‘12345678E’, VALUES (‘Eva’ ‘12345678E’, ‘123456789012’, ‘14/11/1947’, 4);
La vista no se crea cuando se define, sino cuando se consulta ‘123456789012’, ‘14/11/1947’, 4);
Una vista no “contiene información”, sino que “deja ver información” UPDATE VETERANO SET nd=1 UPDATE EMPLEADO SET nd=1
almacenada en sus tablas base WHERE nd=2; WHERE fechan < ‘01/01/1970’ AND nd=2;
167 168
DELETE FROM VETERANO DELETE FROM EMPLEADO
WHERE nif = ‘12345678E’; WHERE fechan < ‘01/01/1970’ AND nif = ‘12345678E’;
SQL-92: LMD – Manipulación de Datos SQL-92: LMD – Manipulación de Datos
LMD: consultas a través de vistas LMD: Modificación a través de vistas
• Las vistas no tienen ninguna limitación en operaciones de • La actualización de datos a través de vistas tiene algunas
consulta limitaciones
• El usuario no distingue si el elemento al que accede es una
- Por un lado, actualizar a través de una vista definida sobre
tabla base o una vista
varias tablas base suele dar problemas, pues puede haber
* Nombres de los empleados y de sus hijos/as
ambigüedad
SELECT empleado, familiar UPDATE Empleado_en_Proyecto SET nombrep = ‘ProductoZ’
FROM Familiar_de_empleado WHERE parentesco LIKE ‘Hij_’ ; WHERE apellido=‘Silva’ AND nombre=‘José’
* Datos del departamento ‘Investigación’ AND nombrep=‘ProductoX’;
SELECT * FROM Info_Depto WHERE nombre_depto=‘Investigación’ ;
Esta modificación puede traducirse a dos actualizaciones distintas de las
* Nombres y apellidos de los empleados que trabajan en el proyecto 'ProductoX'
tablas base de la vista (EMPLEADO, PROYECTO y TRABAJA_EN), como se
SELECT nombre, apellido, nombrep muestra en la siguiente diapositiva…
FROM Empleado_en_Proyecto
WHERE nombrep=‘ProductoX’ ; 169 170

SQL-92: LMD – Manipulación de Datos SQL-92: LMD – Manipulación de Datos


LMD: Modificación a través de vistas LMD: Modificación a través de vistas

UPDATE Trabaja_en SET nump = (SELECT numerop FROM Proyecto - Por otro lado, algunas actualizaciones a través de vistas
WHERE nombrep = ‘ProductoZ’) carecen de sentido
WHERE nsse = (SELECT nss FROM Empleado UPDATE Info_depto
WHERE apellido = ‘Silva’ AND nombre = ‘José’) SET sal_total = 100000
AND númp = (SELECT numerop FROM Proyecto
WHERE nombred=‘Investigación’ ;
WHERE nombrep = ‘ProductoX’) ;
 sal_total
se define como la suma de salarios individuales de los empleados y muchas
☺ Modifica los vínculos en TRABAJA_EN: cada fila que relacionaba las actualizaciones de las tablas base satisfarían esta actualización
filas de ‘José Silva’ en EMPLEADO y de ‘ProductoX’ en PROYECTO, pasa
a relacionar tal empleado con la fila ‘ProductoZ’ de PROYECTO

UPDATE Proyecto SET nombrep = ‘ProductoZ’ Así que no se garantiza que “toda vista sea actualizable”
WHERE nombrep = ‘ProductoX’ ;
 Produce igual efecto que pero modifica nombrep en PROYECTO:
al calcular la vista, mostrará ‘ProductoZ’ para todos los que antes 171 172
aparecían con ‘ProductoX’
SQL-92: LMD – Manipulación de Datos SQL-92: LMD – Manipulación de Datos
LMD: Modificación a través de vistas LMD: Modificación a través de vistas
• Una vista sería actualizable si... • En general...
- Una vista con una sola tabla base
- Implicara una única actualización posible de las tablas base, o bien
SÍ es actualizable si sus columnas contienen la clave primaria u otra clave
- Hubiera varias actualizaciones posibles, pero existiera un candidata de la tabla base
procedimiento específico de actualización de tablas base, tal que... Pues se establece una correspondencia entre cada fila de la vista y una única
· El usuario pudiera elegir el procedimiento, especificándolo en la fila de la tabla base
definición de la vista, o bien - Una vista definida sobre varias tablas mediante reuniones
NO es actualizable
· El SGBD pudiera elegir el procedimiento, según la actualización
- Una vista definida mediante agrupación y funciones agregadas
más probable
NO es actualizable

173 174

SQL-92: LDD – Definición de Datos SQL-92: LDD – Definición de Datos


LDD: Verificación de vistas LDD: Implementación de vistas
• Opción de verificación de vistas 1. Estrategia de actualización de consultas de definición
CREATE VIEW Emp_Precario AS SELECT nombre, apellido, nss, nif, salario, nd - Cada consulta sobre la vista se traduce a una consulta sobre las tablas
FROM Empleado WHERE salario < 900 ; base
*¿Qué pasaría al ejecutar estas sentencias? - La vista se rellena de filas a partir de la ejecución de la consulta
INSERT INTO Emp_Precario VALUES (‘Dimas’, ‘Pi', ‘111222333444’, ‘12121212D’, 1025, 1); - Poco eficiente cuando la <consulta_de_definición> es compleja, con tiempo
UPDATE Emp_Precario SET salario = 950 WHERE nif=‘12345678E’; de ejecución apreciable, y se aplican muchas consultas sobre la vista en
• Cláusula WITH CHECK OPTION poco tiempo
- En la definición de toda vista actualizable que se vaya a utilizar para la 2. Estrategia de materialización de vistas
modificación de datos - 1ª consulta sobre la vista creación de tabla temporal física
- Indica al SGBD que debe comprobar cada INSERT y UPDATE sobre la vista, y - Se conserva la tabla para posteriores consultas sobre la vista
rechazarlo si su realización implicara que la fila nueva o modificada no - Necesaria estrategia para actualización incremental de la tabla temporal tras
cumpliera la condición de definición cualquier modificación sobre las tablas base
CREATE VIEW Emp_Precario AS SELECT nombre, apellido, nss, salario, nd actualización permanente
FROM Empleado WHERE salario < 900 175 - Si no se hace referencia a la vista tras un tiempo, el sistema la eliminará
176 (y

WITH CHECK OPTION ; la recalculará en una consulta futura)


SQL-92: LDD – Definición de Datos SQL-92: LDD – Definición de Datos
LDD: Modificación de la estructura (alteración) de LDD: Alteración de Tablas
los elementos del esquema de base de datos • Adición de una columna a una tabla ya existente
• Alteración de tablas: ALTER TABLE <nombre_tabla> ADD <definición_columna> ;
ALTER TABLE <nombre_tabla> ... ; – No está permitido NOT NULL en la definición de una nueva columna
– Adición y Eliminación de Columnas (si es necesaria esta restricción, podrá establecerse después)
– Modificación de la Definición de Columnas * Añadir una columna a EMPLEADO para contener el puesto de trabajo
– Adición y Eliminación de Restricciones de Tabla ALTER TABLE Empleado ADD puesto VARCHAR(12);
Todas las filas de EMPLEADO tendrán puesto a NULL

• Alteración de dominios: – Para introducir un valor para la columna, en cada fila existente:
ALTER DOMAIN <nombre_dominio> ... ; Especificar la cláusula DEFAULT al añadir la columna:
– Eliminación y Adición de valor por defecto ALTER TABLE Empleado
ADD puesto VARCHAR(12) DEFAULT ‘aprendiz’;
– Eliminación y Adición de Restricciones de Dominio
Utilizar después una orden UPDATE
177 178

SQL-92: LDD – Definición de Datos SQL-92: LDD – Definición de Datos


LDD: Alteración de Tablas LDD: Alteración de Tablas
• Eliminación de una columna de una tabla • Modificación de la definición de una columna
ALTER TABLE <nombre_tabla> DROP <nombre_columna> <opción>; ALTER TABLE <nombre_tabla> ALTER <nombre_columna> <acción> ;
<opción> puede ser...
CASCADE: elimina la columna y toda restricción o vista que le hace referencia <acción> indica la modificación que se desea realizar...
RESTRICT: sólo elimina la columna si ninguna vista ni restricción le referencia
Eliminación de la cláusula DEFAULT existente
* Eliminación de la columna dirección de la tabla EMPLEADO ALTER TABLE Departamento ALTER nssdire DROP DEFAULT;
ALTER TABLE Empleado DROP direccion CASCADE;
ALTER TABLE Departamento DROP numerod <opción>; Definición de un nuevo valor por omisión
– Si <opción> = RESTRICT: no elimina la columna ‘numerod’, pues existe una columna ALTER TABLE Departamento ALTER nssdire SET DEFAULT ‘123456789012’;
‘EMPLEADO.nd’ que le hace referencia
– Si <opción> = CASCADE: elimina la columna y la restricción de integridad referencial que vincula
‘EMPLEADO.nd’ con DEPARTAMENTO. La columna ‘EMPLEADO.nd’ no es eliminada, pero deja
de ser clave ajena 179 180
SQL-92: LDD – Definición de Datos SQL-92: LDD – Definición de Datos
LDD: Alteración de Tablas LDD: Alteración de Dominios
• Orden ALTER DOMAIN <nombre_dominio> <acción>;
• Modificación de una restricción de tabla
– La restricción que se desea modificar debe tener un nombre <acción> indica la modificación que se desea realizar...

– Eliminación de una restricción de tabla – Eliminación y Reemplazo del valor por omisión
ALTER TABLE <nombre_tabla> DROP CONSTRAINT <nombre_RI> <opción>; ALTER DOMAIN <nombre_dominio> DROP DEFAULT;
ALTER TABLE Empleado DROP CONSTRAINT jefe_emp CASCADE; ALTER DOMAIN <nombre_dominio> SET DEFAULT <valor>;

– Adición de una restricción de tabla


– Eliminación y Definición de nuevas restricciones de dominio
ALTER TABLE <nombre_tabla> ALTER DOMAIN <nombre_dominio>
ADD CONSTRAINT <nombre_RI> <definición_RI>; DROP CONSTRAINT <nombre_RI_dominio>;
ALTER TABLE Empleado ALTER DOMAIN <nombre_dominio>
ADD CONSTRAINT salario_ok CHECK (salario > 0); ADD [ CONSTRAINT <nombre_RI_dominio> ] <restricción>;
ALTER TABLE Empleado 181 182
ADD CONSTRAINT puesto_ok CHECK (puesto IS NOT NULL);

SQL-92: LDD – Definición de Datos SQL-92: LDD – Definición de Datos


LDD: eliminación de elementos del esquema LDD: eliminación de elementos del esquema
Eliminación de una tabla. Orden DROP TABLE
• Eliminación de una vista. Orden DROP VIEW Destruye una tabla base, junto con su definición en el INFORMATION_SCHEMA
Destruye una tabla derivada, junto con su definición en el del catálogo
INFORMATION_SCHEMA del catálogo DROP TABLE <nombre_tabla> <opción>;
DROP VIEW <nombre_vista> ; <opción> puede ser...
RESTRICT: Destruye la tabla sólo si no se le hace referencia desde ninguna
• Eliminación de un dominio. Orden DROP DOMAIN otra tabla (clave ajena), ni es tabla base de una vista
Destruye un dominio de datos, junto con su definición en el CASCADE: Elimina la tabla junto con restricciones y vistas que la referencian
INFORMATION_SCHEMA del catálogo
• Eliminación de un esquema. Orden DROP SCHEMA
DROP DOMAIN <nombre_dominio> <opción> ; – Destruye un esquema de BD, junto con su definición en el
<opción> puede ser... INFORMATION_SCHEMA del catálogo
RESTRICT: destruye el dominio si no hay ninguna columna definida sobre él DROP SCHEMA <nombre_esquema> <opción>;
CASCADE: se elimina el dominio y toda columna definida sobre él pasa a tener el <opción> puede ser...
tipo de datos sobre el que se había definido el dominio RESTRICT: Destruye el esquema sólo si no contiene ningún elemento
183
(este aspecto es ampliado en el tema “Integridad en sistemas de bases de datos CASCADE: Elimina el esquema y las tablas, dominios y demás elementos 184

relacionales”) contenidos en el esquema


Integridad en Sistemas de Bases de
Datos Relacionales Reglas de integridad
• Integridad: consistencia o corrección de datos en la base de datos
• Las reglas de integridad (RI) no son específicas para cada usuario
Tipos de restricciones Consideraciones generales
1. Nos interesan las reglas de integridad específicas de
2.5.1 Reglas de integridad: consideraciones generales y una BD (reglas del negocio), además de RI Entidad, RI
componentes Referencial...
2.5.2 Reglas de integridad en SQL-92 2. Veremos las RI definidas sobre tablas base
Reglas de integridad de dominio - Por estar restringidas a contener datos correctos (reflejar la realidad)
Reglas de integridad de tabla La regla “los títulos de las películas son únicos” se aplica a la tabla base
Reglas de integridad generales y Disparadores PELICULA, y también a cualquier vista definida sobre ésta
2.5.3 Comprobación de restricciones - ¿Podemos definir RI sobre una vista (tabla derivada)?
• Sería deseable
• La vista heredaría toda RI de sus tablas base y podría añadir nuevas
185 (ejemplo: clave primaria o alternativa nueva para la vista) 186

Sólo consideraremos RI sobre tablas base (por simplicidad)

Reglas de integridad Reglas de integridad


Consideraciones generales (y 2) Componentes de una RI
3. Nos interesa soporte de RI declarativo Nombre actor_cache_ok
Daremos un vistazo también a... - Regla almacenada en INFORMATION_SCHEMA del catálogo con ese nombre
- Procedimientos o funciones almacenados, - Aparecerá en diagnósticos, producidos por el sistema como respuesta a
- Disparadores (triggers) intentos de violación de la regla (mensajes de error al usuario)
4. Una BD en un estado de integridad es correcta: Restricción NOT EXISTS ( SELECT * FROM ACTOR WHERE cache ≤ 0 )
• No viola ninguna RI conocida por el SGBD, es decir, - Expresión booleana 1 Restricción de Integridad ⊆ Regla de Integridad
• Satisface AND lógico de todas las RI definidas en su esquema - La regla ... se satisface ⇔ la restricción es TRUE
5. La integridad es importante en... es violada ⇔ la restricción es FALSE

• DISEÑO (estructuras de datos y reglas de integridad adecuadas) Respuesta a un intento de violación de la regla
• EJECUCIÓN (corrección de la información) - Indica al SGBD qué hacer si se intenta una operación que viola la RI
6. RI son mantenidas en el INFORMATION_SCHEMA del catálogo - Por defecto RECHAZAR, que implica...
Deshacer los posibles daños causados por la operación
Subsistema de Integridad del SGBD:
·

· Mostrar información de diagnóstico (mensaje)


• controla operaciones de usuario (INSERT,UPDATE,DELETE...) 187 188
- Podría ser un procedimiento de complejidad arbitraria: tratarErr(...)
• para asegurar que NO violan las reglas de integridad
Reglas de integridad SQL-92: Reglas de integridad
Creación, destrucción y tipos Categorías de reglas de integridad
• Creación de una regla de integridad... (en cualquier momento) 1. Reglas de integridad de Dominio
SGBD comprueba: ¿el estado actual de la BD satisface RI? – Asociadas a un dominio de datos específico
– Es una expresión de complejidad arbitraria que define un dominio
- No RI rechazada
- Sí RI aceptada 2. Reglas de integridad de Tabla
- Es almacenada en el INFORMATION_SCHEMA del catálogo – RIs de complejidad arbitraria incluidas en la definición de una tabla
- La regla es activada (entra en vigor) – Pueden ser restricciones de Columna
* Para la RI del ejemplo, actor_cache_ok , el SGBD controlará todo restricciones de Clave Candidata
INSERT INTO ACTOR… y UPDATE ACTOR SET cache =…
restricciones de Clave Externa
• Destrucción de reglas de integridad restricciones de Comprobación
- el sistema elimina su definición del INFORMATION_SCHEMA
Una tabla vacía cumple cualquier RI de tabla,
• Las RIs pueden restringir los valores legales de... aunque esa RI sea “esta tabla no puede estar vacía”
- Dominio 3. Reglas de integridad Generales
- Tabla, Columna – RIs de complejidad arbitraria no incluidas en la definición de ninguna tabla
- Base de datos 189
– Son otro elemento más de la BD, al mismo nivel que una tabla o vista
190

SQL-92: Reglas de integridad SQL-92: Reglas de integridad


Otras consideraciones Reglas de Integridad de Dominio
• Es útil ver la base de datos sujeta a una “RI gigante”... • Definición del conjunto de valores componentes de
resultado del AND de todas las RI... un dominio:
- generales - Enumeración de valores posibles: (‘marron’,‘gris’, ‘azul’, ‘verde’, ‘negro’)
- de tabla
- Expresión de definición: edad ≥ 0 AND edad ≤ 120
- de dominio aplicadas a cada columna de las tablas • RI como parte de la sentencia de definición del
dominio
Significado formal de la base de datos CREATE DOMAIN <nombre dominio> [ AS ] <tipo de datos>
[ DEFAULT <valor defecto> ]
[ [ CONSTRAINT <nombre restricción> ] CHECK (<condición>) ]+ ;
• Una regla de integridad es independiente de cualquier - <valor defecto> suele contener un literal (perteneciente al dominio) o NULL
aplicación específica que acceda a la base de datos • Aplicada a cada columna (de cualquier tabla) definida sobre
- No contiene parámetros ni variables host el dominio
(referencias a variables de los programas de aplicación)
CREATE DOMAIN Color_ojos AS VARCHAR(10)
191 DEFAULT ‘marron’ 192

CONSTRAINT color_valido CHECK ( VALUE IN (‘marron’,‘gris’,‘azul’,‘verde’,‘negro’) );


SQL-92: Reglas de integridad SQL-92: Reglas de integridad
Reglas de Integridad de Dominio Reglas de Integridad de Dominio
• NOT NULL no es una restricción de dominio válida • Eliminación de un dominio
CREATE DOMAIN Estado_civil AS CHAR(1) NOT NULL Incorrecto DROP DOMAIN <nombre dominio> { RESTRICT | CASCADE } ;
CONSTRAINT estado_civil_ok CHECK ( VALUE IN (‘S’, ‘C’, ‘V’, ‘D’) ) ; Opción RESTRICT
CREATE DOMAIN Estado_civil AS CHAR(1) - La eliminación falla si el dominio es referenciado en cualquier definición de columna
CHECK (VALUE IS NOT NULL) ☺ Correcto en una tabla, de vista o restricción de integridad
CONSTRAINT estado_civil_ok CHECK ( VALUE IN (‘S’, ‘C’, ‘V’, ‘D’) ) ; - En otro caso, éxito: el descriptor del dominio es eliminado del INFORMATION_SCHEMA
del catálogo
Opción CASCADE
- El dominio es eliminado del INFORMATION_SCHEMA, junto con toda vista y RI cuya
• Alteración de un dominio definición hace referencia al dominio
ALTER DOMAIN <nombre dominio> <acción>... ; - Las RI de dominio asociadas no son eliminadas, sino que cada columna definida
– Permite añadir y eliminar restricciones de integridad de dominio y valor
sobre el dominio...
· Es definida directamente sobre el tipo de datos subyacente al dominio
por defecto
· Si no tiene DEFAULT explícito, toma el del dominio (si éste lo tenía)
– Explicado en el tema anterior
· Hereda toda restricción de integridad asociada al dominio,

193 - convertida en una restricción de tabla, 194


- sustituyendo VALUE por el nombre de la columna

SQL-92: Reglas de integridad SQL-92: Reglas de integridad


Reglas de Integridad de Tabla Reglas de Integridad de Tabla
• Restricción asociada a una tabla específica
- No existe si la tabla no existe y 1. Definición de Columna - RI de Columna
L puede hace • Especificación del tipo de datos o dominio y otras RI de columna
- Eliminar la tabla implica eliminar la RI referencia a
• RI especificada dentro de CREATE TABLE otras tablas, • No necesita sentencia de creación explícita: es parte de la definición de
además de a la columna, dentro de la sentencia de creación de la tabla
CREATE TABLE <nombre tabla> ( <lista de elemento de tabla> ) ;
que la incluye CREATE TABLE Actor
donde elemento puede ser:
( nombre VARCHAR(30) NOT NULL,
- Definición de columna, que puede incluir RIs de columna
cache INT(9) DEFAULT 2000 NOT NULL,
- Definición de... (precedida o no de CONSTRAINT <nombre restricción>)
· Restricción de clave candidata ojos Color_ojos NOT NULL,
· Restricción de clave externa agencia CHAR(4), ...) ;
· Restricción de comprobación (CHECK) • Si se especifica un dominio para una columna, la comprobación es
• RI añadida/eliminada con ALTER TABLE <nombre tabla>... derivada hacia la comprobación de la restricción de dominio
• Una RI de columna se destruye al eliminar la columna de la tabla
• Toda RI de tabla es comprobada inmediatamente:
• Una operación de modificación sobre la tabla incluye el chequeo de todas
195 196

sus RI (como paso final de la operación)+(una posible) acción


SQL-92: Reglas de integridad SQL-92: Reglas de integridad
Reglas de Integridad de Tabla Reglas de Integridad de Tabla
• Recordemos sobre las claves externas que…
2. Definición de Restricción de Clave Candidata • Cualquier (combinación de) columna(s) puede ser clave externa
• Clave Primaria PRIMARY KEY (<lista columnas>) 1 incluye RI Entidad • SQL-92 permite que una clave externa (FK) se refiera a una clave candidata
• Clave Alternativa UNIQUE (<lista columnas>) (CK): 1 clave primaria o clave alternativa
• Una clave externa y la clave candidata a la que referencia…
– Deben contener el mismo nº de componentes (columnas) y
3. Definición de Restricción de Clave Externa – Las columnas “correspondientes” deben estar definidas sobre el mismo
dominio o tipo de datos
FOREIGN KEY (<lista columnas>) REFERENCES <tabla> (<lista columnas>)
[ ON DELETE { NO ACTION | CASCADE | SET DEFAULT | SET NULL } ] • Referencia desde una FK de la tabla T2 a una CK de la tabla T1...
[ ON UPDATE { NO ACTION | CASCADE | SET DEFAULT | SET NULL } ] » Asegurar que cada T2.FK contiene un valor existente en T1.CK
es el problema de la integridad referencial
Posibles Acciones de Mantenimiento
• Pueden existir ciclos referenciales y auto-referencias
de la Integridad Referencial
(explicadas en el tema anterior) • SQL-92 permite (¡por supuesto!) que una FK pueda contener NULL
197
– salvo si se especifica NOT NULL para dicha FK en el CREATE TABLE 198

SQL-92: Reglas de integridad SQL-92: Reglas de integridad


Reglas de Integridad de Tabla Reglas de Integridad Generales (Asertos)
4. Definición de Restricción de Comprobación (CHECK) • Predicado que expresa una condición que la BD debe
• Regla que se refiere únicamente a la tabla que la contiene
satisfacer siempre
• Puede especificar restricciones adicionales para una columna
*El caché de un actor siempre está entre 300 y 1200€ • Puede involucrar cualquier número de columnas de
CREATE TABLE ACTOR (
...,
cualquier cantidad de tablas
CONSTRAINT actor_cache_ok • Es un elemento de BD, independiente de tablas y vistas
CHECK ( cache ≥ 300 AND cache ≤ 1200 ),
... ); existentes
• Puede definir restricciones que involucran varias columnas
*Toda película se estrena después de finalizar su rodaje
• Especifica restricciones de integridad que pueden no ser...
CREATE TABLE PELICULA ( de clave (primaria o alternativa)
..., de integridad referencial (clave externa)
CONSTRAINT pelicula_fechas_ok
CHECK ( fecha_fin_rodaje < fecha_estreno ), Tiene un nombre y consta de una condición (CHECK)
... ); 199 200
SQL-92: Reglas de integridad SQL-92: Reglas de integridad
Reglas de Integridad Generales Reglas de Integridad Generales
Satisfacción y violación de una RI general • Normalmente, la <condición> se expresa en negativo:
Si alguna fila de la BD hace falsa la condición, el aserto es violado todo X satisface Y ≡ ningún X satisface NO( Y )
– Un estado de la BD satisface un aserto si ninguna (combinación de) fila(s)
de dicho estado viola la condición que incluye
*Todo actor representado por la agencia 1 debe cobrar $3000 o más
CREATE ASSERTION RI1_age1_cache
CHECK (NOT EXISTS (SELECT * FROM Actor WHERE agencia=1 AND cache<3000)) ;
Creación de una RI general
*La paga mínima de los actores que actúan en una película es de $150000
CREATE ASSERTION <nombre restricción> nombre obligatorio
CREATE ASSERTION RI2_paga_minima
CHECK ( <condición> ) ; CHECK 150000 ≤ (SELECT MIN(paga) FROM Actua_en) ;
*Toda agencia representa a un máximo de 40 actores
CREATE ASSERTION RI3_num_actores_age
• Eliminación de una RI general CHECK (NOT EXISTS (SELECT * FROM Actor
DROP ASSERTION <nomRestricción> ; 1 Sin opción RESTRICT o CASCADE GROUP BY codAge
HAVING COUNT(*) > 40)) ;
– Elimina el aserto del INFORMATION_SCHEMA del catálogo 201 202

SQL-92: Reglas de integridad SQL-92: Reglas de integridad


Reglas de Integridad Generales Reglas de Integridad Generales
*Todo actor debe haber participado al menos en una película
CREATE ASSERTION RI4_actor_en_pelicula • Algunas RI generales pueden ser expresadas como RI de
CHECK (NOT EXISTS (SELECT * FROM Actor tabla
WHERE codA NOT IN (SELECT actor FROM Actua_en)));
*El código de los guiones es único (≡ si hay 2 guiones con igual código, son el mismo)
*Todo actor no protagonista de una película cobra menos que cualquier protagonista
CREATE ASSERTION RI7_guion_codigo_unico
CREATE ASSERTION RI5_paga_actores
CHECK ( NOT EXISTS (
CHECK (NOT EXISTS (SELECT * FROM Actua_en ACT WHERE papel<>‘protagonista’ AND
SELECT * FROM Guion G1
paga >= ANY (SELECT paga FROM Actua_en PROTA
WHERE G1.codG IN (SELECT codG FROM Guion G2
WHERE ACT.film=PROTA.film
WHERE G1.titulo<>G2.titulo OR G1.resumen<>G2.resumen
AND PROTA.papel=‘protagonista’));
OR G1.nomAutorPpal<>G2.nomAutorPpal OR G1.fechaFin<>G2.fechaFin
*Debe de existir al menos una distribuidora de películas
CREATE ASSERTION RI6_existe_distribuidora OR G1.fechaEntrega<>G2.fechaEntrega) ) );
CHECK ( 0 < SELECT COUNT (*) FROM Distribuidora ) ; 1 este aserto...
1 este aserto... - Equivale a especificar UNIQUE( codG ) en el CREATE TABLE Guion (…)
- debe crearse una vez que ya exista alguna fila en DISTRIBUIDORA
- una operación DELETE puede violarlo, pero nunca lo hará un INSERT 203 204
SQL-92: Reglas de integridad Disparadores: versión SQL 1999
Reglas de Integridad Generales • En muchos casos conviene especificar una acción que
• Y viceversa: algunas RI de tabla pueden ser expresadas ejecutar tras la violación de una restricción:
- Abortar la transacción que provoca la violación, o
como RI generales - Informar de ello al usuario (mensaje), o
- Excepto la parte de una RI de clave externa que indica la acción de - Ejecutar cierto procedimiento, o
mantenimiento de la integridad referencial (ON DELETE… ON UPDATE…) - Realizar otras actualizaciones en la base de datos...
Esto se consigue mediante los disparadores o triggers
*Los actores y películas anotados en la tabla ACTUA_EN deben existir
CREATE ASERTION RI8_actua_en_ok • Un disparador se ejecuta de forma automática como
CHECK (NOT EXISTS (SELECT * FROM Actua_en efecto secundario de cierta modificación de la BD
WHERE actor NOT IN (SELECT codA FROM Actor)
OR film NOT IN (SELECT codP FROM Pelicula))); • Los SGBDR usan ampliamente los disparadores, pero no
1 este aserto... formaron parte del estándar hasta la versión SQL:1999
- Equivale a especificar...
¨ cada SGBDR los implementó con su propia sintaxis
FOREIGN KEY (actor) REFERENCES Actor(codA)...
y FOREIGN KEY (film) REFERENCES Pelicula(codP)... L Los disparadores SQL:1999 son similares a los de Oracle
... dentro del CREATE TABLE Actor (...) 205 206

Disparadores: versión SQL 1999 Disparadores: versión SQL 1999


• Para diseñar un disparador, se debe especificar : • Definición de un disparador
- Las condiciones en las que se debe ejecutar:
CREATE TRIGGER <nombre_disparador>
Evento que causa la comprobación del disparador
Condición que se debe cumplir para ejecutarlo { BEFORE | AFTER } { INSERT | UPDATE [OF <lista columnas>] | DELETE }
- La Acción que se realizará cuando se ejecute ON <nombre_tabla> Evento
[ REFERENCING OLD [ ROW | TABLE ] [ AS ] <nombre>
• Es el modelo de disparadores evento-condición-acción [ NEW [ ROW | TABLE ] [ AS ] <nombre> ] ] Parametrización
• La BD almacena los disparadores, por lo que...
- son persistentes y [ FOR EACH ROW | FOR EACH STATEMENT ]
- están accesibles para todas las operaciones de BD Granularidad
• El SGBD ejecuta automáticamente un disparador cada vez [ WHEN <condición> ]
que ocurre el evento especificado y se cumple la Condición
BEGIN ATOMIC
condición correspondiente
...
• La ejecución del disparador se considera parte de la END;
ejecución de la operación que provoca su activación 207 208
Acción
Disparadores: versión SQL 1999 Disparadores: versión SQL 1999
* Antes de que un usuario elimine una o varias filas de la tabla PELICULA, el sistema * Si un actor no protagonista de una película percibe una paga no inferior que la de un
debe anotar dicha acción en una tabla DIARIO_BORRADOS, indicando el usuario y el protagonista, asignarle el mínimo cobrado por un protagonista menos 1000€.
momento concreto en el que se realiza dicha operación.
CREATE TRIGGER PagaNoProta En Oracle este trigger tendría el
CREATE TRIGGER anotacion_borrado_pelicula AFTER UPDATE OF paga ON ACTUA_EN problema de la tabla mutante
BEFORE DELETE ON PELICULA REFERENCING NEW ROW AS nueva
FOR EACH STATEMENT FOR EACH ROW
INSERT INTO Diario_Borrados WHEN nueva.papel <> ‘protagonista’ AND
VALUES( ‘PELICULA’, CURRENT_USER, CURRENT_TIMESTAMP); nueva.paga ≥ (SELECT MAX ( paga ) FROM ACTUA_EN
WHERE film = nueva.film AND papel = ‘protagonista’ )
BEGIN ATOMIC
• Si la acción del trigger sólo consiste en una sentencia SQL, no es UPDATE ACTUA_EN
necesario utilizar las palabras reservadas BEGIN ATOMIC ni END SET paga = (SELECT MIN( paga ) - 1000
FROM ACTUA_EN
WHERE film = nueva.film AND papel = ‘protagonista’ )
L Este trigger está escrito en SQL:1999, y no en SQL de Oracle… WHERE actor = nueva.actor AND film = nueva.film
209 END; 210

Disparadores: versión SQL 1999 Reglas de integridad en SQL


• Los disparadores combinan los enfoques declarativo y Características adicionales (pseudo-RIs)
procedimental
- El evento y la condición del disparador son declarativos • SQL rechaza todo intento de INSERT o UPDATE que viole una
- Su acción opera por procedimientos especificación de tipo de datos

• Comparación ASSERTION vs. TRIGGER Ejemplo: introducción de valor CHAR en columna definida como INTEGER
- ASSERTION prohibe realizar una actualización que viola el aserto
- Una especificación de tipo de datos puede verse como una “forma primitiva”
(es decir, que hace FALSE la condición)
de restricción de integridad de dominio
- TRIGGER puede permitir la actualización que cumple la condición
- Una violación de una RI de dominio o de tipo de datos se detecta en tiempo
(es decir, que viola una RI), pero ejecuta una acción (que puede
de ejecución
reparar la violación, dejando consistente la BD)

Las condiciones especificadas en una y otro son inversas • SQL rechaza todo intento de INSERT o UPDATE sobre una
vista, si viola la condición de definición de la vista
- Siempre que se haya especificado la “opción de verificación” en la definición
211 212
de la vista (WITH CHECK OPTION)
Comprobación de restricciones Comprobación de restricciones
• En general, el SGBD comprueba una RI de inmediato, como Modos de comprobación
último paso de la ejecución de una sentencia SQL
• En un momento dado, dentro de cierta transacción SQL, toda
– Si la RI es violada por la sentencia, ésta es cancelada y no tiene efecto sobre
la base de datos restricción de integridad debe estar en modo...
• A veces es necesario que ciertas restricciones no sean - INMEDIATE: será comprobada inmediatamente, o
comprobadas hasta pasado un tiempo, pues si se hiciera - DEFERRED: será chequeada al final de la transacción (diferida)
de inmediato siempre fallarían • Para algunas restricciones de integridad, la comprobación
Ciclo referencial EMP DEP Inicialmente, EMP y DEP están vacías
CREATE TABLE EMP CREATE TABLE DEP
diferida no tiene sentido:
( cod_emp ... ( cod_dep ... , • Restricciones de dominio y tipo de datos
depto ... , jefe ... ,
FOREIGN KEY ( depto ) FOREIGN KEY ( jefe ) • Restricción de columna NOT NULL y
REFERENCES DEP ( cod_dep ) ... , REFERENCES EMP ( cod_emp )... , • Restricciones de clave candidata (UNIQUE, PRIMARY KEY)
... ) ; ... ) ;
- Con chequeo inmediato de las RI de clave externa (RI referencial), todo
INSERT de una fila en EMP o en DEP fallaría, pues nunca encontraría la213
fila 214

destino (referenciada) en la otra tabla…

Comprobación de restricciones Comprobación de restricciones


Modos de comprobación (2) Modos de comprobación (y 3)
• Una definición de RI puede incluir estas dos cláusulas… • Sentencia SET CONSTRAINTS
[ INITIALLY {IMMEDIATE | DEFERRED} ] SET CONSTRAINTS {<lista restricciones> | ALL} { DEFERRED | IMMEDIATE}
[ [ NOT ] DEFERRABLE ] - Establece el modo para varias RIs para la transacción actual
- Toda RI mencionada debe ser DEFERRABLE
- Modo inicial de la RI: INITIALLY DEFERRED o INITIALLY IMMEDIATE
De hecho ALL ≡ todas las RIs diferibles
– Especifica el modo en el que está la RI tras de ser definida (creada) y al
comienzo de cada transacción SQL
- DEFERRED: toda RI mencionada pasa a modo diferido
- Opción de cambio de modo: DEFERRABLE o NOT DEFERRABLE
– Indica si la RI puede pasar a modo DEFERRED
- IMMEDIATE: cada RI pasa a modo inmediato y es comprobada
- si falla la comprobación de alguna RI, falla SET CONSTRAINTS y ninguna RI
- Valores asumidos por omisión: cambia de modo
Si no se indica ningún modo inicial, se asume INITIALLY IMMEDIATE
Si se especifica INITIALLY IMMEDIATE (o se asume)... • Ejecutar COMMIT implica realizar SET CONSTRAINTS ALL IMMEDIATE
- Si no se indica DEFERRABLE ni NOT DEFERRABLE, asume NOT DEFERRABLE - Si la comprobación de alguna RI falla
Si se especifica INITIALLY DEFERRED, no puede indicarse NOT DEFERRABLE 215
COMMIT falla 216
- Puede ponerse DEFERRABLE, aunque se supone la transacción completa falla (rollback)
Reglas de integridad en SQL-92 Reglas de integridad en SQL-92
Reglas de Integridad de Tabla (5) Reglas de Integridad de Tabla (6)
• Claves externas: acciones referenciales (recordatorio) ON UPDATE...
– Mantenimiento de integridad referencial ante intentos de violación – Indica la regla de actualización para T1.CK respecto de T2.FK
– Ejecución de operaciones adicionales que dejan la BD consistente
Qué ocurre si se intenta modificar la clave candidata dentro de una fila r1 de T1 y existe alguna
fila r2 en T2 que le hace referencia (contiene valor r2.FK = r1.CK)
ON DELETE...
– Indica la regla de borrado para filas de T1 respecto de T2.FK – Acciones referenciales posibles:
Qué ocurre si se intenta eliminar una fila r1 de T1 y existe alguna fila r2 en T2 que le hace a. NO ACTION (opción por omisión) Rechazar la actualización sobre T1.CK
referencia (e.d. contiene un valor r2.FK = r1.CK) b. CASCADE Propagar la actualización de CK a toda fila r2 de T2 que se refiera a r1
– Acciones referenciales posibles: c. SET DEFAULT
a. NO ACTION (opción por omisión) Rechazar la operación de eliminación sobre T1 Asignar su valor por defecto a los componentes de FK que corresponden a componentes
b. CASCADE Eliminar junto con r1 toda fila r2 de T2 que se refiera a r1 (propagación) modificados de T1.CK, en todas las filas r2, y actualizar r1

c. SET DEFAULT » Debe existir una fila en T1 con cada componente de CK a su valor por defecto
Asignar su valor por defecto a cada componente de la FK en toda fila r2, y eliminar r1 d. SET NULL
» Debe existir una fila en T1 con cada componente de CK a su valor por defecto Asignar NULL a los componentes de la FK correspondientes a componentes modificados en
d. SET NULL T1.CK, en todas las filas r2, y actualizar r1
Asignar NULL a cada componente de la FK en todas las filas r2, y eliminar r1 217 » Tales componentes de la FK debe tener nulos permitidos 218

» Cada componente de la FK debe tener nulos permitidos

Reglas de integridad en SQL-92


Reglas de Integridad de Tabla (7) EJEMPLOS CON MYSQL
• Comportamiento ante una operación de manipulación de
datos, en función de la acción referencial especificada
Sea T2.FK una clave externa hacia la clave candidata T1.CK ...
La definición de FK no incluye ON DELETE ni ON UPDATE...
INSERT en T2 o UPDATE de T2.FK
si el valor de T2.FK no existe en T1.CK Rechazar (NO ACTION)
DELETE en T1 o UPDATE de T1.CK
si alguna fila de T2 le hace referencia Rechazar (NO ACTION)

La definición de FK incluye ON DELETE o bien ON UPDATE...


INSERT en T2 o UPDATE de T2.FK
si el valor de T2.FK no existe en T1.CK Rechazar (NO ACTION)
DELETE en T1 o UPDATE de T1.CK
si alguna fila de T2 le hace referencia ejecución de la acción referencial
219 220
especificada en las cláusulas
Acceso a MySQL Iniciar con MySQL
Ver opciones:
shell> mysql --help
INSTALAR MySQL.
Checar versión y fecha:
EJECUTAR EL SERVIDOR:
shell> SELECT VERSION(), CURRENT_DATE;
• service mysqld restart (mysqld_safe)
• Verificar en /etc/sysconfig/mysqld (--skip-networking) Ver usuario: shell> SELECT USER()
• mysqld-nt –u root –install -> ;
• Asegurar acceso TCP/IP (vi /etc/sysconfig/mysqld) Entrar a una base de datos
ENTRAR SISTEMA:
mysql –u root –p shell> mysql -h NombreDelServidor -u NombreDeUsuario -p
EN EL SISTEMA CREAR UNA BD DE DATOS shell>mysql -h localhost -u vjsosa –p
mysql> create database db_ejemplo
Enter password:
TODOS LOS COMANDOS EN MySql DEBEN ******Welcome to the MySQL monitor. Commands end with ; or \g.
TERMINAR CON ; Your MySQL connection id is 5563 to server version: 3.23.41
Type 'help;' or '\h' for help.
Type '\c' to clear the buffer.
mysql>
221 222

Las Tablas de la BD:


Creando Usuarios MySQL
mysql> GRANT ALL PRIVILEGES ON *.* TO 'pepe'@'localhost' user
-> IDENTIFIED BY 'contraseña' WITH GRANT OPTION;
db
mysql> GRANT ALL PRIVILEGES ON *.* TO 'pepe'@'%' host
-> IDENTIFIED BY 'contraseña' WITH GRANT OPTION; tables_priv
columns_priv
Cambiando Contraseña (versiones antes de 5): func
time_zone
mysql> SET PASSWORD FOR ………
-> 'pepe'@'localhost' = OLD_PASSWORD('contraseña');

mysql> SET PASSWORD FOR


-> 'pepe'@'%' = OLD_PASSWORD('contraseña');

223 224
Tabla USER
Acceso a MySQL
Host localhost localhost % %
User root irv root phpuser
INSTALAR MySQL.
Password 5a1a 5aff 5ffa 4975 EJECUTAR EL SERVIDOR:
Select_priv Y Y Y N • service mysqld restart (mysqld_safe)
Insert_priv Y Y Y N
Update_priv Y Y Y N
• Verificar en /etc/sysconfig/mysqld (--skip-networking)
Delete_priv Y Y Y N • mysqld-nt –u root –install
Create_priv Y Y Y N • Asegurar acceso TCP/IP (vi /etc/sysconfig/mysqld)
Drop_priv Y Y Y N
Reload_priv Y Y Y N
ENTRAR SISTEMA:
Shutdown_priv Y Y Y N mysql –u root –p
Process_priv Y Y Y N EN EL SISTEMA CREAR UNA BD DE DATOS
File_priv Y Y Y N
Grant_priv Y N Y N
mysql> create database db_ejemplo
References_priv Y Y Y N TODOS LOS COMANDOS EN MySql DEBEN
Index_priv Y Y Y N TERMINAR CON ;
Alter_priv Y Y Y N
225 226

Respaldar una BD Respaldar una BD


Respaldar estructura y datos encontrados dentro de la base de datos:
shell> mysqldump -u root -p --opt bd_ejemplo > archivo_copia.sql
Uso del comando mysqldump para respaldar una BD:
shell> mysqldump [opciones] nombre_base_datos Respaldar únicamente los datos:
shell>mysqldump -u root -p --no-create-info bd_ejemplo >
Uso del comando mysqldump para respaldar varias tablas de una base de datos: archivo_copia.sql
shell> mysqldump [opciones] nombre_base_datos tabla1 tabla2. .
. tablaN Respaldar únicamente la estructura de las tablas,
shell>mysqldump -u root -p --no-data bd_ejemplo > archivo_copia.sql
Uso mysqldump para respaldar varias bases de datos:
Si se está planeando usar mysqldump con el fin de respaldar datos para que puedan ser
shell> mysqldump [opciones] --databases [opciones] nombre_bd1 movidos a otro servidor MySQL, es recomendado que se use la opción "--opt". Esto nos dará
nombre_bd2... un respaldo optimizado de los datos que tendrá como resultado un tiempo más rápido de
lectura cuando se quieran cargar los datos en otro servidor MySQL.
Uso mysqldump para respaldar todas las bases de datos:
shell> mysqldump [opciones] --all-databases [opciones]
Como no hemos indicado ruta ninguna, los archivos resultantes aparecerán en bin.
Las opciones pueden ser vistas ejecutando el siguiente comando: Para cargar el respaldo de nuevo en el server, simplemente: el proceso a la inversa:
shell> mysqldump –help C:\mysql\bin>mysql -u root -pcontraseña base_a_cargar < copia_respaldo.sql.

227 228
Usar MySQL en modo Batch MySQL: Transacciones
MySQL soporta ejecución de transacciones
En todos los ejemplos mostrados se ha usado mysql de manera Por defecto, MySQL se ejecuta en modo autocommit .
interactiva para ejecutar algunas consultas y ver los resultados. Transacciones seguras: con InnoDB o BDB
Es posible usar mysql en modo batch.
Para hacer esto tenemos que poner los comandos que deseamos START TRANSACTION;
ejecutar dentro de un archivo, y entonces decirle a mysql que lea los SELECT @A:=SUM(salary)
comandos de dicho archivo: FROM table1
shell> mysql < archivo-batch WHERE type=1;
Otra opción: UPDATE table2
mysql> create db_name; SET summmary=@A WHERE type=1;
COMMIT;
mysql> use db_name;
mysql> source archivo.sql

Desactivar COMMIT automático:


SET AUTOCOMMIT=0;

229 230

MySQL: Procedimientos y Funciones Procedimiento


Almacenadas
mysql> delimiter //
mysql> CREATE PROCEDURE simpleproc (OUT param1 INT)
CREATE PROCEDURE sp_name ([parameter[,...]]) -> BEGIN
-> SELECT COUNT(*) INTO param1 FROM t;
[characteristic ...] routine_body
-> END
-> //
CREATE FUNCTION sp_name ([parameter[,...]])
RETURNS type [characteristic ...] routine_body parameter: mysql> delimiter ;

[ IN | OUT | INOUT ] param_name type type: cualquier MySQL data type mysql> CALL simpleproc(@a);
characteristic: LANGUAGE SQL
| [NOT] DETERMINISTIC mysql> SELECT @a;
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string' routine_body: procedimientos almacenados o comandos
SQL válidos

231 232
Desde MySQL 5.0.3 Nota: Al usar el comando delimiter, evitar el uso de la antibarra ('\') ya
que es el carácter de escape de MySQL.
Función Procedure y Function (cambios)
mysql> delimiter // ALTER {PROCEDURE | FUNCTION} sp_name [characteristic ...] characteristic: {
mysql> CREATE FUNCTION hello (s CHAR(20)) RETURNS CHAR(50) CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
-> RETURN CONCAT('Hello, ',s,'!');
-> //
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string'
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;
mysql> SELECT hello('world');

DROP {PROCEDURE | FUNCTION} [IF EXISTS] sp_name

SHOW CREATE {PROCEDURE | FUNCTION} sp_name


mysql> SHOW CREATE FUNCTION test.hello\G
Nota: Si el comando RETURN en un procedimiento almacenado retorna un valor con un tipo distinto al *************************** 1. row ***************************
especificado en la cláusula RETURNS de la función, el valor de retorno se coherciona al tipo apropiado. Por
ejemplo, si una función retorna un valor ENUM o SET, pero el comando RETURN retorna un entero, el
Function: hello sql_mode: Create Function: CREATE FUNCTION `test`.`hello`(s
valor retornado por la función es la cadena para el miembro de ENUM correspondiente de un conjunto de CHAR(20)) RETURNS CHAR(50) RETURN CONCAT('Hello, ',s,'!')
miembros SET .

233 234

MySQL: Cursores

CREATE PROCEDURE curdemo()


BEGIN
DECLARE done INT DEFAULT 0;
DECLARE a CHAR(16);
DECLARE b,c INT;
…..
DECLARE cur1 CURSOR FOR
SELECT id,data FROM test.t1; REPEAT
FETCH cur1 INTO a, b;
DECLARE cur2 CURSOR FOR FETCH cur2 INTO c;
SELECT i FROM test.t2;
IF NOT done THEN
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' IF b < c THEN
SET done = 1;
INSERT INTO test.t3 VALUES (a,b);
ELSE INSERT INTO test.t3 VALUES (a,c);
OPEN cur1;
END IF;
OPEN cur2;
END IF;
……
UNTIL done END REPEAT;
…..
CLOSE cur1;
CLOSE cur2; END 235

You might also like