SlideShare una empresa de Scribd logo
1
Semestre 5
Fascículo
3
Bases de Datos
Bases de datos Semestre 5
Bases de datos
Bases de datos
Semestre 5
Tabla de contenido Página
Introducción 1
Conceptos previos 1
Mapa conceptual Fascículo 3 2
Logros 2
El Lenguaje SQL 3
Sentencias de definición 5
Creación y borrado de una base de datos relacional 6
Creación de tablas 8
Modificación y borrado de tablas 11
Creación y borrado de vistas 12
Definición de la base de datos relacional 14
Sentencias de manipulación 16
Inserción de filas en una tabla 16
Borrado de filas de una tabla 17
Modificación de filas de una tabla 18
Introducción de filas en la base de datos relacional 19
Consultas a una base de datos relacional 20
Sentencias de control 33
Las transacciones 33
Las autorizaciones y desautorizaciones 35
Sublenguajes especializados 36
SQL hospedado 36
Las SQL/CLI 38
Resumen 39
Bibliografía recomendada 40
Nexo 40
Seguimiento al autoaprendizaje 41
Créditos: 3
Tipo de asignatura: Teórico – Práctica
Bases de datos Semestre 5
Bases de datos
Copyright©2008 FUNDICIÓN UNIVERSITARIA SAN MARTÍN
Facultad de Universidad Abierta y a Distancia,
“Educación a Través de Escenarios Múltiples”
Bogotá, D.C.
Prohibida la reproducción total o parcial sin autorización
por escrito del Presidente de la Fundación.
La redacción de este fascículo estuvo a cargo de
JOHN FREDY ROJAS
Docente tutor – Programa de Ingeniería de Sistemas a Distancia.
Sede Bogotá, D.C.
Corrección de estilo
ADRIANA RODRÍGUEZ V.
Diseño gráfico y diagramación a cargo de
SANTIAGO BECERRA SÁENZ
ORLANDO DÍAZ CÁRDENAS
Impreso en: GRÁFICAS SAN MARTÍN
Calle 61A No. 14-18 - Tels.: 2350298 - 2359825
Bogotá, D.C., Noviembre de 2011
1
Fascículo No. 3
Semestre 5
Bases de datos
Bases de datos
Introducción
El SQL es el lenguaje estándar ANSI/ISO de definición, manipulación y
control de bases de datos relacionales. Es un lenguaje declarativo: sólo
hay que indicar qué se quiere hacer. En cambio, en los lenguajes proce-
dimentales es necesario especificar cómo hay que hacer cualquier acción
sobre la base de datos. El SQL es un lenguaje muy parecido al lenguaje
natural; concretamente, se parece al inglés, y es muy expresivo. Por estas
razones, y como lenguaje estándar, el SQL es un lenguaje con el que se
puede acceder a todos los sistemas relacionales comerciales.
Conceptos previos
Para una correcta comprensión de este fascículo es importante que el es-
tudiante tenga claro los conceptos del modelo relacional y álgebra relacio-
nal vistos en el fascículo anterior, debe recordar que el modelo relacional y
el álgebra relacional es un lenguaje procedimental que permitirá entender
las relaciones entre las tablas de una base de datos, para de esta forma
realizar las consultas requeridas por los usuarios.
2
Bases de datos
Bases de datos
Fascículo No. 3
Semestre 5
Mapa conceptual fascículo 3
Al finalizar el estudio del presente fascículo, el estudiante estará en capacidad
de:
 Conocer el lenguaje estándar ANSI/ISO SQL92.
 Definir una base de datos relacional, incluyendo dominios, aserciones y Vis-
tas.
 Saber introducir, borrar y modificar datos.
 Ser capaz de plantear cualquier tipo de consulta a la base de datos.
 Saber utilizar sentencias de control.
 Conocer los principios básicos de la utilización del SQL desde un lenguaje
de programación.
LogrosLogrosLogros
3
Bases de datos
Bases de datos
Fascículo No. 3
Semestre 5
El Lenguaje SQL
Empezamos con una breve explicación de la forma en que el SQL ha lle-
gado a ser el lenguaje estándar de las bases de datos relacionales:
1) Al principio de los años setenta, los laboratorios de investigación Santa
Teresa de IBM empezaron a trabajar en el proyecto System R. El objeti-
vo de este proyecto era implementar un prototipo de DBMS relacional;
por lo tanto, también necesitaban investigar en el campo de los lengua-
jes de bases de datos relacionales.
A mediados de los años setenta, el proyecto de IBM dio como resultado
un primer lenguaje denominado SEQUEL (Structured English Query
Language), que por razones legales se denominó más adelante SQL
(Structured Query Language).
Al final de la década de los setenta y al principio de la de los ochenta,
una vez finalizado el proyecto System R, IBM y otras empresas empeza-
ron a utilizar el SQL en sus DBMS relacionales, con lo que este lenguaje
adquirió una gran popularidad.
2) En 1982, ANSI (American National Standards Institute) encargó a uno
de sus comités (X3H2) la definición de un lenguaje de bases de datos
relacionales. Este comité, después de evaluar diferentes lenguajes, y an-
te la aceptación comercial del SQL, eligió un lenguaje estándar que es-
taba basado en éste prácticamente en su totalidad. El SQL se convirtió
oficialmente en el lenguaje estándar de ANSI en el año 1986, y de ISO
(International Standards Organization) en 1987. También ha sido adop-
tado como lenguaje estándar por FIPS (Federal Information Processing
Standard), Unix X/Open y SAA (Systems Application Architecture) de
IBM.
4
Bases de datos
Bases de datos
Fascículo No. 3
Semestre 5
3) En el año 1989, el estándar fue objeto de una revisión y una ampliación
que dieron lugar al lenguaje que se conoce con el nombre de SQL1 o
SQL89.
En el año 1992 el estándar volvió a ser revisado y ampliado considerable-
mente para cubrir carencias de la versión anterior. Esta nueva versión del
SQL, que se conoce con el nombre de SQL2 o SQL92, es la que nosotros
presentaremos en este fascículo.
Se pueden distinguir tres niveles dentro del SQL92:
1) El nivel introductorio (entry), que incluye el SQL89 y las definiciones de
clave primaria y clave foránea al crear una tabla.
2) El nivel intermedio (intermediate), que, además del SQL89, añade algu-
nas ampliaciones del SQL92.
3) El nivel completo (full), que ya tiene todas las ampliaciones del SQL92.
El modelo relacional tiene como estructura de almacenamiento de los da-
tos las relaciones. La intensión o esquema de una relación consiste en
el nombre que hemos dado a la relación y un conjunto de atributos. La
extensión de una relación es un conjunto de tuplas. Al trabajar con SQL,
esta nomenclatura cambia, como podemos apreciar en la siguiente figu-
ra:
SQL – Modelo Relacional
5
Bases de datos
Bases de datos
Fascículo No. 3
Semestre 5
Una vista en el modelo rela-
cional no es sino una tabla
virtual derivada de las tablas
reales de nuestra base de
datos, un esquema externo
puede ser un conjunto de
vistas.
Se hablara de tablas en lugar de relaciones, de columnas en lugar de atri-
butos, de filas en lugar de tuplas.
Sin embargo, a pesar de que la nomenclatura utilizada sea diferente, los
conceptos son los mismos.
Con el SQL se puede definir, manipular y controlar una base de datos rela-
cional.
Sentencias de definición
Para poder trabajar con bases de datos relacionales, lo primero que tene-
mos que hacer es definirlas. Veremos las órdenes del estándar SQL92 para
crear y borrar una base de datos relacional y para insertar, borrar y modifi-
car las diferentes tablas que la componen.
A continuación también veremos cómo se definen los dominios, las aser-
ciones (restricciones) y las vistas.
La sencillez y la homogeneidad del SQL92 hacen que:
1) Para crear bases de datos, tablas, dominios, aserciones y vistas se utili-
ce la sentencia CREATE.
2) Para modificar tablas y dominios se utilice la sentencia ALTER.
3) Para borrar bases de datos, tablas, dominios, aserciones y vistas se uti-
lice la sentencia DROP.
La adecuación de estas sentencias a cada caso nos dará diferencias que
iremos perfilando al hacer la descripción individual de cada una.
Para ilustrar la aplicación de las sentencias de SQL que veremos, utiliza-
remos una base de datos de ejemplo muy sencilla de una pequeña em-
presa con sede en Barcelona, Girona, Lleida y Tarragona, que se encarga
de desarrollar proyectos informáticos. La información que nos interesará
6
Bases de datos
Bases de datos
Fascículo No. 3
Semestre 5
almacenar de esta empresa, que denominaremos BDFUSM, será la si-
guiente:
1) Sobre los empleados que trabajan en la empresa, queremos saber su
código de empleado, el nombre y apellido, el sueldo, el nombre y la
ciudad de su departamento y el número de proyecto al que están asig-
nados.
2) Sobre los diferentes departamentos en los que está estructurada la em-
presa, nos interesa conocer su nombre, la ciudad donde se encuentran
y el teléfono.
Será necesario tener en cuenta que un departamento con el mismo
nombre puede estar en ciudades diferentes, y que en una misma ciudad
puede haber departamentos con nombres diferentes.
3) Sobre los proyectos informáticos que se desarrollan, querremos saber
su código, el nombre, el precio, la fecha de inicio, la fecha prevista de
finalización, la fecha real de finalización y el código de cliente para quien
se desarrolla.
4) Sobre los clientes para quien trabaja la empresa, querremos saber el
código de cliente, el nombre, el NIF, la dirección, la ciudad y el teléfono.
Creación y borrado de una base de datos relacional
El estándar SQL92 no dispone de ninguna sentencia de creación de bases
de datos. La idea es que una base de datos no es más que un conjunto de
tablas y, por lo tanto, las sentencias que nos ofrece el SQL92 se concen-
tran en la creación, la modificación y el borrado de estas tablas.
En cambio, se dispone de una sentencia más potente que la de creación
de bases de datos: la sentencia de creación de esquemas denominada
CREATE SCHEMA.
7
Bases de datos
Bases de datos
Fascículo No. 3
Semestre 5
Muchos de los sistemas
relacionales comerciales
(como ocurre en el caso de
Informix, DB2, SQL Server y
otros) han incorporado sen-
tencias de creación de bases
de datos con la siguiente
sintaxis: CREATE DATABASE
y para el borrado DROP
DATABASE
Con la creación de esquemas podemos agrupar un conjunto de elementos
de la base de datos que son propiedad de un usuario. La sintaxis de esta
sentencia es la siguiente:
CREATE SCHEMA {[nombre_esquema]} | [AUTHORIZATION usua-
rio]}
[lista_de_elementos_del_esquema];
La nomenclatura utilizada en la sentencia es la siguiente:
 Las palabras en negrita son palabras reservadas del lenguaje.
 La notación [...] quiere decir que lo que hay entre los corchetes se podr-
ía poner o no.
 La notación {A| ... |B} quiere decir que tenemos que elegir entre todas
