Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
3. El modelo relacional
Historia y panormica de las bases de datos relacionales.
El World Wide Web quiz sea una de las mayores fuentes de informacin a la que
hoy podemos dirigirnos: teniendo a disposicin una conexin a Internet y un
navegador Web, un software comn de cualquier ordenador, tenemos la posibilidad
de consultar un patrimonio de cientos de millones de pginas a propsito de cualquier
argumento que nos interese.
A menudo, estas pginas no son documentos estticos, sino que se crean
dinmicamente cuando las invocamos, y las informaciones que contienen se extraen
de una base de datos. Si se trata de una base de datos relacional(veremos a
continuacin qu significa esto), es probable que el lenguaje usado para recuperar
las informaciones que se nos muestran sea SQL (Structured Query Language).
Antes de ocuparnos de qu es y cmo se usa SQL intentemos entender qu se
entiende con la expresin database, que a menudo en espaol se traduce como
"base de datos".
Una base de datos es una coleccin de datos que es gestionada y organizada por un
software especfico, el DBMS (DataBase Management System, Sistema de Gestin
de DataBase). Un DBMS es sustancialmente un software que se coloca entre el
usuario y los datos como tales. Gracias a este estrato intermedio el usuario y las
aplicaciones no acceden a los datos tal y como se memorizan efectivamente, es decir
a su representacin fsica, sino que se ve slo una representacin lgica. Esto
permite un grado elevado de independencia entre las aplicaciones y la memorizacin
fsica de los datos. El administrador de la base de datos, si lo necesita, puede decidir
memorizar los datos de un modo diferente o incluso cambiar el DBMS sin que las
aplicaciones, es decir los usuarios, se resientan. Lo importante es que no cambie la
representacin lgica de esos datos, que es la nica cosa que los usuarios conocen.
Esta representacin lgica se conoce como 'Esquema de la base de datos' y es la
forma de representacin de los datos de ms bajo nivel a la que un usuario de la
base de datos puede acceder. Por ejemplo, en la Figura 1 est representada una
situacin en la que el administrador de la base de datos ha decidido que, por motivos
de eficacia, era necesario cambiar el disco en el que se haban memorizado algunos
datos, repartindolos, adems, en ms discos para permitir accesos paralelos a
subconjuntos de datos independientes. Desde el punto de vista del usuario, no ha
cambiado absolutamente nada y probablemente ni siquiera conoce el cambio que se
ha producido.
objetos est representado por un conjunto de clases que definen las caractersticas y
el comportamiento de los objetos que poblarn la base de datos. La diferencia
principal respecto a los modelos examinados hasta ahora es la no positividad de los
datos. En efecto, con una base de datos tradicional (entendiendo con este trmino
cualquier base de datos no por objetos), las operaciones que se tienen que efectuar
en los datos se les piden a las aplicaciones que los usan. Con una base de datos
object-oriented, al contrario, los objetos memorizados en la base de datos contienen
tanto los datos como las operaciones posibles con tales datos. En cierto sentido, se
podr pensar en los objetos como en datos a los que se les ha puesto una inyeccin
de inteligencia que les permite saber cmo comportarse, sin tener que apoyarse en
aplicaciones externas.
Los primeros dos tipos de bases de datos, los jerrquicos y reticulares, hoy ya casi
pertenecen a la historia de la informtica.
La mayor parte de las bases de datos que hoy se usan pertenece a la categora de
las bases de datos relacionales. Los motivos de este xito (tambin comercial) hay
que buscarlos en el rigor matemtico y en la potencialidad expresiva del modelo
relacional en que se basan, en su facilidad de uso y, ltimo pero no menos
importante, en la disponibilidad de un lenguaje de interrogacin estndar, el SQL,
que, al menos potencialmente, permite que se desarrollen aplicaciones
independientes del DBMS concreto relacional que se use.
Las bases de datos por objetos son la nueva frontera en la investigacin sobre las
bases de datos; efectivamente, sus caractersticas de extendibilidad, que se derivan
de la posibilidad de definir nuevos tipos de datos y comportamientos, las hacen
particularmente apetecibles para todas las aplicaciones que usan datos complejos,
como por ejemplo imgenes, sonidos o ambos coordinados. Por desgracia, la falta de
un modelo universalmente aceptado para los objetos, as como que no exista un
lenguaje de interrogacin estndar, hace que cada productor implemente la propia
visin especfica, a menudo absolutamente incompatible con las otras.
Recientemente, han aparecido en el mercado algunas bases de datos definidas como
object-relational, que intentan introducir en el modelo relacional las caractersticas de
extendibilidad propias de las bases de datos object-oriented.
Independientemente del tipo de base de datos, las funciones principales que se
pueden esperar de un DBMS son:
permitir el acceso a los datos a travs de un esquema conceptual, en vez de
hacerlo a travs de un esquema fsico;
compartir e integrar los datos entre aplicaciones diferentes;
controlar el acceso compartido a los datos;
garantizar la seguridad e integridad de los datos;
Gracias a estas caractersticas, las aplicaciones que se desarrollan pueden contar
con una fuente de datos segura, fiable y generalmente escalabale. Estas propiedades
son deseables para aplicaciones que usan la red Internet como infraestructura y que
por tanto tienen evidentes problemas de seguridad y de escala.
El modelo relacional
identificar una tupla concreta en una relacin. Esta propiedad de las relaciones y de
sus llaves primarias est bajo el nombre de integridad de las entidades (entity
integrity).
A menudo, para obtener una llave primaria "econmica", es decir compuesta de
pocos atributos fcilmente manipulables, se introducen uno o ms atributos ficticios,
con cdigos identificativos unvocos para cada tupla de la relacin.
Cada atributo de una relacin se caracteriza por un nombre y por un dominio. El
dominio indica qu valores pueden ser asumidos por una columna de la relacin. A
menudo un dominio se define a travs de la declaracin de un tipo para el atributo
(por ejemplo diciendo que es una cadena de diez caracteres), pero tambin es
posible definir dominios ms complejos y precisos. Por ejemplo, para el atributo
"sexo" de nuestra relacion "Personas" podemos definir un dominio por el cual los
nicos valores vlidos son 'M' y 'F'; o bien por el atributo "fecha_nacimiento"
podremos definir un dominio por el que se consideren vlidas slo las fechas de
nacimiento despus del uno de enero de 1960, si en nuestra base de datos no est
previsto que haya personas con fecha de nacimiento anterior a esa. El DBMS se
ocupar de controlar que en los atributos de las relaciones se incluyan slo los
valores permitidos por sus dominios. Caracterstica fundamental de los dominios de
una base de datos relacional es que sean "atmicos", es decir que los valores
contenidos en las columnas no se puedan separar en valores de dominios ms
simples. Ms formalmente se dice que no es posible tener atributos multivalor
(multivalued). Por ejemplo, si una caracterstica de las personas en nuestra base de
datos fuese la de tener uno o ms hijos, no sera posible escribir la relacin Personas
de la siguiente manera:
Personas (nombre, apellido, fecha_nacimiento, sexo, estado_civil, hijos)
En efecto, el atributo hijos es un atributo no-atmico, bien porque una persona puede
tener ms de un hijo o porque cada hijo tendr diferentes caractersticas que lo
describen. Para representar estas entidades en una base de datos relacional hay que
definir dos relaciones:
Personas (*nmero_persona, nombre, apellido, fecha_nacimiento, sexo, estado_civil)
Hijos(*nmero_persona, *nombre_apellido, edad, sexo)
En las relaciones precedentes, los asteriscos (*) indican los atributos que componen
sus llaves primarias. Ntese la introduccin en la relacin Personas del atributo
nmero_persona, a travs del cual se asigna a cada persona un identificativo
numrico unvoco que se usa como llave primaria. Estas relaciones contienen slo
atributos atmicos. Si una persona tiene ms de un hijo, stos se representarn en
tuplas diferentes de la relacin Hijos. Las diferentes caractersticas de los hijos las
representan los atributos de la relacin Hijos. La unin entre las dos relaciones est
constituida por los atributos nmero_persona que aparecen en ambas relaciones y
que permiten que se asigne cada tupla de la relacin hijos a una tupla concreta de la
relacin Personas. Ms formalmente se dice que el atributo nmero_persona de la
relacin Hijos es una llave externa (foreign key) hacia la relacin Personas. Una llave
externa es una combinacin de atributos de una relacin que son, a su vez, una llave
primaria para otra relacin. Una caracterstica fundamental de los valores presentes
en una llave externa es que, a no ser que no sean null, tienen que corresponder a
valores existentes en la llave primaria de la relacin a la que se refieren. En nuestro
ejemplo, esto significa que no puede existir en la relacin Hijos una tupla con un valor
del atributo nmero_persona sin que tambin en la relacin Personas exista una
tupla con el mismo valor para su llave primaria. Esta propiedad va bajo el nombre de
integridad referencial (referential integrity)
Una de las grandes ventajas del modelo relacional es que define tambin un lgebra,
llamada "lgebra relacional". Todas las manipulaciones posibles sobre las relaciones
se obtienen gracias a la combinacin de tan slo cinco operadores: RESTRICT,
PROJECT, TIMES, UNION y MINUS. Por comodidad, se han definido tambin tres
operadores adicionales que de todos modos se pueden obtener aplicando los cinco
fundamentales: JOIN, INTERSECT y DIVIDE. Los operadores relacionales reciben
como argumento una relacin o un conjunto de relaciones y restituyen una nica
relacin como resultado.
Veamos brevemente estos ocho operadores:
RESTRICT: restituye una relacin que contiene un subconjunto de las tuplas de la
relacin a la que se aplica. Los atributos se quedan como estaban.
PROJECT: restituye una relacin con un subconjunto de los atributos de la relacin a
la que viene aplicado. Las tuplas de la relacin resultado se componen de las tuplas
de la relacion original, de manera que siguen siendo un conjunto en sentido
matemtico.
TIME: se aplica a dos relaciones y efecta el producto cartesiano de las tuplas. Cada
tupla de la primera relacin est concatenada con cada tupla de la segunda.
JOIN: se concatenan las tuplas de dos relaciones de acuerdo con el valor de un
conjunto de sus atributos.
UNION: aplicando este operador a dos relaciones compatibles, se obtiene una que
contiene las tuplas de ambas relaciones. Dos relaciones son compatibles si tienen el
mismo nmero de atributos y los atributos correspondientes en las dos relaciones
tienen el mismo dominio.
MINUS: aplicado a dos relaciones compatibles restituye una tercera que contiene las
tuplas que se encuentran slo en la primera relacin.
INTERSECT: aplicado a dos relaciones compatibles restituye una relacin que
contiene las tuplas que existen en ambas.
DIVIDE: aplicado a dos relaciones que tengan atributos comunes, restituye una
tercera que contiene todas las tuplas de la primera relacin que se puede hacer que
correspondan con todos los valores de la segunda relacin.
En las siguientes tablas, a ttulo de ejemplo, se representan los resultados de la
aplicacin de algunos operadores relacionales a las relaciones Personas e Hijos.
Como nombres para las relaciones resultado se han utilizado las expresiones que las
producen.
Personas
nmero_persona
2
1
3
nombre
Mario
Giuseppe
Russo
Alessandra Mondella
15/11/1972
13/06/1970
M
F
Soltero
Soltera
Hijos
nmero_persona nombre_apellido edad sexo
Maria Rossi
Gianni Rossi
RESTRICT (Personas)
sesso='M'
nmero_persona nombre apellido fecha_nacimiento sexo estado_civil
2
Mario
Rossi
29/03/1965
M
Casado
1
Giuseppe
Russo
15/11/1972
Soltero
Rossi
Apellido 29/03/1965
Casado
Gianni Rossi
Las bases de datos relacionales efectan todas las operaciones en las tablas usando
el lgebra relacional, aunque normalmente no le permiten al usuario usarla. El
usuario interacciona con la base de datos a travs de una interfaz diferente el
lenguaje SQL, un lenguaje declarativo que permite escribir conjuntos de datos. Las
instrucciones SQL vienen descompuestas por el DBMS en una serie de operaciones
relacionales.
de publicaciones.
Author: Representa al autor de una publicacin. La llave primaria est compuesta
por el identificativo de la publicacin y por el de la persona, lo que grantiza la unidad
de la asociacin entre las dos entidades.
Editor: Representa al coordinador de una publicacin. La estructura es idntica a la
de la tabla Author.
Person: Representa a una persona (por ejemplo, un autor) en la base de datos.
Actualmente, las informaciones consideradas interesantes son slo el apellido y el
nombre.
Publisher: La casa editorial de una publicacin.
Institution: La institucin (por ejemplo una universidad o una software house)
responsable de una publicacin.
Book: Un libro con una casa editorial precisa.
InBook: Una parte de un libro. La parte puede caracterizarse por un ttulo, por el
nmero del captulo o por el de la pgina. Las informaciones a propsito del libro y,
por tanto, comunes a sus diferentes partes, se memorizan en la relacin Book.
Proceedings: Las actas de un congreso o de una conferencia.
InProceedings: Una parte de las actas de un congreso. Las informaciones referidas
a la publicacin que contiene esa parte estn en la relacin Proceedings.
Article: Un artculo publicado en un peridico o en una revista.
Manual: Una publicacin de documentacin tcnica.
Techreport: Un informe tcnico publicado por una escuela u otra institucin.
Thesis: Una tesina o una tesis.
Misc: Una publicacin que no puede englobarse en ninguna de las categoras
anteriores.
No voy a explicar el significado de los atributos que componen las diferentes
relaciones, puesto que sus nombres se explican por s mismos. Slo una anotacin
sobre el atributo "pub_month": se ha definido como de tipo CHAR(3), es decir una
cadena con una longitud fija de tres caracteres que incluir las abreviaturas de los
nombres de los meses (las primeras tres letras de los nombres ingleses).
Los lazos entre las relaciones deberan ser bastante fciles de entender. Como
ejemplo para todos, usaremos el que conecta la relacin Book con la relacin
Publisher. Este lazo sirve para describir la la editorial de un libro. En la relacin Book
no estn presentes todos los datos de la editorial, sino slo un identificativo numrico
para ella. El nmero ser la llave primaria de la relacin Publisher y como tal
permitir identificar una editorial precisa. En la relacin Book el atributo publisher es
SQL que le afectan, y por tanto los constructos FOREIGN KEY y REFERENCES no
producen un error, sino slo un warning.
Con la expresin "poblacin de la base de datos" se entiende la actividad de inclusin de los datos
dentro de ella. En una base de datos relacional esto corresponde a la creacin de las lneas que
componen las tablas que constituyen la base de datos. Normalmente, la memorizacin de una
informacin concreta corresponde a la inclusin de una o ms lneas en una o ms tablas de la base
de datos. Tmese, por ejemplo, la siguiente informacin bibliogrfica:
M. Agosti, L. Benfante, M. Melucci. OFAHIR: "On-the-Fly" Automatic Authoring of Hypertexts for
Information Retrieval. In S. Spaccapietra, F. Maryansky (Eds), Searching for Semantics: Data Mining,
Reverse Engineering. Proc. of the 7th IFIP 2.6 Working Conference on Database Semantics (DS-7),
Leysin, Switzerland, October 1997, 129-154.
Suponiendo que en la base de datos no est ya presente ninguna de las informaciones que le afectan
(como por ejemplo alguno de los autores o las actas del congreso al que se refiere), su inclusin en
nuestra base de datos de ejemplo corresponde a la inclusin de las siguientes lneas:
cinco lneas en la tabla Person, que corresponden a cada uno de los autores y de los
coordinadores;
una lnea en la tabla Institution;
dos lneas en la tabla Publication: una para las actas del congreso y una para el artculo
contenido en esas actas;
una lnea en la tabla Proceedings;
una lnea en la taba InProceedings;
tres lneas en la tabla Author, una para cada autor de la publicacin.
dos lneas en la tabla Editor, una para cada coordinador de la publicacin.
El orden de las operaciones anteriores no es puramente casual; de hecho, la insercin de las
lneas tiene que hacerse de modo que se respeten los vnculos impuestos en las tablas. Por
ejemplo, dado que no podr existir una llave externa sin que antes se haya incluido la lnea a
la que se refiere, antes de poder meter una lnea en la tabla InProceedings se tendr que
haber puesto la lnea correspondiente en la tabla Proceedings. En el caso en que un vnculo
sea violado, la DBMS impedir la operacin de inclusin abortndola. Vase la leccin anterior
(Crear la base de datos) para la descripcin de los vnculos que se les pueden imponer a una
tabla y a sus columnas.
La instruccin SQL que lleva a cabo la inclusin de una nueva lnea en una tabla es INSERT.
La sintaxis con la que sta se usa comunmente es:
INSERT INTO nombre_tabla [ ( lista_campos ) ]
VALUES ( lista_valores )
nombre_tabla es el nombre de la tabla en la que se tiene que incluir la nueva lnea.
lista_campos es la lista de los nombres de los campos a los que hay que asignar un valor,
separados entre s por una coma. Los campos no incluidos en la lista tomarn su valor por
defecto o NULL si no lo tienen por defecto. Es un error no incluir en la lista un campo que no
tenga un valor por defecto y que no pueda tomar el valor NULL. En el caso en que no se
especifique la lista, habr que especificar los valores de todos los campos de la tabla.
lista_valores es la lista de los valores que se les darn a los campos de la tabla en el orden y
nmero especificados por la lista_campos o en la de la definicin de la tabla (si no se
especifica lista_campos). Los valores pueden ser una expresin escalar del tipo apropiado
para el campo o las keyword DEFAULT o NULL, si el campo prev un valor por defecto o
admite el valor NULL.
El ejemplo anterior de inclusin se ejecuta a travs de las siguientes instrucciones SQL:
INSERT INTO Person VALUES ( 1, 'Agosti', 'Maristella' );
INSERT INTO Person VALUES ( 2, 'Benfante', 'Lucio' );
INSERT INTO Person VALUES ( 3, 'Melucci', 'Massimo' );
INSERT INTO Person VALUES ( 4, 'Spaccapietra', 'S.' );
INSERT INTO Person VALUES ( 5, 'Maryansky', 'F.' );
INSERT INTO Institution ( ID, name, city, country )
VALUES ( 1, '7th IFIP 2.6 Working Conference on Database Semantics (DS-7)',
'Leysin', 'Switzerland' );
INSERT INTO Publication VALUES ( 1, 'Proceedings' );
INSERT INTO Publication VALUES ( 2, 'InProceedings' );
INSERT INTO Proceedings ( ID, title, organization, pub_month, pub_year )
VALUES ( 1, 'Searching for Semantics: Data Mining, Reverse Engineering',
1, 'Oct', 1997 );
INSERT INTO InProceedings ( ID, proceedingsID, title, pages )
VALUES ( 2, 1,
'OFAHIR: "On-the-Fly" Automatic Authoring of Hypertexts for Information Retrieval', '129-154' );
INSERT INTO Author VALUES ( 2, 1 );
INSERT INTO Author VALUES ( 2, 2 );
INSERT INTO Author VALUES ( 2, 3 );
INSERT INTO Editor VALUES ( 1, 4 );
INSERT INTO Editor VALUES ( 1, 5 );
Otra forma bastante usada de la instruccin INSERT sigue la siguiente sintaxis:
INSERT INTO nombre_tabla [ ( lista_campos ) ]
instruccin_select
La nica diferencia con la sintaxis anterior consiste en la sustitucin de la clusula VALUES
por la instruccin SELECT.
La instruccin SELECT se examinar con detalle en la siguiente leccin (Interrogar a la base
de datos). Por el momento, es suficiente saber que SELECT permite extraer de las tablas de la
base de datos datos que se organizan en una nueva relacin.
La anterior instruccin INSERT permite incluir en la tabla y en los campos especificados datos
provenientes de otras tablas. Obviamente, para que la instruccin se ejecute con xito, los
datos producidos por la instruccin SELECT tendrn que ser compatibles con los vnculos y
los dominios de los campos de la tabla en la que se esta efectuando la insercin.
En el archivo poblad_biblio.sql estn presentes las instrucciones SQL que pueblan la base de
datos bibliogrfica con los datos que se usarn en los ejemplos de las siguientes lecciones.
En la leccin anterior se han examinado los constructos que el lenguaje SQL pone a
disposicin para incluir los datos en una base de datos relacional. Vamos a ver ahora, sin
embargo, las instrucciones necesarias para extraer de ella los datos que nos interesen. La
instruccin SQL que se propone para dicho fin es SELECT. Desde el momento en que la
interrogacin es quiz la funcin ms usada de una base de datos, las opciones de la
instruccin SELECT son numerosas y a veces bastante complicadas. Por esta razn
vamos a describirlas simplificadas, utilizando ejemplos para la presentacin de las
caractersticas ms complejas, en concreto las que se refieren a la especificacin de las
expresiones condicionales.
La sintaxis con que la instruccin SELECT se tiene que usar es la siguiente:
SELECT [ ALL | DISTINCT ] lista_elementos_seleccin
FROM lista_referencias_tabla
[ WHERE expresin_condicional ]
[ GROUP BY lista_columnas ]
[ HAVING expresin_condicional ]
[ ORDER BY lista_columnas ]
La instruccin SELECT produce una tabla que se obtiene aplicando el siguiente
procedimiento (por lo menos desde el punto de vista lgico, cada DBMS optimiza la
ejecucin de las interrogaciones segn las propias estrategias):
produce una tabla que se obtiene como producto cartesiano de las tablas
especificadas en la clusula FROM. Cada elemento de la lista_referencias_tabla
sigue la siguiente sintaxis:
referencia_tabla [ [ AS ] alias_tabla ]
La referencia puede ser el nombre de una tabla o una expresin (puesta entre
parntesis) cuyo resultado es una tabla, y por lo tanto incluso otra SELECT. El alias
es un nombre que sirve para indicar brevemente una referencia de tabla. En el caso
en que la referencia de tabla sea una expresin, es obligatorio especificar un alias.
de la tabla anterior elimina todas las lneas que no satisfacen la expresin
condicional (es decir las lneas por las cuales la expresin condicional devuelve falso
como resultado) de la clusula WHERE.
(si est presente la clusula GROUP BY) las lneas de la tabla resultante del paso 2
se reagrupan segn los valores presentes en las columnas especificadas en la
clusula GROUP BY. Lneas con valores iguales se unen en una nica lnea. Las
columnas no comprendidas en la clusula tienen que comprender expresiones con
funciones de agregacin (como por ejemplo AVG, que calcula la media) que, por
tanto, se calculan produciendo un nico valor para cada grupo.
(si est presente la clusula HAVING) del resultado del punto 3 se eliminan las
(si est presente la clusula ORDER BY) las lneas de la tabla se ordenan segn
los valores presentes en las columnas especificadas en la clusula. La sintaxis que
hay que usar es la siguiente:
ORDER BY nombre_columna [ ASC | DESC ] [ , nombre_columna [ ASC | DESC ] ...
]
El orden por defecto es ascendente. En el caso en que se quiera efectuar el decreciente
hay que especificar la opcin DESC. Si no se especifica la clusula ORDER BY, hay que
considerar la tabla sin ningn orden; de hecho, para la definicin de relacin del modelo
relacional, las lneas de la tabla forman un conjunto: en el sentido matemtico y para los
elementos de un conjunto no se ha definido ninguna propiedad de orden. En la prctica, sin
embargo, el orden que se obtiene no especificando la clusula de orden es casi siempre el
que refleja su memorizacin fsica y por tanto, a menudo, al que se debe que las lneas
hayan sido incluidas en la tabla.
La secuencia de operaciones que acabamos de presentar hay que considerarla vlida slo
desde el punto de vista conceptual. Efectivamente, no est escrito que se ejecuten
exactamente de este modo y en este orden, sobre todo desde el momento en que cada
DBMS optimizar las interrogaciones segn las estrategias ms oportunas.
Examinaremos ahora algunos ejemplos de la instruccin SELECT. Se supone que los datos
presentes en la base de datos de ejemplo son slo los que se han incluido gracias al
archivo [poblad_biblio.sql] presentado en la leccin 7 (Poblar la base de datos). En caso
contrario, las interrogaciones ofrecern resultados diferentes.
EJEMPLO 1
SELECT surname FROM Person
ORDER BY surname
Extrae de la tabla Person los apellidos y los ordena alfabticamente. En nuestro caso, el
resultado es el siguiente:
surname
-------------------------------Agosti
Batini
Bayer
Benfante
Carey
Cochowsky
DeWitt
Kim
Knuth
Lenzerini
Maryansky
McCreight
McGill
Melucci
Richardson
Salton
Santucci
Shekita
Spaccapietra
de Petra
Vase el orden errado de la ltima lnea, debido a que se ha usado el carcter ASCII
minsculo.
La query anterior devolvera lneas duplicadas en el caso en que en la tabla estuviesen
presentes personas con el mismo apellido. Para evitarlo hay que especificar la opcin
DISTINCT:
SELECT DISTINCT surname FROM Person
ORDER BY surname
ESEMPIO 2
SELECT * FROM Person
WHERE surname LIKE 'B%'
Produce una tabla que tiene todas las columnas de la tabla Person. Las lneas se filtran
para que estn presentes slo las que tienen el apellido que empieza con el carcter 'B'. El
operador LIKE permite una comparacin entre cadenas de caracteres usando pattern
construidos con los caracteres '%' e '_'. El primero sustituye un nmero no precisado de
caracteres (tambin 0), mientras que el segundo sustituye uno solo.
ESEMPIO 3
SELECT PUB.*, PER.surname AS S, PER.given_names
FROM Publication PUB, Author AUT, Person PER
WHERE PUB.ID = AUT.publicationID
AND AUT.personID = PER.ID
AND PUB.type = 'Book'
ORDER BY S
En este caso, la tabla resultante contiene todas las columnas de la tabla Publication
(indicada con el alias PUB definido en la clusula FROM) y las columnas surname y
given_names de la tabla Person. La clusula FROM genera el producto cartesiano de las
tablas Publication, Author y Person, de las que se seleccionan slo las lneas en que el
identificativo de la publicacin y el del autor se corresponden. Adems, se limita a
considerar slo las publicaciones del tipo 'Book'. Para acabar, la tabla se ordena segn los
apellidos del autor, indicado mediante el alias S, definido en la clusula SELECT.
ESEMPIO 4
SELECT title, volume, pub_year
FROM Book
WHERE ID IN
( SELECT PUB.ID
FROM Publication PUB, Author AUT, Person PER
WHERE PUB.ID = AUT.publicationID
AND AUT.personID = PER.ID
AND PUB.type = 'Book'
AND PER.surname = 'Knuth' )
En este ejemplo, se ve el uso de una expresin condicional que contiene el operador IN,
que devuelve el valor verdadero si el valor del operando a su izquierda est incluido en la
tabla resultado de la expresin a su derecha. La query entre parntesis produce una tabla
de una nica columna, que contiene los identificativos de las publicaciones del tipo 'Book'
de las que Knuth es autor. La query ms externa extrae, por tanto, de la tabla Book las
informaciones de los libros con esos identificativos.
EJEMPLO 5
SELECT COUNT(*) FROM Publication
count
----12
Cuenta el nmero de lneas presentes en la tabla Publication.
ESEMPIO 6
SELECT type, COUNT(ID) FROM Publication
GROUP BY type
Normalmente, las informaciones presentes en una base de datos no son estticas, sino que
evolucionan en el tiempo. Existe, por tanto, la necesidad no slo de aadir nuevos datos, sino de
modificar los que estn ya incluidos en las tablas de la base de datos. Las instrucciones SQL que se
usan para este fin son UPDATE y DELETE. La primera modifica los valores presentes en una o ms
columnas de una o ms lneas de una tabla. La segunda elimina una o ms lneas de una tabla.
La sintaxis de UPDATE es la siguiente:
UPDATE nombre_tabla
SET lista_asignaciones
[ WHERE expresin_condicional ]
Las asignaciones se especifican del modo:
nombre_columna = expresin_escalar
La instruccin UPDATE actualiza las columnas de la tabla que se han especificado en la clusula SET,
utilizando los valores que son calculados por las correspondientes expresiones escalares. Si se
expresa tambin la clusula WHERE, se actualizan slo las lneas que satisfacen la expresin
condicional. Vase que la expresin escalar usada para actualizar una columna puede ser tambin el
resultado de una query escalar, es decir una query que devuelve una sola lnea y una sola columna.
Veamos un ejemplo:
UPDATE Person
SET given_names = 'Stefano'
WHERE surname = 'Spaccapietra'
La instruccin anterior cambia el valor de la columna given_name de la tabla Person en las lneas (en
nuestro caso es una sola) en que la columna surname tiene valor 'Spaccapietra'.
La sintaxis de DELETE es:
DELETE FROM nombre_tabla
[ WHERE expresin_condicional ]
La instruccin delete elimina de una tabla todas las lneas que satisfacen la expresin condicional de
la clusula WHERE. Si WHERE no se especifica, se cancelan todas las lneas de la tabla.
Si en la definicin de la tabla se han especificado las clusulas ON UPDATE u ON DELETE, en el
momento en que se ejecutan estas operaciones tambin se ejecutan las que haban estado previstas
en las columnas referenciadas (CASCADE, SET DEFAULT o SET NULL).
Hasta ahora hemos examinado las caractersticas del lenguaje SQL que se refieren a la definicin y a
la manipulacin de los datos presentes en una base de datos, sin preocuparnos del hecho de que
normalmente el acceso a tales datos se produce al mismo tiempo por parte de muchos usuarios.
Los mecanismo que hay que tener en cuenta para este mtodo de acceso se refieren principalmente a
la seguridad de los datos, la gestin de las transacciones y la posibilidad de definir las vistas en las
tablas de la base de datos.
1. Seguridad
La ejecucin de una operacin en los datos de la base de datos por parte de un usuario est
supeditada a la posesin por parte del usuario de los privilegios necesarios para la operacin concreta
ejecutada en el conjunto de datos especfico.
En general, los privilegios se asignan del siguiente modo:
Un usuario que crea una tabla o cualquier otro objeto de la base de datos es el propietario y se
le garantizan automticamente todos los privilegios aplicables a dicho objeto, con la
posibilidad de darles tambin a otros usuarios dichos privilegios (privilegio de concesin).
Un usario que tenga un privilegio y posea adems sobre l el privilegio de concesin puede
asignarle tal pricilegio a otro usuario y pasarle tambin el privilegio de concesin.
Los privilegios los concede quien tiene el permiso (es decir el propietario del objeto y quien
tiene el privilegio de concesin) mediante la orden GRANT, y los revoca mediante la orden
REVOKE.
La sintaxis de la orden GRANT es la siguiente:
GRANT lista_privilegios ON objeto TO lista_usuarios [ WITH GRANT OPTION ]
Esto asigna al usuario los privilegios presentes en la lista_privilegios sobre el objeto
especificado.
Los privilegios asignables son los siguientes (con sus respectivas sintaxis):
USAGE
Privilegio para usar un dominio especfico u otro objeto de la base de datos.
SELECT
Privilegio para acceder a todas las columnas de una tabla o de una vista.
INSERT [ (nombre_columna) ]
Si se especifica la opcin nombre_columna, es el privilegio para incluir valores en la columna
indicada de una tabla o de una vista. Sin el nombre_columna es el privilegio para aadir
valores a todas las columnas, incluidas las que se aadirn a continuacin.
UPDATE [ (nombre_columna) ]
Si se especifica la opcin nombre_columna, se trata del privilegio para actualizar el valor en la
columna indicada de una tabla o de una vista. Si no, permite actualizar el valor de todas las
columnas, incluidas las que se aadirn a continuacin.
DELETE
Privilegio para eliminar lneas de una tabla o de una vista.
REFERENCES [ (nombre_columna) ]
"virtuales", las vistas, calculadas a partir de otras tablas. Son virtuales en el sentido que no ocupan
espacio en el disco, pero son el resultado de interrogaciones sobre otras tablas y, por lo tanto, siempre
estn alineadas con los valores contenidos en dichas tablas.
La instruccin SQL para definir una vista es la siguiente:
CREATE VIEW nombre_vista [ ( lista_nombres_columnas ) ]
AS expresin_tabla
Crea una vista llamada nombre_vista definitda por la expresin_tabla. Tpicamente, expresin_tabla es
una instruccin select que producir la tabla que interesa. La lista_nombres_columnas se puede usar
para asignar nombres a las columnas de la vista. Esto es til en el caso en que las columnas que
derivan de la expresin_tabla sean resultado de un clculo (por ejemplo COUNT(nombre_columna)) y
por ello no tengan un nombre explcito. Una vez creada, una vista se puede utilizar como una tabla
normal. Las unicas limitaciones se refieren a las operaciones que cambian los datos contenidos en
ella. En efecto, no todas las vistas pueden actualizarse. Las reglas que discriminan entre una vista
actualizable y una no actualizable son ms bien complejas, y no es este el lugar para describirlas
(vanse los libros en la bibliografa, concretamente el de C.J. Date). Aqu vamos a limitarnos a intentar
entender, mediante un ejemplo, por qu sucede esto.
Hagamos la prueba usando la siguiente vista en nuestra base de datos bibliogrfica:
CREATE VIEW book_publisher89
AS SELECT B.title, P.name
FROM Book B, Publisher P
WHERE B.publisher = P.ID
AND B.pub_year=1989
sta nos permite ejecutar la query que la define simplemente utilizando la instruccin:
SELECT * FROM book_publisher89
Podemos tambin introducir ulteriores condiciones (o hacer que el resultado se ordene segn una
columna concreta de la vista, etc...):
SELECT title FROM book_publisher89
WHERE name = "ACM Press"
Esta ltima interrogacin nos ofrece la lista de los ttulos de los libros publicados por ACM Press en
1989.
Como se ve, por lo que respecta a las operaciones de interrogacin, una vista se comporta como una
tabla normal. Las diferencias aparecen cuando se intentan aplicar a una vista operaciones de
actualizacin. Por ejemplo, si intentamos ejecutar la siguiente instruccin:
INSERT INTO book_publisher89
VALUES( "Nuevo libro", "publisher")
La DBMS no conseguir ejecutarla, devolviendo un error del tipo "No INSERT permission". El motivo
es que no es capaz de crear las lneas correspondientes a nuestro nuevo rcord en las dos tablas
"reales" en las que se ha originado la vista (los problemas son varios: tiene que crear slo una lnea en
la tabla Book y conectarla a una lnea concreta de la tabla Publisher, o crear una lnea en ambas
tablas; cmo decidir qu valores darles a las llaves primarias de los eventuales nuevos rcords; qu
valores darles a los otros campos de las dos tablas, etc...)
Gracias a las vistas (y a la asignacin prudente de los permisos a los usuarios) es posible conseguir
que diferentes usuarios tengan una percepcin de la estructura de la base de datos, si bien muy
diferentes de la que tiene realmente, e impedir que algunas categoras de usuarios puedan acceder a
informaciones que no les competen.
Por ejemplo, supongamos que contamos con una tabla en la que se han memorizado los datos
personales de los empleados de una empresa, as como las cantidades que conforman sus
respectivos sueldos. Obviamente, habra que evitar la consulta de los datos relativos a los sueldos por
parte de los usuarios, excepto quienes se tienen que ocupar de su erogacin/administracin. Un
sistema para hacerlo consiste en definir una vista que contenga slo las columnas de los datos
personales. As, todos los usuarios autorizados a acceder a dichos datos, pero no a los de los sueldos,
podrn entrar slo a travs de dicha vista. Ulteriores particiones podran hacerse en sentido horizontal,
creando por ejemplo una vista que slo contenga las informaciones sobre los directivos y otra con los
datos del resto de los dependientes. Adems, las vistas a menudo contribuyen a facilitar la
independencia entre aplicaciones y estructura de los datos, lo que hace que las bases de datos de los
instrumentos sean tan tiles. Efectivamente, si en un momento determinado fuese necesario cambiar
la estructura de la base de datos (descomponiendo, por ejemplo, una tabla en dos por motivos de
eficacia), no habra que modificar todas las aplicaciones adaptndolas a la nueva estructura, sino que
sera suficiente crear las vistas pertinentes, de modo que, desde el punto de vista de las aplicaciones,
nada haya cambiado.