Cuaderno FBD
Cuaderno FBD
Cuaderno FBD
de FBD
Curso - 2020/21
Profesores de Prácticas:
DECSAI . UGR . ES
Octubre de 2020
Editado sobre una plantilla de latextemplates.com
Índice general
0 Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
0.1 Introducción al SGBD Oracle 11
0.1.1 Nota histórica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
0.1.2 Una visión de conjunto del sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
0.2 Entorno de ejecución para las prácticas 12
0.3 Instalación del software de prácticas en un ordenador particular 12
0.4 Documentación, bibliografía y recursos 14
C Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
Índice de figuras
Introducción
Los objetivos generales que se persiguen con la elaboración del cuaderno de prácticas son:
Familiarizar al alumno con los principales elementos de un sistema de gestión de bases de
datos (SGDB) comercial, Oracler .
Conocer la configuración del sistema y del entorno de trabajo en el que se realizarán las
prácticas de la asignatura.
Conocer a nivel de usuario avanzado un lenguaje estándar para los sistemas de gestión de
bases de datos relacionales, SQL. Concretamente, tras el desarrollo de las prácticas de la
asignatura el alumno ha de adquirir conocimientos relativos a:
• Creación y gestión de una base de datos sencilla
• Realización de consultas a una base de datos
• Gestión del nivel externo de un SGBD
• Gestión del nivel interno de un SGBD
Algunos sistemas que usan SQL son: Oracler , Sybaser , Microsoftr SQL Server, Accessr ,
Ingresr , etc. Aunque la mayoría de estos sistemas tienen ciertas adaptaciones propias del
lenguaje, en las prácticas se verán comandos estándares para la creación y manipulación
de un esquema de base de datos.
Algunas consideraciones sobre este cuaderno de prácticas:
El cuaderno está organizado en varias prácticas. Una práctica no se corresponde con una
única sesión real en el laboratorio (2 horas), sino que contiene todo el material necesario
para cubrir los objetivos que se proponen al inicio de la misma.
Con objeto de conseguir un mejor aprovechamiento de los conocimientos que se exponen
aquí, conviene leer detenidamente la información desarrollada en cada práctica y acudir a
las sesiones en el laboratorio con los ejercicios planteados previamente.
La realización de los ejercicios del cuaderno es voluntaria aunque muy recomendable ya
que complementan y dan soporte a los conocimientos que se exponen en las clases teóricas
y los seminarios.
compañía vendió Oracler a Relational Software Inc., quién, en 1979, produjo la versión 2 del
sistema. Esta versión fue el primer SGBD relacional disponible comercialmente y el primero
que utilizó SQL como lenguaje de consulta y manipulación.
Desde esta fecha Oracler ha ido desarrollando su sistema de gestión, creando al mismo
tiempo productos adicionales y lanzando al mercado distintas versiones tanto del sistema básico
como de los productos asociados. La versión de Oracler disponible en el servidor, es la 12.1,
sobre la que se va a trabajar en las aulas de prácticas.
Veamos qué debe hacerse para implantar la primera alternativa. En este caso, los datos
estarán en la cuenta de alumno en el Servidor de Oracler de la Escuela y éste interactuará con
ellos mediante un cliente SQL.
Como la dirección IP de la máquina donde está instalado el servidor de Oracler de la Escuela
es privada, sólo se puede acceder al mismo desde la subred de la UGR. Esto significa que, para
accesos externos, debe configurarse una VPN y conectarse a la misma, con lo que, a partir de
ese momento, se tendrá acceso a dicho servidor. Si el alumno tiene configurada una conexión
inalámbrica eduroam y se conecta a Internet a través de ella, estará en al subred de la UGR y, por
tanto, también podrá acceder al Servidor Oracler de la Escuela.
En [16] pueden consultarse las instrucciones para la configuración y el uso de la VPN de la
UGR (Recomendamos la configuración de la VPN SSL). En la referencia [17] se proporcionan
las instrucciones para configurar dicho acceso inalámbrico a la UGR, configuración que además
permite disponer de acceso inalámbrico en multitud de Universidades e instituciones educativas
de ámbito nacional e internacional a través de nuestra cuenta inalámbrica de la UGR.
El siguiente paso para acceder al servidor de la Escuela es instalar y configurar un cliente
SQL. Eso lo describiremos más adelante, ahora mostraremos las alternativas en el caso de que el
alumno opte por instalar el SGBD Oracler en su ordenador particular.
Para esta opción, el alumno dispone de dos alternativas: instalar la versión completa del
servidor Oracler 12.1 EE, para la que dispone licencia para uso docente mientras sea alumno
de esta Escuela, o descargar la versión gratuita de dicho servidor, Oracler XE 11.2 (opción
recomendada). Ambas versiones incluyen un cliente SQL*Plus y cuentan con todas las funcio-
nalidades que precisamos para el desarrollo del programa de prácticas, además de disponer de
versiones para Windows y para Linux.
Los tutoriales “InstalacionXE.pdf” e “InstalacionXE_linux.pdf” proporcionan las instruccio-
nes para descargar e instalar Oracler XE en entornos Windows y Linux, respectivamente. Ambos
están disponibles en el apartado de “Material de Prácticas” del portal docente [5]. También están
disponibles en dicho apartado una serie de videotutoriales para la instalación y configuración de
Java, Oracler XE 11.2 y SQLDeveloper para Windows y para Linux, podéis acceder también
desde este enlace [1].
Si hemos optado por la primera alternativa, es decir, trabajar con nuestra cuenta en el servidor
Oracler de la Escuela, habremos de instalar un cliente SQL. En el caso de que queramos
usar SQL*Plus, debemos seguir el tutorial “instalacionClienteXE.pdf”, que se encuentra en
el mencionado portal docente. Para instalar y configurar SQL Developer, debemos seguir las
instrucciones que se proporcionan en el Apéndice A.1.
Para la descarga e instalación de WinRDBI es preciso acudir a la web de la herramienta [2] y,
previo registro gratuito, descargarla y seguir las instrucciones de instalación descritas en [3]. El
proceso de instalación también instala la documentación de la herramienta. La instalación de la
versión de WinRDBI para Windows no reviste ninguna complejidad siguiendo las instrucciones
de [3]. Sin embargo, la instalación de la versión para Linux es algo más complicada, por lo que
vamos detallar aquí los pasos a seguir para la instalación de WinRDBI en Linux 64 bits (probado,
al menos, con Fedora 16 64 bits):
Bajarse de [2] el fichero de WinRDBI para Linux.
Ejecutar la instalación con: java -jar WinRDBI-4.3.160_06-linux.jar.
Descargarse desde aquí [10] una máquina virtual de Java JRE para 32 bits (la arquitectura
debe ser x86), por ejemplo la jre-7u3-linux-i586.tar.gz.
Descomprimir el fichero .tar.gz con la orden: tar zxfv <fichero>.
Por ejemplo, tar zxfv jre-7u3-linux-i586.tar.gz.
Conectado como root, mover la carpeta descomprimida a la carpeta /usr/java (si no
existe el directorio /usr/java, creadlo con la orden mkdir /usr/java) con la orden mv.
14 Introducción
#!/bin/bash
cd ~/WinRDBI
JAVA_HOME=/usr/java/jre1.7.0_03
PATH=$JAVA_HOME/bin:$PATH
LD_LIBRARY_PATH=~/WinRDBI:$JAVA_HOME/lib:$LD_LIBRARY_PATH
java -cp WinRDBI.jar:xerces.jar:amzi.jar WinRDBI
Cambiar los permisos del script para ejecución con la orden: chmod ux /WinRDBI/WinRDBI+
Instalar la biblioteca de compatibilidad de C++ compat-libstdc++-33 para x86.
Para ello empleamos la orden: yum install compat-libstdc++-33.i686.
Con esto, terminaría la instalación y preparación para ejecución del programa. Para invocar
al programa, hay que ejecutar la orden ~/WinRDBI/WinRDBI
Mas información acerca de la herramienta puede encontrase en el Apéndice B.
1. Familiarizar al alumno con el entorno de trabajo en el que se van a desarrollar las prácticas
en el SGDB Oracler .
2. Ver tipos de datos y algunas de las operaciones disponibles sobre éstos.
3. Creación y modificación de esquemas relacionales.
4. Inserción, actualización y eliminación de tuplas.
Al final esta práctica dispondremos de las tablas de la base de proveedores, piezas, proyectos
y ventas, que nos servirán como ejemplo para ilustrar diferentes aspectos del uso de un DBMS.
Esta unidad va utilizar SQL*Plus como herramienta cliente para la realización de los ejer-
cicios propuestos, sin embargo, se anima al alumno a que pruebe a realizar algunos de dichos
ejercicios usando SQL Developer A.
La documentación de referencia para esta unidad y siguientes es [8] y [12]. La documentación
relativa al uso de SQL Developer puede encontrarse en [11]. El Apéndice A proporciona una
introducción al uso de SQL Developer.
SQL>
SQL>cd u:\FBD
Ya está todo dispuesto para introducir cualquier sentencia SQL o comando SQL*Plus.
Indicar aquí, que ninguno es sensible a mayúsculas o minúsculas.
y luego
lo que hace que el barrido de pantalla se detenga cada vez que se llena ésta y nos permita
observar los resultados de nuestras operaciones con mayor comodidad.
1.5 Ejecutar comandos de SQL 17
file_name representa el fichero de texto donde se quiere enviar la salida. Como puede
verse la extensión es opcional. En el caso de que no la lleve se pone por defecto la extensión
lst.
OFF termina la salida al fichero.
OUT termina la salida al fichero y envía este a la impresora.
Una vez finalizada la creación del fichero de salida mediante el comando SPOOL OFF podrá
editarse cómodamente la salida abriendo el fichero generado mediante un editor de texto. El
apéndice A.3 ilustra las posibilidades que presenta SQL Developer para ejecutar, visualizar y
guardar los resultados de la ejecución de sentencias.
Si todo ha ido bien, devolverá el mensaje TABLA CREADA; en caso contrario dará un mensaje
de error adecuado (leedlo atentamente), en ocasiones se indica con un subrayado la palabra
“responsable” del error.
Desde el buffer
En realidad SQL*Plus siempre trabaja con un fichero de comandos que, por defecto, se llama
afidiet.buf. Este fichero contiene siempre último comando o bloque de sentencias que se ha
tecleado en “línea”. El contenido de este fichero se puede editar tecleando simplemente edit y
se vuelve a lanzar mediante el comando run. La introducción de “/” seguida de “Intro” también
desencadena la ejecución del último bloque almacenado en el “buffer”.
Desde un fichero
Otra alternativa, recomendada, para trabajar es editar y lanzar ficheros de comandos que se
pueden guardar y volver a relanzar desde SQL*Plus. Estos ficheros de comandos SQL se pueden
crear con cualquier editor (conviene dejarlos en un directorio de Bases de Datos preparado a tal
efecto), que deberían tener extensión .sql. Para ello hay varias posibilidades:
1. Tecleando edit nombre-de-fichero, siendo éste un fichero no creado previamente y
escribiendo en él antes de abandonar el editor.
2. Tecleando save nombre-de-fichero. De esta forma se copia el contenido del buffer al
fichero en cuestión.
3. Utilizar un editor de texto externo como “wordpad” de Windows, para crear y almacenar
el archivo de sentencias.
18 Definición del esquema de una base de datos
Ejercicio 1.1 Editar el fichero pp.sql en el directorio de trabajo, debe contener las instruc-
ciones:
a continuación ejecutar el fichero. Mediante esta sentencia hemos creado una tabla vacía
llamada prueba2 con dos atributos, cad1 y num. Para comprobarlo, es necesario consultar el
catálogo de la base de datos o ejecutar un comando describe, como veremos a continuación.
DESCRIBE nombre-tabla;
Hay que tener en cuenta que este es un comando SQL*Plus, no una sentencia SQL estándar.
Para más detalles sobre las restricciones de tablas, será necesario consultar el catálogo, que
veremos más adelante.
El uso de la funcionalidades descritas en esta sección desde SQL Developer puede consultarse
en A.3.
Ejercicio 1.2 Ver la descripción de las tablas prueba1, prueba2.
atributos y sus tipos de datos correspondientes, el valor por defecto que toma un atributo cuando
no se especifica su valor al insertar una nueva tupla (cláusula DEFAULT), así como las claves
primaria, candidatas y externas. A continuación se introduce la forma básica de su sintaxis:
Además, cabe destacar que cuando la clave primaria, la clave candidata o la clave externa
está formada por un solo atributo, las palabras reservadas PRIMARY KEY, UNIQUE y RE-
FERENCES, respectivamente, se podrán incluir a continuación de la definición del atributo
correspondiente, tal y como se muestra a continuación:
La cláusula tipo-atributo3 puede omitirse, en cuyo caso el atributo será del mismo tipo
que el atributo al que hace referencia.
Ejemplo 1.1 Como ejemplo, vamos a considerar la tabla plantilla, donde vamos a almacenar
el dni, nombre y fecha de alta de los trabajadores de una empresa, considerando dni como clave
primaria. Algunos de los tipos de datos que ofrece SQL se pueden consultar en la Tabla 1.1.
Obsérvese que estamos delimitando el rango de valores para el atributo estadocivil median-
te la sentencia CHECK. Los operadores que se pueden utilizar en estas expresiones quedan
recogidos en la Tabla 1.2.
Ejercicio 1.3 Buscar la lista completa de los tipos de datos que ofrece Oracler (Data types).
Para ello debe consultarse el apartado correspondiente del manual de referencia de SQL de
Oracler [8].
Ejercicio 1.4 Deduce el diagrama E/R que recoge la semántica de las tablas plantilla y
serjefe.
Ejercicio 1.5 Borrar la tabla prueba1 y comprobar las tablas que quedan.
obtener más información acerca del uso de esta sentencia puede consultarse el manual de
referencia de SQL de Oracler [8]. La sintaxis básica es:
El tipo de alteración de la tabla dependerá del modificador que incluyamos. Por ejemplo,
para añadir un atributo nuevo a una tabla se utiliza el modificador ADD del siguiente modo:
Ejercicio 1.6 Modifica el esquema de la tabla plantilla añadiendo un nuevo atributo llamado
fechabaja de tipo date.
SQL>start pieza;
SQL>start proyecto;
Comprueba las tablas que tenemos creadas hasta el momento En nuestro caso aparecerá
TABLE_NAME
------------------------------
PRUEBA2
PLANTILLA
SERJEFE
PIEZA
PROYECTO
PROVEEDOR
VENTAS
FECHA DATE
Todos estos ejercicios se pueden realizar desde la “Hoja de Trabajo” de SQL Developer o,
de forma visual, como se describe en el Apéndice A.4. Como ejercicios adicionales se deja al
alumno trasladar al sistema el esquema de la base de datos de la Gestión docente universitaria
utilizada en clase de teoría.
Se pide que se cree dicho esquema con las siguientes restricciones de diseño:
Equipos: No se debe permitir que ninguno de los atributos tome valor nulo, además, el
nombre del equipo ha de ser único.
Jugadores: No se debe permitir valor nulo ni en nombreJ, ni en el equipo al que pertenece.
Encuentros: Los encuentros se realizan entre equipos de la liga, cada uno de los atributos
ELocal y EVisitante es clave externa a la tabla Equipos. Los resultados PLocal y
PVisitante (tantos marcados por ELocal y por EVisitante, respectivamente) han
de ser positivos y tomar 0 como valor por defecto.
Faltas: Representan la cantidad de faltas personales cometidas por un jugador en el encuentro
indicado. El conjunto de atributos formado por ELocal y EVisitante son clave
externa a la tabla Encuentros y el atributo codJ es clave externa a la tabla Jugadores.
El número de faltas num estará comprendido entre 0 y 5, ambos incluidos y debe tomar
0 como valor por defecto.
Capítulo 2
Ejemplo 2.1 Utiliza la sentencia INSERT para introducir valores en la tabla PRUEBA2. Para
hacerlo, vamos a editar el fichero introducir_datos.sql cuyo contenido debe ser:
Si la tupla es correcta (número y tipos de datos acordes, etc.) devolverá: 3 filas creadas. En
caso contrario dará el correspondiente mensaje de error por cada tupla introducida errónea y se
desestimará la inserción.
Observa que en el ejemplo 2.1 se pueden introducir tuplas repetidas, al no haber definido
clave primaria en la tabla prueba2.
Ejemplo 2.2 Utiliza la sentencia INSERT para introducir valores en las tablas plantilla y
serjefe del siguiente modo:
Para conocer qué tablas tenemos creadas hasta este momento, podemos consultar una vista
del catálogo del SGBD (5) denominada user_tables, en la forma que sigue:
Ejercicio 2.1 Ejecuta la sentencia SELECT para mostrar el contenido de las tablas PRUEBA2
y PLANTILLA. Intenta mostrar sólo algunos campos de las mismas.
Juan a divorciado.
SQL> UPDATE plantilla
SET estadocivil = 'divorciado'
WHERE nombre='Juan';
Ejercicio 2.2 Ejecuta la sentencia UPDATE sobre la tabla plantilla y cambia el nombre del
trabajador con dni ’12345678’ a ’Luis’.
La instrucción de borrado, sin cláusula WHERE, borra todas las tuplas de la tabla.
En este caso da un mensaje de error (¿por qué?). Aunque sí podríamos borrar las tuplas
28 Mantenimiento de una base de datos
de la tabla serjefe.
Ejemplo 2.5 Ejecuta la sentencia UPDATE sobre la tabla plantilla y cambia la fecha de alta
de Juan al día siguiente.
Aunque los datos de fecha podrían representarse mediante los tipos VARCHAR y NUMBER,
el tipo DATE ofrece, además, funciones específicas para su manejo que tienen en cuenta su
semántica.
Si se omite la función TO_CHAR en la sentencia SELECT, el formato aplicado será el que haya
por defecto.
Ejemplo 2.7 Ejecuta la sentencia SELECT sobre la tabla plantilla mostrando la fecha sin
utilizar la función TO_CHAR y observa el resultado.
Para realizar la introducción de tuplas en la tabla ventas del usuario se provee de una tabla
ya rellena en el servidor de Bd de la Escuela, se trata de la tabla opc.ventas, de la que se puede
consultar su contenido con la sentencia: SQL> SELECT * FROM opc.ventas;.
A continuación se muestra su contenido.
22 filas seleccionadas.
2.3 Antes de salir... 31
Obsérvese que esta tabla se llama ventas, al igual que la que hemos creado, pero pertenece a
otro usuario, el usuario opc, que en esta ocasión ha dado permiso de consulta a cualquier usuario.
Podemos rellenar fácilmente nuestra tabla ventas a partir de la anterior atendiendo a la sintaxis
dada en la seccion 2.1.1. Si los esquemas de las tablas no son iguales, es decir, si no coinciden
en número, orden y tipo de los atributos, se producirá un error. Por lo tanto, antes de copiar los
datos de una a otra tabla, debemos de comprobar antes sus esquemas. Una vez comprobado, si
coinciden, debemos ejecutar:
Tras esta última operación, es el momento de ejecutar el comando COMMIT para guardar
de forma permanente todas las operaciones realizadas hasta el momento.
Ejercicio 2.4 A continuación vamos a tratar de insertar algunas tuplas nuevas en ventas.
Comprueba que se introducen correctamente y, en caso contrario, razona por qué da error.
Ejercicio 2.6 Para mostrar la columna FECHA con un formato específico e imprimirla,
utilizar la siguiente sentencia:
donde el texto que se quiere incluir como parte de la fecha debe ir entre comillas dobles.
Este capítulo del guión se presenta un breve recorrido por los elementos más comunes del
uso de la sentencia SELECT, junto a serie de ejemplos y ejercicios sencillos que pueden servir al
alumno como referencia en una primera etapa de aprendizaje. Este contenido se completa con el
estudio más amplio de dicha sentencia desarrollado en las explicaciones teórico/prácticas de los
profesores y en la bibliografía de la asignatura.
Los ejercicios de esta unidad se pueden realizar mediante SQL*Plus o mediante la “Hoja de
Trabajo” de SQL Developer (ver Apéndice A.3). Esta herramienta también dispone de un editor
visual básico para la edición de consultas (la pestaña “Generador de consultas”), aunque no se
recomienda su uso.
Con el objeto de proporcionar una perspectiva conjunta de SQL, del Álgebra Relacional
y del Cálculo Relacional Orientado a Tuplas, para aquellos tipos de consultas susceptibles de
expresarse mediante expresiones del Álgebra y/o del Cálculo, se proporciona la expresión en
dichos lenguajes y, además, para poder ejercitar dichas consultas, se adjunta la misma expresión
en términos de la sintaxis empleada por la herramienta WinRDBI, cuyo uso se describe en el
Apéndice B.
Esta práctica está confeccionada para procurar una guía para el aprendizaje de esta compleja
sentencia, y de su relación con el Álgebra y Cálculo Relacionales, sin embargo es preciso aclarar
lo siguiente:
El seguimiento exhaustivo de esta guía no garantiza la superación de esta parte de las
prácticas de la asignatura.
Tras asimilar los conceptos de SQL, de Álgebra y Cálculo Relacionales que aparecen en
esta práctica, se recomienda al alumno/a la realización de los ejercicios adicionales que se
hallan en la parte final de esta unidad del cuaderno de prácticas, tanto en SQL como, en
aquellos ejercicios que lo permitan, en AR, COT y WinRDBI.
Ejercicio 3.1 Comprueba el resultado de la proyección. ¿Es éste conforme a lo que se obtiene
en el AR?
Ejercicio 3.2 Muestra los suministros realizados (tan solo los códigos de los componentes
de una venta). ¿Es necesario utilizar DISTINCT?
Ejercicio 3.3 Muestra las piezas de Madrid que son grises o rojas.
Ejercicio 3.4 Encontrar todos los suministros cuya cantidad está entre 200 y 300, ambos
inclusive.
SQL> SELECT nompro, ciudad FROM proveedor WHERE ciudad LIKE 'L%';
El carácter comodín _ sustituye un sólo carácter.
Ejercicio 3.5 Mostrar las piezas que contengan la palabra tornillo con la t en
mayúscula o en minúscula.
SQL> SELECT codpro, nompro FROM proveedor WHERE status IS NOT NULL;
36 Realización de consultas a una base de datos
Ejemplo 3.7 Mostrar la información de todas las tablas denominadas ventas a las que tienes
acceso.
Ejercicio 3.6 Comprueba que no devuelve ninguna. Pero SI que hay!!!. Prueba a usar
la función upper() comparando con ’VENTAS’ o la función lower() comparando con
’ventas’
Estos operadores tienen una restricción similar a sus correspondientes del AR, para poder
llevarse a cabo: los esquemas de las tablas resultantes de cada sentencia SELECT han de ser
iguales en tipo, esto es, los atributos no tienen porqué llamarse igual, aunque sí han de coincidir
en número, posición en el “select list” y tipo. Trás la operación, el esquema del resultado coincide
con el esquema del primer operando.
Ejemplo 3.8 Ciudades donde viven proveedores con status mayor de 2 en las que no se fabrica
la pieza ’P1’.
Nótese que los operadores UNION, MINUS e INTERSECT implementan en SQL las ope-
raciones , −, del AR, respectivamente y que, por tanto, consideran los argumentos como
S T
relaciones (sin tuplas repetidas) y devuelven el resultado como una relación (sin tuplas repetidas).
Por consiguiente, la sentencia SQL que resuelve el ejercicio anterior podría prescindir de las
cláusulas DISTINCT. Sin embargo el operador UNION ALL devuelve todas las tuplas incluidas en
las tablas argumento, sin eliminar tuplas duplicadas.
Ejercicio 3.8 Encontrar los códigos de aquellos proyectos a los que sólo abastece ’S1’.
Ejercicio 3.9 Mostrar todas las ciudades de la base de datos. Utilizar UNION
Ejercicio 3.10 Mostrar todas las ciudades de la base de datos. Utilizar UNION ALL
Ejercicio 3.11 Comprueba cuántas tuplas resultan del producto cartesiano aplicado a ventas
y proveedor
Ejemplo 3.9 Muestra las posibles ternas (codpro,codpie,codpj) tal que, todos los implicados
Ejemplo 3.10 Mostrar las ternas (codpro,codpie,codpj) tal que todos los implicados son de
Londres.
WinRDBI(AR): pQuery :=
(
(project codpro (select ciudad='Londres' (proveedor))) product
(project codpj (select ciudad='Londres' (proyecto)))
) product
(project codpie (select ciudad='Londres' (pieza)));
Ejercicio 3.12 Mostrar las ternas que son de la misma ciudad pero que hayan realizado
alguna venta.
WinRDBI(AR):
% Creación de tres relaciones intermedias con atributo ciudad renombrado
cproveedor(codpro,sciudad) := project codpro,ciudad (proveedor);
cproyecto(codpj,yciudad) := project codpj,ciudad (proyecto);
cpieza(codpie,pciudad) := project codpie,ciudad (pieza);
% Consulta
cQuery := project codpro,codpj,codpie (
select sciudad = yciudad and yciudad= pciudad
((cproveedor product cproyecto) product cpieza)
);
AR : πnompro,cantidad (proveedor o
n σcantidad>800 (ventas))
Observe el resultado que se obtiene de la reunión natural cuando se proyecta sobre todos
los atributos. Si se quiere reunir en base a campos que no tienen el mismo nombre, se pueden
usar dos alternativas: producto cartesiano junto a condición de reunión en la cláusula WHERE
o la equi-reunión expresada mediante cláusula JOIN ... ON en la forma que se indica a
continuación:
Ejercicio 3.15 Mostrar las piezas vendidas por los proveedores de Madrid.
Ejercicio 3.16 Encuentra la ciudad y los códigos de las piezas suministradas a cualquier
proyecto por un proveedor que está en la misma ciudad donde está el proyecto.
40 Realización de consultas a una base de datos
Ejercicio 3.17 Comprobar la salida de la consulta anterior sin la cláusula ORDER BY.
Ejercicio 3.18 Listar las ventas ordenadas por cantidad, si algunas ventas coinciden en la
cantidad se ordenan en función de la fecha de manera descendente.
Ejercicio 3.19 Mostrar las piezas vendidas por los proveedores de Madrid. (Fragmentando
la consulta con ayuda del operador IN.) Compara la solución con la del ejercicio 3.15.
Ejercicio 3.20 Encuentra los proyectos que están en una ciudad donde se fabrica alguna
pieza.
Ejercicio 3.21 Encuentra los códigos de aquellos proyectos que no utilizan ninguna pieza
roja que esté suministrada por un proveedor de Londres.
Ejemplo 3.17 Muestra el código de las piezas cuyo peso es mayor que el peso de alguna pieza
’tornillo’.
Ejercicio 3.22 Muestra el código de las piezas cuyo peso es mayor que el peso de cualquier
’tornillo’.
Ejercicio 3.23 Encuentra las piezas con peso máximo. Compara esta solución con la obtenida
en el ejercicio 3.14
42 Realización de consultas a una base de datos
πcod pro (ventas) − πcod pro ((πcod pro (ventas) × πcod pie (pieza)) − πcod pro,cod pie (ventas))
WinRDBI(AR):
dividendo := project codpro,codpie (ventas);
divisor := project codpie (pieza);
codproventas := project codpro (ventas);
pDivision := codproventas
difference (
project codpro
((codproventas product divisor) difference dividendo)
);
Ejercicio 3.24 Encontrar los códigos de las piezas suministradas a todos los proyectos
localizados en Londres.
Ejercicio 3.25 Encontrar aquellos proveedores que envían piezas procedentes de todas las
ciudades donde hay un proyecto.
Ejercicio 3.28 Mostrar el código de la pieza de máximo peso. Compara esta solución con
las correspondientes de los ejercicios 3.14 y 3.23.
Ejercicio 3.30 Muestra los códigos de proveedores que han hecho más de 3 envíos diferentes.
Figura 3.1: Instancia de la tabla ventas y el resultado de la consulta del ejemplo 3.20.
Ejercicio 3.31 Mostrar la media de las cantidades vendidas por cada código de pieza junto
con su nombre.
Ejercicio 3.32 Encontrar la cantidad media de ventas de la pieza ’P1’ realizadas por cada
proveedor.
Ejercicio 3.33 Encontrar la cantidad total de cada pieza enviada a cada proyecto.
Ejemplo 3.21 Hallar la cantidad media de ventas realizadas por cada proveedor, indicando
solamente los códigos de proveedores que han hecho más de 3 ventas.
Para integrar los nuevos conceptos de selección de grupos con los antiguos de selección de
tuplas vamos a plantear una consulta donde se combinan las cláusulas WHERE y having.
Ejemplo 3.22 Mostrar la media de unidades vendidas de la pieza ’P1’ realizadas por cada
proveedor, indicando solamente la información de aquellos proveedores que han hecho entre 2 y
10 ventas.
Ejemplo 3.23 Encuentra los nombres de proyectos y cantidad media de piezas que recibe por
proveedor.
Ejercicio 3.35 Mostrar los nombres de proveedores tales que el total de sus ventas superen
la cantidad de 1000 unidades.
Ejemplo 3.27 Mostrar las piezas que nunca fueron suministradas despues del año 2001.
SQL> SELECT *
FROM ALL_USERS;
Puede interesar primero ver el esquema de tal vista mediante DESCRIBE ALL_USERS para hacer
una proyección más selectiva.
48 Realización de consultas a una base de datos
Ejemplo 3.30 Queremos saber qué índices tenemos definidos sobre nuestras tablas, pero en
esta ocasión vamos a consultar al propio catálogo para que nos muestre algunas de las vistas que
contiene (así ya no necesitamos chuleta).
Ejercicio 3.39 ¿ Cuál es el nombre de la vista que tienes que consultar y qué campos te
pueden interesar?
Ejercicio 3.40 Muestra las tablas ventas a las que tienes acceso de consulta junto con el
nombre del propietario y su número de identificación en el sistema.
Ejercicio 3.41 Muestra todos tus objetos creados en el sistema. ¿Hay algo más que tablas?
Ejercicio 3.43 Mostrar los mejores proveedores, entendiéndose como los que tienen mayores
cantidades totales.
Ejercicio 3.44 Mostrar los proveedores que venden piezas a todas las ciudades de los
proyectos a los que suministra ’S3’, sin incluirlo.
Ejercicio 3.45 Encontrar aquellos proveedores que hayan hecho al menos diez pedidos.
Ejercicio 3.46 Encontrar aquellos proveedores que venden todas las piezas suministradas
por S1.
Ejercicio 3.47 Encontrar la cantidad total de piezas que ha vendido cada proveedor que
cumple la condición de vender todas las piezas suministradas por S1.
Ejercicio 3.48 Encontrar qué proyectos están suministrados por todos lo proveedores que
suministran la pieza P3.
Ejercicio 3.50 Queremos saber los nombres de tus índices y sobre qué tablas están montados,
indica además su propietario.
3.8 Ejercicios adicionales 49
Ejercicio 3.51 Implementar el comando DESCRIBE para tu tabla ventas a través de una
consulta a las vistas del catálogo.
Ejercicio 3.52 Mostrar para cada proveedor la media de productos suministrados cada año.
Piensa con detenimiento el significado de la palabra todos/as en las siguientes tres consultas
y resuélvelas convenientemente:
Ejercicio 3.53 Encontrar todos los proveedores que venden una pieza roja.
Ejercicio 3.54 Encontrar todos los proveedores que venden todas las piezas rojas.
Ejercicio 3.55 Encontrar todos los proveedores tales que todas las piezas que venden son
rojas.
Ejercicio 3.56 Encontrar el nombre de aquellos proveedores que venden más de una pieza
roja.
Ejercicio 3.57 Encontrar todos los proveedores que vendiendo todas las piezas rojas cumplen
la condición de que todas sus ventas son de más de 10 unidades.
Ejercicio 3.58 Coloca el status igual a 1 a aquellos proveedores que sólo suministran la pieza
P1.
Ejercicio 3.59 Encuentra, de entre las piezas que no se han vendido en septiembre de 2009,
las ciudades de aquéllas que se han vendido en mayor cantidad durante Agosto de ese mismo
año.
Como ejercicios adicionales se deja al alumno la posibilidad de realizar todas las consultas
en SQL correspondientes a las ya resueltas en álgebra relacional sobre la base de datos de la
Gestión Docente Universitaria.
Ejercicio 3.61 Muestra los nombres de los equipos y de los jugadores jugadores ordenados
alfabéticamente.
Ejercicio 3.63 Muestra los compañeros de equipo del jugador que tiene por código x
(codJ=’x’) y donde x es uno elegido por ti.
Ejercicio 3.64 Muestra los jugadores y la localidad donde juegan (la de sus equipos).
Ejercicio 3.65 Muestra los equipos que han ganado algún encuentro jugando como local.
Ejercicio 3.66 Muestra los equipos que han ganado algún encuentro.
Ejercicio 3.67 Muestra los equipos que todos los encuentros que han ganado lo han hecho
como equipo local.
Ejercicio 3.68 Muestra los equipos que han ganado todos los encuentros jugando como
equipo local.
Ejercicio 3.69 Muestra los encuentros que faltan para terminar la liga. Suponiendo que en la
tabla Encuentros sólo se almacenan los encuentros celebrados hasta la fecha.
Ejercicio 3.70 Muestra los encuentros que tienen lugar en la misma localidad.
Resolver mediante SQL las siguientes consultas sobre la base de datos de la liga de balonces-
to:
Ejercicio 3.71 Para cada equipo muestra cantidad de encuentros que ha disputado como
local.
Ejercicio 3.72 Muestra los encuentros en los que se alcanzó mayor diferencia.
Ejercicio 3.73 Muestra los jugadores que no han superado 3 faltas acumuladas.
Ejercicio 3.74 Muestra los equipos con mayores puntuaciones en los partidos jugados fuera
de casa.
3.8 Ejercicios adicionales 51
Ejercicio 3.75 Muestra la cantidad de victorias de cada equipo, jugando como local o como
visitante.
Ejercicio 3.77 Muestra el promedio de puntos por equipo en los encuentros de ida.
Ejercicio 3.78 Muestra el equipo con mayor número de puntos en total de los encuentros
jugados.
Capítulo 4
En esta unidad se introduce el concepto de vista como mecanismo para materializar el nivel
externo de una Base de Datos y se proporcionan las sentencias SQL necesarias para su creación
y manipulación.
Gracias a las vistas, podemos establecer niveles de seguridad adicionales a los que ofrezca el
sistema, ya que se puede ocultar cierta información y hacer visible a los usuarios sólo la parte de
la BD que necesiten para realizar sus tareas. Además, simplifican el aspecto la BD y el uso de
algunos comandos. Como hemos comentado anteriormente, el catálogo de la BD es una porción
de la misma que usa las vistas para mostrar a cada usuario la información que le concierne de la
estructura de la BD.
1 Existe una variedad de vista que si contiene datos: la vista materializada, que se usa en entornos distribuidos para
replicar datos.
54 Definición del nivel externo de un DBMS
En SQL, la creación de una vista se hace mediante el comando CREATE VIEW, según se
muestra en el siguiente ejemplo:
Ejemplo 4.1 Extraer el conjunto de suministros realizados sólo con integrantes procedentes
de Paris.
En la cláusula AS se especifica la consulta que determina qué filas y columnas de la tabla o tablas
almacenadas forman parte de la vista.
La ejecución de esta sentencia, básicamente produce la inserción de una fila en el catálogo.
La información registrada puede consultarse a través de la vista all_views, cuyos atributos más
relevantes son :
all_views(owner,view_name,text)
y donde owner es el propietario de la vista, view_name el nombre que se le ha asignado y text
la sentencia SELECT que permite reconstruirla.
Mediante SQL Developer también se pueden crear vistas de forma visual, de forma parecida
a como se crean las tablas (ver Apéndice A.4), sólo que el asistente de creación se inicia a partir
de la selección del objeto vista en el árbol de objetos del panel izquierdo. También se pueden
consultar, editar y eliminar, siguiendo un procedimiento similar.
La vista PiezasLondres cumple las condiciones para actualizar la tabla Piezas, pero
inserta NULL como valor para Ciudad, ya que este atributo no pertenece a la vista.
Ejercicio 4.2 Crear una vista con los nombres de los proveedores y sus ciudades. Inserta
sobre ella una fila y explica cuál es el problema que se plantea. ¿Habría problemas de
actualización?
Ejercicio 4.3 Crear una vista donde aparezcan el código de proveedor, el nombre de provee-
dor y el código del proyecto tales que la pieza sumistrada sea gris. Sobre esta vista realiza
alguna consulta y enumera todos los motivos por los que sería imposible realizar una inserción.
Capítulo 5
Introducción a la administración: el
catálogo y gestión de privilegios
En esta unidad se dará a conocer al alumno el componente del que dispone un SGBD para
proporcionar toda información relevante acerca de la estructura y contenidos de una base de
datos, el catálogo o diccionarios de datos. También se revisara uno de los mecanismos con los
que cuenta un SGBD para permitir compartir datos entre usuarios y/o aplicaciones, así como,
restringir o ampliar la operatividad de los usuarios frente al sistema: la concesión de privilegios
del sistema.
Vista Descripción
DICTIONARY Descripciones de las tablas y vistas del diccionario de datos.
USER_CATALOG Tablas, vistas, clusters, índices, sinónimos
y secuencias propiedad del usuario.
USER_CONSTRAINTS Definiciones de restricciones sobre las tablas del usuario.
USER_CONS_COLUMNS Columnas propiedad del usuario y que se han especificado en la
definición de restricciones.
USER_ROLE_PRIVS Roles autorizados al usuario (de administrador, usuario por defecto, ...).
USER_SYS_PRIVS Privilegios del sistema concedidos al usuario.
USER_TAB_COLUMNS Descripción de las columnas de las tablas, vistas y clusters pertenecientes
al usuario.
USER_TABLES Tablas del usuario con su nombre, número de columnas,
información relativa al almacenamiento, estadísticas, ...
USER_INDEXES Información de los índices del usuario.
USER_CLUSTERS Información de los clústers del usuario.
USER_TABLESPACES Espacios de tablas a los que puede acceder el usuario.
USER_USERS Información sobre el usuario actual.
ALL_USERS Información sobre los usuarios del sistema.
ALL_TABLES Información de aquellas tablas a los que tenemos acceso
porque el propietario lo haya especificado así.
ALL_VIEWS Información de aquellas vistas a las que tenemos acceso.
Este tipo de privilegios permiten al usuario llevar a cabo acciones particulares en la base de
datos. Existen más de 80 privilegios de este tipo (ver [8]), y su número continúa aumentando con
cada nueva versión del SGBD Oracler . Sólo usuarios con privilegios de administración pueden
gestionar este tipo de privilegios.
Estos privilegios pueden clasificarse como sigue:
Privilegios que autorizan operaciones de alto nivel en el sistema (como por ejemplo
CREATE SESSION y CREATE TABLESPACE).
Privilegios que autorizan la gestión de objetos en el propio esquema de usuario (como por
ejemplo CREATE TABLE).
Privilegios que autorizan la gestión de objetos en cualquier esquema (como por ejemplo
CREATE ANY TABLE).
Hay dos comandos del DDL que se encargan de controlar los privilegios, GRANT y REVO-
KE. Estos permiten otorgar y retirar privilegios a un usuario o a un “role”.
GRANT {system_priv | role} [,{system_priv | role}] ... TO {user | role | PUBLIC} [,{user | role |
PUBLIC}]...
[WITH ADMIN OPTION]
PUBLIC se refiere a todos los usuarios.
WITH ADMIN OPTION permite que el usuario autorizado pueda otorgar a su vez el
privilegio a otros.
5.2 Gestión de privilegios 59
REVOKE {system_priv | role} [,{system_priv | role}] ... FROM {user | role | PUBLIC} [,{user | role
| PUBLIC}]...
Sólo permite derogar privilegios que hayan sido explícitamente concedidos mediante el
uso de GRANT.
Hay que vigilar los efectos sobre otros privilegios al derogar uno dado.
No hay efecto de cascada aunque se haya usado en el GRANT la opción WITH ADMIN
OPTION.
Para gestionar los privilegios del sistema desde SQL Developer A, el usuario debe poseer
el “role dba” y, en ese caso, podrá acceder a esta herramienta como “DBA” a partir del menú
Ver|DBA, tras autentificarse en una conexión con privilegios de administración, podrá desplegar
la lista de usuarios, seleccionar el usuario deseado, desplegar el menú contextual con el botón
derecho del ratón y seleccionar la opción “Editar”. A través del formulario que aparecerá podrá,
entre otras acciones, otorgar y revocar, privilegios y “roles” del sistema.
En esta unidad de trabajo se completa la formación del alumno con aspectos relacionados
con la gestión del nivel interno. Concretamente ejercitaremos:
Los índices. Se ilustrará la creación y uso de diferentes tipos de índices.
Los “clusters”. Se introduce brevemente el concepto de “cluster” como mecanismo de
almacenamiento a nivel interno, cuyo principal objetivo es el de minimizar el tiempo de
acceso a tablas que van a recuperarse reunidas con mucha frecuencia. Se explicarán, a su
vez, tanto el proceso que debe seguirse, como las sentencias necesarias para construir un
“cluster”.
Por último ilustrará la implementación y uso del acceso directo mediante hashing.
El alumno podrá encontrar información complementaria relativa al uso de los “clusters” y de
los índices en [7], en los capítulos 2 y 3, respectivamente. En [8] encontrará la sintaxis completa
para la gestión de estos elementos.
realizan actualizaciones de una tabla de la base de datos, cada uno de los índices basados en esa
tabla necesita también una actualización.
Antes de crear un índice se debe determinar si es necesario, es decir, se debe estimar si el
beneficio en el rendimiento que se obtendrá supera al costo derivado de su mantenimiento.
El usuario sólo debe crear aquellos índices que considere necesarios y el SGBD se encargará
de usarlos y mantenerlos automáticamente. El mantenimiento implica la modificación necesaria
del índice cuando se añaden, modifican o eliminan registros de la tabla.
Cuando creamos una tabla, Oracler crea automáticamente un índice asociado a la llave
primaria de la misma. Por tanto, no es necesario ni conveniente crear índices sobre la llave
primaria porque no sólo no se consigue mejorar el rendimiento sino que se empeora al tener que
mantener un índice más.
En esta unidad ejercitaremos el uso de índices basados en árboles B* y otro tipo de índices
que pueden resultar más útiles en determinadas situaciones (para más información, véase el
capítulo 3 de [7]).
Como conclusión, es importante utilizar los índices que se necesiten realmente y se deben
borrar si no resultan de utilidad frente a las operaciones de consulta habituales.
Ejemplo 6.1 Si queremos acelerar las consultas cuando busquemos a un proveedor por su
nombre podemos crear un índice asociado al campo nompro de la tabla proveedor.
Cuando se crea una tabla es mejor insertar los registros antes de crear el índice. Si se crea
antes el índice, Oracler deberá actualizarlo cada vez que se inserte un registro.
Ejemplo 6.2 Podemos comprobar la creación de este índice mediante la siguiente consulta al
catálogo.
Sin embargo no mejorará el acceso cuando las consultas no incluyan referencias a los
primeros campos del índice. Por ejemplo:
Se debe tener en cuenta que cuando se borra una tabla también se borran todos los índices
asociados.
Los índices que Oracler crea asociados a las llaves primarias sólo se pueden borrar elimi-
nando dichas restricciones.
rendimiento. La sintaxis es la misma que la de los índices normales salvo que se usa la cláusula
REVERSE para indicar que son de este tipo de índice:
CREATE INDEX nombre_del_indice ON tabla(campo [ASC | DESC],...) REVERSE;
Índices BITMAP
Cuando los valores de la clave tienen una baja cardinalidad, el uso de este tipo de índice
puede ser apropiado. Se usa la cláusula BITMAP para indicar que son de este tipo de índice.
Ejemplo de uso frente a índice normal:
1. Crear tabla ejemplo: CREATE TABLE Prueba_Bit (color Varchar2(10));
2. Insertar 50000 tuplas con valores de color aleatorios. Ejecutar:
BEGIN
FOR i IN 1..50000 LOOP
INSERT INTO Prueba_bit (
SELECT decode(round(dbms_random.value(1,4)),1,'Rojo',2,'Verde',
3,'Amarillo',4,'Azul') FROM dual);
END LOOP;
END;
3. Crear un índice normal: CREATE INDEX Prueba_IDX ON Prueba_Bit(color);
4. Ejecutar:
SELECT count(*) FROM Prueba_Bit
WHERE color='Amarillo' OR color= 'Azul';
5. Apuntar el tiempo empleado.
6. Pinchar el botón “Explicación del Plan” (F10) para ver el plan seleccionado para ejecutar
esa consulta.
7. Borrar índice normal: DROP INDEX Prueba_IDX;
8. Crear índice BITMAP:
CREATE BITMAP INDEX Prueba_BITMAP_IDX ON Prueba_Bit(color);
9. Volver a ejecutar la consulta anterior.
10. Apuntar el tiempo empleado y comparar con el anterior.
11. Pinchar el botón “Explicación del Plan” (F10) para ver el plan seleccionado para ejecutar
esa consulta. Comparar con el plan usado por la consulta con el índice normal.
12. Borrar tabla e índice: DROP TABLE Prueba_bit;
Tablas organizadas por Índice (IOT)
Este tipo de tablas organizan sus tuplas según el valor de la clave utilizando una estructura de
árbol B*. La diferencia respecto a un índice normal estriba en que en las hojas están las tuplas,
no los RID que apuntan a las tuplas. Para crear estas tablas se usa la cláusula ORGANIZATION
INDEX en la sentencia CREATE TABLE, normalmente utilizan los campos de la clave primaria
para ordenar la tabla. Una recuperación total devuelve los resultados ordenados por la clave. El
siguiente ejemplo ilustra su uso:
1. Crear la tabla:
CREATE TABLE Prueba_IOT (id NUMBER PRIMARY KEY) ORGANIZATION INDEX;
2. Carga de 2000 tuplas con id entre 1 y 2000, ordenadas de forma aleatoria. Abrir y ejecutar
el script SQL: Carga_prueba_iot.sql.
3. Ejecutar la consulta: SELECT id FROM Prueba_IOT. Observar el orden en que se obtie-
nen las tuplas en relación al campo id.
4. Pinchar el botón “Explicación del Plan” (F10) para ver el plan seleccionado para ejecutar
esa consulta.
5. Borrar tabla: DROP TABLE Prueba_IOT;
6.2 “Clusters” 65
6.2 “Clusters”
Un “cluster” proporciona un método alternativo de almacenar información en las tablas. Un
“cluster” lo forman un conjunto de tablas que se almacenan en los mismos bloques de datos
porque comparten campos comunes (clave del “cluster”) y se accede frecuentemente a ellas de
forma conjunta.
Por ejemplo, las tablas proveedor y ventas comparten el campo codpro. Si se incluyen las
dos tablas en el mismo “cluster”, Oracler físicamente almacena todas las filas de cada codpro
de ambas tablas en los mismos bloques de datos. No se deben usar “clusters” con tablas a las que
se accede frecuentemente de forma individual.
A continuación mostramos una instancia de la tabla proveedor:
Después de crear un “cluster” se pueden crear las tablas que pertenecen al “cluster”.
Figura 6.1: “Cluster” compuesto de las tablas proveedor y ventas, denominado cluster_codpro
Se debe elegir la clave del “cluster” con cuidado. Si se usan varios campos en consultas que
reunen las tablas, se debe usar una llave compuesta.
Una buena clave del “cluster” debe tener un número adecuado de valores distintos para que
la información asociada a cada valor de la clave ocupe aproximadamente un bloque de datos.
Si la cantidad de valores distintos de la llave del “cluster” es muy pequeña se desperdicia
espacio y la mejora en el rendimiento es muy baja. Por ello es conveniente evitar claves de
“cluster” demasiado específicas.
Cuando la cantidad de valores distintos es demasiado alta, la búsqueda del registro a partir de
la clave del “cluster” es lenta. Por tanto, se deben evitar claves de “cluster” demasiado generales.
El acceso a los elementos del “cluster” a través de la clave puede mejorarse mediante el uso
de índices B* o mediante “Hash”. En este último caso, podemos crear un “cluster” que sólo
tenga asociada una tabla, de esta forma implementaremos el método de acceso “Hash” sobre esa
tabla.
Veremos, en primer lugar como se crea un “cluster” accedido mediante índices basado en
árboles B*, después veremos como se crea un “cluster Hash” y una tabla accedida mediante
“Hash”.
Ejemplo 6.3 Para crear el “cluster” mostrado en la figura 6.1, usamos la siguiente sentencia.
Ejercicio 6.1 Rellena las tablas proveedor2 y ventas2 con los datos de sus homólogas
originales.
Ejercicio 6.2 Realiza alguna consulta a los datos contenidos en el “cluster” cluster_codpro.
La cláusula HASH IS se puede usar solamente si la clave del “cluster” está compuesta por
un único atributo de tipo NUMBER y contiene enteros uniformemente distribuidos. Si no se dan
68 Nivel interno: Índices, clusters y hashing
esas condiciones, se omite esa cláusula y Oracle usará la función “hash” que tiene implementada
por defecto.
Mediante la cláusla SIZE debemos establecer cuanto espacio van a ocupar todas las tuplas
del “cluster” que tengan un mismo valor para la clave del “cluster”. Este valor debe estimarse a
partir del tamaño estimado de cada tupla y de la cantidad máxima de ellas que van a tomar un
mismo valor de la clave. Un valor escaso en esta estimación favorecerá la aparición de colisiones
(que haya más tuplas para un valor de la clave del espacio habilitado para las mismas y deban
ubicarse en otro bloque distinto), lo que deteriorará el rendimiento. Si primamos el rendimiento
frente al uso óptimo del espacio de almacenamiento, debemos añadir un 15 % al valor estimado
de SIZE.
Mediante el parámetro HASHKEYS establecemos cuantos valores distintos va a tomar la
clave del “cluster”, Oracle calcula el número primo inmediatamente superior al valor que le
indicamos y ese es el que usa para determinar en su función “hash” los valores distintos que va a
tomar la clave.
Ejemplo 6.5 Crear el “cluster” mostrado en la figura 6.1, suponiendo que vamos a tener unos
50 proveedores y una media de 30 ventas por proveedor.
En este ejemplo, nuevamente la clave del “cluster” sería codpro y, puesto que va a tener unos
50 valores distintos, HASHKEYS sería 50. El valor de SIZE lo estimaríamos, en función del
tamaño de las tuplas de la tabla proveedor y de la tabla ventas de la figura 6.1 y de la cantidad
media de ventas por valor de la clave (30), de esta manera1 :
Tamaño de tupla de proveedor: codpro=3 bytes, nompro=30 bytes, status=2 bytes y
ciudad=15 bytes. Total=50 bytes.
Tamaño de tupla de ventas; codpie=3 bytes, codpj=3 bytes, cantidad=3 bytes y fecha=7
bytes. Total=16 bytes.
Como por cada proveedor (tamaño 50 bytes) tendremos una media de 30 ventas (tamaño 16
bytes por tupla). Entonces el valor de SIZE sería: 50+30*16=530 bytes a lo que añadimos
un 15 %, quedando: SIZE 610
Por lo que la sentencia de creación del “cluster” quedaría así:
CREATE CLUSTER cluster_codpro_hash(codpro VARCHAR2(3)) SIZE 610 HASHKEYS 50;
Después añadiríamos las tablas del “cluster” de la misma manera que hacíamos con el
“cluster” indizado.
Como hemos calculado, el tamaño de las tuplas de proveedor es de 50 bytes, por lo que
SIZE tomará ese valor (no es necesario incrementar ese tamaño, como en el ejemplo anterior) y
HASKEYS tomará el valor 100. Por lo que la sentencia de creación del “cluster” sería:
para calcular su tamaño usamos: SELECT VSIZE(99) FROM dual; que devuelve 2 bytes de almacenamiento.
6.2 “Clusters” 69
Si un “cluster” contiene tablas no podrá ser eliminado a menos que se eliminen antes las
tablas o que se incluya en la sentencia la opción INCLUDING TABLES.
El “cluster” no podrá ser borrado si las tablas contienen campos que son referenciados por
claves externas localizadas en tablas externas al “cluster”. Para que se pueda borrar el “cluster”
se deben eliminar las referencias externas mediante la opción CASCADE CONSTRAINTS.
Como hemos indicado, SQL Developer es una herramienta desarrollada en Java y, para su
ejecución, precisa de un JDK1 versión 1.8 o superior. Existen versiones con el JDK incluido,
o sin él, para cualquier plataforma que soporte Java. Si se tiene ya instalada la versión de JDK
necesaria, se puede descargar la version sin JDK, por el contrario, se puede optar por descargar
la versión con JDK si no se dispone del mismo.
Para descargar la herramienta acceda a la web de descargas de Oracler [13] y, previo registro
gratuito, descargue la versión adecuada para su plataforma y configuración (con o sin JDK).
La instalación y ejecución de esta herramienta es muy sencilla, ya que sólo es preciso
descomprimir el fichero descargado en la carpeta que se elija y después ejecutar el archivo
sqldeveloper.exe. En la primera ejecución, sólo para la versión que no incluye SDK, le solicitará
la ubicación del programa java.exe del JDK a utilizar, dicha información queda guardada en los
archivos de configuración y no se solicitará más. En la primera ejecución también puede solicitar
las asociaciones de extensiones de archivos con SQL Developer, de forma que las extensiones
que seleccionemos harán que un doble click sobre archivos que tengan esa extensión se abran de
forma automática en SQL Developer.
1 SQL Developer precisa la versión de desarrollo de Java (JDK), no funciona con la “runtime”, es decir la jre
72 Uso de SQL Developer
con los datos de dicha cuenta, para ello pinchamos y rellenamos el formulario
que aparece como se muestra a continuación:
donde los datos de conexión mostrados sirven para conectarnos al servidor de la Escuela2 ,
aunque debemos personalizar nuestro nombre de usuario y contraseña (la cual se podría introducir
y guardar en el formulario). Finalmente podemos comprobar la corrección de la conexión
pinchando “Probar”3 y, por último “Guardar”, con lo que nos aparece en la lista de conexiones
del panel superior izquierdo de la herramienta.
Para conectarnos a través de dicha conexión sólo tenemos que pinchar en el símbolo +
situado a la izquierda del icono de la conexión, lo cual hace que se muestre un formulario de
autentificación (si no hemos guardado la clave al crear la conexión), después de introducir la
clave y aceptar se desplegará un árbol de objetos bajo el icono de conexión y se abrirá a la
derecha una hoja de trabajo, desde la que podemos enviar sentencias SQL al servidor.
se pulsa el icono o las teclas CTRL+Intro. Esta última forma de ejecución es muy útil para
ejecutar consultas, pues devuelve las tuplas resultado en un formato tabular editable y con un
aspecto más presentable que SQL*Plus.
Para ejecutar todas las sentencias presentes en la “Hoja de Trabajo”, se pulsa el icono o
la tecla F5. Los resultados de la ejecución de las sentencias SQL se muestran en las pestañas
“Resultado de la Consulta” y “Salida de Script”, respectivamente.
El icono permite acceder a un histórico de sentencias SQL ejecutadas. Para cargar una
sentencia del histórico se hace doble-clik sobre la sentencia. El icono borra el contenido de la
“Hoja de Trabajo”.
Para ver el número de línea en la “Hoja de Trabajo” hay que activar la opción Herramien-
tas|Preferencias|Editor de Códigos|Canal de Línea|Mostrar Números de línea. Para grabar a un
fichero .SQL el contenido de la “Hoja de Trabajo” se utiliza la opción Archivo|Guardar o el
icono . Para abrir un fichero .SQL en la “Hoja de Trabajo” se utiliza la opción Archivo|Abrir...
o el icono .
Para abrir una nueva “Hoja de Trabajo” se utiliza la opción Herramientas|Hoja de Trabajo
SQL o el icono .
Para crear y editar un nuevo fichero SQL se utiliza la opción Archivo|Nuevo...|Archivo SQL .
IMPORTANTE: Las sentencias SQL que modifican la base de datos (INSERT, UPDATE
y DELETE) no establecen de forma permanente los datos en la base de datos hasta que se
realiza un “Commit”, para lo que hay que pulsar el icono . Si se quiere que las sentencias SQL
establezcan automáticamente los datos en la base de datos después de ejecutarlas hay que activar
la opción Herramientas|Preferencias|base de Datos|Avanzada|Confirmación Automática.
Si lo que queremos es hacer un “rollback” para deshacer la transacción en curso, podemos
usar el icono .
Para que los cambios realizados por sentencias SQL de creación de objetos (DDL) se reflejen
en el navegador de objetos, es necesario pulsar el icono Refrescar" .
Para crear de forma visual una tabla se despliega el menu contextual sobre el objeto tablas
del árbol de objetos del panel superior izquierdo (pinchar el botón derecho del ratón sobre dicho
Para establecer en la base de datos los cambios realizados pinchamos el icono , para
deshacerlo el icono y para refrescar el contenido de la tabla con respecto a alguna operación
de actualización que hayamos realizado sobre la misma desde la “Hoja de Trabajo” pinchamos el
icono . El icono permite anclar la pestaña de la tabla actual de manera que si se selecciona
otra tabla en el navegador de objetos se abrirá otra pestaña nueva y no se reutilizará la pestaña
fijada.
Desde SQL Developer es posible exportar objetos de una base de datos e, incluso el contenido
de esos objetos, las tuplas en el caso de las tablas, a diferentes formatos de archivo que incluyen:
diferentes tipos de formatos de texto plano delimitado, sentencias insert para la exportación de
datos, xml, pdf, xls y xlsx (formatos de hoja de cálculo), etc. Esta opción es útil para exportar la
base de datos desde la instalación particular a la de la Escuela y viceversa.
Vamos a ver un ejemplo mediante el cual vamos a exportar el DDL de dos tablas junto con
los datos que contienen, eligiendo como formato de exportación un fichero que contenga las
sentencias SQL para crear esas tablas y para insertar los datos que éstas contenían. Para ello
seleccionamos el asistente de exportación desde Herramientas|Exportación de Bases de Datos y,
en el primer paso del asistente debemos establecer la cuenta origen desde donde queremos realizar
la exportación, así como determinar si queremos exportar la definición de los objetos (DDL)
y/o los datos que contengan. Si queremos que el fichero generado no contenga referencias al
usuario origen, debemos desactivar la opción “Mostrar Esquema”. Además debemos determinar
el formato de fichero al que queremos exportar (en nuetro caso SQL), la ubicación y nombre
del fichero que se genere, codificación en el caso de texto plano, etc. En nuestro ejemplo el
formulario quedaría como sigue:
76 Uso de SQL Developer
pulsamos “Siguiente” y, como sólo queremos exportar tablas y sus datos, dejaríamos activada
sólo esa opción, pero como podemos apreciar, podemos exportar cualquier objeto de la base de
datos.
En el paso 3, tras pulsar “Siguiente”, debemos seleccionar los objetos concretos a exportar.
Para ello en la parte superior podemos realizar un consulta sobre los objetos de los que somos
propietarios y tras seleccionar los objetos deseados con el ratón manteniendo pulsada la tecla
CTRL, pinchamos >para pasarlos a la ventana derecha.
A.6 Exportación e importación de objetos y datos 77
Tras pulsar “Siguiente”, nos aparece un formulario en el que podemos establecer criterios de
consulta sobre las tablas seleccionadas de forma que sólo se exporten las tuplas que cumplan la
cláusula “WHERE’ establecida y se proyecte por los campos que deseemos. En nuestro caso
queremos exportar todas las tuplas con todos sus campos, por lo que el formulario quedaría como
sigue:
Tras pulsar “Siguiente”, nos aparece la pantalla resumen de lo que se va a realizar mediante
la exportación:
78 Uso de SQL Developer
Para importar esas tablas y sus datos en otra cuenta en la misma base de datos o en otra
base de datos Oracler , sólo tendríamos que abrir y ejecutar el fichero generado desde esa nueva
conexión.
Como podemos apreciar se pueden importar datos desde un formato de hoja de cálculo (xls y
xlsx) y desde diversos tipo de ficheros de texto. Vamos a ilustrar como importar datos desde una
hoja de cálculo. En este ejemplo vamos a importar en la tabla alojamiento los datos presentes en
la siguiente hoja de cáculo:
Entramos el primer paso de un asistente que nos va a ayudar a acomodar los datos de la
hoja de cálculo en la tabla destino. La primera fila de la hoja puede tomarse como cabecera,
manteniendo activada dicha opción y, por tanto descartándola en la importación o, como es
nuestro caso, tomándola como fila de datos válida (opción desactivada).
Tras pulsar “Siguiente” aceptamos los valores que nos ofrece por defecto.
A.6 Exportación e importación de objetos y datos 81
aceptamos y avanzamos hasta el paso 4 del asistente, en este paso asignamos el contenido
de cada columna de la hoja de cálculo con cada atributo de la tabla alojamiento, por defecto la
columna primera de la hoja se asigna a la primera de la tabla, y así sucesivamente, aunque esto
podemos cambiarlo por medio de este formulario:
En el quinto paso del asistente podemos darle al botón “Verificar” para comprobar que todo
está correcto antes de proceder a la importación
82 Uso de SQL Developer
B.1 Introducción
@pieza(codpie/char,nompie/char,color/char,ciudad/char,peso/numeric):codpie
'P1','Tuerca','Gris','Madrid', 25
'P2','Tornillo','Rojo' ,'Paris',125
'P3','Arandela','Blanco','Londres',3
'P4','Clavo','Gris','Lisboa', 55
'P5','Alcayata','Blanco','Roma',10
@proveedor(codpro/char,nompro/char,status/numeric,ciudad/char):codpro
'S1' , 'Jose Fernandez',2, 'Madrid'
'S2' , 'Manuel Vidal' ,1, 'Londres'
'S3' , 'Luisa Gomez' ,3, 'Lisboa'
'S4' , 'Pedro Sanchez' ,4, 'Paris'
'S5' , 'Maria Reyes' ,5, 'Roma'
'S6' , 'Jose Perez' ,6, 'Bruselas'
'S7' , 'Luisa Martins' ,7, 'Atenas'
@proyecto(codpj/char,nompj/char,ciudad/char):codpj
'J1','Proyecto 1','Londres'
'J2','Proyecto 2','Londres'
'J3','Proyecto 3','Paris'
'J4','Proyecto 4','Roma'
@ventas(codpro/char,codpie/char,codpj/char,cantidad/numeric,fecha/char):
codpro,codpie,codpj
'S1','P1','J1',150,'110930'
'S1','P1','J2',100,'060523'
'S1','P1','J3',500,' 060520'
'S1','P2','J1',200 ,'100715'
'S2','P2','J2', 15,'091104'
'S4','P2','J3', 1700,'111121'
'S1','P3','J1',800,'110711'
'S5','P3','J2', 30 ,'100106'
'S1','P4','J1', 10,'110718'
'S1','P4','J3',250,'090317'
'S2','P5','J2',300,'041127'
'S2','P2','J1', 4500,'050825'
'S3','P1','J1', 90,'090629'
B.2 Preparación de los datos 85
'S3','P2','J1',190,'120429'
'S3','P5','J3', 20,'021105'
'S4','P5','J1', 15,'030402'
'S4','P3','J1',100,'120402'
'S4','P1','J3', 1500,'110103'
'S1','P4','J4',290,'090319'
'S1','P2','J4',175,'090313'
'S5','P1','J4',400,'100104'
'S5','P3','J3',400,'100104'
'S1','P5','J1',340,'100206'
'S6','P1','J1',340,'100206'
'S6','P1','J2',340,'100206'
'S6','P1','J3',340,'100206'
'S6','P1','J4',340,'100206'
'S7','P1','J1',340,'100206'
'S7','P1','J2',340,'100206'
'S7','P1','J3',340,'100206'
'S7','P1','J4',340,'100206'
Las fechas se han codificado como una cadena de caracteres con 2 dígitos para el año, 2
dígitos para el mes y dos dígitos para el día en ese orden. Así, la fecha='100104’ representa el
día 04 de Enero de 2010.
La figura B.2 muestra una parte de la instancia de la base de datos usada en el cuaderno de
prácticas, una vez realizada la carga de los datos mediante el fichero anterior.
Figura B.2: Ventana de WinRDB mostrando una instancia de la base de datos de las prácticas.
86 Uso de la herramienta WinRDBI
AR (teoría) WinRDBI
Selección: σΘ (r) select Θ (r)
Proyección: π<lista_atributos> (r) project <lista_atributos>(r)
Producto Cartesiano: r × s r product s
Θ-Reunión: r ./Θ s select Θ (r product s)
Reunión natural: r ./ s r nJoin s
Unión: r ∪ s r union s
Intersección: r ∩ s r intersect s
Diferencia:r − s r difference s
División: r(a1, a2) ÷ s(a2) = (projection a1 (r)) difference
πa1 (r) − πa1 ((πa1 (r) × s) − r) (projection a1 (((projection a1 (r)) product s) difference r))
Renomb. de relaciones: ρ(r) = rcopy rcopy := r
Renomb. de atributos: rcopy.a rcopy (acopy) := project a (r)
Cuadro B.1: Correspondencia entre la notación usada en teoría y la proporcionada por WinRDBI
En [4] pueden encontrarse varios esquemas de Bases de Datos sobre los que se proponen y
resuelven numerosas consultas expresadas en todos los lenguajes que soporta esta herramienta.
En este apartado vamos a proponer una serie de consultas a resolver sobre la base de
datos “Company” cuyo esquema y tuplas se ha obtenido desde esa dirección. Para ello nos
descargaremos desde esa ubicación el archivo company.rdb y lo abriremos desde WinRDBI, con
ello tendremos la base de datos y las tuplas en nuestra herramienta. Sobre esa base de datos se
pide elaborar las sentencias en Álgebra Relacional que resuelven las siguientes consultas:
Ejercicio B.1 Recupera nombre (name) y dirección (address) de todos los empleados que
trabajan en el departamento ’Research’.
Ejercicio B.2 Para cada proyecto localizado en ’Stafford’, muestra el numero de proyecto, el
numero del departamento que lo controla y el apellido (last name), la dirección (address) y la
fecha de nacimiento (birthdate) del ’manager’ de ese departamento.
Ejercicio B.3 Encontrar los nombres de los empleados que trabajan en todos los proyectos
del departamento numero 5.
Ejercicio B.4 Mostrar la lista de los códigos de proyectos en que trabaja un empleado cuyo
apellido (last name) es ’Smith’, ya sea como trabajador o como ’manager’ del departamento
que controla el proyecto.
Ejercicio B.5 Listar lo nombres de todos los empleados con dos o mas dependientes.
Ejercicio B.6 Recupera los nombres de los empleados que no tienen dependientes.
Ejercicio B.7 Lista los nombres de los ’managers’ que tienen al menos un dependiente.
88 Uso de la herramienta WinRDBI
Una regla de oro para escribir expresiones seguras es cerciorarse de que una variable está
ligada a un valor antes de su uso, ya sea en una comparación o dentro de una negación.
A continuación se muestra la sintaxis para COD soportada por WinRDBI.
Referencias
[4] Universidad del Estado de Arizona. Estados Unidos de América. WinRDBI Sample Files.
2019. URL: http://winrdbi.asu.edu/samples.html (véase página 87).
[5] Universidad de Granada. Prado: Plataforma de Recursos de Apoyo a la Docencia. 2019.
URL : http://prado.ugr.es (véase página 13).