las opciones que hay entre las llaves, pero debemos poner una obliga-
toriamente.
La sentencia de creación de esquemas hace que varias tablas (lis-
ta_de_elementos_del_esquema) se puedan agrupar bajo un mismo nom-
bre (nombre_esquema) y que tengan un propietario (usuario). Aunque
todos los parámetros de la sentencia CREATE SCHEMA son opcionales,
como mínimo se debe dar o bien el nombre del esquema, o bien el nom-
bre del usuario propietario de la base de datos. Si sólo especificamos el
usuario, éste será el nombre del esquema.
La creación de esquemas puede hacer mucho más que agrupar tablas,
porque lista_de_elementos_del_esquema puede, además de tablas, ser
también dominios, vistas, privilegios y restricciones, entre otras cosas.
Para borrar una base de datos encontramos el mismo problema que para
crearla.
El estándar SQL92 sólo nos ofrece la sentencia de borrado de esquemas
DROP SCHEMA, que presenta la siguiente sintaxis:
8
Bases de datos
Bases de datos
Fascículo No. 3
Semestre 5
DROP SCHEMA nombre_esquema {RESTRICT|CASCADE};
Donde tenemos lo siguiente:
• La opción de borrado de esquemas RESTRICT hace que el esquema
sólo se pueda borrar si no contiene ningún elemento.
• La opción CASCADE borra el esquema aunque no esté completamente
vacío.
Creación de tablas
La estructura de almacenamiento de los datos del modelo relacional son
las tablas. Para crear una tabla, es necesario utilizar la sentencia CREATE
TABLE. Cuyo formato es:
CREATE TABLE nombre_tabla
( definición_columna
[, definición_columna...]
[, restricciones_tabla]
);
Donde definición_columna es:
nombre_columna {tipo_datos|dominio} [def_defecto] [restric_col]
El proceso que hay que seguir para crear una tabla es el siguiente:
• Lo primero que tenemos que hacer es decidir qué nombre queremos
poner a la tabla (nombre_tabla).
• Después, iremos dando el nombre de cada uno de los atributos que
formarán las columnas de la tabla (nombre_columna).
• A cada una de las columnas le asignaremos un tipo de datos predefini-
do o bien un dominio definido por el usuario. También podremos dar
definiciones por defecto y restricciones de columna.
• Una vez definidas las columnas, sólo nos quedará dar las restricciones
de tabla.
9
Bases de datos
Bases de datos
Fascículo No. 3
Semestre 5
Para cada columna tenemos que elegir entre algún dominio definido por el
usuario o alguno de los tipos de datos predefinidos que se describen a
continuación:
Algunos ejemplos de asignaciones de columnas en los tipos de datos pre-
definidos son:
DATE, TIME y TIMESTAMP:
• La columna fecha_nacimiento podría ser del tipo DATE y podría tener
como valor „1978-12-25‟.
• La columna inicio_partido podría ser del tipo TIME y podría tener como
valor „17:15:00.000000‟.
• La columna entrada_trabajo podría ser de tipo TIMESTAMP y podría te-
ner como valor „1998-7-8 9:30:05‟.
10
Bases de datos
Bases de datos
Fascículo No. 3
Semestre 5
Creación, modificación y borrado de dominios
Además de los dominios dados por el tipo de datos predefinidos, el SQL92
nos ofrece la posibilidad de trabajar con dominios definidos por el usuario.
Para crear un dominio es necesario utilizar la sentencia CREATE DOMAIN:
CREATE DOMAIN nombre dominio [AS] tipos_datos
[def_defecto] [restricciones_dominio];
Donde restricciones_dominio tiene el siguiente formato:
[CONSTRAINT nombre_restricción] CHECK (condiciones)
Si quisiéramos definir un dominio para las ciudades donde se encuentran
los departamentos de la empresa BDFUSM, haríamos:
CREATE DOMAIN dom_ciudades AS CHAR (20)
CONSTRAINT ciudades_validas
CHECK (VALUE IN (‘Barcelona’, ‘Tarragona’, ‘Lleida’, ‘Girona’));
De este modo, cuando definimos la columna ciudades dentro de la tabla
departamentos no se tendrá que decir que es de tipo CHAR (20), sino de
tipo dom_ciudades. Esto nos debería asegurar, según el modelo relacio-
nal, que sólo haremos operaciones sobre la columna ciudades con otras
columnas que tengan este mismo dominio definido por el usuario; sin em-
bargo, el SQL92 no nos ofrece herramientas para asegurar que las compa-
raciones que hacemos sean entre los mismos dominios definidos por el
usuario.
Para borrar un dominio definido por el usuario es preciso utilizar la senten-
cia DROP DOMAIN, que tiene este formato:
En este caso, tenemos que:
• La opción de borrado de dominios RESTRICT hace que el dominio sólo
se pueda borrar si no se utiliza en ningún sitio.
11
Bases de datos
Bases de datos
Fascículo No. 3
Semestre 5
• La opción CASCADE borra el dominio aunque esté referenciado, y pone
el tipo de datos del dominio allí donde se utilizaba.
Para modificar un dominio semántico es necesario utilizar la sentencia AL-
TER DOMAIN. Cuyo su formato es:
ALTER DOMAIN nombre_dominio {acción_modificar_dominio|
acción_modif_restricción_dominio};
Restricciones de columna
En cada una de las columnas de la tabla, una vez les hemos dado un
nombre y hemos definido su dominio, podemos imponer ciertas restriccio-
nes que siempre se tendrán que cumplir. Las restricciones que se pueden
dar son las que aparecen en la tabla que tenemos a continuación:
Restricciones de Columna
Modificación y borrado de tablas
Para modificar una tabla es preciso utilizar la sentencia ALTER TABLE. De
acuerdo al siguiente formato:
ALTER TABLE nombre_tabla {acción_modificar_columna|
acción_modif_restricción_tabla};
En este caso, tenemos que:
• acción_modificar_columna puede ser:
12
Bases de datos
Bases de datos
Fascículo No. 3
Semestre 5
{ADD [COLUMN] columna def_columna |
ALTER [COLUMN] columna {SET def_defecto|DROP DEFAULT}|
DROP [COLUMN ] columna {RESTRICT|CASCADE}}
• acción_modif_restricción_tabla puede ser:
{ADD restricción|
DROP CONSTRAINT restricción {RESTRICT|CASCADE}}
Si queremos modificar una tabla es que queremos realizar una de las si-
guientes operaciones:
1) Añadirle una columna (ADD columna).
2) Modificar las definiciones por defecto de la columna (ALTER columna).
3) Borrar la columna (DROP columna).
4) Añadir alguna nueva restricción de tabla (ADD restricción).
5) Borrar alguna restricción de tabla (DROPCONSTRAINT restricción).
Para borrar una tabla es preciso utilizar la sentencia DROP TABLE:
DROP TABLE nombre_tabla {RESTRICT|CASCADE};
En este caso tenemos que:
• Si utilizamos la opción RESTRICT, la tabla no se borrará si está referen-
ciada, por ejemplo, por alguna vista.
• Si usamos la opción CASCADE, todo lo que referencie a la tabla se bo-
rrará con ésta.
Creación y borrado de vistas
La arquitectura ANSI/SPARC distingue tres niveles, que se describen en el
esquema conceptual, el esquema interno y los esquemas externos.
Hasta ahora, mientras creábamos las tablas de la base de datos, íbamos
describiendo el esquema conceptual. Para describir los diferentes esque-
mas externos utilizamos el concepto de vista del SQL.
13
Bases de datos
Bases de datos
Fascículo No. 3
Semestre 5
Para crear una vista es necesario utilizar la sentencia CREATE VIEW. El
formato utilizado es:
CREATE VIEW nombre_vista [(lista_columnas)] AS (consulta)
[WITH CHECK OPTION];
Lo primero que tenemos que hacer para crear una vista es decidir qué
nombre le queremos poner (nombre_vista). Si queremos cambiar el nom-
bre de las columnas, o bien poner nombre a alguna que en principio no
tenía, lo podemos hacer en lista_columnas. Y por último definir la consul-
ta que formará nuestra vista.
Las vistas no existen realmente como un conjunto de valores almacenados
en la base de datos, sino que son tablas ficticias, denominadas derivadas
(no materializadas). Se construyen a partir de tablas reales (materializadas)
almacenadas en la base de datos, y conocidas con el nombre de tablas
básicas (o tablas de base). La no-existencia real de las vistas hace que
puedan ser actualizables o no.
Si tuviésemos las siguientes tablas:
Tabla clientes:
Tabla proyectos:
14
Bases de datos
Bases de datos
Fascículo No. 3
Semestre 5
Antes de crear una tabla con
una o más claves foráneas,
se deben haber creado las
tablas que tienen como
clave primaria las referen-
ciadas por las foráneas.
Si creamos una vista sobre la base de datos BDFUSM que nos dé para
cada cliente el número de proyectos que tiene encargados el cliente en
cuestión.
CREATE VIEW proyectos_por_cliente (codigo_cli, nume-
ro_proyectos) AS
(SELECT c.codigo_cli, COUNT(*)
FROM proyectos p, clientes c
WHERE p.codigo_cliente = c.codigo_cli
GROUP BY c.codigo_cli);
Si miramos la extensión de la vista proyectos_por_clientes, veríamos co-
mo resultado.
Para borrar una vista es preciso utilizar la sentencia DROP VIEW, que pre-
senta el formato:
DROP VIEW nombre_vista (RESTRICT|CASCADE);
Si utilizamos la opción RESTRICT, la vista no se borrará si está referencia-
da, por ejemplo, por otra vista. En cambio, si ponemos la opción CASCA-
DE, todo lo que referencie a la vista se borrará con ésta.
Definición de la base de datos relacional
Veamos cómo se crearía la base de datos BDFUSM, utilizando, por ejem-
plo, un DBMS relacional que disponga de la sentencia CREATE DATABA-
15
Bases de datos
Bases de datos
Fascículo No. 3
Semestre 5
SE:
CREATE DATABASE bdfusm;
CREATE TABLE clientes
(codigo_cli INTEGER,
nombre_cli CHAR(30) NOT NULL,
nif CHAR (12),
direccion CHAR (30),
ciudad CHAR (20),
telefono CHAR (12),
PRIMARY KEY (codigo_cli),
UNIQUE(nif)
);
CREATE TABLE departamentos
(nombre_dep CHAR(20),
ciudad_dep CHAR(20),
telefono INTEGER DEFAULT NULL,
PRIMARY KEY (nombre_dep, ciudad_dep)
);
CREATE TABLE proyectos
(codigo_proyec INTEGER,
nombre_proyec CHAR(20),
precio REAL,
fecha_inicio DATE,
fecha_prev_fin DATE,
fecha_fin DATE DEFAULT NULL,
codigo_cliente INTEGER,
PRIMARY KEY (codigo_proyec),
FOREIGN KEY codigo_cliente REFERENCES clientes (codigo_cli),
CHECK (fecha_inicio < fecha_prev_fin),
CHECK (fecha_inicio < fecha_fin)
);
CREATE TABLE empleados
(codigo_empl INTEGER,
nombre_empl CHAR (20),
apellido_empl CHAR(20),
sueldo REAL CHECK (sueldo > 7000),
nombre_dep CHAR(20)
ciudad_dep CHAR(20),
num_proyec INTEGER,
PRIMARY KEY (codigo_empl),
FOREIGN KEY (nombre_dep, ciudad_dep) REFERENCES
departamentos (nombre_dep, ciudad_dep),
FOREIGN KEY (num_proyec) REFERENCES proyectos (codi-
go_proyec)
16
Bases de datos
Bases de datos
Fascículo No. 3
Semestre 5
Inserción de múltiples filas:
Para insertar más de una fila
con una sola sentencia,
tenemos que obtener los
valores como resultado de
una consulta realizada en
unao más tablas.
);
COMMIT;
Al crear una tabla vemos que muchas restricciones se pueden imponer de
dos formas: como restricciones de columna o como restricciones de tabla.
Por ejemplo, cuando queremos decir cuál es la clave primaria de una tabla,
tenemos las dos posibilidades. Esto se debe a la flexibilidad del SQL:
• En el caso de que la restricción haga referencia a un solo atributo, po-
demos elegir la posibilidad que más nos guste.
• En el caso de la tabla departamentos, tenemos que elegir por fuerza la
opción de restricciones de tabla, porque la clave primaria está com-
puesta por más de un atributo.
En general, lo pondremos todo como restricciones de tabla, excepto NOT
NULL y CHECK cuando haga referencia a una sola columna.
Sentencias de manipulación
Una vez creada la base de datos con sus tablas, debemos poder insertar,
modificar y borrar los valores de las filas de las tablas. Para poder hacer
esto, el SQL92 nos ofrece las siguientes sentencias: INSERT para insertar,
UPDATE para modificar y DELETE para borrar. Una vez hemos insertado
valores en nuestras tablas, tenemos que poder consultarlos. La sentencia
para hacer consultas a una base de datos con el SQL92 es SELECT
FROM. A continuación veremos estas consultas.
Inserción de filas en una tabla
Antes de poder consultar los datos de una base de datos, es preciso intro-
ducirlos con la sentencia INSERT INTO VALUES, que tiene el formato:
INSERT INTO nombre_tabla [(columnas)]
{VALUES ({v1|DEFAULT|NULL}, ...,
{vn/DEFAULT/NULL})|<consulta>};
17
Bases de datos
Bases de datos
Fascículo No. 3
Semestre 5
Los valores v1, v2, ..., vn se deben corresponder exactamente con las co-
lumnas que hemos dicho que tendríamos con el CREATE TABLE y deben
estar en el mismo orden, a menos que las volvamos a poner a continua-
ción del nombre de la tabla. En este último caso, los valores se deben dis-
poner de forma coherente con el nuevo orden que hemos impuesto. Podr-
ía darse el caso de que quisiéramos que algunos valores para insertar fue-
sen valores por omisión, definidos previamente con la opción DEFAULT.
Entonces pondríamos la palabra reservada DEFAULT. Si se trata de intro-
ducir valores nulos, también podemos utilizar la palabra reservada NULL.
Ejemplo:
La forma de insertar a un cliente en la tabla clientes de la base de datos de
BDFUSM es:
INSERT INTO clientes
VALUES (10, ‘ECIGSA’, ‘37.248.573-C’, ‘ARAGON 242’, ‘Barcelona’,
DEFAULT);
o bien:
INSERT INTO clientes(nif, nombre_cli, codigo_cli, telefono, direc-
cion,
ciudad)
VALUES (‘37.248.573-C’, ‘ECIGSA’, 10, DEFAULT, ‘ARAGON 242’,
‘Barcelona’);
Borrado de filas de una tabla
Para borrar valores de algunas filas de una tabla podemos utilizar la sen-
tencia DELETE FROM WHERE. Su formato es el siguiente:
DELETE FROM nombre_tabla
[WHERE condiciones];
18
Bases de datos
Bases de datos
Fascículo No. 3
Semestre 5
En cambio, si lo que quisiéramos conseguir es borrar todas las filas de una
tabla, entonces sólo tendríamos que poner la sentencia DELETE FROM,
sin WHERE.
Ejemplo:
Podemos dejar la tabla proyectos sin ninguna fila:
DELETE FROM proyectos;
En nuestra base de datos, borrar los proyectos del cliente 2 se haría de la
siguiente forma:
DELETE FROM proyectos
WHERE codigo_cliente = 2;
Modificación de filas de una tabla
Si quisiéramos modificar los valores de algunas filas de una tabla, tendría-
mos que utilizar la sentencia UPDATE SET WHERE. Con el siguiente for-
mato:
UPDATE nombre_tabla
SET columna = {expresión|DEFAULT|NULL}
[, columna = {expr|DEFAULT|NULL} ...]
WHERE condiciones;
Ejemplo:
Supongamos que queremos incrementar el sueldo de todos los em-
pleados del proyecto 2 en 1.000.000 de pesos. La modificación a ejecu-
tar sería:
UPDATE empleados
SET sueldo = sueldo + 1000
WHERE num_proyec = 2;
19
Bases de datos
Bases de datos
Fascículo No. 3
Semestre 5
Introducción de filas en la base de datos relacional
Antes de empezar a hacer consultas a la base de datos BDFUSM, debe-
mos introducir unas cuantas filas en sus tablas con la sentencia INSERT
INTO. De esta forma, podremos ver reflejado el resultado de las consultas
que iremos haciendo, a partir de este momento, sobre cada extensión; es-
to lo podemos observar en las tablas correspondientes a cada extensión,
que presentamos a continuación:
Tabla departamentos:
Tabla clientes:
20
Bases de datos
Bases de datos
Fascículo No. 3
Semestre 5
Tabla empleados:
Tabla proyectos:
3.1
Realice las consultas INSER INTO necesarias para obtener que las ta-
blas de nuestra base de datos contengan los datos que se presentan en
las imágenes.
Consultas a una base de datos relacional
Para hacer consultas sobre una tabla con el SQL es preciso utilizar la sen-
tencia SELECT FROM, que tiene el siguiente formato:
SELECT nombre_columna_a_seleccionar [[AS] col_renombrada]
[,nombre_columna_a_seleccionar [[AS] col_renombrada]...]
FROM tabla_a_consultar [[AS] tabla_renombrada];
La opción AS nos permite renombrar las columnas que queremos selec-
cionar o las tablas que queremos consultar que en este caso, es sólo una.
Dicho de otro modo, nos permite la definición de alias. Fijémonos en que
21
Bases de datos
Bases de datos
Fascículo No. 3
Semestre 5
El * después de SELECT
indica que queremos ver
todos los atributos que apa-
recen en la tabla.
la palabra clave AS es opcional, y es bastante habitual poner sólo un es-
pacio en blanco en lugar de toda la palabra.
Ejemplo:
A continuación presentamos un ejemplo de consulta a la base de datos
BDFUSM para conocer todos los datos que aparece en la tabla clientes:
SELECT *
FROM clientes;
La respuesta a esta consulta sería:
Si hubiésemos querido ver sólo el código, el nombre, la dirección y la ciu-
dad, la consulta seria:
SELECT codigo_cli, nombre_cli, direccion, ciudad
FROM clientes;
Y obtendríamos:
22
Bases de datos
Bases de datos
Fascículo No. 3
Semestre 5
Con la sentencia SELECT FROM podemos seleccionar columnas de una
tabla, pero para seleccionar filas de una tabla es preciso añadirle la cláusu-
la WHERE. El formato es:
SELECT nombre_columnas_a_seleccionar
FROM tabla_a_consultar
WHERE condiciones;
La cláusula WHERE nos permite obtener las filas que cumplen la condición
especificada en la consulta.
Ejemplo:
Solicitamos “los códigos de los empleados que trabajan en el proyecto
número 4”:
SELECT codigo_empl
FROM empleados
WHERE num_proyec = 4;
La respuesta a esta consulta seria:
Para definir las condiciones en la cláusula WHERE, podemos utilizar algu-
no de los operadores de los que dispone el SQL, que son los siguientes:
23
Bases de datos
Bases de datos
Fascículo No. 3
Semestre 5
Si queremos que en una consulta nos aparezcan las filas resultantes sin
repeticiones, es preciso poner la palabra clave DISTINCT inmediatamente
después de SELECT. También podríamos explicitar que lo queremos todo,
incluso con repeticiones, poniendo ALL (opción por defecto) en lugar de
DISTINCT. El formato de DISTINCT es:
SELECT DISTINCT nombre_columnas_a_seleccionar
FROM tabla_a_consultar
[WHERE condiciones];
Ejemplo
Si quisiéramos ver qué sueldos se están pagando en nuestra empresa,
podríamos hacer:
SELECT DISTINCT sueldo
FROM empleados;
24
Bases de datos
Bases de datos
Fascículo No. 3
Semestre 5
Con lo cual obtendríamos:
Funciones de agregación
El SQL nos ofrece las siguientes funciones de agregación para efectuar
varias operaciones sobre los datos de una base de datos:
En general, las funciones de agregación se aplican a una columna, excep-
to la función de agregación COUNT, que normalmente se aplica a todas
las columnas de la tabla o tablas seleccionadas. Por lo tanto, COUNT (*)
contará todas las filas de la tabla o las tablas que cumplan las condiciones.
Si se utilizase COUNT(distinct columna), sólo contaría los valores que no
fuesen nulos ni repetidos, y si se utilizase COUNT (columna), sólo contaría
los valores que no fuesen nulos.
25
Bases de datos
Bases de datos
Fascículo No. 3
Semestre 5
3.2
Genere consultas que usen las distintas funciones de agregación.
Subconsultas
Una subconsulta es una consulta incluida dentro de una cláusula WHERE
o HAVING de otra consulta. En ocasiones, para expresar ciertas condicio-
nes no hay más remedio que obtener el valor que buscamos como resul-
tado de una consulta.
Si quisiéramos saber los códigos y los nombres de los proyectos de precio
más elevado, en primer lugar tendríamos que encontrar los proyectos que
tienen el precio más elevado.
Lo haríamos de la forma siguiente:
SELECT codigo_proyec, nombre_proyec
FROM proyectos
WHERE precio = (SELECT MAX(precio)
FROM proyectos);
El resultado sería:
Otros predicados
Predicado BETWEEN
Para expresar una condición que quiere encontrar un valor entre unos lími-
tes concretos, podemos utilizar BETWEEN:
SELECT nombre_columnas_a_seleccionar
FROM tabla_a_consultar
WHERE columna BETWEEN límite1 AND límite2;
26
Bases de datos
Bases de datos
Fascículo No. 3
Semestre 5
Aunque _ y % son los carac-
teres elegidos por el están-
dar, cada sistema relacional
comercial ofrece diversas
variantes.
Predicado IN
Para comprobar si un valor coincide con los elementos de una lista utiliza-
remos IN, y para ver si no coincide, NOT IN:
SELECT nombre_columnas_a_seleccionar
FROM tabla_a_consultar
WHERE columna [NOT] IN (valor1, ..., valorN);
Predicado LIKE
Para comprobar si una columna de tipo carácter cumple alguna propiedad
determinada, podemos usar LIKE:
SELECT nombre_columnas_a_seleccionar
FROM tabla_a_consultar
WHERE columna LIKE característica;
Los patrones del SQL92 para expresar características son los siguientes:
a) Pondremos un carácter _ para cada carácter individual que queramos
considerar.
b) Pondremos un carácter % para expresar una secuencia de caracteres,
que puede no estar formada por ninguno.
Predicado IS NULL
Para comprobar si un valor es nulo utilizaremos IS NULL, y para averiguar
si no lo es, IS NOT NULL. El formato es:
SELECT nombre_columnas_a_seleccionar
FROM tabla_a_consultar
WHERE columna IS [NOT] NULL;
Predicados ANY/SOME y ALL
Para ver si una columna cumple que todas sus filas (ALL) o algunas de sus
filas (ANY/SOME) satisfagan una condición, podemos hacerlo con:
SELECT nombre_columnas_a seleccionar
27
Bases de datos
Bases de datos
Fascículo No. 3
Semestre 5
FROM tabla_a_consultar
WHERE columna operador_comparación
{ALL|ANY|SOME}subconsulta;
Predicado EXISTS
Para comprobar si una subconsulta produce alguna fila de resultados, po-
demos utilizar la sentencia denominada test de existencia: EXISTS. Para
comprobar si una subconsulta no produce ninguna fila de resultados, po-
demos utilizar NOT EXISTS.
SELECT nombre_columnas_a_seleccionar
FROM tabla_a_consultar
WHERE [NOT] EXISTS subconsulta;
Ordenación de los datos obtenidos en respuestas a consultas
Si se desea que, al hacer una consulta, los datos aparezcan en un orden
determinado, es preciso utilizar la cláusula ORDER BY en la sentencia SE-
LECT, que presenta el siguiente formato:
SELECT nombre_columnas_a seleccionar
FROM tabla_a_consultar
[WHERE condiciones]
ORDER BY columna_según_la_cual_se_quiere_ordenar [DESC]
[, col_ordenación [DESC]...];
Imaginemos que queremos consultar los nombres de los empleados orde-
nados según el sueldo que ganan, y si ganan el mismo sueldo, ordenados
alfabéticamente por el nombre:
SELECT codigo_empl, nombre_empl, apellido_empl, sueldo
FROM empleados
ORDER BY sueldo, nombre_empl;
28
Bases de datos
Bases de datos
Fascículo No. 3
Semestre 5
Esta consulta daría la respuesta siguiente:
Si no se especifica nada más, se seguirá un orden ascendente, pero si se
desea seguir un orden descendente es necesario añadir DESC detrás de
cada factor de ordenación expresado en la cláusula ORDER BY:
ORDER BY columna_ordenación [DESC] [, columna [DESC] ...];
Consultas con agrupación de filas de una tabla
Las cláusulas siguientes, añadidas a la instrucción SELECT FROM, permi-
ten organizar las filas por grupos:
a) La cláusula GROUP BY nos sirve para agrupar filas según las columnas
que indique esta cláusula.
b) La cláusula HAVING especifica condiciones de búsqueda para grupos
de filas; lleva a cabo la misma función que antes cumplía la cláusula
WHERE para las filas de toda la tabla, pero ahora las condiciones se
aplican a los grupos obtenidos.
Presenta el siguiente formato:
SELECT nombre_columnas_a seleccionar
FROM tabla_a_consultar
[WHERE condiciones]
29
Bases de datos
Bases de datos
Fascículo No. 3
Semestre 5
GROUP BY columnas_según_las_cuales_se_quiere_agrupar
[HAVING condiciones_por_grupos]
[ORDER BY columna_ordenación [DESC] [, columna [DESC]...]];
Ejemplo
SELECT nombre_dep, ciudad_dep, AVG(sueldo) AS sueldo_medio
FROM empleados
GROUP BY nombre_dep, ciudad_dep;
El resultado de esta consulta sería:
Consultas a más de una tabla
Muchas veces queremos consultar datos de más de una tabla haciendo
combinaciones de columnas de tablas diferentes. En el SQL es posible
listar más de una tabla que se quiere consultar especificándolo en la cláu-
sula FROM.
1) Combinación
La combinación consigue crear una sola tabla a partir de las tablas especifica-
das en la cláusula FROM, haciendo coincidir los valores de las columnas relacio-
nadas de estas tablas.
30
Bases de datos
Bases de datos
Fascículo No. 3
Semestre 5
Ejemplo
En el siguiente ejemplo con la base de datos BDFUSM queremos saber el
NIF del cliente y el código y el precio del proyecto que desarrollamos para
el cliente número 20:
SELECT proyectos.codigo_proyecto, proyectos.precio, clientes.nif
FROM clientes, proyectos
WHERE clientes.codigo_cli = proyectos.codigo_cliente AND clien-
tes.
codigo_cli = 20;
El resultado sería:
Si trabajamos con más de una tabla, puede ocurrir que la tabla resultante
tenga dos columnas con el mismo nombre. Por ello es obligatorio especifi-
car a qué tabla corresponden las columnas a las que nos estamos refirien-
do, denominando la tabla a la que pertenecen antes de ponerlas (por
ejemplo, clientes.codigo_cli). Para simplificarlo, se utilizan los alias que, en
este caso, se definen en la cláusula FROM.
2) Combinación natural
La combinación natural (natural join) de dos tablas consiste básicamente,
al igual que en el álgebra relacional, en hacer una equicombinación entre
columnas del mismo nombre y eliminar las columnas repetidas. La combi-
nación natural, utilizando el SQL92 intermedio o completo, se haría de la
siguiente forma:
SELECT nombre_columnas_a_seleccionar
FROM tabla1 NATURAL JOIN tabla2
[WHERE condiciones];
31
Bases de datos
Bases de datos
Fascículo No. 3
Semestre 5
3) Combinación interna y externa
Cualquier combinación puede ser interna o externa:
a) La combinación interna (inner join) sólo se queda con las filas que tie-
nen valores idénticos en las columnas de las tablas que compara. Esto
puede hacer que perdamos alguna fila interesante de alguna de las dos
tablas; por ejemplo, porque se encuentra a NULL en el momento de
hacer la combinación. Su formato es el siguiente:
SELECT nombre_columnas_a_seleccionar
FROM t1 [NATURAL] [INNER] JOIN t2
{ON condiciones|
|USING (columna [,columna...])}
[WHERE condiciones];
b) Por ello disponemos de la combinación externa (outer join), que nos
permite obtener todos los valores de la tabla que hemos puesto a la de-
recha, los de la tabla que hemos puesto a la izquierda o todos los valo-
res de las dos tablas.
Su formato es:
SELECT nombre_columnas_a_seleccionar
FROM t1 [NATURAL] [LEFT|RIGHT|FULL] [OUTER] JOIN t2
{ON condiciones|
[USING (columna [,columna...])}
[WHERE condiciones];
4) Combinaciones con más de dos tablas
Si queremos combinar tres tablas o más con el SQL92 introductorio, sólo
tenemos que añadir todas las tablas en el FROM y los vínculos necesarios
en el WHERE. Si queremos combinarlas con el SQL92 intermedio o con el
completo, tenemos que ir haciendo combinaciones de tablas por pares, y
la tabla resultante se convertirá en el primer componente del siguiente par.
Por ejemplo, suponiendo que queremos combinar las tablas empleados,
32
Bases de datos
Bases de datos
Fascículo No. 3
Semestre 5
proyectos y clientes:
SELECT *
FROM empleados, proyectos, clientes
WHERE num_proyec = codigo_proyec AND codigo_cliente = codi-
go_cli;
o bien:
SELECT *
FROM (empleados JOIN proyectos ON num_proyec = codi-
go_proyec)
JOIN clientes ON codigo_cliente = codigo_cli;
La unión
La cláusula UNION permite unir consultas de dos o más sentencias SE-
LECT FROM. Su formato es:
SELECT columnas
FROM tabla
[WHERE condiciones]
UNION [ALL]
SELECT columnas
FROM tabla
[WHERE condiciones];
La intersección
Para hacer la intersección entre dos o más sentencias SELECT FROM,
podemos utilizar la cláusula INTERSECT, cuyo formato es:
SELECT columnas
FROM tabla
[WHERE condiciones]
INTERSECT [ALL]
SELECT columnas
33
Bases de datos
Bases de datos
Fascículo No. 3
Semestre 5
FROM tabla
[WHERE condiciones];
La diferencia
Para encontrar la diferencia entre dos o más sentencias SELECT FROM
podemos utilizar la cláusula EXCEPT, que tiene este formato:
SELECT columnas
FROM tabla
[WHERE condiciones]
EXCEPT [ALL]
SELECT columnas
FROM tabla
[WHERE condiciones];
Lo más importante de la diferencia es que somos nosotros quienes tene-
mos que vigilar que se haga entre columnas definidas sobre dominios
compatibles.
Sentencias de control
Además de definir y manipular una base de datos relacional, es importante
que se establezcan mecanismos de control para resolver problemas de
concurrencia de usuarios y garantizar la seguridad de los datos. Para la
concurrencia de usuarios utilizaremos el concepto de transacción, y para la
seguridad veremos cómo se puede autorizar y desautorizar a usuarios a
acceder a la base de datos.
Las transacciones
Una transacción es una unidad lógica de trabajo. O informalmente, y traba-
jando con SQL, un conjunto de sentencias que se ejecutan como si fuesen
una sola. En general, las sentencias que forman parte de una transacción
se interrelacionan entre sí, y no tiene sentido que se ejecute una sin que se
ejecuten las demás.
34
Bases de datos
Bases de datos
Fascículo No. 3
Semestre 5
La mayoría de las transacciones se inician de forma implícita al utilizar al-
guna sentencia que empieza con CREATE, ALTER, DROP, SET, DECLA-
RE, GRANT o REVOKE, aunque existe la sentencia SQL para iniciar tran-
sacciones, que es la siguiente:
SET TRANSACTION {READ ONLY|READ WRITE};
Si queremos actualizar la base de datos utilizaremos la opción READ
WRITE, y si no la queremos actualizar, elegiremos la opción READ ONLY.
Sin embargo, en cambio, una transacción siempre debe acabar explícita-
mente con alguna de las sentencias siguientes:
{COMMIT|ROLLBACK} [WORK];
La diferencia entre COMMIT y ROLLBACK es que mientras la sentencia
COMMIT confirma todos los cambios producidos contra la BD durante la
ejecución de la transacción, la sentencia ROLLBACK deshace todos los
cambios que se hayan producido en la base de datos y la deja como esta-
ba antes del inicio de nuestra transacción.
La palabra reservada WORK sólo sirve para aclarar lo que hace la senten-
cia, y es totalmente opcional.
Ejemplo
Se quiere disminuir el sueldo de los empleados que han trabajado en el
proyecto 3 en 1.000.000 de pesos y aumentar el sueldo de los empleados
que han trabajado en el proyecto 1 también en 1.000.000 de pesos.
SET TRANSACTION READ WRITE;
UPDATE empleados SET sueldo = sueldo – 1000000 WHERE
num_proyec = 3;
UPDATE empleados SET sueldo = sueldo + 1000000 WHERE
num_proyec = 1;
COMMIT;
35
Bases de datos
Bases de datos
Fascículo No. 3
Semestre 5
Las autorizaciones y desautorizaciones
Todos los privilegios sobre la base de datos los tiene su propietario, pero
no es el único que accede a ésta. Por este motivo, el SQL nos ofrece sen-
tencias para:
1) Autorizaciones
Para autorizar, el SQL dispone de la siguiente sentencia:
GRANT privilegios ON objeto TO usuarios
[WITH GRANT OPTION];
Donde tenemos que privilegios puede ser:
ALL PRIVILEGES: todos los privilegios sobre el objeto especificado.
• USAGE: utilización del objeto especificado; en este caso el dominio.
• SELECT: consultas.
• INSERT [(columnas)]: inserciones. Se puede concretar de qué columnas.
• UPDATE [(columnas)]: modificaciones. Se puede concretar de qué co-
lumnas.
• DELETE: borrados.
• REFERENCES [(columna)]: referencia del objeto en restricciones de in-
tegridad. Se puede concretar de qué columnas.
Objeto debe ser:
• DOMAIN: dominio
• TABLE: tabla.
• Vista.
Usuarios puede ser todo el mundo: PUBLIC, o bien una lista de los identi-
ficadores de los usuarios que queremos autorizar.
La opción WITH GRANT OPTION permite que el usuario que autoricemos
pueda, a su vez, autorizar a otros usuarios a acceder al objeto con los
mismos privilegios con los que ha sido autorizado.
36
Bases de datos
Bases de datos
Fascículo No. 3
Semestre 5
2) Desautorizaciones
Para desautorizar, el SQL dispone de la siguiente sentencia:
REVOKE [GRANT OPTION FOR] privilegios ON objeto FROM
usuarios [RESTRICT|CASCADE];
Donde tenemos que:
a) privilegios, objeto y usuarios son los mismos que para la sentencia
GRANT.
b) La opción GRANT OPTION FOR se utilizaría en el caso de que quisié-
ramos eliminar el derecho a autorizar (WITH GRANT OPTION).
c) Si un usuario al que hemos autorizado ha autorizado a su vez a otros,
que al mismo tiempo pueden haber hecho más autorizaciones, la op-
ción CASCADE hace que queden desautorizados todos a la vez.
d) La opción RESTRICT no nos permite desautorizar a un usuario si éste
ha autorizado a otros.
Sublenguajes especializados
Muchas veces querremos acceder a la base de datos desde una aplicación
hecha en un lenguaje de programación cualquiera. Para utilizar el SQL
desde un lenguaje de programación, podemos utilizar el SQL hospedado,
y para trabajar con éste necesitamos un precompilador que separe las
sentencias del lenguaje de programación de las del lenguaje de bases de
datos. Una alternativa muy interesante a esta forma de trabajar son las ruti-
nas SQL/CLI.
A continuación introduciremos las ideas básicas del funcionamiento de
ambos.
SQL hospedado
Para crear y manipular una base de datos relacional necesitamos SQL.
Además, si la tarea que queremos hacer requiere el poder de procesa-
37
Bases de datos
Bases de datos
Fascículo No. 3
Semestre 5
miento de un lenguaje de programación como Java, C, Cobol, Fortran,
Pascal, etc., podemos utilizar el SQL hospedado en el lenguaje de pro-
gramación elegido. De este modo, podemos utilizar las sentencias del SQL
dentro de nuestras aplicaciones, poniendo siempre delante la palabra re-
servada EXEC SQL.
Para poder compilar la mezcla de llamadas de SQL y sentencias de pro-
gramación, antes tenemos que utilizar un precompilador. Un precompila-
dor es una herramienta que separa las sentencias del SQL y las sentencias
de programación.
Donde en el programa fuente haya una sentencia de acceso a la base de
datos, se debe insertar una llamada a la interfaz del SGBD. El programa
fuente resultante de la precompilación ya está únicamente en el lenguaje
de programación, preparado para ser compilado, montado y ejecutado.
Todas las sentencias de definición, manipulación y control que hemos vis-
to para el SQL se pueden utilizar en el SQL hospedado, pero precedidas
de la cláusula EXEC SQL. Sólo habrá una excepción: cuando el resultado
de una sentencia SQL obtenga más de una fila o haga referencia también a
más de una, deberemos trabajar con el concepto de cursor.
Un cursor se tiene que haber declarado antes de su utilización (EXEC SQL
DECLARE nombre_cursor CURSOR FOR). Para utilizarlo, se debe abrir
(EXEC SQL OPEN nombre_cursor), ir tomando los datos uno a uno, tra-
tarlos.
Puede haber pequeñas diferencias dependiendo del lenguaje de progra-
mación concreto que estemos considerando (EXEC SQL FETCH nom-
bre_cursor INTO), y finalmente, cerrarlo (EXEC SQL CLOSE nom-
bre_cursor).
38
Bases de datos
Bases de datos
Fascículo No. 3
Semestre 5
Las SQL/CLI
Las SQL/CLI (SQL/Call-Level Interface), denominadas de forma abreviada
CLI, permiten que aplicaciones desarrolladas en un cierto lenguaje de pro-
gramación (con sólo las herramientas disponibles para este lenguaje y sin
el uso de un precompilador) puedan incluir sentencias SQL mediante lla-
madas a librerías.
Estas sentencias SQL se deben interpretar en tiempo de ejecución del
programa, a diferencia del SQL hospedado, que requería el uso de un pre-
compilador.
39
Bases de datos
Bases de datos
Fascículo No. 3
Semestre 5
La interfaz ODBC (Open Database Connectivity) define una librería de
funciones que permite a las aplicaciones acceder al SGBD utilizando el
SQL. Las rutinas SQL/CLI están fuertemente basadas en las características
de la interfaz ODBC, y gracias al trabajo desarrollado por SAG-X/Open
(SQL Access Group-X/Open), fueron añadidas al estándar ANSI/ISO
SQL92 desde 1995.
Las SQL/CLI son simplemente rutinas que llaman al DBMS para interpretar
las sentencias SQL que pide la aplicación. Desde el punto de vista del
DBMS, las SQL/CLI se pueden considerar, simplemente, como otras apli-
caciones.
En este Fasciculo hemos presentado las sentencias más utilizadas del len-
guaje estándar ANSI/ISO SQL92 de definición, manipulación y control de
bases de datos relacionales. Como ya hemos comentado en la introduc-
ción, el SQL es un lenguaje muy potente, y esto hace que existan más sen-
tencias y opciones de las que hemos explicado aquí. Sin embargo, no es
menos cierto que hemos visto más sentencias que las que algunos siste-
mas relacionales ofrecen actualmente. Hemos intentado seguir con la ma-
yor fidelidad el estándar, incluyendo comentarios sólo cuando en la mayor-
ía de los sistemas relacionales comerciales alguna operación se hacía de
forma distinta.
Conociendo el SQL92 podemos trabajar con cualquier sistema relacional
comercial; sólo tendremos que dedicar unas cuantas horas a ver qué va-
riaciones se dan con respecto al estándar.
Recordemos cómo será la creación de una base de datos con SQL:
40
Bases de datos
Bases de datos
Fascículo No. 3
Semestre 5
1) En primer lugar, tendremos que dar nombre a la base de datos, con la
sentencia CREATE DATABASE, si la hay, o con CREATE SCHEMA.
2) A continuación definiremos las tablas, los dominios, las aserciones y las
vistas que formarán nuestra base de datos.
3) Una vez definidas las tablas, que estarán completamente vacías, se de-
berán llenar con la sentencia INSERT INTO.
Cuando la base de datos tenga un conjunto de filas, la podremos manipu-
lar, ya sea actualizando filas o bien haciendo consultas.
Además, podemos usar todas las sentencias de control que hemos expli-
cado.
Elmasri, Ramez y Navathe Shamkant B. Sistemas de Bases de Datos:
Conceptos Fundamentales. Addison-Wesley.
Chen, Peter. The Entity-Relationship Model-Toward a Unified View of Data.
ACM Transactions on Data Base Systems. Vol. 1, Number 1, 1976
J.C. Date. Introducción a los sistemas de Base de Datos. Volumen 1. Quin-
ta Edición. (Texto Guía)
Ullman, J.D.; Widom, J. "Introducción a los Sistemas de Bases de Datos".
Prentice Hall.
Antes de Implementar una base de datos relacional sobre un DBMS es im-
portante contar con una definición detallada de la mismas basada en un
diseño que represente el modelo del problema que queremos solucionar,
el siguiente fascículo se enfocara en las metodologías y herramientas que
nos permiten generar diseños de bases de datos cumpliendo con los
estándares establecidos.
41
Bases de datos
Bases de datos
Fascículo No. 3
Semestre 5
SeguimientoalautoaprendizajeSeguimientoalautoaprendizajeSeguimientoalautoaprendizaje
Bases de datos - Fascículo No. 3
Nombre_______________________________________________________
Apellidos ________________________________ Fecha: _________________
Ciudad___________________________________Semestre: _______________
1. Dadas las siguientes tablas:
 Personas (DNI, nombre, apellidos, dirección, ciudad, país)
 Carros(matricula, marca, modelo, color, conductor, seguro)
 Seguros(numero, compañía, tipo, franquicia, tomador, fecha)
