Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Lenguaje de definición de datos (LDD). El LDD de SQL proporciona comandos para la definición
de esquemas de relación, borrado de relaciones y modificación de los esquemas de relación.
Lenguaje interactivo de manipulación de datos (LMD). El LMD de SQL incluye un lenguaje de
consultas basado tanto en el álgebra relacional (Capítulo 2) como en el cálculo relacional de
tuplas
Integridad. El LDD de SQL incluye comandos para especificar las restricciones de integridad que
deben cumplir los datos almacenados en la base de datos. Las actualizaciones que violan las
restricciones de integridad se rechazan.
Definición de vistas. El LDD de SQL incluye comandos para la definición de vistas.
Control de transacciones. SQL incluye comandos para especificar el comienzo y el final de las
transacciones.
SQL incorporado y SQL dinámico. SQL incorporado y SQL dinámico definen cómo se pueden
incorporar instrucciones de SQL en lenguajes de programación de propósito general como C, C++,
Java, PL/I, Cobol, Pascal y Fortran.
Autorización. El LDD de SQL incluye comandos para especificar los derechos de acceso a las
relaciones y a las vistas.
1
Moreno García Luis Eduardo 10/05/16
Fundamentos de Bases de Datos
6.2 Definición de datos
Conceptualmente, SQL es un lenguaje de definición de datos (LDD), un lenguaje de definiciones de vistas
(LDV) y un lenguaje de manipulación de datos (LMD), que posee también capacidad para especificar
restricciones y evolución de esquemas.
El lenguaje SQL está compuesto por comandos, cláusulas, operadores y funciones de agregado. Estos
elementos se combinan en las instrucciones para crear, actualizar y manipular las bases de datos.
Comandos Existen dos tipos de comandos SQL:
DLL ==> que permiten crear y definir nuevas bases de datos, campos e índices.
DML ==> que permiten generar consultas para ordenar, filtrar y extraer datos de la base de datos.
El lenguaje de definición de datos (en inglés Data Definition Language, o DDL), es el que se encarga de la
modificación de la estructura de los objetos de la base de datos. Incluye órdenes para modificar, borrar
o definir las tablas en las que se almacenan la base de datos. Existen cuatro operaciones básicas: CREATE,
ALTER, DROP y TRUNCATE.
Comandos DLL
Comando Descripción
CREATE Utilizado para crear nuevas tablas, campos e índices
DROP Empleado para eliminar tablas e índices
Utilizado para modificar las tablas agregando campos o cambiando la definición de
ALTER
los campos.
Comandos DML
Comando Descripción
Utilizado para consultar registros de la base de datos que satisfagan un criterio
SELECT
determinado
INSERT Utilizado para cargar lotes de datos en la base de datos en una única operación.
UPDATE Utilizado para modificar los valores de los campos y registros especificados
DELETE Utilizado para eliminar registros de una tabla de una base de datos
2
Moreno García Luis Eduardo 10/05/16
Fundamentos de Bases de Datos
6.3 Estructura básica de las consultas
La estructura básica de una expresión SQL consiste en tres cláusulas: select, from y where.
• La cláusula select corresponde a la operación proyección del álgebra relacional. Se usa para listar los
atributos deseados del resultado de una consulta.
• La cláusula from corresponde a la operación producto cartesiano del álgebra relacional. Lista las
relaciones que deben ser analizadas en la evaluación de la expresión.
• La cláusula where corresponde al predicado selección del álgebra relacional. Es un predicado que
engloba a los atributos de las relaciones que aparecen en la cláusula from.
CLAUSULAS
Las cláusulas son condiciones de modificación utilizadas para definir los datos que desea seleccionar o
manipular.
Cláusula Descripción
FROM Utilizada para especificar la tabla de la cual se van a seleccionar los registros
Utilizada para especificar las condiciones que deben reunir los registros que se
WHERE
van a seleccionar
GROUP BY Utilizada para separar los registros seleccionados en grupos específicos
HAVING Utilizada para expresar la condición que debe satisfacer cada grupo
Utilizada para ordenar los registros seleccionados de acuerdo con un orden
ORDER BY
específico
3
Moreno García Luis Eduardo 10/05/16
Fundamentos de Bases de Datos
Ejemplos:
La sintaxis básica de una consulta de selección es la siguiente:
SELECT
Campos
FROM
Tabla
En donde campos es la lista de campos que se deseen recuperar y tabla es el origen de los mismos, por
ejemplo:
SELECT Nombre, Teléfono FROM Clientes
Esta sentencia devuelve un conjunto de resultados con el campo nombre y teléfono de la tabla
clientes.
En determinadas ocasiones nos puede interesar incluir una columna con un texto fijo en una consulta
de selección, por ejemplo, supongamos que tenemos una tabla de empleados y deseamos recuperar las
tarifas semanales de los electricistas, podríamos realizar la siguiente consulta:
SELECT Empleados.Nombre, 'Tarifa semanal: ', Empleados.TarifaHora *
40 FROM Empleados WHERE Empleados.Cargo = 'Electricista
Operadores Lógicos
Operador Uso
Es el "y" lógico. Evalúa dos condiciones y devuelve un valor de verdad sólo si ambas son
AND
ciertas.
Es el "o" lógico. Evalúa dos condiciones y devuelve un valor de verdad si alguna de las dos
OR
es cierta.
NOT Negación lógica. Devuelve el valor contrario de la expresión.
Operadores de Comparación
Operador Uso
< Menor que
> Mayor que
<> Distinto de
<= Menor o igual que
>= Mayor o igual que
= Igual que
BETWEEN Utilizado para especificar un intervalo de valores.
LIKE Utilizado en la comparación de un modelo
In Utilizado para especificar registros de una base de datos
4
Moreno García Luis Eduardo 10/05/16
Fundamentos de Bases de Datos
Ejemplos:
select número-préstamo from préstamo where nombre-sucursal = ‘Navacerrada’ and importe > 1200
SELECT *
FROM
Empleados
WHERE
(Sueldo > 100 AND Sueldo < 500)
OR
(Provincia = 'Madrid' AND Estado = 'Casado')
select número-préstamo
from préstamo
where importe between 90000 and 100000
La cláusula from define por sí misma un producto cartesiano de las relaciones que aparecen en la
cláusula.
Escribir una expresión SQL para la reunión natural es una tarea relativamente fácil, puesto que la reunión
natural se define en términos de un producto cartesiano, una selección y una proyección. La expresión
del álgebra relacional se escribe como sigue:
Para la consulta «Para todos los clientes que tienen un préstamo en el banco, obtener los nombres,
números de préstamo e importes». Esta consulta puede escribirse en SQL como
select nombre-cliente, prestatario.número-préstamo, importe from prestatario,
préstamo where prestatario.número-préstamo =préstamo.número-préstamo
Podemos ver cómo funciona en el siguiente ejemplo, en el que preguntamos por los distintos oficios de
nuestros empleados.
5
Moreno García Luis Eduardo 10/05/16
Fundamentos de Bases de Datos
Director
Secretario
Contable
Comercial
Comercial
Director
Analista
Programador
Programador
Director
Analista
Programador
Programador
14 rows selected.
Pero si incluimos la cláusula DISTINCT la respuesta varía para adecuarse más a nuestras espectativas.
select distinct oficio from emp
OFICIO
-----------
Analista
Comercial
Contable
Director
Presidente
Programador
Secretario
7 rows selected.
SQL proporciona un mecanismo para renombrar tanto relaciones como atributos. Para ello utiliza la
cláusula as, que tiene la forma siguiente: nombre-antiguo as nombre-nuevo la cláusula as puede
aparecer tanto en select como en from.
La cláusula order by hace que las tuplas resultantes de una consulta se presenten en un cierto orden. Si
deseamos seleccionar todos los empleados que residen en el estado de Hidalgo ordenados por edad.
Select * from empleados where estado='Hidalgo' order by edad.
La operación renombramiento
6
Moreno García Luis Eduardo 10/05/16
Fundamentos de Bases de Datos
SQL proporciona un mecanismo para renombrar tanto relaciones como atributos. Utiliza la cláusula as
de la forma siguiente:
nombre-antiguo as nombre-nuevo
La operación de unión permite combinar datos de varias relaciones. Supongamos que una determinada
empresa internacional posee una tabla de empleados para cada uno de los países en los que opera. Para
conseguir un listado completo de todos los empleados de la empresa tenemos que realizar una unión de
todas las tablas de empleados de todos los países.
No siempre es posible realizar consultas de unión entre varias tablas, para poder realizar esta operación
es necesario e imprescindible que las tablas a unir tengan las mismas estructuras, que sus campos sean
iguales.
La operación unión
Para determinar todos los clientes del banco que tienen un préstamo, una cuenta o las dos cosas en el
banco, hay que escribir:
(select nombre_cliente
from impositor)
union
(select nombre_cliente
from prestatario)
A diferencia de la cláusula select, la operación union (unión) elimina los valores duplicados
automáticamente.
Así, en la consulta anterior, si un cliente—por ejemplo, Santos—tiene varias cuentas o préstamos
(O ambas cosas) en el banco, sólo aparecerá una vez en el resultado.
Si se desea conservar todos los duplicados hay que escribir union all en lugar de union:
(select nombre_cliente
from impositor)
7
Moreno García Luis Eduardo 10/05/16
Fundamentos de Bases de Datos
union all
(select nombre_cliente
from prestatario)
El número de tuplas duplicadas en el resultado es igual al número total de valores duplicados que
aparecen en i y p. Así, si Santos tiene tres cuentas y dos préstamos en el banco, en el resultado
aparecerán cinco tuplas con el nombre de Santos.
La operación intersección
Para encontrar todos los clientes que tienen tanto un préstamo como una cuenta en el banco, hay que
escribir:
(select distinct nombre_cliente
from impositor)
intersect
(select distinct nombre_cliente
from prestatario)
La operacion intersect (intersección) elimina los valores duplicados automáticamente. Así, en la consulta
anterior, si un cliente—por ejemplo, Santos—tiene varias cuentas o préstamos en el banco, sólo
aparecerá una vez en el resultado.
Si se desean conservar todos los valores duplicados hay que escribir intersect all en lugar de intersect:
(select nombre_cliente
from impositor)
intersect all
(select nombre_cliente
from prestatario)
El número de tuplas duplicadas que aparecen en el resultado es igual al número mínimo de valores
duplicados que aparecen en i y p. Por tanto, si Santos tiene tres cuentas y dos préstamos en el banco, en
el resultado de la consulta aparecerán dos tuplas con el nombre de Santos.
La operación excepto
Para determinar todos los clientes que tienen cuenta en el banco pero no tienen ningún préstamo
concedido hay que escribir:
8
Moreno García Luis Eduardo 10/05/16
Fundamentos de Bases de Datos
from prestatario)
La operación except (excepto) elimina los valores duplicados automáticamente. Así, en la consulta
anterior, sólo aparecerá en el resultado (exactamente una vez) una tupla con el nombre de Santos si
Santos tiene una cuenta en el banco pero no tiene ningún préstamo concedido.
Si se desea conservar todos los valores duplicados hay que escribir except all en lugar de except:
select nombre_cliente
from impositor)
except all
(select nombre_cliente
from prestatario)
El número de copias duplicadas de una tupla en el resultado es igual al número de copias duplicadas de
dicha tupla en impositor menos el número de copias duplicadas de la misma tupla en prestatario,
siempre que la diferencia sea positiva. Así, si Santos tiene tres cuentas y un préstamo en el banco, en el
resultado aparecerán dos tuplas con el nombre de Santos. Si, por el contrario, ese cliente tiene dos
cuentas y tres préstamos en el banco, en el resultado no habrá ninguna tupla con el nombre de Santos.
Los datos de entrada para sum y avg deben ser una colección de números, pero los otros operadores
también pueden operar sobre colecciones de datos de tipo no numérico como las cadenas de caracteres.
A modo de ejemplo, considérese la consulta “Determinar el saldo medio de las cuentas de la sucursal de
Navacerrada”. Esta consulta se puede formular del modo siguiente:
select avg (saldo)
from cuenta
where nombre_sucursal = ’Navacerrada’
9
Moreno García Luis Eduardo 10/05/16
Fundamentos de Bases de Datos
Así, para determinar todos los números de préstamo que aparecen en la relación préstamo con valores
nulos para importe hay que escribir:
select número_préstamo
from préstamo
where importe is null
El predicado is not null comprueba la ausencia de valores nulos. El uso de valores nulos en las
operaciones aritméticas y de comparación causa algunos problemas. El resultado de las expresiones
aritméticas (que incluyan por ejemplo +, ¡, ¤ o =) es nulo si cualquiera de los valores de entrada es nulo.
SQL trata como unknown (desconocido) el resultado de cualquier comparación que implique un valor
nulo (excepto con is null y is not null).
Dado que el predicado de las cláusulas where puede incluir operaciones booleanas como and, or y not
sobre los resultados de las comparaciones, se amplían las definiciones de las operaciones booleanas para
que manejen el valor unknown.
and. El resultado de cierto and desconocido es desconocido, falso and desconocido es falso,
mientras que desconocido and desconocido es desconocido.
or. El resultado de cierto or desconocido es cierto, falso or desconocido es desconocido,
mientras que desconocido or desconocido es desconocido.
not. El resultado de not desconocido es desconocido.
Una subconsulta anidada en la instrucción externa SELECT tiene los componentes siguientes:
Una consulta SELECT normal, que incluye los componentes normales de la lista de selección.
Una cláusula normal FROM que incluye uno o varios nombres de tablas o vistas.
Una cláusula opcional WHERE.
Una cláusula opcional GROUP BY.
Una cláusula opcional HAVING.
10
Moreno García Luis Eduardo 10/05/16
Fundamentos de Bases de Datos
La consulta SELECT de una subconsulta se presenta siempre entre paréntesis. No puede incluir una
cláusula COMPUTE o FOR BROWSE y sólo puede incluir una cláusula ORDER BY cuando se especifica
también una cláusula TOP.
Una subconsulta puede anidarse en la cláusula WHERE o HAVING de una instrucción externa SELECT,
INSERT, UPDATE o DELETE, o bien en otra subconsulta. Se puede disponer de hasta 32 niveles de
anidamiento, aunque el límite varía dependiendo de la memoria disponible y de la complejidad del resto
de las expresiones de la consulta. Las consultas individuales no permiten anidamientos de más de 32
niveles. Una subconsulta puede aparecer en cualquier parte en la que se pueda usar una expresión, si
devuelve un solo valor.
Si una tabla sólo aparece en una subconsulta y no en la consulta externa, las columnas de esa tabla no
se podrán incluir en la salida (la lista de selección de la consulta externa).
Las instrucciones que incluyen una subconsulta normalmente tienen uno de estos formatos:
WHERE expression [NOT] IN (subquery)
WHERE expression comparison_operator [ANY | ALL] (subquery)
WHERE [NOT] EXISTS (subquery)
En algunas instrucciones Transact-SQL, la subconsulta se puede evaluar como si fuera una consulta
independiente. Conceptualmente, los resultados de la subconsulta se sustituyen en la consulta externa,
aunque en realidad ésta no es la forma en la que Microsoft SQL Server procesa las instrucciones Transact-
SQL con subconsultas.
11
Moreno García Luis Eduardo 10/05/16
Fundamentos de Bases de Datos
Relaciones derivadas
SQL permite el uso de expresiones de subconsulta en las cláusulas from. Si se utiliza una expresión de
este tipo, hay que proporcionar un nombre a la relación resultado y será posible renombrar los atributos
mediante la cláusula as. Por ejemplo, considérese la subconsulta:
Esta subconsulta genera una relación consistente en los nombres de todas las sucursales y sus
correspondientes saldos de cuenta medios. El resultado de la subconsulta recibe el nombre de
media_sucursal, con los atributos nombre_sucursal y saldo_medio.
Para ilustrar el uso de una expresión de subconsulta en la cláusula from, considérese la consulta
“Determinar el saldo medio de las cuentas de las sucursales en las que el saldo medio de las cuentas sea
superior a 1.200 e”. En el Apartado 3.5 se formulaba esta consulta utilizando la cláusula having. Ahora
se puede reescribir sin utilizar esa cláusula, de la siguiente forma:
La cláusula with
Las consultas complicadas son mucho más fáciles de formular y de entender si se estructuran
descomponiéndolas en vistas más simples que luego se combinan, igual que se estructuran los
programas descomponiendo sus tareas en procedimientos.
Sin embargo, a diferencia de la definición de procedimientos, las cláusulas create view crean definiciones
de vistas en la base de datos y esa definición de vista sigue en la base de datos hasta que se ejecuta una
orden drop view nombre_vista.
La cláusula with proporciona una forma de definir vistas temporales cuya definición sólo está disponible
para la consulta en la que aparece la cláusula. Considérese la siguiente consulta, que selecciona cuentas
con el saldo máximo; si hay muchas cuentas con el mismo saldo máximo, se seleccionan todas.
12
Moreno García Luis Eduardo 10/05/16
Fundamentos de Bases de Datos
select número_cuenta
from cuenta, saldo_máximo
where cuenta.saldo = saldo_máximo.valor
6.9 Vistas
Hasta este momento los ejemplos se han limitado a operar en el nivel de los modelos lógicos. Es decir,
se ha dado por supuesto que las relaciones facilitadas son las relaciones reales almacenadas en la base
de datos.
No resulta deseable que todos los usuarios vean el modelo lógico completo. Las consideraciones de
seguridad pueden exigir que se oculten ciertos datos a los usuarios. Considérese una persona que
necesita saber el número de préstamo y el nombre de la sucursal de un cliente, pero no necesita ver el
importe de ese préstamo. Esa persona debería ver una relación descrita (módulo renombramiento de
atributos) en SQL mediante:
Aparte de las consideraciones de seguridad, puede que se desee crear un conjunto personalizado de
relaciones que se adapte mejor a la intuición de un usuario determinado que el modelo lógico.
Puede que a un usuario del departamento de publicidad, por ejemplo, le guste ver una relación que
consista en los clientes que tienen o bien cuenta abierta o bien préstamo concedido en el banco y las
sucursales con las que trabajan. La relación que se crearía para ese empleado es la siguiente:
(select nombre_sucursal, nombre_cliente
from impositor, cuenta
where impositor.número_cuenta = cuenta.número_cuenta)
union
(select nombre_sucursal, nombre_cliente
from prestatario, préstamo
where prestatario.número_préstamo = préstamo.número_préstamo)
Las relaciones que no forman parte del modelo lógico pero se hacen visibles a los usuarios como
relaciones virtuales se denominan vistas. Es posible definir un gran número de vistas de cualquier
conjunto dado de relaciones reales.
13
Moreno García Luis Eduardo 10/05/16
Fundamentos de Bases de Datos
6.10 Modificación de las bases de datos
Hasta ahora se ha estudiado la extracción de información de las bases de datos. A continuación se
mostrará cómo añadir, eliminar y modificar información utilizando SQL.
Borrado
Las solicitudes de borrado se expresan casi igual que las consultas. Sólo se pueden borrar tuplas
completas; no se pueden borrar sólo valores de atributos concretos. SQL expresa los borrados mediante:
delete from r
where P
donde P representa un predicado y r representa una relación. La declaración delete busca primero todas
las tuplas t en r para las que P(t) es cierto y a continuación las borra de r. La cláusula where se puede
omitir, en cuyo caso se borran todas las tuplas de r.
Obsérvese que cada comando delete sólo opera sobre una relación. Si se desea borrar tuplas de varias
relaciones hay que utilizar una orden delete por cada relación. El predicado de la cláusula where puede
ser tan complicado como la cláusula where de cualquier orden select. En el otro extremo, la cláusula
where puede estar vacía. La consulta delete from préstamo borra todas las tuplas de la relación
préstamo (los sistemas bien diseñados exigen una confirmación del usuario antes de ejecutar una
petición tan devastadora).
Borrar todos los préstamos con importe comprendido entre 1.300 e y 1.500 e.
Esta solicitud de borrado busca primero todas las sucursales de Arganzuela y luego borra todas las
tuplas cuenta correspondientes a esas sucursales.
Inserción
Para insertar datos en una relación, se especifica la tupla que se desea insertar o se formula una
consulta cuyo resultado sea el conjunto de tuplas que se desea insertar. Obviamente, los valores de los
14
Moreno García Luis Eduardo 10/05/16
Fundamentos de Bases de Datos
atributos de las tuplas que se inserten deben pertenecer al dominio de los atributos. De igual modo, las
tuplas insertadas deben ser de la aridad correcta.
La instrucción insert más sencilla es una solicitud de inserción de una tupla. Supóngase que se desea
insertar el hecho de que hay una cuenta C-9732 en la sucursal de Navacerrada y que tiene un saldo de
1.200 e.
Actualizaciones
En determinadas situaciones puede ser deseable modificar un valor dentro de una tupla sin cambiar
todos los valores de la misma. Para este tipo de situaciones se puede utilizar la instrucción update. Al
igual que ocurre con insert y delete, se pueden elegir las tuplas que se van a actualizar mediante una
consulta.
Supóngase que se va a realizar el pago anual de intereses y que hay que incrementar todos los saldos en
un 5 por ciento. Hay que escribir:
update cuenta
set saldo = saldo * 1.05
Esta instrucción de actualización se aplica una vez a cada tupla de la relación cuenta. Si sólo se paga el
interés a las cuentas con un saldo de 1.000 e o superior, se puede escribir:
update cuenta
set saldo = saldo * 1.05
where saldo >= 1000
En general, la cláusula where de la instrucción update puede contener cualquier constructor permitido
en la cláusula where de la instrucción select (incluyendo instrucciones select anidadas). Al igual que
ocurre con insert y con delete, un select anidado en una instrucción update puede hacer referencia a la
relación que se esté actualizando.
Al igual que antes, SQL primero comprueba todas las tuplas de la relación para determinar si se deben
actualizar y después realiza la actualización. Por ejemplo, se puede escribir la solicitud “Pagar un interés
del 5 por ciento a las cuentas cuyo saldo sea mayor que la media” como sigue:
update cuenta
set saldo = saldo * 1.05
where saldo > (select avg (saldo)
from cuenta)
15
Moreno García Luis Eduardo 10/05/16
Fundamentos de Bases de Datos
Actualización de vistas
Aunque las vistas resultan una herramienta útil para las consultas, presentan serios problemas si se
expresa con ellas actualizaciones, inserciones o borrados. La dificultad radica en que las modificaciones
de la base de datos expresadas en términos de vistas deben traducirse en modificaciones de las
relaciones reales del modelo lógico de la base de datos.
Para ilustrar el problema, considérese un empleado que necesita ver todos los datos de préstamos de la
relación préstamo, excepto importe_préstamo. Sea sucursal_préstamo la vista ofrecida al empleado.
Esta vista se define como:
Como se permite que el nombre de la vista aparezca en cualquier lugar en el que pueda aparecer el
nombre de una relación, el empleado puede escribir
Esta inserción debe representarse mediante una inserción en la relación préstamo, puesto que préstamo
es la relación real a partir de la cual el sistema de bases de datos construye la vista sucursal_préstamo.
Sin embargo, para insertar una tupla en préstamo hay que tener algún valor para importe. Hay dos
enfoques razonables para tratar esta inserción:
Transacciones
Commit work compromete la transacción actual; es decir, hace que las actualizaciones
realizadas por la transacción pasen a ser permanentes en la base de datos. Una vez
comprometida la transacción, se inicia de manera automática una nueva transacción.
Rollback work provoca el retroceso de la transacción actual; es decir, deshace todas las
actualizaciones realizadas por las instrucciones SQL de la transacción. Por tanto, el estado de la
base de datos se restaura al que tenía antes de la ejecución de la primera instrucción de la
transacción. La palabra clave work es opcional en ambas instrucciones.
El retroceso de transacciones resulta útil si se detecta alguna condición de error durante la ejecución de
la transacción. El compromiso es parecido, en cierto sentido, a guardar los cambios de un documento
16
Moreno García Luis Eduardo 10/05/16
Fundamentos de Bases de Datos
que se esté editando, mientras que el retroceso es como abandonar la sesión de edición sin guardar los
cambios.
Una vez que la transacción ha ejecutado commit work, sus efectos ya no se pueden deshacer con
rollback work. El sistema de bases de datos garantiza en caso de fallo (como puede ser un error en una
de las instrucciones SQL, una caída de tensión o una caída del sistema) provocar el retroceso de los
efectos de la transacción si todavía no se había ejecutado commit work. En caso de caída de tensión o
caída del sistema, el retroceso ocurre cuando el sistema se reinicia.
17