Documentos de Académico
Documentos de Profesional
Documentos de Cultura
PORTADA
CURSO DE INTRODUCCIÓN A BASES DE DATOS
Profesor: LUIS ICHAICOTO BONCANCA
PORTADA
1. INTRODUCCION
En este curso aprenderemos sobre las bases de datos y la utilización de los sistemas de gestión de
bases de datos, principalmente desde los puntos de vista de usuario, diseñador y desarrollador de
aplicaciones de bases de datos. Muchas aplicaciones, hacen uso de bases de datos para funcionar,
estas bases de datos están disponibles para las aplicaciones que las utilizan gracias a un sistema de
gestión de bases de datos.
En la actualidad, los sistemas de gestión de bases de datos son bastante populares, podemos
encontrarlos virtualmente en todas partes: Están detrás de muchos sitios web, en sistemas de gestión
bancaria, sistemas de telecomunicación, experimentos científicos, explotación de redes de sensores,
etc.
Principalmente, proporciona los medios necesarios para manejar o manipular enormes cantidades de
datos o información. Una definición más detallada es la siguiente:
Expliquemos los aspectos relevantes que hacen tan populares a estos sistemas:
Volumen de datos: Las bases de datos manejan enormes cantidades de datos actualmente,
del orden de los terabytes, en muchos casos se trata de terabytes de datos diarios. El detalle
crítico respecto a este volumen elevado, es que generalmente los sistemas de gestión de bases
de datos, manejan volúmenes de datos superiores a la capacidad de memoria de los sistemas
computacionales habituales, es decir, aunque las capacidades de memoria para la ejecución de
aplicaciones crecen de forma rápida, el volumen de datos que deben gestionar las bases de
datos crece a un ritmo mucho más rápido. Por tanto, los SGBD están diseñados para manejar
datos ubicados fuera de la memoria principal de los sistemas computacionales.
Persistencia: Los datos manejados por un SGBD, se dice normalmente que son persistentes, es
decir, el ciclo de vida de los datos almacenados en la BD es mucho mayor que el ciclo de vida
de los programas que acceden a los datos en un determinado momento.
Recordarles que los programas al ser ejecutados, se cargan en memoria, se crean variables y se
manipulan datos cargados en memoria. Una vez se termina el procesamiento de datos y
presentación de resultados, el programa finaliza y desaparece de la memoria así como los
datos; todo lo contrario para los SGBD, donde lo que permanece son los datos, los programas
se inician, operan sobre los datos de la BD, finalizan su sesión y los datos siguen en la BD; a
menudo se da el caso de que multiples programas operan sobre los mismos datos de la BD.
Seguridad: Puesto que los SGBD manejan información crítica como pueden ser de los sistemas
de telecomunicación o los sistemas bancarios, deben existir mecanismos que garanticen la
existencia consistente de los datos manejados por el SG, mecanismos que eviten la pérdida o
sobre escritura de los datos ante fallas o averías como: fallos de hardware, software, apagones
eléctricos (sería catastrófico si el saldo se su cuenta bancaria se modificara como consecuencia
3
de un apagón); incluso ante los ataques de usuarios maliciosos que traten de corromper los
Página
datos.
Multi-usuario: Hemos mencionado la situación en que varios programas pueden operar sobre
la misma BD; En el caso de un solo programa operando sobre los datos, es posible que dicho
programa permita el acceso simultáneo o concurrente a más de un usuario. Cuando se da este
caso de acceso de multiples aplicaciones a los mismo datos, el sistema debe contar con
mecanismos que garanticen la consistencia de dichos datos ante esta situación; por ejemplo,
el sistema debe prevenir situaciones como la posibilidad de que parte de un dato sea
modificado por un usuario y la otra parte por otro usuario.
Estos mecanismos ejercen un control a nivel de los elementos atómicos de los datos en la BD, de
manera que varios usuarios pueden estar operando en la misma base de datos, pero no actúan
sobre los mismos elementos de datos (tablas, atributos, tuplas, etc.)
Conveniencia: Una de las características críticas en el diseño de los SGBD. Se deben diseñar de
manera que hagan muy fácil la operación con enormes cantidades de datos, que permitan un
procesamiento interesante y potente de los datos almacenados, esto ocurre en dos niveles:
o Independencia física de los datos: Quiere decir, que en disco (dispositivo de
almacenamiento masivo o secundario), los datos están distribuidos y estructurados de
una forma determinada, que es diferente e independiente de la forma en que los
programas conciben la estructura de los datos. Esto permite que se pueda cambiar la
estructura física de los datos, sin necesidad de cambiar el programa que accede a los
datos, lo que significa, las operaciones sobre los datos son independientes de la
estructura y distribución de los datos en disco.
o Lenguajes de consulta de alto nivel: Normalmente las consultas a SGBD se suelen
hacer con lenguajes relativamente compactos, que describen a muy alto nivel (muy
próximo al idioma en que nos expresamos), la información que se quiere de la BD;
concretamente, se rigen por el concepto de declarativo, quiere decir que en un
lenguaje de consulta, solo hay que centrarse en expresar o decir lo que se quiere de
la base de datos y no pensar en la formulación del algoritmo capaz de extraer dicha
información de la BD. Esta es una característica muy importante, ya que nos permite
formular fácilmente las consultas, sabiendo que el propio sistema se encargará de
determinar el algoritmo más apropiado para extraer los datos de forma eficiente.
Eficiencia: Existe un dicho en el sector inmobiliario que dice: Cuando eres dueño de una
propiedad, los tres aspectos más importantes dela misma, son la ubicación de la propiedad,
la ubicación y la ubicación; en el mundo de las bases de datos, se aplica un dicho similar, que
dice: Los tres aspectos más importantes en un SGBD son: primero, el rendimiento, segundo,
el rendimiento y tercero, el rendimiento.
Los sistemas reales de bases de datos, deben realizar miles de consultas/actualizaciones por
segundo y no necesariamente se trata de consultas elementales, suelen ser en muchos casos,
operaciones muy complejas; por tanto construir un SGBD capaz de ejecutar consultas,
consultas complejas a este ritmo sobre una enorme cantidad de datos (terabytes de datos), no
4
es tarea fácil, y esa es otra de las características principales que debe reunir un buen sistema
Página
Bueno, todas estas características descritas, nos deben dar una idea de la importancia y la
responsabilidad de los SGBD. De modo que deberíamos estar convencidos de la importancia de todas
estas características, si diseñamos aplicaciones que vayan a utilizar bases de datos.
Uso de frameworks para desarrollo de aplicaciones de bases de datos: Los frameworks son
entornos que facilitan el desarrollo de aplicaciones y traen integradas las funciones necesarias
para ayudarnos a establecer las conexiones a las bases de datos, de modo que nuestra
aplicación pueda lanzar consultas a la base de datos sobre la que debe operar. Algunos
frameworks populares son Ruby-on-rails, Django, etc. No vamos a tratar el uso de frameworks
en este curso, más bien nos centraremos en el mismo sistema de base de datos, en cómo se
utiliza y que nos proporciona.
Uso de “middleware”: A menudo los SGBD se utilizan conjuntamente con determinadas
aplicaciones conocidas por ese nombre. El software middleware facilita la interacción de las
aplicaciones con el SGBD de distintas formas. Algunos ejemplos de este tipo de software son,
los servidores de aplicaciones, servidores web, etc. En este curso tampoco se tratará este
tema.
El uso intensivo de datos por una aplicación, no implica la existencia de un SGBD asociado:
No es cierto que toda aplicación que hace un uso intensivo de datos, necesariamente utiliza un
SGBD; Históricamente, se han utilizado archivos para el almacenamiento de gran cantidad de
datos, aunque actualmente esta práctica ha quedado en desuso, pero hay una gran cantidad
de información por allí disponible en archivos o ficheros; por ejemplo en hojas de cálculo
Excel, y resultan útiles de alguna manera; el procesamiento de datos no siempre se realiza
mediante consultas asociadas a SGBD, un ejemplo es el software hadoop, que es un
framework de procesamiento para ejecutar operaciones sobre información almacenada en
ficheros o archivos.
Este curso se centra en torno a los SGBD propiamente dichos y en como almacenar y operar sobre
los datos a través de un SGBD.
MODELO DE DATOS: Es la descripción general de cómo están estructurados los datos, nos dice
la forma general que tendrán los datos en la BD. Uno de los más populares es el modelo
relacional, del que hablaremos bastante; en el modelo relacional, los datos se almacenan
como un conjunto de registros o filas.
Otra alternativa popular para almacenar datos (otro modelo de datos) es mediante el formato XML, el
formato XML representa los datos mediante una estructura jerárquica de valores etiquetados.
También se puede almacenar datos mediante grafos, con lo cual los datos en la BD se almacenan en
5
El concepto de esquema y dato se puede comparar con los conceptos “tipo de datos” y “variables”
utilizados en los lenguajes de programación.
En un lenguaje de programación definimos tipos de datos para diferentes variables de manera que la
variable solo puede soportar valores que se ajustan al tipo de datos definido, mientras que durante la
ejecución, el valor de la variable puede quedar modificado de un momento a otro, siempre por un
valor del mismo tipo; De forma análoga, en las bases de datos, definimos un esquema y luego
almacenamos un montón de datos que se deben ajustar a dicho esquema.
Por lo general, el esquema de una BD se define al principio de su creación, y apenas se modifica con el
tiempo, pero sin embargo, los datos si cambian bastante a lo largo del tiempo.
Una vez creado el esquema de la BD, y tras cargar datos a la misma, es cuando se puede utilizar el
LMD. Es el lenguaje utilizado para realizar consultas y modificaciones a los datos de la BD.
datos de ventas, puede haber algunas aplicaciones que operan sobre la BD insertando la
Página
información de ventas conforme se van produciendo las ventas, y otras aplicaciones podrían
operar sobre la BD analizando las ventas. Por lo tanto no necesariamente habrá un
acoplamiento 1-a-1 entre bases de datos y aplicaciones.
2. EL MODELO RELACIONAL
El modelo relacional existe desde hace más de treinta y cinco años y es en realidad, la base
fundamental de los sistemas de bases de datos. Marcó el inicio de una gran industria multimillonaria.
Entre sus características principales, destacan:
Atributos: Forman parte de las relaciones, cada relación o tabla consta de un número
predefinido de atributos con nombre asignado. Cada atributo es una columna de la tabla;
podemos entender los atributos como los datos informativos que queremos almacenar sobre
un tema concreto (el nombre de la tabla).
7
Página
Continuando con nuestro ejemplo de estudiante y universidad, podemos crear como atributos para
estudiantes: identidad del estudiante (eID), su nombre (enombre), su calificación (calificación) y la foto
del estudiante (foto); para la tabla universidad, el nombre de la universidad (unombre), la provincia
donde se encuentra (provincia) y el precio de matrícula (matricula). Entonces las tablas quedarían de la
siguiente forma:
estudiante
eid enombre calificacion foto Constituyen la estructura de las
tablas, los datos reales estarán en
lo que llamaremos tuplas o filas de
la tabla. Justo del encabezado que
universidad
contiene los nombres de atributos.
unombre provincia matricula
En el estado actual, las tablas
están vacías (no contienen ningún
dato real).
estudiante
eid enombre calificacion foto En el estado actual, las tablas
123 Obiang Belobe 7,7 están pobladas (contienen
234 Bindang Bakale 6,5 información real). En una base de
datos real, habrá millares de filas,
cada una con un valor en cada
universidad
unombre provincia matricula atributo.
UNGE BN 50000
SIPACO BS 30000
ATENEO LT 60000
Tipo (dominio): Cada atributo de una tabla tiene un tipo de datos asignado, lo que determina
su dominio o los valores que pueden ser almacenados en su lugar correspondiente de la fila.
Por ejemplo, la identidad de un alumno, será un número entero (en Guinea Ecuatorial, no
utilizamos letras ni decimales en el número de identificación), el nombre será de tipo texto, la
calificación será de tipo número decimal (coma flotante o float), etc.; para la universidad,
tendríamos el nombre y la provincia como texto y la matricula como un valor numérico (puede
ser decimal o entero).
Esquema (o estructura): El esquema de una base de datos es la estructura de sus relaciones o
tablas, es decir, es la descripción estructural de las tablas de la base de datos, incluye el
nombre de las relaciones, el nombre de los atributos de cada relación y los tipos de datos de
estos atributos.
Instancia: La instancia de una base de datos, se refiere al contenido real de la base de datos en
un instante determinado. Por lo general, el esquema se establece a priori, en el momento
inicial, mientras que las instancias de la BD, tienden a cambiar a lo largo del tiempo.
NULL (NULO): Ya sabemos que cada atributo tiene un tipo de datos definido. Pero existe el
tipo null o nulo disponible para cualquier atributo de una tabla. Los valores nulos se utilizan
para indicar que el valor de un atributo concreto puede ser “desconocido” ó “indefinido”. Por
8
Página
ejemplo:
Nos dan la siguiente información acerca de un estudiante que hay que registrar en la base de datos,
id=345, nombre= Bilogo Mba, calificación = (No nos han dado la calificación del estudiante) y foto=
archivo JPG.
Por otra parte puede que Bindang Bakale no entregase su foto a la hora de inscribirse, por tanto,
también tendríamos un valor nulo en el atributo foto.
Observación: Los valores nulos son interesantes, pero debemos tener bastante cuidado a la hora de
formular consultas a una base de datos donde pueden existir valores nulos. Tendremos que manejar
esas situaciones de forma especial. Más adelante estudiaremos los efectos que puede tener la
presencia de estos valores, por ahora vemos un ejemplo:
Evidentemente, esperamos entre nuestros resultados a Obiang Belobe y Bindang Bakale, pero ¿qué
hay de Bilogo Mba?, ¿debería aparecer en los resultados?, pues claro que no, ya que al no estar
disponible su nota, no tenemos garantía alguna de que su nota sea mayor que 5.
Otro ejemplo:
Pues entre los resultados, es seguro que aparecerá Bindang Bakale, pero ¿que hay de Bilogo Mba?,
como en el caso anterior, no hay ninguna garantía acerca del valor de su nota, por tanto tampoco
aparecerá. Bueno, hasta ahora todo parece razonable, pero veamos que pasa en este último caso:
Consulta (query): Nombres de alumnos que tengan una calificación >7 OR <=7.
Pues aparentemente, esta consulta debería mostrarnos el total de alumnos que hay en la tabla, pues la
nota de cualquier alumno estará ente 0 y 10 puntos, sea cual sea cumplirá una de las dos condiciones;
pero resulta que este comportamiento no se cumple cuando existen valores nulos entre los datos, y
esta es la razón por la que habrá que andarse con cuidado cuando tratemos con sistemas que admiten
valores nulos.
Clave (Key): Es uno de los conceptos más importantes en el modelo relacional, la clave es un
atributo cuyo valor es único para cada fila de la tabla. Nunca puede repetirse el valor entre dos
o más datos de un atributo definido como clave.
En las tablas de nuestro ejemplo, intuitivamente podemos determinar que el atributo
9
identidad del estudiante (eid) será una clave, ya que sabemos de sobra que el documento de
Página
identidad no es compartido en ninguna parte del mundo. Por otra parte la situación para la
tabla universidad, no es tan clara. Por ejemplo el nombre de la universidad podría ser una
clave, pero corremos el riesgo de que existan dos o más universidades en el mundo real que
tengan el mismo nombre (podría existir otras universidades llamadas UNGE en otras
provincias). Esto da lugar al concepto de clave múltiple.
Clave múltiple: es una clave definida mediante un conjunto de atributos, es decir, no se puede
repetir en ninguna fila, una misma combinación de valores de los atributos que conforman la
clave.
Observación: Cuando diseñamos la base de datos sobre papel, escribiendo los nombres de tablas y sus
atributos, es habitual indicar los atributos clave mediante subrayado de sus nombres.
Importancia de las claves: Las claves tienen mucha utilidad en el modelo relacional, por ejemplo, se
utilizan para:
Para concluir, quiero mostrarles cómo se crea una relación (tabla) en el lenguaje de consulta de alto
nivel SQL:
Es bastante frecuente que la carga inicial de datos provenga de una fuente externa,
como unos archivos Excel, archivos csv, etc. La figura siguiente muestra un proceso
de carga de datos desde un fichero externo; una vez cargados los datos, ya
tendremos cierta cantidad de tuplas o filas en las tablas de la base de datos,
entonces podemos proceder al paso siguiente.
Las bases de datos relacionales soportan consultas ad-hoc en lenguajes de alto nivel:
con el término ad-hoc, nos referimos a que es posible plantear consultas que no han
sido premeditadas, podemos formular consultas que se nos ocurran de repente. No
hay necesidad de escribir todo un programa para una consulta específica, podemos
utilizar el lenguaje para formular la consulta mientras pensamos en lo que queremos
preguntar a la base de datos.
Y como ya se ha dicho antes, los lenguajes soportados por los sistemas relacionales,
son de alto nivel, lo que significa, posibilidad de escribir de forma compacta
consultas complicadas y sin preocuparnos de formular el algoritmo necesario para
extraer los resultados de la base de datos.
Veamos algunos ejemplos de consultas que podemos plantear en una base de datos,
11
12
Página
4. LENGUAJES DE CONSULTA (QUERY)
Algebra Relacional
Es un lenguaje formal, por su nombre deducimos que es un algebra, por lo que está
bastante bien fundamentado teóricamente.
SQL
Select estudiante.eID
From estudiante, solicitud
Where estudiante.eID = solicitud.eID
And calificacion > 7.0 and uNombre =
‘UNGE’
Y vemos la diferencia de operadores y palabras clave de ambos lenguajes, pero las
dos expresiones expresan (valga la redundancia) exactamente lo mismo, por tanto,
son totalmente equivalentes.
En el tema siguiente estudiaremos las bases fundacionales del lenguaje SQL a través
del algebra relacional. Una vez comprendido estas bases, procederemos al estudio del
lenguaje SQL.
13
Página
CURSO DE INTRODUCCIÓN A BASES DE DATOS
Profesor: LUIS ICHAICOTO BONCANCA
PORTADA
Introducción
Es un lenguaje formal, es el álgebra que describe los fundamentos sobre los que se
crean los lenguajes implementados como el SQL.
estudiante
eID eNombre calificacion cInstituto
Los atributos subrayados son las respectivas claves de dichas relaciones, es decir,
Los nombres de Universidad (uNombre) son únicos, la identidad de cada estudiante
(eID) es única y la solicitud de una especialidad en una universidad concreta solo
puede hacerse una vez por cada estudiante (Ej. un estudiante solo puede tener una
única solicitud de la especialidad de mecánica en la UNGE)
15
Página
1. CONSULTA MAS ELEMENTAL
2. OPERADORES
SINTAXIS: ( )
EXPRESION: Puede ser una tabla o consulta de algebra relacional, que como
sabemos, dará como resultado una relación.
Ejemplos:
∧ ( )
Si además queremos que solo aparezcan aquellos estudiantes que han asistido
en institutos con capacidad inferior a 200 alumnos, tenemos que anidar las
16
⋀ ( )
Observaciones:
SINTAXIS: ( )
EXPRESION: Puede ser una tabla o consulta de algebra relacional, que como
sabemos, dará como resultado una relación.
Ejemplos:
Ejemplo:
Para ello, debemos aplicar primero el operador selección para quedarnos con una
relación que contenga solo los estudiantes que cumplan la condición (calificación
Página
>7).
( )
Una vez tenemos la expresión que nos devuelve ese subconjunto de la tabla
estudiantes, le aplicamos la proyección indicando solo los dos atributos eID y
eNombre.
, ( ( ))
Observaciones:
, ( )
A diferencia del lenguaje SQL que está basado en multi-conjuntos o bolsas, donde sí
se conservan los duplicados debido a que la multiplicidad de los elementos de un
multi-conjunto siempre es ≥1, mientras que para los conjuntos la multiplicidad es
estrictamente =1.
18
Página
2.5 OPERADOR PRODUCTO CARTESIANO
SINTAXIS: ×
estudiante solicitud
eID eNombre calificacion cInstituto eID uNombre especialidad decision
123 Antonio 9 300 123 UNGE MECANICA SI
456 Etundi 8,5 200 456 AUCCA ELECTRONICA NO
La formulación de esta consulta nos exige acceder a los registros de las relaciones
estudiante y solicitud, ya que la información que necesitamos se encuentra
dispersada entre ambas relaciones.
( × )
La expresión anterior nos devuelve una relación que contiene ocho atributos (cuatro
de estudiante y cuatro de solicitud).
. . ( × )
Seguidamente, añadimos las condiciones adicionales que nos exige la consulta:
. . ⋀ ⋀ ⋀ (
× )
Y finalmente, nos quedamos solo con los atributos que nos exige la consulta,
poniendo toda la expresión anterior en un paréntesis, y aplicando PROYECCION a
dicha expresión:
, ( . . ⋀ ⋀ ⋀
( × ))
Es un operador del algebra relacional que simplifica el uso del producto cartesiano
en el caso particular de los atributos con igual nombre en ambas relaciones, es decir,
la unión natural realiza un producto cartesiano aplicando internamente la condición
de igualdad para todos los atributos con igual nombre en ambas relaciones.
Observaciones:
Primero, utilizando la unión natural, vemos que no tenemos que añadir la condición
Página
de igualdad entre los atributos con el mismo nombre entre ambas relaciones, ya que
de esto se encarga el propio operador⋈: ( ⋈ )
A continuación podemos añadir el resto de condiciones que nos exige la consulta:
∧ ∧
( ⋈ )
Y finalmente podemos proyectar para quedarnos con los atributos que nos interesan
(eNombre y calificacion).
, ( ∧ ∧
( ⋈ ))
Ejemplo 2: Queremos los nombres y las calificaciones de estudiantes que asistieron a
institutos con capacidad para más de 200 alumnos, que hayan solicitado
INFORMATICA en universidades cuya matrícula cuesta más de 50000 y que han sido
rechazados.
En primer lugar, nos damos cuenta que ahora el problema involucra una tercera
relación (universidad). Para formular esta consulta, tenemos que hacer una unión
natural también con la tabla de universidad y añadir una condición más a la lista de
condiciones anteriores. – En el ejemplo solo se han resaltado las modificaciones
hechas al ejemplo anterior.
, ( ∧ ∧ ∧
( ⋈( ⋈ )
Observaciones:
Técnicamente la unión natural es una operación binaria, es decir, actúa sobre
dos relaciones. Así que con los paréntesis debemos determinar el orden en que
queremos que se hagan las uniones, teniendo en cuenta los atributos que
deben igualarse: se debe unir universidad con solicitud por el atributo común
uNombre y luego este resultado se debe unir a estudiantes por el campo eID.
⋈ = ( )∪ ( )( . . ∧ . . …( × )
natural.
SINTAXIS: ⋈
El subíndice theta representa una condición tal como vimos para el operador de
selección s. básicamente la UNION THETA equivale a aplicar una consulta de
selección sobre el producto cartesiano de dos expresiones aplicando la condición
THETA.
⋈ ≡ ( × )
Visto así, parece irrelevante su mención en este texto. Pero la razón de mencionarlo
es que varios sistemas de gestión de bases de datos (SGBD) implementan esta
operación como la operación básica para combinar relaciones, es decir el término
“unión” o “join”, en muchos casos significa unión theta.
En resumen, lo que hace es: Coge dos relaciones, combina las dos relaciones y
devuelve una relación que contiene solo las tuplas que cumplen la THETA-
CONDICION.
2.8. RESUMEN:
SINTAXIS: ∪
Requisito: Las reglas del algebra relacional exigen que EXP 1 y EXP 2 tengan un
esquema o estructura idéntico para poder hacer la UNION.
universidad
uNombre Provincia matricula N/D
UNGE BN 50000 UNGE
AUCCA LT 200000 AUCCA
UNED BS 150000 UNED
IYANGA
estudiante BONEKE
eID eNombre calificacion cInstituto BAKALE
123 IYANGA 7,5 200
456 BONEKE 8,3 150
234 BAKALE 6,5 300
Intuitivamente podemos pensar que es posible generar esta lista con los operadores
ya estudiados hasta ahora para combinar diferentes relaciones como (PRODUCTO
CARTESIANO O UNION NATURAL).
( )× ( )
universidad
N/D N/D
uNombre Provincia matricula
UNGE BN 50000 UNGE IYANGA
AUCCA LT 200000 UNGE BONEKE
UNED BS 150000 UNGE BAKALE
AUCCA IYANGA
estudiante AUCCA BONEKE
eID eNombre calificacion cInstituto AUCCA BAKALE
123 IYANGA 7,5 200 UNED IYANGA
456 BONEKE 8,3 150 UNED BONEKE
234 BAKALE 6,5 300
UNED BAKALE
( )∪ ( )
SINTAXIS: −
Requisito: Las reglas del algebra relacional exigen que EXP 1 y EXP 2 tengan un
esquema o estructura idéntico para poder hacer la DIFERENCIA.
Formular esta consulta puede parecer complicado, pero resulta bastante fácil como
veremos.
Y que basta con eliminar del conjunto A, todos aquellos elementos que existen en el
conjunto B.
Página
estudiante
solicitud
eID eNombre calificacion cInstituto
eID uNombre especialidad decision
123 IYANGA 7,5 200
123 UNGE INFORMATICA SI 456 BONEKE 8,3 150
456 AUCCA ELECTRONICA NO 234 BAKALE 6,5 300
234 AUCCA INFORMATICA SI 235 OBIANG 7 200
124 ANGESOMO 9 250
( )− ( )
456
123
234
456
235
234
124
Diferencia de A y B (A – B)
235
124
Ejemplo 2: Queremos las identidades (eID) y los nombres de estudiantes que no han
hecho ninguna solicitud.
Esta consulta es un poco más compleja que la anterior, uno podría pensar que basta
con añadir a la proyección sobre la tabla estudiante, el atributo eNombre. Pero, si lo
pensamos un poco más, esto violaría el requisito del operador UNION que dice: Los
esquemas de ambas expresiones deben ser idénticos. Esquema 1(eID, eNombre)
es diferente de Esquema 2 (eID).
Una forma de formular esta consulta sería, partiendo del resultado de la consulta
anterior:
( )− ( )
25
Hacemos una UNION NATURAL con la tabla estudiante (donde tenemos el atributo
Página
eNombre). ( ( )− ( )) ⋈
Con esta consulta obtenemos un esquema idéntico al de la tabla estudiante, pero
estamos seguros que solo aparecen las tuplas de los alumnos que nunca han
solicitado, de modo que ahora podemos hacer una proyección sobre este resultado,
quedándonos con los atributos que nos interesan.
, (( ( )− ( )) ⋈ ))
SINTAXIS: ∩
Requisito: Las reglas del algebra relacional exigen que EXP 1 y EXP 2 tengan un
esquema o estructura idéntico para poder hacer la INTERSECCION.
Ejemplo 1: Queremos saber si hay nombres de alumnos que coinciden con nombres
de universidades
estudiante universidad
eID eNombre calificacion cInstituto uNombre Provincia matricula
123 IYANGA 7,5 200 UNGE BN 50000
456 BONEKE 8,3 150
234 BAKALE 6,5 300
AUCCA LT 200000
235 OBIANG 7 200 UNED BS 150000
127 MPA SIPACO 9 250 MPA SIPACO AN 40000
Para formular esta consulta, basta con hacer dos proyecciones y aplicar la
intersección a ambas expresiones.
( )∩ ( )
elementos de E1.
E1: Contiene elementos que también están en E2 y otros que no lo están
Entonces está claro que podemos obtener la intersección eliminando de E1, los
elementos únicos de E1, dejando así los que éste conjunto tiene en común con el
conjunto E2.
Por tanto: ∩ ≡ −( − )
∩ ≡ ⋈
SINTAXIS GENERAL: _ ( _ _ , _ _ … )( )
Se trata de un operador que resulta necesario muchas veces para poder expresar
determinadas consultas o queries.
( )∪ ( )
Para resolver este problema, debemos renombrar una de las dos expresiones como
sigue:
)( ( )) ∪ )( ( ))
27
( (
Página
Como vemos ahora tendremos dos relaciones con nombre lista y cuyo único atributo
se llamará nombres.
Observación: Una de las aplicaciones principales de este operador es reasignar
esquemas para cumplir el requisito que exigen los operadores de conjuntos (UNION,
DIFERENCIA, INTERSECCION).
Otra aplicación importante del operador RENOMBRAR, es para eliminar los casos de
ambigüedad en las AUTO-UNIONES (unión de una relación consigo misma).
Ejemplo: Queremos una lista con dos columnas de manera que nos muestre pares
de universidades que pertenecen a la misma provincia.
Se entiende aquí que UNGE y MPA SIPACO están en la misma provincia así como
AUCCA y POLITECNICO, están una misma provincia diferente a la que pertenecen
UNGE y MPA SIPACO.
( × )
( ( , , ( )
× ( , , ( ))
( , , ( )
⋈ ( , , ( )
Observad que hemos igualado el nombre del atributo provincia, esto es un requisito
para que pueda funcionar el operador UNION NATURAL. Este operador solo
conserva las tuplas que tienen el mismo valor en aquellos atributos comunes a las
dos relaciones implicadas.
Observación: El resultado de esta consulta, nos producirá algunas tuplas en las que
tendremos las dos columnas del resultado con el mismo valor es decir, y tendremos
dos instancias de esta situación, aparecerán resultados como:
Problema 2: Tenemos el
UNGE MPA SIPACO
MPA SIPACO UNGE resultado buscado,
UNGE UNGE prácticamente duplicado.
Problema 1: Resultado AUCCA POLITECNICO
innecesario. No nos da POLITECNICO AUCCA
28
AUCCA AUCCA
información útil.
MPA SIPACO MPA SIPACO
Página
POLITECNICO POLITECNICO
¿Qué puedes hacer para eliminar estas tuplas innecesarias?— ¡PIENSA!
2.10 OTRAS NOTACIONES APLICABLES
≔ , , ( )
Del mismo modo, procedemos para la segunda instancia de la tabla universidad
(uni2).
≔ , , ( )
Finalmente asignaremos a la variable pu (pares de universidades), la UNION
NATURAL DE las dos anteriores:
≔ ⋈
Y ahora podemos asignar a la variable RES (respuesta), el resultado final de la
consulta:
≔ ( )
Podemos observar como de esta forma, la expresión se compacta bastante.
Vemos que la formulación de esta consulta implica las tres tablas de nuestra base de
Página
datos
Nuestro árbol tendrá como hojas, las tres relaciones de nuestra base de datos
(universidad, estudiante y solicitud). En algebra relacional, las hojas siempre serán
nombres de relaciones.
1. Sobre estas tres hojas, aplicaremos una UNION NATURAL, que como sabemos,
impone automáticamente una condición de igualdad sobre los atributos
idénticos en nombre y tipo de datos de todas las relaciones implicadas.
2. Sobre la UNION NATURAL, aplicaremos una SELECCIÓN con las dos
condiciones del problema provincia= ‘Bioko Sur’ y especialidad =
‘INFORMATICA’
3. Finalmente, sobre la SELECCIÓN, aplicaremos la PROYECCION que nos dará
el resultado buscado (calificación).
4. Y así quedaría nuestro árbol:
( ∧ (
⋈( ⋈ ))
2.11 RESUMEN FINAL
Conceptos básicos
INTERSECCION.
Página
Uso de paréntesis: Es necesario utilizar paréntesis para delimitar el rango de
actuación de los distintos operadores, eliminando así las posibles situaciones
ambigüedad.
( ( , , ( )
⋈ ( , , ( ))
( ( , , ( )
⋈ ( , , ( ))
31
Página
CURSO DE INTRODUCCIÓN A BASES DE DATOS
Profesor: LUIS ICHAICOTO BONCANCA
PORTADA
1. Introducción a SQL
El lenguaje SQL, al igual que el modelo relacional, lleva varias décadas de existencia.
Y es el pilar de un mercado multimillonario. El nombre se puede pronunciar de dos
formas, deletreando (S.Q.L) o leyendo (SIKUEL). Utilizaremos ambas.
SQL está soportado por los principales sistemas de bases de datos comerciales, es un
lenguaje que lleva existiendo desde mucho tiempo atrás, y es un lenguaje
estandarizado. Su estandarización comenzó siendo relativamente simple, pero con el
paso del tiempo, ha evolucionado bastante; hasta tal punto que las versiones
actuales del estándar SQL contienen miles de páginas, pero la esencia del lenguaje,
que es el objetivo de aprendizaje en este tema, sigue siendo relativamente simple.
Nos basaremos en el estándar SQL 2.0, también conocido como SQL 92, junto con
algunas funciones del estándar SQL 3.0.
El lenguaje se puede utilizar en un SGBD de forma interactiva mediante interfaz
gráfica de usuario (GUI) o mediante línea de comandos; pero el uso más frecuente
es mediante la incrustación de sentencias SQL en el código fuente de los programas
que hacen uso de alguna base de datos.
Por último, SQL es un lenguaje declarativo, es decir, el usuario del lenguaje sólo debe
escribir consultas bastante sencillas que expresan con claridad lo que quiere obtener
de la base de datos sin la necesidad de describir el procedimiento para obtenerlo; y
se trata de un lenguaje basado en los conceptos del algebra relacional.
Como podemos ver, una sentencia de selección está formada por tres
cláusulas básicas: la cláusula SELECT, la cláusula FROM y la cláusula
WHERE; El mejor orden para entender estas cláusulas es (1) FROM, (2)
WHERE y (3) SELECT.
La cláusula FROM: Identifica las relaciones o tablas sobre las que queremos
consultar; la CONDICION se utiliza para combinar y filtrar las tablas y
finalmente la cláusula SELECT nos dice que hay que devolver como resultado.
Conclusión:
Se trata de un lenguaje declarativo de alto nivel, cuyas bases proceden del algebra
relacional.
estudiante
eID eNombre calificacion cInstituto
Los atributos subrayados son las respectivas claves de dichas relaciones, es decir,
Los nombres de Universidad (uNombre) son únicos, la identidad de cada estudiante
(eID) es única y la solicitud de una especialidad en una universidad concreta solo
puede hacerse una vez por cada estudiante (Ej. un estudiante solo puede tener una
única solicitud de la especialidad de mecánica en la UNGE).
A continuación se muestra una instancia del contenido de las tablas de nuestra base
de datos:
35
Página
Página 36
Bien, con toda esta información, vamos a proceder a las demostraciones formulando
diferentes consultas de ejemplo, que a la vez nos irán enseñando las diferentes
características del lenguaje SQL.
Consulta 2: Queremos una lista que muestre los nombres de estudiantes y junto a
las especialidades solicitadas por dichos estudiantes.
Como podemos deducir, esta consulta combina dos tablas o relaciones, la tabla de
estudiantes y la tabla de solicitudes; básicamente se pide todos los registros de la
tabla solicitudes, pero ya que nos piden también el nombre de los estudiantes,
estamos obligados a incluir la tabla estudiantes (es la que contienen los nombres de
estudiantes).
Formulemos esta consulta por partes:
En la sección SELECT, indicamos los atributos que nos pide la consulta: eNombre,
especialidad.
En el FROM, indicamos las tablas o relaciones implicadas: estudiante y solicitud; y
finalmente,
En el WHERE, formulamos la condición de filtro. Estudiante.eID = solicitud.eID; Se
trata de una condición de unión que nos dice: Queremos combinar tuplas de la tabla
estudiantes con tuplas de la tabla solicitud que tengan el mismo valor en el atributo
eID de ambas tablas. Esta condición, es lo que ocurre de forma automática en la
unión natural que estudiamos en algebra relacional; pero en SQL, siempre tenemos
que expresar la condición de unión natural de forma explícita. Y este es el resultado
al ejecutar la consulta en el motor de SQL.
38
Página
OBSERVACIONES:
Al ejecutar esta consulta de la forma planteada, nos devuelve error (lo sabemos por la
línea ondulada roja que subraya toda la consulta). Este error es causado por el
atributo indicado en el SELECT. Se trata de un problema de ambigüedad, ya que
existe el atributo uNombre en las dos tablas implicadas, SQL exige que se especifique
siempre cuál de los dos atributos se desea; para ello, basta con añadir como prefijo
del atributo, el nombre de la tabla a la que pertenece, por ejemplo,
universidad.uNombre (al tratarse del mismo atributo, con mismo valor, nos dará
igual, pero SQL exige que se indique de forma explícita).
Esta consulta implica unir todas las tablas de nuestra base de datos por lo que en
nuestra cláusula FROM aparecerán las tres tablas, y en el filtro WHERE, debemos
añadir condiciones que nos garanticen que entre la tabla solicitud y estudiante, nos
referimos siempre a un mismo estudiante y entre la tabla solicitud y universidad, nos
referimos siempre a la misma universidad.
42
Página
Cuando el orden es importante para nosotros en nuestro resultado, el lenguaje SQL
proporciona el modificador ORDER BY + nombre_atributo+sentido de ordenamiento
(ascendente ASC ó descendente DESC) que permite ordenar los resultados en base a
un atributo o grupo de atributo. Por ejemplo, si queremos ordenar los resultados de
la consulta anterior en orden descendente del valor de calificación, añadiríamos la
cláusula order by calificación desc.
EL OPERADOR LIKE
Es un operador integrado en SQL que nos permite hacer comparaciones de cadenas
de texto sobre valores de atributos. Por ejemplo, si deseamos conocer la
identificación y la especialidad elegida por estudiantes que han solicitado
especialidades que contengan la cadena “bio”, sería:
OBSERVACION:
OBSERVACIÓN: Vemos que el atributo calculado tiene un nombre aritmético, si no nos gusta dicho
nombre, podemos cambiarlo mediante el operador “as”, como se muestra a continuación:
SELECT eID, eNombre, calificacion, cInstituto, (calificacion/10)*100 as porcentaje
FROM estudiante; PARA TABLAS Y OPERADORES DE CONJUNTOS
3. VARIABLES
45
El resultado de esta consulta no es lo que nos interesa demostrar, por tanto vamos a
modificar esta consulta para demostrar el uso de las variables para tablas, la
consulta anterior quedaría de la siguiente forma:
Como podemos observar, las tablas pueden ser renombradas en la cláusula FROM
con el nombre que nos interese (lo que se conoce como un ALIAS), y podremos
utilizar dicho nombre en las otras secciones de la consulta (SELECT y WHERE). En
el ejemplo, la tabla estudiante se está renombrando con la variable E, la tabla
universidad con la variable U y la tabla solicitud, con la variable S.
El uso de estas variables, nos permite ahorrar tiempo ya que no tenemos que escribir
el nombre completo de la tabla para referirnos a ella. Pero el resultado de esta
consulta reescrita, es exactamente igual al de la consulta original.
Ahora veamos una aplicación de utilidad de estas variables.
Consulta 2: Queremos encontrar todos los pares de estudiantes que tengan la
misma calificación.
Para formular la consulta 2, necesitamos dos instancias de una misma tabla (la tabla
46
47
Página
OBSERVACION: La consulta tal como se ha formulado, incluye cada estudiante pareado consigo mismo
debido a que existe el estudiante en las dos instancias de la tabla. Si no nos interesa ver cada estudiante
consigo mismo se puede corregir la consulta añadiendo una condición que diga que el estudiante de la
instancia 1 debe ser distinto al estudiante de la instancia 2.
48
Página
OBSERVACION: Al imponer la condición de
E1.eID distinto (<>) de E2.eID, la cantidad de
resultados se ha reducido bastante. Pero
seguimos teniendo un fenómeno que puede
no ser lo que queremos como resultado,
pues estamos obteniendo resultados
alternativos como NVO NCHAMA---
PANADES MENEJAL y luego PANADES
MENEJAL---NVO NCHAMA, que básicamente
nos dan la misma información. Pero este
problema es de fácil solución, basta con
cambiar el operador distinto (<>) por el
operador menor que (<).
OPERADOR UNION
Si nos interesa retener los valores duplicados, en lugar de UNION, tenemos UNION
ALL, que si es un operador multi-conjunto. Y veremos que el resultado aparecerá
desordenado y con los valores duplicados incluidos.
50
Página
OPERADOR INTERSECCION
RESULTADO
OPERADOR DIFERENCIA
de esta forma: Va a proyectar los atributos eID y eNombre tomando los valores o
tuplas de aquellos estudiantes cuyo eID aparece en la lista que nos da la sub-
Página
consulta.
En realidad se puede conseguir el resultado del ejemplo 1 sin utilizar una sub-
consulta. La consulta sería la siguiente:
Como vemos, al formular la consulta de esta forma, aparece la línea roja ondulada,
que nos indica la existencia de un error sintáctico en la expresión. En realidad, este
error ha sido voluntario para recordarles la importancia de evitar la ambigüedad en
nuestras expresiones, cuando tenemos atributos iguales en distintas relaciones. En
este caso, el problema está en el atributo eID, debemos indicar en la sección
SELECT, de qué relación vamos a tomar los valores del atributo ya sea de estudiante
o de solicitud. Al final, de una u otra relación, el resultado será el mismo, pero SQL
exige que se indique explícitamente.
***Notar que hay dos estudiantes diferentes con el nombre Craig, el 345 y el 543.
Por lo que al eliminar duplicados, Craig no se considera duplicado por el atributo
eID. ***
Este problema es muy similar al anterior, salvo que en este caso, solo estamos
interesados en el nombre y no en la identidad.
Observación: Ahora vemos que seguimos teniendo los mismos 5 resultados que
obtuvimos en el ejemplo 1 con la sub-consulta. Pero en este caso, al tener solo el
nombre, Craig ahora se ve como un verdadero duplicado; si añadimos el operador
DISTINCT, nos quedaremos con un Craig, a pesar de que internamente existen
dos estudiantes diferentes con ese nombre.
53
Página
Veamos ocurre al reformular la expresión anterior sin el uso de la sub-consulta:
DISTINCT ese problema se resuelve, pero, se crea otro problema. En caso de haber alumnos
Página
diferentes con la misma calificación, DISTINCT eliminaría una calificación necesaria para
calcular el promedio correcto. Como vemos, la única forma fiable es mediante la sub-consulta.
Retomemos el ejemplo utilizado para demostrar el operador diferencia, dijimos que
con las herramientas SQL aprendidas hasta entonces, NO ERA POSIBLE reformular
dicha consulta.
Ahora que conocemos el operado IN, mencionar que este operador tiene su opuesto
NOT IN que nos permitirá reformular la consulta anterior sin hacer uso de EXCEPT.
OBSERVACIÓN: En realidad, el
operador es IN, y lo utilizamos
para comprobar si un valor
pertenece o no a un conjunto de
valores. Existe el operador
NEGACIÓN conocido como NOT,
que hace lo contrario de la
expresión que lleva delante.
También podríamos aplicar la
“NOT” antes del eID y
obtendríamos el mismo resultado.
Los operadores IN y su negación NOT IN que hemos utilizado hasta ahora, nos han
servido para probar la pertenencia o no de un valor a un conjunto de valores
determinado resultante de una sub-consulta. Veamos otros operadores EXIST y su
negación NOT EXIST para comprobar si una sub-consulta devuelve un conjunto
vacío o no.
Referencia correlativa: Es una referencia hecha desde una sub-consulta, tal que, el
valor referenciado pertenece a la consulta principal. La siguiente consulta utilizará
Página
este concepto.
OBSERVACIONES: La expresión formulada utiliza el concepto de Referencia
correlativa antes definido. Vemos que en la sub-consulta se hace una
comparación de igualdad entre atributos provincia de las instancias U1 y U2
de la relación universidad.
comprobando tiene el valor de matrícula más alto, entonces la sub-consulta dará como
resultado una lista vacía ya que ninguna tupla de U2 será mayor que dicha tupla de U1.
Ejemplo 7: Encontrar el estudiante con la calificación más alta.
Mencionar que si existieran dos o más estudiantes con la misma calificación, y esa
fuera la más alta, obtendríamos como resultado, los nombres de todos estos
estudiantes.
SQLite no soporta los operadores ALL y ANY. Por tanto, no podemos corregir el error
que presenta, pero si podemos ejecutar esta consulta en MySQL y obtenemos el
siguiente resultado:
La expresión así formulada devuelve un conjunto vacío como resultado. Como tarea para el lector, le
58
proponemos analizar la consulta para saber exactamente que hace; y llegar a la conclusión de si el
Página
Junto a la palabra clave ALL, tenemos ANY, que expresa una condición menos
restrictiva que ALL. Mientras ALL exige que el valor que tiene a la izquierda deba
satisfacer la condición para todos los elementos del conjunto que hay a su derecha;
ANY establece que el valor a su izquierda, cumpla la condición para alguno o algunos
de los elementos del conjunto a su derecha.
La consulta del ejemplo 7, sobre encontrar la universidad con la matricula más alta,
se puede reescribir con ANY formulando una consulta que haga lo siguiente: Buscar
la universidad cuya matrícula no sea inferior a alguna de las matrículas.
Para concluir este apartado, vamos a reescribir la consulta del ejemplo 4, esta vez
utilizando el operador ANY.
La consulta dice:
a) El eID del estudiante sea igual a algún eID del conjunto de identidades (eIDs)
que han solicitado la especialidad de CS, que llamaremos lista (1).
b) Y además, que el eID sea distinto a alguno de los eIDs de del conjunto de
estudiantes que han solicitado la especialidad de EE, que designaremos como
lista (2). Este segundo punto sí está mal formulado, ya que lo común será
encontrar algún estudiante que haya solicitado EE que no sea el estudiante
cuyo eID estamos analizando.
Ej. Puede existir un estudiante que ha solicitado INFORMATICA y EE, por tanto, este
aparecerá en la lista (2), y ante un estudiante que ha solicitado CS Y MECANICA,
cumplirá la condición B, ya que eID del solicitante de INFORMATICA y EE, será
distinto al eID del solicitante de CS y MECANICA.
Para simplificar aún más la consulta, en aras de evitar escribir múltiples veces la
misma expresión, utilizaremos una sub-consulta en el FROM, que entre otras cosas,
se encargará de calcular la calificación escalada (eCalf).
En la siguiente consulta, vemos la habilidad que tiene SQL al permitirnos hacer
consultas sobre una tabla generada mediante sub-consulta.
61 Página
En esta versión de la consulta, estamos creando una tabla que llamamos C, y que
tiene todos los atributos de la tabla estudiantes (y sus tuplas), además del atributo
calculado eCalf.
También podemos observar como esta vez, solo hemos escrito la expresión
matemática una sola vez. Con lo cual resulta fácil de modificar en el futuro y con
menos probabilidad de cometer errores.
Producto cartesiano
Unión natural
Ejemplo 2: Formar pares Universidad, nombre del solicitante con calificación más
alta.
Este problema tiene una solución similar al ejemplo anterior, en lugar de mostrar la
calificación, mostraremos el nombre. Hagamos un primer intento de formular esta
consulta.
WHERE condición
NOTA: En SQL, la unión por defecto es INNER JOIN, por tanto si escribimos
64
Ahora vamos a reescribir esta consulta utilizando el operador JOIN. Para ello,
eliminamos la coma (que es el producto cartesiano) y en su lugar ponemos JOIN, y
como condición para el JOIN pues, desplazamos la cláusula WHERE, en su lugar,
ponemos ON manteniendo la misma condición de igualdad, y ahora el WHERE, lo
vamos a situar justo antes de la primera condición adicional, y nos queda la
siguiente consulta:
Ahora bien, resulta que podemos prescindir de la cláusula WHERE y añadir las
condiciones adicionales como parte del operador ON, para ello, simplemente
sustituimos WHERE por AND:
OBSERVACIONES: Como vemos, obtenemos el mismo resultado. Puede que alguno se cuestione ¿Qué pongo en
la sección ON y que pongo en la sección WHERE?, pues ambas versiones son prácticamente equivalentes. Pues
la respuesta es:
Primero saber que en SQL existen varias equivalencias entre expresiones, a menudo encontraremos más de una
forma de hacer de conseguir un mismo resultado. En cualquier caso, se espera que el procesador de
expresiones del SGBD sea capaz de ejecutar nuestras expresiones de la forma más eficiente posible.
En el caso particular del operador JOIN, éste suele ser utilizado como una pista sobre como ejecutar la consulta
de esta forma:
Si todas las condiciones están en la sección ON, estamos indicando que a medida que el procesador de consulta
realiza la unión (JOIN), simultáneamente debe evaluar todas las condiciones.
65
Si el resto de condiciones van a la sección del WHERE, entonces el procesador entenderá que la consulta que
Página
afecta a la unión es la que aparece en el ON, y el resto de condiciones se aplican a atributos diferentes
Veamos lo que pasa si tenemos tres relaciones y las queremos unir (JOIN). Esta vez,
vamos a formular la consulta y luego analizarla.
Ejemplo 3: Una consulta que involucra tres relaciones
La interpretación de lo que hace esta consulta queda como ejercicio para el lector. A
continuación, vamos a reescribir la consulta utilizando la unión (JOIN).
Para ello, sustituimos las comas (,) por JOIN, sustituimos WHERE por ON.
La consulta así formulada, falla en algunos SGBD, por ejemplo, en postgres, sin
embargo; se ejecuta sin problemas en el SQLite y en MySQL.
La razón por la que falla en postgres, y posiblemente en otros sistemas, es que
postgres requiere que las uniones sean estrictamente binarias (como establece su
definición fundamental, estudiada en el tema de algebra relacional). Es decir,
debemos delimitar correctamente las sucesivas uniones o JOIN.
Para delimitar, basta con utilizar paréntesis de esta forma:
Obviamente se trata de una unión natural, que si nos acordamos del álgebra
relacional, la unión natural hace un producto cartesiano entre dos tablas que tienen
atributos de igual nombre y solo conserva como resultado, aquellas tuplas que
tengan el mismo valor en los atributos de igual nombre.
En este ejemplo, las tablas estudiante y solicitud tienen el atributo común eID, por lo
tanto si sustituimos el INNER JOIN por el NATURAL JOIN, entonces, no hace falta la
añadir el operador ON y todo lo que le sigue.
Para reformular con NATURAL JOIN, basta con sustituir JOIN por NATURAL JOIN y
eliminar toda la parte del ON.
67
Página
NOTA IMPORTANTE: Existe una característica interesante del operador JOIN en
SQL, de hecho el uso de esta característica se considera mejor práctica que el uso de
la unión natural. Se trata del operador USING (nombre_atributo).
La construcción EXP 1 JOIN EXP2 USING (NOMBRE_ATRIBUTO), permite especificar
explícitamente el atributo común a las dos expresiones que se debe igualar.
Vemos la flexibilidad de este operador respecto a la unión natural donde
automáticamente se igualan todos los atributos del mismo nombre, ya que puede
existir un caso de atributos con el mismo nombre que no tengan el mismo tipo de
información o datos, en un caso así, la unión natural estaría fallando.
Veamos un ejemplo del operador JOIN para dos instancias de una misma relación
Ejemplo 6: Encontrar pares de estudiantes que tengan la misma calificación.
Este problema ya fue resuelto de la siguiente manera
Como podemos comprobar, a pesar de ser una formulación correcta, nos da un error.
Por experiencia, la mayoría de sistemas de bases de datos no permiten el uso
combinado de USING… + ON…, por lo que si queremos hacer funcionar nuestra
consulta, debemos sustituir la parte de ON… por WHERE…
68
Página
Bien, hasta ahora hemos visto ejemplos con INNER JOIN, NATURAL JOIN y la
cláusula USING. Ahora veamos ejemplos con el miembro más interesante de esta
familia, la unión externa (OUTER JOIN).
Desafío: Llegar al mismo resultado del ejemplo sin utilizar el operador OUTER JOIN.
Ejemplo 8: Mostrar eNombre, eID, uNombre y especialidad para todos los
estudiantes, incluir tuplas de la tabla solicitudes aunque no coincidan con tuplas de
la tabla estudiantes.
Este ejemplo es similar al anterior modificado, donde hemos exigido que se
incluyan tuplas de la tabla estudiantes, aunque no coincidan con tuplas de la
tabla solicitudes (sabemos que las tuplas coinciden cuando el atributo común
tiene el mismo valor en ambas tablas).
Por lo tanto, esta vez lo que nos piden es incluir valores de la tabla a la
derecha del OUTER JOIN, para ello, solo debemos cambiar LEFT por RIGHT
(alternativamente, podemos conseguir el mismo resultado cambiando el orden
de las tablas, es decir, a la izquierda colocamos solicitudes y a la derecha
estudiantes; entonces manteniendo el operador LEFT, obtenemos el mismo
resultado.
NOTA: Si resulta que no existen tuplas no comunes en una de las tablas, no se notará
diferencia alguna en los resultados obtenidos.
tablas en el resultado.
Página
Desafío: Conseguir el mismo resultado del FULL OUTER JOIN utilizando solo LEFT y
RIGHT OUTER JOIN. Conseguir este mismo resultado sin utilizar la familia JOIN.
Finalmente veamos una importante deficiencia de la familia JOIN. Primero un
breve recordatorio sobre los conceptos de propiedad conmutativa y propiedad
asociativa.
Propiedad conmutativa: Establece que al realizar una operación entre dos
conjuntos u operandos A y B, el orden de estos operandos es irrelevante, es
decir, (A op B) = (B op A).
Propiedad asociativa: Establece que al realizar operaciones entre tres operandos
A, B y C, el orden en que se realizan las operaciones no es relevante y debemos
obtener el mismo resultado, es decir, (A op B) op C = A op (B op C)
Vamos a demostrar el cumplimiento de estas propiedades para la familia
JOIN utilizando este ejemplo sencillo: sean las tablas T1(A, B), T2(B,C) y
T3(A,C)
T1 T1 T1
A B A B A B
11 2 2 3 4 5
El resultado es:
A B C
1 2 3
4 NULL 5
Ahora formulemos la siguiente consulta
RESUMEN
En conclusión, la familia de operadores JOIN se utiliza en SQL para combinar
relaciones donde explícitamente queremos hacer operaciones típicas del
algebra relacional.
El operador INNER JOIN es el equivalente al THETA JOIN del algebra
relacional, donde se combinan dos relaciones explícitamente utilizando una
condición.
El operador NATURAL JOIN que hace una combinación de dos relaciones
donde implícitamente iguala los atributos con nombres iguales eliminando
una copia del atributo común. Tanto el INNER como el NATURAL se pueden
reescribir de forma similar sin el uso del operador JOIN.
El operador OUTER JOIN, es bastante diferente a los dos anteriores ya que
añade tuplas no comunes a ambas tablas completando los atributos ausentes
con valores nulos.
Los operadores JOIN se utilizan a menudo para indicar al procesador de
consultas cómo debe ejecutar una consulta, y esta característica se puede
utilizar para mejorar el rendimiento de las consultas, aunque en teoría no
debería ocurrir ya que se entiende que el procesador está preparado para
encontrar la forma más eficiente para ejecutar las consultas.
72
Página
7. FUNCIONES DE AGREGACION
Las funciones de agregación básicas que soporta cualquier sistema SQL son:
MIN: Devuelve el valor más pequeño o mínimo de un conjunto de valores
MAX: Devuelve el valor más grande o máximo de un conjunto de valores
SUM: Devuelve el valor total de la suma de un conjunto de valores
AVG: Devuelve el valor promedio o media aritmética de un conjunto de valores
COUNT: Devuelve el número de elementos o valores de un conjunto
Una vez estudiadas las funciones de agregación, ya podremos introducir dos nuevas
cláusulas para la sentencia SELECT de SQL. Se trata de las cláusulas:
Normalmente el cálculo de la nota media que deseamos sería aquel que tenga en cuenta una sola vez
la calificación de cada solicitante de la especialidad CS. Para ello, esta forma de expresar la consulta no
nos ayuda a conseguir dicho resultado.
Hasta ahora hemos visto ejemplos con las funciones MIN y AVG; El siguiente ejemplo
nos demuestra la función COUNT (contar), que como ya vimos, devuelve el número
de tuplas que cumplen la condición de una consulta.
Queremos saber con esta consulta, la suma del precio de matrícula de todas las
universidades que pertenecen a una misma provincia. Para ello, tendremos que
agrupar mediante el atributo provincia y evaluar la función de agregación SUM para
cada grupo.
77
Página
Ejemplo 6: Mostrar las calificaciones mínimas y máximas de los solicitantes,
por universidad y por especialidad.
Este ejemplo demuestra un caso más complejo del uso de GROUP BY. Queremos
saber, para cada combinación (Universidad, Especialidad), la calificación mínima y la
máxima de los estudiantes que han solicitado en dicha universidad.
Primero vamos a plantear una consulta que nos permita ver las agrupaciones que
queremos generar:
Como se puede observar, solo hemos hecho un ligero ajuste en los atributos
relacionados con la calificación, a los que hemos renombrado como mn y mx.
La consulta que vamos a formular en este ejemplo, tiene que hacer la unión de las
tablas estudiante y solicitud; a continuación agrupar las tuplas en función del ID de
estudiante (eID) y finalmente, para cada grupo, presentar el conteo de todas las
universidades asociadas a cada eID.
81
Página
Ahora veamos algunas sutilezas de la cláusula GROUP BY. Para demostrar la
primera sutileza o comportamiento sorprendente, vamos a añadir a la consulta del
ejemplo 6, otros atributos en el resultado, por ejemplo vamos a añadir además de lo
que ya tenemos (eID y conteo de uNombre), el nombre de cada estudiante:
valor aleatoriamente.
Veamos otra sutileza, para ello volvamos al ejemplo 7 original, que nos pedía el número de
universidades a las que ha solicitado cada estudiante. Aquí mostramos la formulación de dicha
consulta y su resultado.
OBSERVACION: Pensando un poco, en la tabla
estudiantes existirán estudiantes que todavía no han
hecho ninguna solicitud, por tanto, no aparecen sus eID
en la tabla solicitud; por tanto, dichos estudiantes no
vienen reflejados en los resultados de esta consulta;
evidentemente, no vemos ningún eID asociado con un
conteo igual a 0 (cero).
La cláusula HAVING nos da la posibilidad de aplicar condiciones sobre los resultados de las funciones
de agregación. Se aplica esta cláusula justo después de la cláusula GROUP BY y nos permite probar
condiciones que afectan a cada grupo o agrupación, en contraste con la cláusula WHERE cuya
condición afecta a cada tupla individual.
Para formular esta consulta, debemos buscar en la tabla solicitud, agrupar por
uNombre y evaluar una inecuación que tiene por un lado la evaluación de la función
COUNT y por otro lado el valor 5; ambos lados separados por el operador menor que
(<).
8. VALORES NULOS
En este apartado, vamos a estudiar los valores nulos en SQL utilizando nuestra ya
conocida base de datos de admisiones a universidades. Y empleando todo lo
estudiado hasta ahora sobre la expresión SELECT (ATRIBUTOS)-FROM
(RELACIONES)-WHERE (condición).
Esta vez, en lugar de estudiar sobre expresiones que podemos escribir en consultas o
queries, vamos a estudiar los datos almacenados.
NULL es un valor especial que, en las bases de datos relacionales, a menos que se
especifique lo contrario, cualquier atributo puede adoptar dicho valor especial. El
valor NULL se utiliza habitualmente para indicar el estado de valores indefinidos o
desconocidos.
Otro ejemplo, es posible crear la relación solicitud, antes de que se tomen las
decisiones; por tanto, el atributo decisión se rellenará con el valor NULL.
Para ello, hemos agregado dos estudiantes a la base de datos, cuyas calificaciones
85
son desconocidas por ahora y se manifiesta este estado mediante el valor especial
NULL. Veamos los ejemplos demostrativos.
Página
Página 86
Ejemplo 1: Encontrar todos los estudiantes con calificación mayor que 3.5
Ejemplo 2: Encontrar todos los estudiantes con calificación menor o igual a 3.5
Ejemplo 4: Encontrar todos los estudiantes con calificación mayor que 3.5 o
menor o igual a 3.5 o que sean NULL.
NOTA: Sin entrar en los detalles técnicos, que puede leer en otras bibliografías, la
evaluación de la cláusula WHERE cuando existen valores NULL, sigue una lógica de
triple evaluación, tal que, cualquier expresión en dicha cláusula puede resultar en
tres valores lógicos: VERDADERO, FALSO o NULL (NULO); Estos valores lógicos son
combinados para producir el resultado final de la expresión, cual es, la decisión
sobre si una tupla debe o no aparecer en el resultado de la consulta.
Ahora, para saber si la función COUNT DISTINCT incluye o no los valores NULL,
modificaremos la consulta anterior eliminando la cláusula WHERE.
Como podemos observar, tenemos el mismo resultado anterior, lo que significa, que
la función COUNT DISTINCT descarta los valores NULL durante su evaluación.
Finalmente, hagamos una consulta para ver las distintas calificaciones de los
90
estudiantes:
Página
OBSERVACION: Como podemos ver, obtenemos 20
calificaciones diferentes. También observamos que aparece
una calificación NULL. Es decir que la consulta SELECT tiene
en cuenta los valores NULL en su evaluación y presenta los
resultados nulos, si es que existen; mientras que la función
COUNT, descarta directamente los valores NULL en su
evaluación y resultados.
Bueno, estos han sido solo un ejemplo de los efectos que podemos observar al
formular consultas en presencia de valores NULOS, y una vez más recomendamos
ser cuidadosos al trabajar con bases de datos con atributos que admiten valores
NULL, intentando comprender en cada momento el resultado esperado y comparar
con el resultado obtenido.
91
Página
9. SENTENCIAS DE MODIFICACION DE DATOS
En este apartado final, vamos a estudiar las sentencias de modificación de datos que
tiene el lenguaje SQL.
INSERCIÓN DE DATOS
Para insertar nuevos datos en cualquiera relación de una base de datos, existen dos
métodos.
WHERE Condición
La condición puede ser muy simple o muy compleja, llegando a incluir sub-
consultas, funciones de agregación, etc. Todo ello, vamos a aclararlo mediante los
ejemplos demostrativos.
92
Página
ACTUALIZACIÓN DE DATOS EXISTENTES
Bien, ahora que conocemos todas las herramientas del lenguaje SQL para la
modificación de datos, vamos a ver una serie de ejemplos demostrativos para
practicar utilizando dichas herramientas y aclarar posibles dudas.
Primero hagamos una sentencia SELECT que nos muestre todas las universidades
existentes en la tabla, para ver que todavía no existe la tupla que vamos a añadir:
93
Página
Y ahora vamos a formular la sentencia de inserción:
Pero algunas aplicaciones utilizadas para interactuar directamente con los SGBD
suelen ofrecer información en pantalla sobre los comandos ejecutados y los
resultados de los mismos, tal como vemos en la imagen anterior; donde la línea 50,
nos muestra el comando ejecutado y la línea 51, comentarios sobre los efectos que
ha tenido la ejecución del comando.
94
Página
Ejemplo 2: Hacer que todos los estudiantes que no han hecho ninguna
solicitud, soliciten en la nueva universidad añadida (Carnegie Mellon), la
especialidad CS, y la decisión desconocida (por ahora).
Bien, para esta consulta, vamos paso a paso. Primero formulemos una consulta que
nos muestre todos los estudiantes que todavía no han emitido una solicitud:
Para este ejemplo, vamos a proceder por partes. Primero vamos a buscar los
estudiantes que han solicitado EE en otras universidades con decisión NO:
Ahora vamos a componer las tuplas para su inserción en la tabla de solicitudes. Para
ello:
Para decisión, tenemos: ‘SI’, ya que según el ejemplo, debemos admitir a los
estudiantes para dicha especialidad.
Ejemplo 4: Eliminar a todos los estudiantes que han solicitado más de dos
especialidades diferentes.
Vamos a considerar a que un estudiante que solicita más de dos especialidades, nos
es de fiar y por tanto, vamos a eliminarle completamente de la base de datos.
Para resolver este ejemplo, empezamos formulando una consulta que nos muestre
todos los estudiantes que han solicitado más de dos especialidades:
Para ello, empezamos con una consulta que nos muestre todas las universidades que
carecen de solicitudes de la especialidad CS:
Para este ejemplo, comenzamos formulando una consulta que nos devuelva todos los
solicitantes de Carnegie Mellon que tienen calificaciones menores que 3.6:
Mediante una consulta SELECT, podemos observar los cambios en la tabla solicitud:
99
Página
Página 100