Con las siguientes relaciones:



Y las siguientes restricciones:
 Carros.Seguro es un campo obligatorio
 Seguros.Tipo debe tomar por defecto el valor “Terceros”
Realizar en SQL los siguientes ejercicios:
 Crear las tablas tal y como se haría en SQL y, una vez creadas:
a. Agregar a la tabla Personas la columna sexo de un solo carácter.
b. Agregar a la tabla Carros la columna potencia de tipo entero.
2. Dar un ejemplo de inserción en cada una de las tablas.
3. Seleccionar, alfabéticamente, el nombre de todas las personas que viven
en ciudades cuyo nombre empieza por A.
4. Seleccionar las compañías de seguros que aseguran carros de la marca
“FIAT”.
5. Devolver, para cada compañía de seguros, la cantidad de carros asegura-
dos que tengan más de 100 CC.
6. Seleccionar el modelo de los carros que tienen una potencia superior que
cualquier carro asegurado por la compañía “AS S.A.”

Más contenido relacionado

DOCX
ODP
PRESENTACIÓN SQL
PDF
6. sql structured query language
PDF
6. SQL structured query language
DOCX
SQL (Structured Query Language): Informe de Lectura Unidad 3
PDF
Base de datos laboratorio
PPSX
Lenguaje sql
DOCX
Base de datos1024
PRESENTACIÓN SQL
6. sql structured query language
6. SQL structured query language
SQL (Structured Query Language): Informe de Lectura Unidad 3
Base de datos laboratorio
Lenguaje sql
Base de datos1024

Similar a Base datos f03 (20)

PDF
Base de datos
PDF
6. sql structured query language
PDF
6. sql structured query language
PDF
6. sql structured query language2
PDF
6. sql structured query language
PDF
6. sql structured query language
PDF
6. sql structured query language
PDF
6 150113092523-conversion-gate01
PDF
6. sql structured query language
PDF
6. sql structured query language
PDF
6. sql structured query language
PDF
6. sql structured query language
PDF
Base de datos de la unp es facil no te compliques
PDF
POOABD (POO Aplicada a B Datos) - RDBMS parte 2 -2020
PPTX
Clase de investigacion presentacion 1
PDF
TEMA3-SQL-(PARTE 1).pdf
PPSX
Características de las 5 Base de Datos más importantes
DOC
unidad 3 de bases de datos (1) ya arre-
PPTX
introduccion a sql
Base de datos
6. sql structured query language
6. sql structured query language
6. sql structured query language2
6. sql structured query language
6. sql structured query language
6. sql structured query language
6 150113092523-conversion-gate01
6. sql structured query language
6. sql structured query language
6. sql structured query language
6. sql structured query language
Base de datos de la unp es facil no te compliques
POOABD (POO Aplicada a B Datos) - RDBMS parte 2 -2020
Clase de investigacion presentacion 1
TEMA3-SQL-(PARTE 1).pdf
Características de las 5 Base de Datos más importantes
unidad 3 de bases de datos (1) ya arre-
introduccion a sql
Publicidad

Último (20)

PDF
Electricidad-Estatica-Peligros-Prevencion.pdf
PPTX
NILS actividad 4 PRESENTACION.pptx pppppp
PDF
Módulo-de Alcance-proyectos - Definición.pdf
PDF
manual-electricidad-automotriz-sistemas-electricos-bateria-alumbrado-iluminac...
PDF
SEC formula cargos al Consejo Directivo del Coordinador y a ocho eléctricas p...
DOCX
CONCEPTOS BASICOS DE LA PROGRAMACION STEP
PDF
Estrategias de apoyo de tecnología 2do periodo pdf
PDF
Sugerencias Didacticas 2023_Diseño de Estructuras Metalicas_digital.pdf
PDF
HISTORIA DE LA GRÚAA LO LARGO DE LOS TIEMPOSpdf
PDF
1132-2018 espectrofotometro uv visible.pdf
PPTX
MODULO 2. METODOLOGIAS PARA ANALISIS DE RIESGOS 2da Parte.pptx
PPTX
MARITIMO Y LESGILACION DEL MACO TRANSPORTE
PPTX
Contexto Normativo NSR10, presentacion 2025
PDF
Oficio SEC de formulación de cargos por el apagón del 25F en contra del CEN
PDF
SUBDIVISIÓN URBANA PUEDE ENFRENTAR SERVIDUMBRE DE PASO.pdf
PDF
Durabilidad del concreto en zonas costeras
PPT
tema DISEÑO ORGANIZACIONAL UNIDAD 1 A.ppt
PPTX
clase MICROCONTROLADORES ago-dic 2019.pptx
PDF
Copia de Presentación Propuesta de Marketing Corporativo Blanco y Negro.pdf
PPT
PRIMEROS AUXILIOS EN EL SECTOR EMPRESARIAL
Electricidad-Estatica-Peligros-Prevencion.pdf
NILS actividad 4 PRESENTACION.pptx pppppp
Módulo-de Alcance-proyectos - Definición.pdf
manual-electricidad-automotriz-sistemas-electricos-bateria-alumbrado-iluminac...
SEC formula cargos al Consejo Directivo del Coordinador y a ocho eléctricas p...
CONCEPTOS BASICOS DE LA PROGRAMACION STEP
Estrategias de apoyo de tecnología 2do periodo pdf
Sugerencias Didacticas 2023_Diseño de Estructuras Metalicas_digital.pdf
HISTORIA DE LA GRÚAA LO LARGO DE LOS TIEMPOSpdf
1132-2018 espectrofotometro uv visible.pdf
MODULO 2. METODOLOGIAS PARA ANALISIS DE RIESGOS 2da Parte.pptx
MARITIMO Y LESGILACION DEL MACO TRANSPORTE
Contexto Normativo NSR10, presentacion 2025
Oficio SEC de formulación de cargos por el apagón del 25F en contra del CEN
SUBDIVISIÓN URBANA PUEDE ENFRENTAR SERVIDUMBRE DE PASO.pdf
Durabilidad del concreto en zonas costeras
tema DISEÑO ORGANIZACIONAL UNIDAD 1 A.ppt
clase MICROCONTROLADORES ago-dic 2019.pptx
Copia de Presentación Propuesta de Marketing Corporativo Blanco y Negro.pdf
PRIMEROS AUXILIOS EN EL SECTOR EMPRESARIAL
Publicidad

Base datos f03

  • 2. Bases de datos Semestre 5 Bases de datos
  • 3. Bases de datos Semestre 5 Tabla de contenido Página Introducción 1 Conceptos previos 1 Mapa conceptual Fascículo 3 2 Logros 2 El Lenguaje SQL 3 Sentencias de definición 5 Creación y borrado de una base de datos relacional 6 Creación de tablas 8 Modificación y borrado de tablas 11 Creación y borrado de vistas 12 Definición de la base de datos relacional 14 Sentencias de manipulación 16 Inserción de filas en una tabla 16 Borrado de filas de una tabla 17 Modificación de filas de una tabla 18 Introducción de filas en la base de datos relacional 19 Consultas a una base de datos relacional 20 Sentencias de control 33 Las transacciones 33 Las autorizaciones y desautorizaciones 35 Sublenguajes especializados 36 SQL hospedado 36 Las SQL/CLI 38 Resumen 39 Bibliografía recomendada 40 Nexo 40 Seguimiento al autoaprendizaje 41 Créditos: 3 Tipo de asignatura: Teórico – Práctica
  • 4. Bases de datos Semestre 5 Bases de datos Copyright©2008 FUNDICIÓN UNIVERSITARIA SAN MARTÍN Facultad de Universidad Abierta y a Distancia, “Educación a Través de Escenarios Múltiples” Bogotá, D.C. Prohibida la reproducción total o parcial sin autorización por escrito del Presidente de la Fundación. La redacción de este fascículo estuvo a cargo de JOHN FREDY ROJAS Docente tutor – Programa de Ingeniería de Sistemas a Distancia. Sede Bogotá, D.C. Corrección de estilo ADRIANA RODRÍGUEZ V. Diseño gráfico y diagramación a cargo de SANTIAGO BECERRA SÁENZ ORLANDO DÍAZ CÁRDENAS Impreso en: GRÁFICAS SAN MARTÍN Calle 61A No. 14-18 - Tels.: 2350298 - 2359825 Bogotá, D.C., Noviembre de 2011
  • 5. 1 Fascículo No. 3 Semestre 5 Bases de datos Bases de datos Introducción El SQL es el lenguaje estándar ANSI/ISO de definición, manipulación y control de bases de datos relacionales. Es un lenguaje declarativo: sólo hay que indicar qué se quiere hacer. En cambio, en los lenguajes proce- dimentales es necesario especificar cómo hay que hacer cualquier acción sobre la base de datos. El SQL es un lenguaje muy parecido al lenguaje natural; concretamente, se parece al inglés, y es muy expresivo. Por estas razones, y como lenguaje estándar, el SQL es un lenguaje con el que se puede acceder a todos los sistemas relacionales comerciales. Conceptos previos Para una correcta comprensión de este fascículo es importante que el es- tudiante tenga claro los conceptos del modelo relacional y álgebra relacio- nal vistos en el fascículo anterior, debe recordar que el modelo relacional y el álgebra relacional es un lenguaje procedimental que permitirá entender las relaciones entre las tablas de una base de datos, para de esta forma realizar las consultas requeridas por los usuarios.
  • 6. 2 Bases de datos Bases de datos Fascículo No. 3 Semestre 5 Mapa conceptual fascículo 3 Al finalizar el estudio del presente fascículo, el estudiante estará en capacidad de:  Conocer el lenguaje estándar ANSI/ISO SQL92.  Definir una base de datos relacional, incluyendo dominios, aserciones y Vis- tas.  Saber introducir, borrar y modificar datos.  Ser capaz de plantear cualquier tipo de consulta a la base de datos.  Saber utilizar sentencias de control.  Conocer los principios básicos de la utilización del SQL desde un lenguaje de programación. LogrosLogrosLogros
  • 7. 3 Bases de datos Bases de datos Fascículo No. 3 Semestre 5 El Lenguaje SQL Empezamos con una breve explicación de la forma en que el SQL ha lle- gado a ser el lenguaje estándar de las bases de datos relacionales: 1) Al principio de los años setenta, los laboratorios de investigación Santa Teresa de IBM empezaron a trabajar en el proyecto System R. El objeti- vo de este proyecto era implementar un prototipo de DBMS relacional; por lo tanto, también necesitaban investigar en el campo de los lengua- jes de bases de datos relacionales. A mediados de los años setenta, el proyecto de IBM dio como resultado un primer lenguaje denominado SEQUEL (Structured English Query Language), que por razones legales se denominó más adelante SQL (Structured Query Language). Al final de la década de los setenta y al principio de la de los ochenta, una vez finalizado el proyecto System R, IBM y otras empresas empeza- ron a utilizar el SQL en sus DBMS relacionales, con lo que este lenguaje adquirió una gran popularidad. 2) En 1982, ANSI (American National Standards Institute) encargó a uno de sus comités (X3H2) la definición de un lenguaje de bases de datos relacionales. Este comité, después de evaluar diferentes lenguajes, y an- te la aceptación comercial del SQL, eligió un lenguaje estándar que es- taba basado en éste prácticamente en su totalidad. El SQL se convirtió oficialmente en el lenguaje estándar de ANSI en el año 1986, y de ISO (International Standards Organization) en 1987. También ha sido adop- tado como lenguaje estándar por FIPS (Federal Information Processing Standard), Unix X/Open y SAA (Systems Application Architecture) de IBM.
  • 8. 4 Bases de datos Bases de datos Fascículo No. 3 Semestre 5 3) En el año 1989, el estándar fue objeto de una revisión y una ampliación que dieron lugar al lenguaje que se conoce con el nombre de SQL1 o SQL89. En el año 1992 el estándar volvió a ser revisado y ampliado considerable- mente para cubrir carencias de la versión anterior. Esta nueva versión del SQL, que se conoce con el nombre de SQL2 o SQL92, es la que nosotros presentaremos en este fascículo. Se pueden distinguir tres niveles dentro del SQL92: 1) El nivel introductorio (entry), que incluye el SQL89 y las definiciones de clave primaria y clave foránea al crear una tabla. 2) El nivel intermedio (intermediate), que, además del SQL89, añade algu- nas ampliaciones del SQL92. 3) El nivel completo (full), que ya tiene todas las ampliaciones del SQL92. El modelo relacional tiene como estructura de almacenamiento de los da- tos las relaciones. La intensión o esquema de una relación consiste en el nombre que hemos dado a la relación y un conjunto de atributos. La extensión de una relación es un conjunto de tuplas. Al trabajar con SQL, esta nomenclatura cambia, como podemos apreciar en la siguiente figu- ra: SQL – Modelo Relacional
  • 9. 5 Bases de datos Bases de datos Fascículo No. 3 Semestre 5 Una vista en el modelo rela- cional no es sino una tabla virtual derivada de las tablas reales de nuestra base de datos, un esquema externo puede ser un conjunto de vistas. Se hablara de tablas en lugar de relaciones, de columnas en lugar de atri- butos, de filas en lugar de tuplas. Sin embargo, a pesar de que la nomenclatura utilizada sea diferente, los conceptos son los mismos. Con el SQL se puede definir, manipular y controlar una base de datos rela- cional. Sentencias de definición Para poder trabajar con bases de datos relacionales, lo primero que tene- mos que hacer es definirlas. Veremos las órdenes del estándar SQL92 para crear y borrar una base de datos relacional y para insertar, borrar y modifi- car las diferentes tablas que la componen. A continuación también veremos cómo se definen los dominios, las aser- ciones (restricciones) y las vistas. La sencillez y la homogeneidad del SQL92 hacen que: 1) Para crear bases de datos, tablas, dominios, aserciones y vistas se utili- ce la sentencia CREATE. 2) Para modificar tablas y dominios se utilice la sentencia ALTER. 3) Para borrar bases de datos, tablas, dominios, aserciones y vistas se uti- lice la sentencia DROP. La adecuación de estas sentencias a cada caso nos dará diferencias que iremos perfilando al hacer la descripción individual de cada una. Para ilustrar la aplicación de las sentencias de SQL que veremos, utiliza- remos una base de datos de ejemplo muy sencilla de una pequeña em- presa con sede en Barcelona, Girona, Lleida y Tarragona, que se encarga de desarrollar proyectos informáticos. La información que nos interesará
  • 10. 6 Bases de datos Bases de datos Fascículo No. 3 Semestre 5 almacenar de esta empresa, que denominaremos BDFUSM, será la si- guiente: 1) Sobre los empleados que trabajan en la empresa, queremos saber su código de empleado, el nombre y apellido, el sueldo, el nombre y la ciudad de su departamento y el número de proyecto al que están asig- nados. 2) Sobre los diferentes departamentos en los que está estructurada la em- presa, nos interesa conocer su nombre, la ciudad donde se encuentran y el teléfono. Será necesario tener en cuenta que un departamento con el mismo nombre puede estar en ciudades diferentes, y que en una misma ciudad puede haber departamentos con nombres diferentes. 3) Sobre los proyectos informáticos que se desarrollan, querremos saber su código, el nombre, el precio, la fecha de inicio, la fecha prevista de finalización, la fecha real de finalización y el código de cliente para quien se desarrolla. 4) Sobre los clientes para quien trabaja la empresa, querremos saber el código de cliente, el nombre, el NIF, la dirección, la ciudad y el teléfono. Creación y borrado de una base de datos relacional El estándar SQL92 no dispone de ninguna sentencia de creación de bases de datos. La idea es que una base de datos no es más que un conjunto de tablas y, por lo tanto, las sentencias que nos ofrece el SQL92 se concen- tran en la creación, la modificación y el borrado de estas tablas. En cambio, se dispone de una sentencia más potente que la de creación de bases de datos: la sentencia de creación de esquemas denominada CREATE SCHEMA.
  • 11. 7 Bases de datos Bases de datos Fascículo No. 3 Semestre 5 Muchos de los sistemas relacionales comerciales (como ocurre en el caso de Informix, DB2, SQL Server y otros) han incorporado sen- tencias de creación de bases de datos con la siguiente sintaxis: CREATE DATABASE y para el borrado DROP DATABASE Con la creación de esquemas podemos agrupar un conjunto de elementos de la base de datos que son propiedad de un usuario. La sintaxis de esta sentencia es la siguiente: CREATE SCHEMA {[nombre_esquema]} | [AUTHORIZATION usua- rio]} [lista_de_elementos_del_esquema]; La nomenclatura utilizada en la sentencia es la siguiente:  Las palabras en negrita son palabras reservadas del lenguaje.  La notación [...] quiere decir que lo que hay entre los corchetes se podr- ía poner o no.  La notación {A| ... |B} quiere decir que tenemos que elegir entre todas las opciones que hay entre las llaves, pero debemos poner una obliga- toriamente. La sentencia de creación de esquemas hace que varias tablas (lis- ta_de_elementos_del_esquema) se puedan agrupar bajo un mismo nom- bre (nombre_esquema) y que tengan un propietario (usuario). Aunque todos los parámetros de la sentencia CREATE SCHEMA son opcionales, como mínimo se debe dar o bien el nombre del esquema, o bien el nom- bre del usuario propietario de la base de datos. Si sólo especificamos el usuario, éste será el nombre del esquema. La creación de esquemas puede hacer mucho más que agrupar tablas, porque lista_de_elementos_del_esquema puede, además de tablas, ser también dominios, vistas, privilegios y restricciones, entre otras cosas. Para borrar una base de datos encontramos el mismo problema que para crearla. El estándar SQL92 sólo nos ofrece la sentencia de borrado de esquemas DROP SCHEMA, que presenta la siguiente sintaxis:
  • 12. 8 Bases de datos Bases de datos Fascículo No. 3 Semestre 5 DROP SCHEMA nombre_esquema {RESTRICT|CASCADE}; Donde tenemos lo siguiente: • La opción de borrado de esquemas RESTRICT hace que el esquema sólo se pueda borrar si no contiene ningún elemento. • La opción CASCADE borra el esquema aunque no esté completamente vacío. Creación de tablas La estructura de almacenamiento de los datos del modelo relacional son las tablas. Para crear una tabla, es necesario utilizar la sentencia CREATE TABLE. Cuyo formato es: CREATE TABLE nombre_tabla ( definición_columna [, definición_columna...] [, restricciones_tabla] ); Donde definición_columna es: nombre_columna {tipo_datos|dominio} [def_defecto] [restric_col] El proceso que hay que seguir para crear una tabla es el siguiente: • Lo primero que tenemos que hacer es decidir qué nombre queremos poner a la tabla (nombre_tabla). • Después, iremos dando el nombre de cada uno de los atributos que formarán las columnas de la tabla (nombre_columna). • A cada una de las columnas le asignaremos un tipo de datos predefini- do o bien un dominio definido por el usuario. También podremos dar definiciones por defecto y restricciones de columna. • Una vez definidas las columnas, sólo nos quedará dar las restricciones de tabla.
  • 13. 9 Bases de datos Bases de datos Fascículo No. 3 Semestre 5 Para cada columna tenemos que elegir entre algún dominio definido por el usuario o alguno de los tipos de datos predefinidos que se describen a continuación: Algunos ejemplos de asignaciones de columnas en los tipos de datos pre- definidos son: DATE, TIME y TIMESTAMP: • La columna fecha_nacimiento podría ser del tipo DATE y podría tener como valor „1978-12-25‟. • La columna inicio_partido podría ser del tipo TIME y podría tener como valor „17:15:00.000000‟. • La columna entrada_trabajo podría ser de tipo TIMESTAMP y podría te- ner como valor „1998-7-8 9:30:05‟.
  • 14. 10 Bases de datos Bases de datos Fascículo No. 3 Semestre 5 Creación, modificación y borrado de dominios Además de los dominios dados por el tipo de datos predefinidos, el SQL92 nos ofrece la posibilidad de trabajar con dominios definidos por el usuario. Para crear un dominio es necesario utilizar la sentencia CREATE DOMAIN: CREATE DOMAIN nombre dominio [AS] tipos_datos [def_defecto] [restricciones_dominio]; Donde restricciones_dominio tiene el siguiente formato: [CONSTRAINT nombre_restricción] CHECK (condiciones) Si quisiéramos definir un dominio para las ciudades donde se encuentran los departamentos de la empresa BDFUSM, haríamos: CREATE DOMAIN dom_ciudades AS CHAR (20) CONSTRAINT ciudades_validas CHECK (VALUE IN (‘Barcelona’, ‘Tarragona’, ‘Lleida’, ‘Girona’)); De este modo, cuando definimos la columna ciudades dentro de la tabla departamentos no se tendrá que decir que es de tipo CHAR (20), sino de tipo dom_ciudades. Esto nos debería asegurar, según el modelo relacio- nal, que sólo haremos operaciones sobre la columna ciudades con otras columnas que tengan este mismo dominio definido por el usuario; sin em- bargo, el SQL92 no nos ofrece herramientas para asegurar que las compa- raciones que hacemos sean entre los mismos dominios definidos por el usuario. Para borrar un dominio definido por el usuario es preciso utilizar la senten- cia DROP DOMAIN, que tiene este formato: En este caso, tenemos que: • La opción de borrado de dominios RESTRICT hace que el dominio sólo se pueda borrar si no se utiliza en ningún sitio.
  • 15. 11 Bases de datos Bases de datos Fascículo No. 3 Semestre 5 • La opción CASCADE borra el dominio aunque esté referenciado, y pone el tipo de datos del dominio allí donde se utilizaba. Para modificar un dominio semántico es necesario utilizar la sentencia AL- TER DOMAIN. Cuyo su formato es: ALTER DOMAIN nombre_dominio {acción_modificar_dominio| acción_modif_restricción_dominio}; Restricciones de columna En cada una de las columnas de la tabla, una vez les hemos dado un nombre y hemos definido su dominio, podemos imponer ciertas restriccio- nes que siempre se tendrán que cumplir. Las restricciones que se pueden dar son las que aparecen en la tabla que tenemos a continuación: Restricciones de Columna Modificación y borrado de tablas Para modificar una tabla es preciso utilizar la sentencia ALTER TABLE. De acuerdo al siguiente formato: ALTER TABLE nombre_tabla {acción_modificar_columna| acción_modif_restricción_tabla}; En este caso, tenemos que: • acción_modificar_columna puede ser:
  • 16. 12 Bases de datos Bases de datos Fascículo No. 3 Semestre 5 {ADD [COLUMN] columna def_columna | ALTER [COLUMN] columna {SET def_defecto|DROP DEFAULT}| DROP [COLUMN ] columna {RESTRICT|CASCADE}} • acción_modif_restricción_tabla puede ser: {ADD restricción| DROP CONSTRAINT restricción {RESTRICT|CASCADE}} Si queremos modificar una tabla es que queremos realizar una de las si- guientes operaciones: 1) Añadirle una columna (ADD columna). 2) Modificar las definiciones por defecto de la columna (ALTER columna). 3) Borrar la columna (DROP columna). 4) Añadir alguna nueva restricción de tabla (ADD restricción). 5) Borrar alguna restricción de tabla (DROPCONSTRAINT restricción). Para borrar una tabla es preciso utilizar la sentencia DROP TABLE: DROP TABLE nombre_tabla {RESTRICT|CASCADE}; En este caso tenemos que: • Si utilizamos la opción RESTRICT, la tabla no se borrará si está referen- ciada, por ejemplo, por alguna vista. • Si usamos la opción CASCADE, todo lo que referencie a la tabla se bo- rrará con ésta. Creación y borrado de vistas La arquitectura ANSI/SPARC distingue tres niveles, que se describen en el esquema conceptual, el esquema interno y los esquemas externos. Hasta ahora, mientras creábamos las tablas de la base de datos, íbamos describiendo el esquema conceptual. Para describir los diferentes esque- mas externos utilizamos el concepto de vista del SQL.
  • 17. 13 Bases de datos Bases de datos Fascículo No. 3 Semestre 5 Para crear una vista es necesario utilizar la sentencia CREATE VIEW. El formato utilizado es: CREATE VIEW nombre_vista [(lista_columnas)] AS (consulta) [WITH CHECK OPTION]; Lo primero que tenemos que hacer para crear una vista es decidir qué nombre le queremos poner (nombre_vista). Si queremos cambiar el nom- bre de las columnas, o bien poner nombre a alguna que en principio no tenía, lo podemos hacer en lista_columnas. Y por último definir la consul- ta que formará nuestra vista. Las vistas no existen realmente como un conjunto de valores almacenados en la base de datos, sino que son tablas ficticias, denominadas derivadas (no materializadas). Se construyen a partir de tablas reales (materializadas) almacenadas en la base de datos, y conocidas con el nombre de tablas básicas (o tablas de base). La no-existencia real de las vistas hace que puedan ser actualizables o no. Si tuviésemos las siguientes tablas: Tabla clientes: Tabla proyectos:
  • 18. 14 Bases de datos Bases de datos Fascículo No. 3 Semestre 5 Antes de crear una tabla con una o más claves foráneas, se deben haber creado las tablas que tienen como clave primaria las referen- ciadas por las foráneas. Si creamos una vista sobre la base de datos BDFUSM que nos dé para cada cliente el número de proyectos que tiene encargados el cliente en cuestión. CREATE VIEW proyectos_por_cliente (codigo_cli, nume- ro_proyectos) AS (SELECT c.codigo_cli, COUNT(*) FROM proyectos p, clientes c WHERE p.codigo_cliente = c.codigo_cli GROUP BY c.codigo_cli); Si miramos la extensión de la vista proyectos_por_clientes, veríamos co- mo resultado. Para borrar una vista es preciso utilizar la sentencia DROP VIEW, que pre- senta el formato: DROP VIEW nombre_vista (RESTRICT|CASCADE); Si utilizamos la opción RESTRICT, la vista no se borrará si está referencia- da, por ejemplo, por otra vista. En cambio, si ponemos la opción CASCA- DE, todo lo que referencie a la vista se borrará con ésta. Definición de la base de datos relacional Veamos cómo se crearía la base de datos BDFUSM, utilizando, por ejem- plo, un DBMS relacional que disponga de la sentencia CREATE DATABA-
  • 19. 15 Bases de datos Bases de datos Fascículo No. 3 Semestre 5 SE: CREATE DATABASE bdfusm; CREATE TABLE clientes (codigo_cli INTEGER, nombre_cli CHAR(30) NOT NULL, nif CHAR (12), direccion CHAR (30), ciudad CHAR (20), telefono CHAR (12), PRIMARY KEY (codigo_cli), UNIQUE(nif) ); CREATE TABLE departamentos (nombre_dep CHAR(20), ciudad_dep CHAR(20), telefono INTEGER DEFAULT NULL, PRIMARY KEY (nombre_dep, ciudad_dep) ); CREATE TABLE proyectos (codigo_proyec INTEGER, nombre_proyec CHAR(20), precio REAL, fecha_inicio DATE, fecha_prev_fin DATE, fecha_fin DATE DEFAULT NULL, codigo_cliente INTEGER, PRIMARY KEY (codigo_proyec), FOREIGN KEY codigo_cliente REFERENCES clientes (codigo_cli), CHECK (fecha_inicio < fecha_prev_fin), CHECK (fecha_inicio < fecha_fin) ); CREATE TABLE empleados (codigo_empl INTEGER, nombre_empl CHAR (20), apellido_empl CHAR(20), sueldo REAL CHECK (sueldo > 7000), nombre_dep CHAR(20) ciudad_dep CHAR(20), num_proyec INTEGER, PRIMARY KEY (codigo_empl), FOREIGN KEY (nombre_dep, ciudad_dep) REFERENCES departamentos (nombre_dep, ciudad_dep), FOREIGN KEY (num_proyec) REFERENCES proyectos (codi- go_proyec)
  • 20. 16 Bases de datos Bases de datos Fascículo No. 3 Semestre 5 Inserción de múltiples filas: Para insertar más de una fila con una sola sentencia, tenemos que obtener los valores como resultado de una consulta realizada en unao más tablas. ); COMMIT; Al crear una tabla vemos que muchas restricciones se pueden imponer de dos formas: como restricciones de columna o como restricciones de tabla. Por ejemplo, cuando queremos decir cuál es la clave primaria de una tabla, tenemos las dos posibilidades. Esto se debe a la flexibilidad del SQL: • En el caso de que la restricción haga referencia a un solo atributo, po- demos elegir la posibilidad que más nos guste. • En el caso de la tabla departamentos, tenemos que elegir por fuerza la opción de restricciones de tabla, porque la clave primaria está com- puesta por más de un atributo. En general, lo pondremos todo como restricciones de tabla, excepto NOT NULL y CHECK cuando haga referencia a una sola columna. Sentencias de manipulación Una vez creada la base de datos con sus tablas, debemos poder insertar, modificar y borrar los valores de las filas de las tablas. Para poder hacer esto, el SQL92 nos ofrece las siguientes sentencias: INSERT para insertar, UPDATE para modificar y DELETE para borrar. Una vez hemos insertado valores en nuestras tablas, tenemos que poder consultarlos. La sentencia para hacer consultas a una base de datos con el SQL92 es SELECT FROM. A continuación veremos estas consultas. Inserción de filas en una tabla Antes de poder consultar los datos de una base de datos, es preciso intro- ducirlos con la sentencia INSERT INTO VALUES, que tiene el formato: INSERT INTO nombre_tabla [(columnas)] {VALUES ({v1|DEFAULT|NULL}, ..., {vn/DEFAULT/NULL})|<consulta>};
  • 21. 17 Bases de datos Bases de datos Fascículo No. 3 Semestre 5 Los valores v1, v2, ..., vn se deben corresponder exactamente con las co- lumnas que hemos dicho que tendríamos con el CREATE TABLE y deben estar en el mismo orden, a menos que las volvamos a poner a continua- ción del nombre de la tabla. En este último caso, los valores se deben dis- poner de forma coherente con el nuevo orden que hemos impuesto. Podr- ía darse el caso de que quisiéramos que algunos valores para insertar fue- sen valores por omisión, definidos previamente con la opción DEFAULT. Entonces pondríamos la palabra reservada DEFAULT. Si se trata de intro- ducir valores nulos, también podemos utilizar la palabra reservada NULL. Ejemplo: La forma de insertar a un cliente en la tabla clientes de la base de datos de BDFUSM es: INSERT INTO clientes VALUES (10, ‘ECIGSA’, ‘37.248.573-C’, ‘ARAGON 242’, ‘Barcelona’, DEFAULT); o bien: INSERT INTO clientes(nif, nombre_cli, codigo_cli, telefono, direc- cion, ciudad) VALUES (‘37.248.573-C’, ‘ECIGSA’, 10, DEFAULT, ‘ARAGON 242’, ‘Barcelona’); Borrado de filas de una tabla Para borrar valores de algunas filas de una tabla podemos utilizar la sen- tencia DELETE FROM WHERE. Su formato es el siguiente: DELETE FROM nombre_tabla [WHERE condiciones];
  • 22. 18 Bases de datos Bases de datos Fascículo No. 3 Semestre 5 En cambio, si lo que quisiéramos conseguir es borrar todas las filas de una tabla, entonces sólo tendríamos que poner la sentencia DELETE FROM, sin WHERE. Ejemplo: Podemos dejar la tabla proyectos sin ninguna fila: DELETE FROM proyectos; En nuestra base de datos, borrar los proyectos del cliente 2 se haría de la siguiente forma: DELETE FROM proyectos WHERE codigo_cliente = 2; Modificación de filas de una tabla Si quisiéramos modificar los valores de algunas filas de una tabla, tendría- mos que utilizar la sentencia UPDATE SET WHERE. Con el siguiente for- mato: UPDATE nombre_tabla SET columna = {expresión|DEFAULT|NULL} [, columna = {expr|DEFAULT|NULL} ...] WHERE condiciones; Ejemplo: Supongamos que queremos incrementar el sueldo de todos los em- pleados del proyecto 2 en 1.000.000 de pesos. La modificación a ejecu- tar sería: UPDATE empleados SET sueldo = sueldo + 1000 WHERE num_proyec = 2;
  • 23. 19 Bases de datos Bases de datos Fascículo No. 3 Semestre 5 Introducción de filas en la base de datos relacional Antes de empezar a hacer consultas a la base de datos BDFUSM, debe- mos introducir unas cuantas filas en sus tablas con la sentencia INSERT INTO. De esta forma, podremos ver reflejado el resultado de las consultas que iremos haciendo, a partir de este momento, sobre cada extensión; es- to lo podemos observar en las tablas correspondientes a cada extensión, que presentamos a continuación: Tabla departamentos: Tabla clientes:
  • 24. 20 Bases de datos Bases de datos Fascículo No. 3 Semestre 5 Tabla empleados: Tabla proyectos: 3.1 Realice las consultas INSER INTO necesarias para obtener que las ta- blas de nuestra base de datos contengan los datos que se presentan en las imágenes. Consultas a una base de datos relacional Para hacer consultas sobre una tabla con el SQL es preciso utilizar la sen- tencia SELECT FROM, que tiene el siguiente formato: SELECT nombre_columna_a_seleccionar [[AS] col_renombrada] [,nombre_columna_a_seleccionar [[AS] col_renombrada]...] FROM tabla_a_consultar [[AS] tabla_renombrada]; La opción AS nos permite renombrar las columnas que queremos selec- cionar o las tablas que queremos consultar que en este caso, es sólo una. Dicho de otro modo, nos permite la definición de alias. Fijémonos en que
  • 25. 21 Bases de datos Bases de datos Fascículo No. 3 Semestre 5 El * después de SELECT indica que queremos ver todos los atributos que apa- recen en la tabla. la palabra clave AS es opcional, y es bastante habitual poner sólo un es- pacio en blanco en lugar de toda la palabra. Ejemplo: A continuación presentamos un ejemplo de consulta a la base de datos BDFUSM para conocer todos los datos que aparece en la tabla clientes: SELECT * FROM clientes; La respuesta a esta consulta sería: Si hubiésemos querido ver sólo el código, el nombre, la dirección y la ciu- dad, la consulta seria: SELECT codigo_cli, nombre_cli, direccion, ciudad FROM clientes; Y obtendríamos:
  • 26. 22 Bases de datos Bases de datos Fascículo No. 3 Semestre 5 Con la sentencia SELECT FROM podemos seleccionar columnas de una tabla, pero para seleccionar filas de una tabla es preciso añadirle la cláusu- la WHERE. El formato es: SELECT nombre_columnas_a_seleccionar FROM tabla_a_consultar WHERE condiciones; La cláusula WHERE nos permite obtener las filas que cumplen la condición especificada en la consulta. Ejemplo: Solicitamos “los códigos de los empleados que trabajan en el proyecto número 4”: SELECT codigo_empl FROM empleados WHERE num_proyec = 4; La respuesta a esta consulta seria: Para definir las condiciones en la cláusula WHERE, podemos utilizar algu- no de los operadores de los que dispone el SQL, que son los siguientes:
  • 27. 23 Bases de datos Bases de datos Fascículo No. 3 Semestre 5 Si queremos que en una consulta nos aparezcan las filas resultantes sin repeticiones, es preciso poner la palabra clave DISTINCT inmediatamente después de SELECT. También podríamos explicitar que lo queremos todo, incluso con repeticiones, poniendo ALL (opción por defecto) en lugar de DISTINCT. El formato de DISTINCT es: SELECT DISTINCT nombre_columnas_a_seleccionar FROM tabla_a_consultar [WHERE condiciones]; Ejemplo Si quisiéramos ver qué sueldos se están pagando en nuestra empresa, podríamos hacer: SELECT DISTINCT sueldo FROM empleados;
  • 28. 24 Bases de datos Bases de datos Fascículo No. 3 Semestre 5 Con lo cual obtendríamos: Funciones de agregación El SQL nos ofrece las siguientes funciones de agregación para efectuar varias operaciones sobre los datos de una base de datos: En general, las funciones de agregación se aplican a una columna, excep- to la función de agregación COUNT, que normalmente se aplica a todas las columnas de la tabla o tablas seleccionadas. Por lo tanto, COUNT (*) contará todas las filas de la tabla o las tablas que cumplan las condiciones. Si se utilizase COUNT(distinct columna), sólo contaría los valores que no fuesen nulos ni repetidos, y si se utilizase COUNT (columna), sólo contaría los valores que no fuesen nulos.
  • 29. 25 Bases de datos Bases de datos Fascículo No. 3 Semestre 5 3.2 Genere consultas que usen las distintas funciones de agregación. Subconsultas Una subconsulta es una consulta incluida dentro de una cláusula WHERE o HAVING de otra consulta. En ocasiones, para expresar ciertas condicio- nes no hay más remedio que obtener el valor que buscamos como resul- tado de una consulta. Si quisiéramos saber los códigos y los nombres de los proyectos de precio más elevado, en primer lugar tendríamos que encontrar los proyectos que tienen el precio más elevado. Lo haríamos de la forma siguiente: SELECT codigo_proyec, nombre_proyec FROM proyectos WHERE precio = (SELECT MAX(precio) FROM proyectos); El resultado sería: Otros predicados Predicado BETWEEN Para expresar una condición que quiere encontrar un valor entre unos lími- tes concretos, podemos utilizar BETWEEN: SELECT nombre_columnas_a_seleccionar FROM tabla_a_consultar WHERE columna BETWEEN límite1 AND límite2;
  • 30. 26 Bases de datos Bases de datos Fascículo No. 3 Semestre 5 Aunque _ y % son los carac- teres elegidos por el están- dar, cada sistema relacional comercial ofrece diversas variantes. Predicado IN Para comprobar si un valor coincide con los elementos de una lista utiliza- remos IN, y para ver si no coincide, NOT IN: SELECT nombre_columnas_a_seleccionar FROM tabla_a_consultar WHERE columna [NOT] IN (valor1, ..., valorN); Predicado LIKE Para comprobar si una columna de tipo carácter cumple alguna propiedad determinada, podemos usar LIKE: SELECT nombre_columnas_a_seleccionar FROM tabla_a_consultar WHERE columna LIKE característica; Los patrones del SQL92 para expresar características son los siguientes: a) Pondremos un carácter _ para cada carácter individual que queramos considerar. b) Pondremos un carácter % para expresar una secuencia de caracteres, que puede no estar formada por ninguno. Predicado IS NULL Para comprobar si un valor es nulo utilizaremos IS NULL, y para averiguar si no lo es, IS NOT NULL. El formato es: SELECT nombre_columnas_a_seleccionar FROM tabla_a_consultar WHERE columna IS [NOT] NULL; Predicados ANY/SOME y ALL Para ver si una columna cumple que todas sus filas (ALL) o algunas de sus filas (ANY/SOME) satisfagan una condición, podemos hacerlo con: SELECT nombre_columnas_a seleccionar
  • 31. 27 Bases de datos Bases de datos Fascículo No. 3 Semestre 5 FROM tabla_a_consultar WHERE columna operador_comparación {ALL|ANY|SOME}subconsulta; Predicado EXISTS Para comprobar si una subconsulta produce alguna fila de resultados, po- demos utilizar la sentencia denominada test de existencia: EXISTS. Para comprobar si una subconsulta no produce ninguna fila de resultados, po- demos utilizar NOT EXISTS. SELECT nombre_columnas_a_seleccionar FROM tabla_a_consultar WHERE [NOT] EXISTS subconsulta; Ordenación de los datos obtenidos en respuestas a consultas Si se desea que, al hacer una consulta, los datos aparezcan en un orden determinado, es preciso utilizar la cláusula ORDER BY en la sentencia SE- LECT, que presenta el siguiente formato: SELECT nombre_columnas_a seleccionar FROM tabla_a_consultar [WHERE condiciones] ORDER BY columna_según_la_cual_se_quiere_ordenar [DESC] [, col_ordenación [DESC]...]; Imaginemos que queremos consultar los nombres de los empleados orde- nados según el sueldo que ganan, y si ganan el mismo sueldo, ordenados alfabéticamente por el nombre: SELECT codigo_empl, nombre_empl, apellido_empl, sueldo FROM empleados ORDER BY sueldo, nombre_empl;
  • 32. 28 Bases de datos Bases de datos Fascículo No. 3 Semestre 5 Esta consulta daría la respuesta siguiente: Si no se especifica nada más, se seguirá un orden ascendente, pero si se desea seguir un orden descendente es necesario añadir DESC detrás de cada factor de ordenación expresado en la cláusula ORDER BY: ORDER BY columna_ordenación [DESC] [, columna [DESC] ...]; Consultas con agrupación de filas de una tabla Las cláusulas siguientes, añadidas a la instrucción SELECT FROM, permi- ten organizar las filas por grupos: a) La cláusula GROUP BY nos sirve para agrupar filas según las columnas que indique esta cláusula. b) La cláusula HAVING especifica condiciones de búsqueda para grupos de filas; lleva a cabo la misma función que antes cumplía la cláusula WHERE para las filas de toda la tabla, pero ahora las condiciones se aplican a los grupos obtenidos. Presenta el siguiente formato: SELECT nombre_columnas_a seleccionar FROM tabla_a_consultar [WHERE condiciones]
  • 33. 29 Bases de datos Bases de datos Fascículo No. 3 Semestre 5 GROUP BY columnas_según_las_cuales_se_quiere_agrupar [HAVING condiciones_por_grupos] [ORDER BY columna_ordenación [DESC] [, columna [DESC]...]]; Ejemplo SELECT nombre_dep, ciudad_dep, AVG(sueldo) AS sueldo_medio FROM empleados GROUP BY nombre_dep, ciudad_dep; El resultado de esta consulta sería: Consultas a más de una tabla Muchas veces queremos consultar datos de más de una tabla haciendo combinaciones de columnas de tablas diferentes. En el SQL es posible listar más de una tabla que se quiere consultar especificándolo en la cláu- sula FROM. 1) Combinación La combinación consigue crear una sola tabla a partir de las tablas especifica- das en la cláusula FROM, haciendo coincidir los valores de las columnas relacio- nadas de estas tablas.
  • 34. 30 Bases de datos Bases de datos Fascículo No. 3 Semestre 5 Ejemplo En el siguiente ejemplo con la base de datos BDFUSM queremos saber el NIF del cliente y el código y el precio del proyecto que desarrollamos para el cliente número 20: SELECT proyectos.codigo_proyecto, proyectos.precio, clientes.nif FROM clientes, proyectos WHERE clientes.codigo_cli = proyectos.codigo_cliente AND clien- tes. codigo_cli = 20; El resultado sería: Si trabajamos con más de una tabla, puede ocurrir que la tabla resultante tenga dos columnas con el mismo nombre. Por ello es obligatorio especifi- car a qué tabla corresponden las columnas a las que nos estamos refirien- do, denominando la tabla a la que pertenecen antes de ponerlas (por ejemplo, clientes.codigo_cli). Para simplificarlo, se utilizan los alias que, en este caso, se definen en la cláusula FROM. 2) Combinación natural La combinación natural (natural join) de dos tablas consiste básicamente, al igual que en el álgebra relacional, en hacer una equicombinación entre columnas del mismo nombre y eliminar las columnas repetidas. La combi- nación natural, utilizando el SQL92 intermedio o completo, se haría de la siguiente forma: SELECT nombre_columnas_a_seleccionar FROM tabla1 NATURAL JOIN tabla2 [WHERE condiciones];
  • 35. 31 Bases de datos Bases de datos Fascículo No. 3 Semestre 5 3) Combinación interna y externa Cualquier combinación puede ser interna o externa: a) La combinación interna (inner join) sólo se queda con las filas que tie- nen valores idénticos en las columnas de las tablas que compara. Esto puede hacer que perdamos alguna fila interesante de alguna de las dos tablas; por ejemplo, porque se encuentra a NULL en el momento de hacer la combinación. Su formato es el siguiente: SELECT nombre_columnas_a_seleccionar FROM t1 [NATURAL] [INNER] JOIN t2 {ON condiciones| |USING (columna [,columna...])} [WHERE condiciones]; b) Por ello disponemos de la combinación externa (outer join), que nos permite obtener todos los valores de la tabla que hemos puesto a la de- recha, los de la tabla que hemos puesto a la izquierda o todos los valo- res de las dos tablas. Su formato es: SELECT nombre_columnas_a_seleccionar FROM t1 [NATURAL] [LEFT|RIGHT|FULL] [OUTER] JOIN t2 {ON condiciones| [USING (columna [,columna...])} [WHERE condiciones]; 4) Combinaciones con más de dos tablas Si queremos combinar tres tablas o más con el SQL92 introductorio, sólo tenemos que añadir todas las tablas en el FROM y los vínculos necesarios en el WHERE. Si queremos combinarlas con el SQL92 intermedio o con el completo, tenemos que ir haciendo combinaciones de tablas por pares, y la tabla resultante se convertirá en el primer componente del siguiente par. Por ejemplo, suponiendo que queremos combinar las tablas empleados,
  • 36. 32 Bases de datos Bases de datos Fascículo No. 3 Semestre 5 proyectos y clientes: SELECT * FROM empleados, proyectos, clientes WHERE num_proyec = codigo_proyec AND codigo_cliente = codi- go_cli; o bien: SELECT * FROM (empleados JOIN proyectos ON num_proyec = codi- go_proyec) JOIN clientes ON codigo_cliente = codigo_cli; La unión La cláusula UNION permite unir consultas de dos o más sentencias SE- LECT FROM. Su formato es: SELECT columnas FROM tabla [WHERE condiciones] UNION [ALL] SELECT columnas FROM tabla [WHERE condiciones]; La intersección Para hacer la intersección entre dos o más sentencias SELECT FROM, podemos utilizar la cláusula INTERSECT, cuyo formato es: SELECT columnas FROM tabla [WHERE condiciones] INTERSECT [ALL] SELECT columnas
  • 37. 33 Bases de datos Bases de datos Fascículo No. 3 Semestre 5 FROM tabla [WHERE condiciones]; La diferencia Para encontrar la diferencia entre dos o más sentencias SELECT FROM podemos utilizar la cláusula EXCEPT, que tiene este formato: SELECT columnas FROM tabla [WHERE condiciones] EXCEPT [ALL] SELECT columnas FROM tabla [WHERE condiciones]; Lo más importante de la diferencia es que somos nosotros quienes tene- mos que vigilar que se haga entre columnas definidas sobre dominios compatibles. Sentencias de control Además de definir y manipular una base de datos relacional, es importante que se establezcan mecanismos de control para resolver problemas de concurrencia de usuarios y garantizar la seguridad de los datos. Para la concurrencia de usuarios utilizaremos el concepto de transacción, y para la seguridad veremos cómo se puede autorizar y desautorizar a usuarios a acceder a la base de datos. Las transacciones Una transacción es una unidad lógica de trabajo. O informalmente, y traba- jando con SQL, un conjunto de sentencias que se ejecutan como si fuesen una sola. En general, las sentencias que forman parte de una transacción se interrelacionan entre sí, y no tiene sentido que se ejecute una sin que se ejecuten las demás.
  • 38. 34 Bases de datos Bases de datos Fascículo No. 3 Semestre 5 La mayoría de las transacciones se inician de forma implícita al utilizar al- guna sentencia que empieza con CREATE, ALTER, DROP, SET, DECLA- RE, GRANT o REVOKE, aunque existe la sentencia SQL para iniciar tran- sacciones, que es la siguiente: SET TRANSACTION {READ ONLY|READ WRITE}; Si queremos actualizar la base de datos utilizaremos la opción READ WRITE, y si no la queremos actualizar, elegiremos la opción READ ONLY. Sin embargo, en cambio, una transacción siempre debe acabar explícita- mente con alguna de las sentencias siguientes: {COMMIT|ROLLBACK} [WORK]; La diferencia entre COMMIT y ROLLBACK es que mientras la sentencia COMMIT confirma todos los cambios producidos contra la BD durante la ejecución de la transacción, la sentencia ROLLBACK deshace todos los cambios que se hayan producido en la base de datos y la deja como esta- ba antes del inicio de nuestra transacción. La palabra reservada WORK sólo sirve para aclarar lo que hace la senten- cia, y es totalmente opcional. Ejemplo Se quiere disminuir el sueldo de los empleados que han trabajado en el proyecto 3 en 1.000.000 de pesos y aumentar el sueldo de los empleados que han trabajado en el proyecto 1 también en 1.000.000 de pesos. SET TRANSACTION READ WRITE; UPDATE empleados SET sueldo = sueldo – 1000000 WHERE num_proyec = 3; UPDATE empleados SET sueldo = sueldo + 1000000 WHERE num_proyec = 1; COMMIT;
  • 39. 35 Bases de datos Bases de datos Fascículo No. 3 Semestre 5 Las autorizaciones y desautorizaciones Todos los privilegios sobre la base de datos los tiene su propietario, pero no es el único que accede a ésta. Por este motivo, el SQL nos ofrece sen- tencias para: 1) Autorizaciones Para autorizar, el SQL dispone de la siguiente sentencia: GRANT privilegios ON objeto TO usuarios [WITH GRANT OPTION]; Donde tenemos que privilegios puede ser: ALL PRIVILEGES: todos los privilegios sobre el objeto especificado. • USAGE: utilización del objeto especificado; en este caso el dominio. • SELECT: consultas. • INSERT [(columnas)]: inserciones. Se puede concretar de qué columnas. • UPDATE [(columnas)]: modificaciones. Se puede concretar de qué co- lumnas. • DELETE: borrados. • REFERENCES [(columna)]: referencia del objeto en restricciones de in- tegridad. Se puede concretar de qué columnas. Objeto debe ser: • DOMAIN: dominio • TABLE: tabla. • Vista. Usuarios puede ser todo el mundo: PUBLIC, o bien una lista de los identi- ficadores de los usuarios que queremos autorizar. La opción WITH GRANT OPTION permite que el usuario que autoricemos pueda, a su vez, autorizar a otros usuarios a acceder al objeto con los mismos privilegios con los que ha sido autorizado.
  • 40. 36 Bases de datos Bases de datos Fascículo No. 3 Semestre 5 2) Desautorizaciones Para desautorizar, el SQL dispone de la siguiente sentencia: REVOKE [GRANT OPTION FOR] privilegios ON objeto FROM usuarios [RESTRICT|CASCADE]; Donde tenemos que: a) privilegios, objeto y usuarios son los mismos que para la sentencia GRANT. b) La opción GRANT OPTION FOR se utilizaría en el caso de que quisié- ramos eliminar el derecho a autorizar (WITH GRANT OPTION). c) Si un usuario al que hemos autorizado ha autorizado a su vez a otros, que al mismo tiempo pueden haber hecho más autorizaciones, la op- ción CASCADE hace que queden desautorizados todos a la vez. d) La opción RESTRICT no nos permite desautorizar a un usuario si éste ha autorizado a otros. Sublenguajes especializados Muchas veces querremos acceder a la base de datos desde una aplicación hecha en un lenguaje de programación cualquiera. Para utilizar el SQL desde un lenguaje de programación, podemos utilizar el SQL hospedado, y para trabajar con éste necesitamos un precompilador que separe las sentencias del lenguaje de programación de las del lenguaje de bases de datos. Una alternativa muy interesante a esta forma de trabajar son las ruti- nas SQL/CLI. A continuación introduciremos las ideas básicas del funcionamiento de ambos. SQL hospedado Para crear y manipular una base de datos relacional necesitamos SQL. Además, si la tarea que queremos hacer requiere el poder de procesa-
  • 41. 37 Bases de datos Bases de datos Fascículo No. 3 Semestre 5 miento de un lenguaje de programación como Java, C, Cobol, Fortran, Pascal, etc., podemos utilizar el SQL hospedado en el lenguaje de pro- gramación elegido. De este modo, podemos utilizar las sentencias del SQL dentro de nuestras aplicaciones, poniendo siempre delante la palabra re- servada EXEC SQL. Para poder compilar la mezcla de llamadas de SQL y sentencias de pro- gramación, antes tenemos que utilizar un precompilador. Un precompila- dor es una herramienta que separa las sentencias del SQL y las sentencias de programación. Donde en el programa fuente haya una sentencia de acceso a la base de datos, se debe insertar una llamada a la interfaz del SGBD. El programa fuente resultante de la precompilación ya está únicamente en el lenguaje de programación, preparado para ser compilado, montado y ejecutado. Todas las sentencias de definición, manipulación y control que hemos vis- to para el SQL se pueden utilizar en el SQL hospedado, pero precedidas de la cláusula EXEC SQL. Sólo habrá una excepción: cuando el resultado de una sentencia SQL obtenga más de una fila o haga referencia también a más de una, deberemos trabajar con el concepto de cursor. Un cursor se tiene que haber declarado antes de su utilización (EXEC SQL DECLARE nombre_cursor CURSOR FOR). Para utilizarlo, se debe abrir (EXEC SQL OPEN nombre_cursor), ir tomando los datos uno a uno, tra- tarlos. Puede haber pequeñas diferencias dependiendo del lenguaje de progra- mación concreto que estemos considerando (EXEC SQL FETCH nom- bre_cursor INTO), y finalmente, cerrarlo (EXEC SQL CLOSE nom- bre_cursor).
  • 42. 38 Bases de datos Bases de datos Fascículo No. 3 Semestre 5 Las SQL/CLI Las SQL/CLI (SQL/Call-Level Interface), denominadas de forma abreviada CLI, permiten que aplicaciones desarrolladas en un cierto lenguaje de pro- gramación (con sólo las herramientas disponibles para este lenguaje y sin el uso de un precompilador) puedan incluir sentencias SQL mediante lla- madas a librerías. Estas sentencias SQL se deben interpretar en tiempo de ejecución del programa, a diferencia del SQL hospedado, que requería el uso de un pre- compilador.
  • 43. 39 Bases de datos Bases de datos Fascículo No. 3 Semestre 5 La interfaz ODBC (Open Database Connectivity) define una librería de funciones que permite a las aplicaciones acceder al SGBD utilizando el SQL. Las rutinas SQL/CLI están fuertemente basadas en las características de la interfaz ODBC, y gracias al trabajo desarrollado por SAG-X/Open (SQL Access Group-X/Open), fueron añadidas al estándar ANSI/ISO SQL92 desde 1995. Las SQL/CLI son simplemente rutinas que llaman al DBMS para interpretar las sentencias SQL que pide la aplicación. Desde el punto de vista del DBMS, las SQL/CLI se pueden considerar, simplemente, como otras apli- caciones. En este Fasciculo hemos presentado las sentencias más utilizadas del len- guaje estándar ANSI/ISO SQL92 de definición, manipulación y control de bases de datos relacionales. Como ya hemos comentado en la introduc- ción, el SQL es un lenguaje muy potente, y esto hace que existan más sen- tencias y opciones de las que hemos explicado aquí. Sin embargo, no es menos cierto que hemos visto más sentencias que las que algunos siste- mas relacionales ofrecen actualmente. Hemos intentado seguir con la ma- yor fidelidad el estándar, incluyendo comentarios sólo cuando en la mayor- ía de los sistemas relacionales comerciales alguna operación se hacía de forma distinta. Conociendo el SQL92 podemos trabajar con cualquier sistema relacional comercial; sólo tendremos que dedicar unas cuantas horas a ver qué va- riaciones se dan con respecto al estándar. Recordemos cómo será la creación de una base de datos con SQL:
  • 44. 40 Bases de datos Bases de datos Fascículo No. 3 Semestre 5 1) En primer lugar, tendremos que dar nombre a la base de datos, con la sentencia CREATE DATABASE, si la hay, o con CREATE SCHEMA. 2) A continuación definiremos las tablas, los dominios, las aserciones y las vistas que formarán nuestra base de datos. 3) Una vez definidas las tablas, que estarán completamente vacías, se de- berán llenar con la sentencia INSERT INTO. Cuando la base de datos tenga un conjunto de filas, la podremos manipu- lar, ya sea actualizando filas o bien haciendo consultas. Además, podemos usar todas las sentencias de control que hemos expli- cado. Elmasri, Ramez y Navathe Shamkant B. Sistemas de Bases de Datos: Conceptos Fundamentales. Addison-Wesley. Chen, Peter. The Entity-Relationship Model-Toward a Unified View of Data. ACM Transactions on Data Base Systems. Vol. 1, Number 1, 1976 J.C. Date. Introducción a los sistemas de Base de Datos. Volumen 1. Quin- ta Edición. (Texto Guía) Ullman, J.D.; Widom, J. "Introducción a los Sistemas de Bases de Datos". Prentice Hall. Antes de Implementar una base de datos relacional sobre un DBMS es im- portante contar con una definición detallada de la mismas basada en un diseño que represente el modelo del problema que queremos solucionar, el siguiente fascículo se enfocara en las metodologías y herramientas que nos permiten generar diseños de bases de datos cumpliendo con los estándares establecidos.
  • 45. 41 Bases de datos Bases de datos Fascículo No. 3 Semestre 5 SeguimientoalautoaprendizajeSeguimientoalautoaprendizajeSeguimientoalautoaprendizaje Bases de datos - Fascículo No. 3 Nombre_______________________________________________________ Apellidos ________________________________ Fecha: _________________ Ciudad___________________________________Semestre: _______________ 1. Dadas las siguientes tablas:  Personas (DNI, nombre, apellidos, dirección, ciudad, país)  Carros(matricula, marca, modelo, color, conductor, seguro)  Seguros(numero, compañía, tipo, franquicia, tomador, fecha) Con las siguientes relaciones:    Y las siguientes restricciones:  Carros.Seguro es un campo obligatorio  Seguros.Tipo debe tomar por defecto el valor “Terceros” Realizar en SQL los siguientes ejercicios:  Crear las tablas tal y como se haría en SQL y, una vez creadas: a. Agregar a la tabla Personas la columna sexo de un solo carácter. b. Agregar a la tabla Carros la columna potencia de tipo entero. 2. Dar un ejemplo de inserción en cada una de las tablas. 3. Seleccionar, alfabéticamente, el nombre de todas las personas que viven en ciudades cuyo nombre empieza por A. 4. Seleccionar las compañías de seguros que aseguran carros de la marca “FIAT”. 5. Devolver, para cada compañía de seguros, la cantidad de carros asegura- dos que tengan más de 100 CC. 6. Seleccionar el modelo de los carros que tienen una potencia superior que cualquier carro asegurado por la compañía “AS S.A.”