r.
«I! ¡TV1!
arceta
grupo editorial
Iván LópezMontalbán
M
Jesús Castellano
Pérez
John Ospino
Rivas
DAM
y
DAW
Bases de Datos
Técnico
Supe
en
Desa
de
Ap
M
y
Web
arceta
grupoeditorial
Iván López Montalbán
M3 Jesús Castellano Pérez
John Ospino Rivas
ISBN: 978-84-9281-291-2
IBERGARCETA PUBLICACIONES,
S.L., Madrid 2011
Edición: 1.°
Impresión: 3.
N.° de páginas: 328
Formato: 20 x 26 cm
Reservados los derechos para todos los países de lengua española. De conformidad con lo dispuesto en el artículo 270 y siguientes del
código penal vigente, podrán ser castigados con penas de multa y privación de libertad quienes reprodujeren o plagiaren, en todo o en
parte, una obra literaria, artística o cientíca fijada en cualquier tipo de soporte sin la preceptiva autorización. Ninguna parte de esta
publicación, incluido el diseño de la cubierta, puede ser reproducida, almacenada o trasmitida de ninguna forma, ni por ningún medio,
sea éste electrónico, químico, mecánico, electro-óptico, grabación, fotocopia o cualquier otro, sin la previa autorización escrita por parte
de la editorial.
Diríjase a CEDRO (Centro Español de Derechos Reprográcos), www.cedro.org, si necesita fotocopiar o escanear algún fragmento de esta
obra.
COPYRIGHT © 2011 IBERGARCETA PUBLICACIONES, S.L.
info@garceta.es
Bases de Datos
©
Iván López Montalbán, Ma Jesús Castellano Pérez, John Ospino Rivas
1.° edición, 3.° impresión
OI: 0078/2012
ISBN: 978-84-9281-291-2
Deposito Legal: M-33366-2011
Imagen de cubiertazpisotskii ©
fotoIia.com
Impresión:
PRINT
HOUSE, marca
registrada de
Copiar, S.
A.
IMPRESO ENESPAÑA-PRINTED IN SPAIN
Nota sobre enlaces a páginas web ajenas: Este libro puede incluir referencias a sitios web gestionados por terceros y ajenos a IBERGAR-
CETA PUBLICACIONES,S.L., que se incluyen sólo con nalidad informativa. IBERGARCETA PUBLICACIONES,S.L., no asume ningún tipo
de responsabilidad por los daños y perjuicios derivados del uso de los datos personales que pueda hacer un tercero encargado del man-
tenimiento de las páginas web ajenas a IBERGARCETA PUBLICACIONES, S.L., y del funcionamiento, accesibilidad y mantenimiento de
los sitios web no gestionados por IBERGARCETA PUBLICACIONES,S.L., directamente. Las referencias se proporcionan en el estado en
que se encuentran en el momento de publicación sin garantías, expresas o implícitas, sobre la información que se proporcione en ellas.
PRÓLOGO
Este libro está concebido para formar estudiantes de los ciclos de grado su-
perior DAM (Desarrollo deAplicaciones Multiplataforma) y
DAW (Desarrollo de
Aplicaciones Web). Más concrementamente, está pensado para cubrir la unidad de
competencia UC0026_3, programar bases de datos relacionales mediante el módulo
Base de datos común a ambos ciclos formativos.
Desde nuestra experiencia como administradores de bases de datos en empre-
sas multinacionales,
como profesores
de educaciónsecundaria (Informática)y como
profesores asociadosde universidad, hemos compuestoesta herramienta complemen-
taria a las clasesdel módulo de formación profesional e indispensable para lectores
independientes que quieran convertirse en programadores de basesde datos.
El contenido del libro tiene una orientación puramente práctica, con actividades,
consejos y ejercicios resueltos en Access, MySQL, Oracle y DB2, que facilitan al
profesor del módulo su completo seguimiento.
El objetivo del libro no esser una guía de referencia de un solo SGBD, sino la for-
mación de programadores de bases dedatos actualizados, versátiles y competentes.
Existe multitud de material disponible para la realización de las prácticas pro-
puestas en el blog bbdd-garceta.blogspot . com.
Índice general
1. Los sistemas de almacenamiento de la información
1.1. Ficheros
1.1.1. Tipos
de cheros
y formatos
.. . ........ ... .....
1.1.2. Ficheros de texto
1.1.3. Ficheros binarios
Bases de Datos
1.2.1. Conceptos . . . . . . . . . . . .. . .. . . . .. . . . . . . . .
1.2.2. Estructura de una base de datos . . . . .. .. . . .. . . . . .
1.2.3. Usos de las bases de datos
1.2.4. Evolución y tipos de base de datos
Los Sistemas Gestores de Base de Datos
1.3.1. Concepto de Sistema Gestor de Base de Datos .. .. . .. . .
1.3.2. Funciones de un SGBD . . .. . .. . .. . .. .. . .. . . . .
1.3.3. El lenguaje SQL
1.3.4. Tipos de SGBD . . . . . . . . .. . . . . .. . . . . . . . .. .
Prácticas Resueltas . . .. . . . . . .. . . . . . .. .. . .. . . . . .
Prácticas Propuestas . . . . . .. . .. . . . . . .. . .. .. . . .. .
Resumen . .. . . . . . . . .. . . . .. . . . .. . .. . . .. .. . . .
Test de repaso . .. .. . .. . .. . . . .. . . . .. . . .. .. . . . .
Comprueba tu aprendizaje . .. . . . .. .. . .. . . . .. . .. . . .
1.2.
1.3.
1.4.
1.5.
1.6.
Bases de Datos
2.4.1. Generalización y Especialización . . . . . .. . . .. . . . . . .59
2.5. Construcción de un diagrama E/R . . .. . .. . .. . . . . . . . .. 62
2.6. El modelo relacional . . . .. . . . .. . .. . .. . . . . . . . . .. .64
2.6.1. Las relaciones en el modelo relacional . . . . . . . .. . . .. .65
2.6.2. Otros conceptos del modelo relacional . . .. . .. .. . . . .. 65
2.7. Transformación de un diagrama E/ R al modelorelacional . . . . . . .67
2.8. Normalización . . .. . . . .. . . . . . . .. . . .. . .. . . . . . . .73
2.9. Prácticas Resueltas . . . .. . . . . . . .. . . . . . .. . . . . .. .. 77
2.10. Prácticas Propuestas . .. . . .. . . . .. . . . .. . .. . .. . . . .81
2.11. Resumen . . . . .. . .. . .. . . .. . . .. . . .. . .. . . .. . . .88
2.12. Test de repaso . . . . . .. . . . . . . . . . . . . . . . .. . . .. . .. 89
2.13. Comprueba tu aprendizaje .. . . . . . . . . . . . . . . . . . . . . . .90
3. Diseño físico relacional 91
3.1. Notación para la sintaxis . . . .. . . .. . . . . .. . .. . . .. . . .92
3.2. Herramientas grácas proporcionadas por los SGBD . . .. . . .. . .93
3.2.1. PhpMyAdmin de MySQL .. . . .. . . . .. . . . .. . . . .93
3.2.2. Oracle Enterprise Manager y
Grid Control . .. . . . . .. . .94
3.2.3. DB2 Data Studio . .. . . . . . . . . . . . . . . .. . . . . . .96
3.3. Intérpretes de comandos de los SGBD . .. . . . .. . . . . .. . .. .97
3.3.1. MySQL: El cliente de MySQL-Server .. . . . . . . .. .. . .98
3.3.2. Ejecución de consultas en MySQL .. . . . . . . . . . .. . . .99
3.3.3. SQL*Plus: El intérprete de comandos de Oracle . . . . . .. . 102
3.3.4. Ejecución de consultas en SQL*Plus .. .. . .. . . . . . . .103
3.4. El lenguaje de denición de datos . .. . .. . . . . . . . .. . . . . .104
3.5. Creación de bases de datos . . . . . .. . .. . . . . . . . . .. . . . .105
3.5.1. Creación de basesde datos en MySQL . .. . .. . . . . . . .105
3.5.2. Creación de bases de datos en Oracle . . .. . . .. . . . . .. 107
3.6. Modicación de una base de datos . . . . . . .. . . .. . .. .. . . .110
3.7. Borrado de bases de datos . .. . .. .. . . .. .. . . . . .. . . . .111
3.8. Creación de tablas . . .. . . .. . . . . . .. . .. . .. . . .. . . .111
3.8.1. Implementación de restricciones . . . . . .. . . . . . . . . . .113
3.8.2. Tipos de Datos . . . . . .. . . .. . . . . . . . .. . . . . .. 116
3.8.3. Características de la creación de tablas para MySQL . .. . .117
3.8.4. Características de la creación de tablas para Oracle . .. . . .118
3.8.5. Consulta de las tablas de una base de datos . . . . . . . . . .119
3.8.6. Consulta de la estructura de una tabla .. . . . .. . . . .. .119
3.9. Modicación de tablas . . . . .. . . . . . . . . . . . . .. .. . . .. 120
3.10. Borrado de tablas . . . . . .. . . . . . . . . .. . . . . . . . .. . . .122
3.11. Renombrado de tablas . . . . . . . . . . . . . .. . . .. .. . . . . .122
3.12. Prácticas Resueltas . . . . . .. . .. . . . . . . .. . .. . .. . .. .123
VIII
Índice general
3.13. Prácticas Propuestas .. . . . .. . .. . .. . . . .. . .. . . .. . .128
3.14. Resumen . . . . . .. . .. . . . . . .. . . . . . . . . . .. .. . .. .130
3.15. Test de repaso .. . . . . . . . . . . . . . .. . . . .. . . . . . . . . .131
3.16. Comprueba tu aprendizaje . .. . . . . . . . .. . . . . . . . . .. . . 132
. Realización de Consultas 133
4.1. El lenguaje DML . .. . . . . . . .. . .. . . . . . .. . . .. . . .. 134
4.2. La sentencia SELECT . . . . . .. . .. . . .. . .. . . . .. . . . .134
4.3. Consultas básicas .. . .. . .. .. . . . . . .. . .. . . . . . . . . .135
4.4. Filtros . . . . . . . . . .. . . .. . . . . . . . .. . .. . . .. . . . .137
4.4.1. Expresiones para ltros . .. .. . . . .. . . . .. . . . .. . .138
4.4.2. Construcción de ltros . . . . . . . .. . . . . . . .. . . . . .140
4.4.3. Filtros con operador de pertenencia a conjuntos . . . . . .. .141
4.4.4. Filtros con operador de rango . .. . . . . . . .. . . . .. . .142
4.4.5. Filtros con test de valor nulo . .. . . . . . .. . . . .. . .. . 143
4.4.6. Filtros con test de patrón . . . .. . . . . . . . . . . . . . . .143
4.4.7. Filtros por límite de número de registros . . . . . . .. . . . .144
4.5. Ordenación . .. . . .. . . . . . . .. .. . .. . . .. .. . . . . . .145
4.6. Consultas de resumen . . . . .. . . .. . . . . . . . . . .. . . . . . .147
4.6.1. Filtros de Grupos . . . .. .. . . .. . . . . . . .. .. . . . .151
4.7. Subconsultas . . . . .. . . .. . . .. . .. . . .. . . . . .. . .. .152
4.7.1. Test de Comparación . . .. . . . .. .. . . . .. . . .. . . .153
4.7.2. Test de pertenencia a conjunto .. . .. . .. . . . .. . . . .154
4.7.3. Test de existencia .. .. . .. .. .. . . . . . .. . . . . . . .154
4.7.4. Test cuanticados ALL y ANY . . . . . . . . . . . . . . . . .156
4.7.5. Subconsultas anidadas . . . .. . . . . .. . . . . . . . . . . .157
4.8. Consultas multitabla . .. . . . . . . . . .. .. . . . . . . . . . . . .158
4.8.1. Consultas multitabla SQL 1 . . . . .. . . . . . .. . . . . . .159
4.8.2. Consultas multitabla SQL 2 . . .. . . . . .. .. . . . . .. .162
4.9. Consultas reexivas . . .. . .. . .. . .. . . . . . . . . . . . . .. .169
4.10. Consultas con tablas derivadas . .. . . . . . . .. . . . . .. .. . .. 170
4.11. Prácticas Resueltas . .. . . . . . . . . . .. .. . . . .. . . . . . . .172
4.12. Prácticas Propuestas . . . . .. .. . . .. . . . . . . . . . . . .. . .176
4.13. Resumen . . . . . . . . .. . . . . .. . .. . . . . .. . . . . . .. . .182
4.14. Test de repaso .. . .. .. . . . . . .. . . . . . . . . . .. .. . .. . 183
4.15. Comprueba tu aprendizaje . . . .. . .. . .. . . . .. . . . .. . . .184
.Tratamiento de los datos 185
5.1. Herramientas grácas para la edición de los datos . . . . .. . . . . .186
5.1.1. Edición con phpMyAdmin .. .. . . . .. . . . . .. . .. .. 186
5.1.2. Access como entorno gráco para otros gestores . . . .. . .. 187
IX
Bases de Datos
5.2. La sentencia INSERT . . . . . . . .. . . . .. . .. . . . .. . . . . .189
5.3. La sentencia INSERT extendida . . . . .. . . . . . .. .. .. . .. . 191
5.4. INSERT y SELECT .. . . . .. . .. . . . .. . .. .. . .. .. . .191
5.5. La sentencia UPDATE . .. .. . . . .. . . . . . .. . .. . .. . . .192
5.6. La sentencia DELETE .. . . . .. . .. .. . .. . . . . . . . .. . . 193
5.7. La sentencias UPDATE y
DELETE con subconsultas . . . .. .. . .193
5.8. Borrado y modicación de registros con relaciones . . .. .. . . .. .194
5.9. Transacciones . . . . . . . . . . .. . . . . . . . . .. . . . . . .. . .197
5.10. Acceso concurrente a los datos . . . . .. . .. . . . . .. . .. . . . .198
5.10.1. Ejemplo de problemas en el acceso concurrente . . . . . . . . .200
5.11. El acceso a la información . . . . . .. . .. . . . . .. . . . . . . . .203
5.12. Las vistas . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . .203
5.13. Los usuarios . . . . . .. .. . . . . . .. .. .. . . . . . . .. . . . .205
5.14. Los privilegios . . . . . . .. .. .. . . . . . . .. . . .. . . . . . . .207
5.14.1. El sistema de privilegios de l'IySQL
.. .. . .. . . . . . . . .208
5.14.2. El sistema de privilegios de Oracle .. . .. . . . .. . . . . .212
5.14.3. El sistema de privilegios de DB2 .. . .. . . . . .. .. . . .. 219
5.15. Prácticas Resueltas . . . . .. . . . . .. . . .. . . . . .. . . . .. .221
5.16. Prácticas Propuestas . .. .. . . . . . . . . . . .. . . . . . . . . . .223
5.17. Resumen . .. . .. .. . . . .. .. .. . .. . . . . . . .. . . .. .. 228
5.18. Test de repaso . . . . . .. . . . . . . . . . .. . . .. .. . .. . . .. 229
5.19. Comprueba tu aprendizaje . .. .. . . .. . . .. . .. . . . . . .. . 230
6. Programación de bases de datos 231
6.1. Introducción a la programación de bases dedatos .. .. . . . .. .. 232
6.2. Los lenguajes de programación de bases dedatos . . . . . .. . .. .235
6.3. Tipos de datos, identicadores y variables . . . . .. . . .. . . . . .240
6.4. Operadores y expresiones . .. . . . . . . . . . . . . . .. . .. .. . .243
6.5. Estructuras de control . . .. .. . . . . . . . . . . . .. . . . . . . .245
6.5.1. IF..THEN-ELSIF..THENELSE-END IF . . . . . . . . . . . .245
6.5.2. CASE-WHENTHEN-ELSE-END CASE . .. . . . . .. . . .246
6.5.3. LOOP-EXIT WHEN-END LOOP .. .. . .. . . .. . .. .. 247
6.5.4. WHILE..LOOP-END LOOP . . .. . .. . . .. . .. . . . . .248
6.5.5. FOR..IN..LOOP-END LOOP . . .. . . . .. . . . . . . . . .248
6.6. Gestión de errores . . . . . . .. . . . . . . . . . . .. .. . . .. . .. 251
6.7. Transacciones en scripts . . . . . . . . . . . . . . .. .. . .. . . . .253
6.8. Las secuencias . . . . . .. .. .. . . . .. . . . .. . . . . . . .. . .257
6.9. Prácticas Resueltas . . . .. . . .. . . .. . .. . .. . . . . . . . . .258
6.10. Prácticas Propuestas . . . . . . . .. .. . . . .. . .. . . . . .. . .262
6.11. Resumen . . .. .. . . . . . . .. .. .. . . .. . . . . . . .. . . . . 264
6.12. Test de repaso . . . .. . . . . .. . . . . . . . . . . . . . .. .. . . .265
Índice general
6.13. Comprueba tu aprendizaje .. .. . . . . . .. . .. .. . .. . .. .. 266
.BBDD distribuidas 267
7.1. BBDD y SGBD distribuidos . . . . .. . .. . . . . . . . . . . . .. .268
7.1.1. Componentes de una BBDD distribuida .. .. . .. . . . . .268
7.2. Técnicas de fragmentación .. . . . . .. . .. .. . . . . . .. . . . .270
7.3. Consultas distribuidas . .. . . . . . . . . .. . .. . . .. . . . .. .271
7.3.1. DB Links . . . .. . . . . . . .. . .. . . .. . . . . . .. . .271
7.3.2. Ejecución de consultas distribuidas . .. .. .. . . . . .. . .273
7.4. Transacciones distribuidas . . . . .. . . .. . .. . . . . .. . . . . .275
7.4.1. TWO-PHASE COMMIT . .. . . .. . . . . .. . . . . . . .. 276
7.4.2. Ejemplo de transacción distribuida . . . . . . . . . . . . . . .277
7.5. Optimización de consultas sobre basesde datos distribuidas . . . .. 280
7.5.1. Optimización mediante consultas derivadas .. . . . . . .. .. 280
7.5.2. Optimización mediante hints . . .. .. . . . . . . . . . .. . .281
7.6. Prácticas Resueltas . .. . . . . .. .. . .. . . . .. . . .. . .. . .283
7.7. Prácticas propuestas .. . . .. . . .. . . .. . . .. . . .. . . . . . 286
7.8. Resumen . . . . . . . . . . . . . . .. . . . . . .. . .. . . . . . . ..289
7.9. Test de repaso . . . . . . .. .. . . . . . . . . . . . . . . . . . . .. .290
7.10. Comprueba tu aprendizaje . . . . . . . .. . .. .. . . . . . . .. .. 291
.BBDD Objeto-Relacionales 293
8.1. Las Bases dedatos objetos-relacionales . . .. . .. . . . . . .. . . . 294
8.2. Los atributos multivaluados .. . .. . .. .. . .. . . . .. . . . . .294
8.2.1. Las colecciones . . . . . . . . . . . . . . . . . . . . . . . . . .295
8.2.2. Tablas anidadas .. . . . . .. . . . . . . . .. . . . . . . .. .296
8.2.3. Tipos de Objeto .. .. . . . . .. . . . . . .. . . . .. . . . .298
8.3. Los identicadores de objeto .. . . . .. . .. . . .. . . . .. . . . .300
8.4. Los métodos . . .. .. . . .. . . . . .. . .. . . . . . . . . . . . . .301
8.5. La herencia . .. . . .. .. .. . . . .. . . .. . . . . . . . . . .. .304
8.6. Operaciones DML .. .. .. . . . .. .. . .. . . . . . . .. . . . . .306
8.7. Las referencias . . . .. . . . . .. . . .. . . . . . . . . . . . . . . . .307
8.8. Prácticas Resueltas . . .. . . . . . . .. . .. .. . .. . . .. .. . . 309
8.9. Prácticas Propuestas .. .. . . .. . . . .. . . .. . . .. . .. .. . 312
8.10. Resumen . . .. .. . . . . .. . .. . . . .. . . .. . . . . .. .. . . 314
8.11. Test de repaso . . . . . . . .. . . . . . . . . .. . . . . . . .. . . . .315
8.12. Comprueba tu aprendizaje .. . . . .. . . .. . . . . . . . . . . .. . 316
XI
CAPÍTULO 1
Los sistemas de almacenamiento
de la información
Objetivos
W
Analizar los sistemaslógicos de
almacenamiento V sus carac-
.terísticas
Contenidos
Identicar los distintos tipos de
Ñ
Ficheros.Tipos y
formatos bases de datos
n? Bases de datos. Conceptos.
. Reconocer la utilidad de un sis-
usos y tipos
tema gestor de base de datos
n? Sistemas gestores de bases de
Describir la función de los ele-
datos
mentos de un sistema gestor de
base de datos
Clasicar los sistemas gestores
de bases de datos
Este capítulo introduce conceptos sencillos e intuitivos para establecer una
cultura básica de bases de datos, y poder, de este modo, avanzar a objeti-
vos más avanzados. E1estudiante, a modo introductorio, manejará, de forma
muy visual, conceptos tales como tablas y
relaciones. De esta manera, afron-
tará capítulos próximos con más experiencia, y
entenderá y
asimilará mejor el
diseño lógico y
sico de las bases dedatos.
Bases de Datos
1. 1. Ficheros
Un ordenador almacena muchos tipos de información, desde datos administrati-
vos, contables o bancarios hasta música, películas, partidas de videojuegos, páginas
webs, etc. Toda esta información está almacenada en los dispositivos de almace-
namiento del ordenador, esto es, discos duros, dvds, pen drives, etc. Para poder
organizar la información en estos dispositivos, se utilizan los cheros o archivos.
Los cheros son estructuras de información que crean los sistemas operativos de los
ordenadores para poder almacenar datos. Suelen tener un nombre y una extensión,
que determina el formato de la información que contiene.
1.1.1. Tipos de cheros y
formatos
El formato y tipo de chero determina la forma de interpretar la información
que contiene, ya que, en denitiva, lo único que se almacena en un chero es una
ristra de bits (ceros y unos), de forma que esnecesaria suinterpretación para dar
sentido a la información que almacena.Así, por ejemplo, para almacenar una imagen
en un ordenador, se puede usar un chero binario bmp, que almacena un vector de
datos con los colores que tiene cada pixel que forma la imagen. Además, la imagen
posee una paleta de colores y unas dimensiones, información que también hay que
almacenar en el chero. Todos estosdatos seordenan según un formato, y el sistema
operativo, o la utilidad que trate los grácos, debe conocer este formato para poder
extraer los píxeles y mostrarlos por pantalla en la forma y dimensiones correctas. Si
se abre el graco con una utilidad como el bloc de notas, que solo sabe interpretar
texto, el resultado será ilegible e incomprensible.
<> Actividad 1.1: Buscaen tu ordenador un
chero con extensión doc
(del pro-
cesador detextos Microsoft Word), y ábrelo conel bloc de notas,pulsando conel
ratón derecho sobre el y seleccionando la opción Abrir con. Observa que el bloc de
notas no conoce el formato del chero tipo doc, y por tanto, no sabe interpretar el
contenido del chero, cosa que sí hace la aplicación de Microsoft.
Tradicionalmente, los cheros se han clasicado de muchasformas, segúnsu conte-
nido (texto o binario), según suorganización (secuencial,
directa, indexada)o según
su utilidad (maestros, históricos,
movimientos).
El contenido de un chero puede ser tratado como texto, o como datos binarios,
es decir, los bits almacenados en un chero pueden ser traducidos por el sistema
operativo a caracteres alfabéticos y números que entiende el ser humano, o pueden
Capítulo 1. Los sistemas de almacenamiento de Ia información
ser tratados como componentesde estructuras de datos más complejas,como cheros
que almacenan sonido, vídeo, imágenes, etc.
La organización de un chero dicta la forma en quese hande accedera losdatos,
así, los datos de un chero con organización secuencial, están dispuestos siguiendo
una secuencia ordenada, es decir, unos detrás de otros. Se caracterizan por tener
que recorrer todos los datos anteriores para llegar a uno en concreto. Los cheros
de organización directa, permiten acceder a un dato en concreto sin necesidad de
acceder a todos los anteriores. Finalmente, los de organización indexada acceden
a los datos consultando un índice, es decir, una estructura de datos que permite
acceder a la información rápidamente, simulando la forma en que el índice de un
libro facilita el acceso a sus contenidos. Existen también variantes de las anteriores
que mezclan las mejores características de cada una de ellas.
Por otro lado, la utilidad de un chero indica qué uso se va a hacer de él, por
ejemplo, puede contener datos fundamentales para una organización, como los datos
de los clientes, que se almacenan en un chero principal llamada maestro. Si hay
variaciones (altas,modicaciones o bajas de clientes) en los cheros maestros, se
almacenan en los llamados cheros de movimientos que posteriormente se enfrentan
con los maestros para incorporar las modicaciones. Finalmente, cuando existen
datos que ya no son necesariospara su proceso diario pasan a formar parte de los
cheros históricos.
Hoy en día, estas dos últimas clasicaciones han quedado en desuso. Por ejemplo,
desde la aparición de las bases de datos modernas, ya no se clasican según su
utilidad u organización.
Actualmente un sistema opera.tivo trata. un chero desde dos puntos de vista:
1. Segúnsu contenido(texto o datos binarios)
2. Según su tipo (imágenes, ejecutables, clips de videos, etc.)
1.1.2. Ficheros de texto
Los cheros de texto suelen llamarse también cheros planos o cheros ascii. El
vocablo ascii es un acrónimo de American Standard Code for Information Inter-
change. Es un estándar que asigna un valor numérico a cada carácter, con lo que se
pueden representar los documentos llamados de Texto Plano, es decir, los que son
directamente legibles por seres humanos.
Bases de Datos
La asignación de valores numéricos a caracteres viene dada por la famosa tabla
de códigos ascii, que es la más extendida, aunque existen otras. Se caracteriza por
utilizar 1 byte para la representación de cada carácter. Con x bits se puedengenerar
2 combinacionesdistintas de caracteres, ycomo 1byte =
8 bits, existen 28=
256
caracteres en la tabla de códigos ascii, numerados del 0 al 255.
<> Actividad 1.22 Conéctate
a Internet,y buscauna tablade códigos
ascii de8
bits. Observa las siguientes características:
- Los 32 primeros caracteres, sellaman caracteres no imprimibles y se utilizaban
tradicionalmente para el control de transmisiones.
ILa distancia entre mayúsculas y minúsculas es exactamente 32 caracteres.
n Hay caracteres queson numéricos, y cuyo valor ascii es elresultado de sumarle
48. Por ejemplo, 6+48=54. 54 es el código ascii del carácter 6.
Algunos alfabetos, como el katakana japonés utilizan más de 256 caracteres. En
estos casos,se requierenlas tablas de caracteres unicode, quereservan dosbytes para
cada carácter.
o Actividad 1.32 Conéctate
a http://mm.unicode.org/charts/ y descárgate
las tablasde códigosLatin (alfabeto latino) y K
atakana (alfabeto japonés).Observa
las siguientes curiosidades:
n La tabla de códigos Latin ,es exactamente idéntica a la tabla de códigos ascii
de 8 bits, solo que los bits del primer byte unicode, están todos a 0.
ILa tablas de códigos Latin y Katakana tienen múltiples extensiones, como
Katakana Phonetic Extensions o Latin Extended Additional.
Los cheros de texto, aunque no necesitan un formato para. ser interpretado,
suelen tener extensiones para conocer qué tipo de texto se halla dentro del chero,
por ejemplo:
- Ficheros de conguración: Son cheros cuyo contenido es texto sobre con-
guraciones del sistema operativo o de alguna aplicación. Estos pueden tener
extensión .ini, .inf ,.conf
Capítulo 1. Los sistemas de almacenamiento de la información
IFicheros de código fuente: Su contenido es texto con programas informáticos.
Ejemplos: sql, .c, .java
n Ficherosde páginas
web: Laspáginas webs
son cherosde textocon hipertexto
que interpreta el navegador. html, php, .css, .xml
n Formatos enriquecidos: Son textos que contienen códigos de control para ofre-
cer una visión del texto más elegante: .rtf, .ps ,.tex
¿Sabías que .. . 7
XML es unlenguaje estándar
para elintercambio de
datos entre aplicaciones informáticas. Se están desarrollando actualmente las
llamadas basesde datos nativas XML. cuyo foco principal es el aI1nacenamien-
to de documentos de texto con código en XML. y no las relaciones entre la
información, como sucede conlas basesde datos relacionales quese estudianen
el presentelibro. Por ejemplo, DB2 incorpora dentro de sumotor una nueva ca-
racterística que potencia el XML: XQuery, esto es,un lenguaje innovador para
hacer consultas directamente sobre documentos XML guardados directamente
en la base de datos.
1.1.3. Ficheros binarios
Los cheros binarios son todos los que no son de texto, y requieren un formato
para ser interpretado. A continuación se muestran algunos tipos de formatos de
cheros binarios:
IDe imagen: jpg, gif, .tiff, .bmp, .wmf, .png, .pcx; entre muchos otros
n De vídeo: .mpg, .mov, .avi, .qt
IComprimidos o empaquetados: .zip. .Z, .gz, tar, .lhz
IEjecutables o compilados: exe. .com, .cgi, .0, .a
IProcesadores de textos: .doc, .odt
lEl hipertexto es unaforma de escritura no secuencial, conbifurcaciones, quepermite que el
lector elija qué secuencia seguir y
que es presentado en una pantalla interactiva para facilitar la
navegación.
Bases de Datos
Generalmente los cheros que componen una base de datos son de tipo binario,
puesto que la información que hay almacenada en ellos debe tener una estructura
lógica y organizada para que lasaplicaciones puedan acceder aella de manera univer-
sal, estoes, siguiendoun estándar. Esta estructura. lógica y organizada, generalmente
es muy difícil de expresar mediante cheros de texto, por tanto, la información de
una base de datos se sueleguardar en uno o varios cheros:
u El software de gestión de base dedatos Oracle guarda la información en múlti-
ples tipos de cheros, llamados datales, temples, logles, etc.
IUn tipo de tablas del gestor liI;vSQL guarda su información en 3 cheros de
datos binarios, con extensión frm, myd y myi.
n Access guarda toda la información de una base de datos con extensión mdb.
<> Actividad 1.4: La siguiente imagen
es una
captura de
una carpeta
en elsistema
operativo Windows 7. Indica qué tipo de chero es cadauno de ellos y qué contiene.
HcmL-re Fecha de nmzhwïcecicn Tnpc Tamahc
u112i
l
E Battlestar Galactica
-lxLavi Úí 3-322v]? "LJ Íhp de ¿dee 6&#39;
-4
11
a
Í
u
r
J
"n
1
.
o
_.
__
(omojnstalantxt
i- DSCN0776JPG
5&#39; eclipseexe
l 1
v. q
.
t n1
a
¡If L
__
eclipseini
c:
t.
a
V
IJ -
.-- img_xp_sp3.iso
_
lícencia_windows.bct
,4
(¡r
Capítulo 1. Los sistemas de almacenamiento de la información
de forma ordenada y coherente (sincontradicciones). Cadauna de estas tablases
una estructura que se parece a las hojas de cálculo, pues está dispuesta mediante
las y columnas. De este modo, cada la almacena un registro con tantos campos
como columnas tenga la tabla. Por ejemplo, sepodría tener una tabla de Empleados,
donde cada la o registro es un empleado de la empresa y cada columna o campo
representa un trozo discreto de información sobre cada empleado, por ejemplo el
nombre o el número de teléfono.
jímpliidïvï - - Y
CodngoEmple v Nombre v Apellidol v Apellndoz v Extension v Email v codugoo :
1 Marcos
Magaña Perez
3897 marcos@jardnneria.es
TAL-ES
4
2
Ruben López Martinez 2899
rlopez@jardmeria.es TAL-ES
3
Alberto Soria Carrasco 2837 asoria@}ardineria.es TAL-ES _
4
Maria Solís Jerez 2847 msolis@jardineria.es TAL-ES E
5 Felipe Rosas Marquez 2844 frosas@jardineria.es TAL-ES
l
6 JuanCarlos 0m: Serrano 2845 cortiz@jardnnerua.es TAL-ES l
7
Carlos Soria Jimenez 2444
csorxa@jardmeria.es MAD-ES
x
8 Mariano López Murcia 2442 mlopezcenardmenaes rvlAD-ES
9 Lucio Campoamor Manín 2442 lcampoamorczïjardineriaes MAD-ES
10 Hilario Rodriguez Huertas 2444 hrodrlguez@jardineria.es MAD-ES
11 Emmanuel Magaña Perez 2518 manu@¡ardinena.es BCN-ES
12 José
Manuel Martinez De laOsa 2519
¡mmanéïhotmarles BCN-ES
13 David Dalma Aceituno 2519
dpalma@jard¡neria.es BCN-ES
14
Oscar Palma Aceituno 7519 opalma@jardineria.es BCN-ES
15 Francois Fugnon 9981
ffignonQgardeningxom PAR-FR
16
Lionel Narvaez 9982
lnarvaez@gardening.com PAR-FR
17 Laurent Serra 9982
lserra@gardening.com PAR-FR
18 Michael Bolton 7454 mboltoncaïgardeningmom SFC-USA
___ ___19 W_a|_ïe_r_ Santuag
Sanchez Lopez 7454 wssanchez@gardenlng.com SFC-USA
v
Registro:
H 4
46231 P N P -Buscar 4 m
l I
Figura 1.1: Ejemplo de tabla en Microsoft Access.
1.2.1. Conceptos
Uno de los grandesproblemas al que seenfrentan los informáticos cuando comien-
zan su aprendizaje, es el gran número de términos desconocidos que debe asimilar,
incluyendo el enorme número de sinónimos y siglas que se utilizan para nombrar la
misma cosa. Tratando, a modo de resumen, de aclarar algunos de lo componentes
que sepueden encontrar en una base dedatos, y que severán en próximos capítulos,
se denen los siguientes conceptos:
Dato: El dato es un trozo de información concreta sobre algún concepto o suceso.
Por ejemplo, 1996 esun número que representa un año de nacimiento de una
persona. Los datos se caracterizan por pertenecer a un tipo.
Tipo de Dato: El tipo de dato indica la naturaleza del campo. Así, se puede te-
ner datos numéricos, que son aquellos con los que se pueden realizar cálculos
aritméticos (sumas,restas, multiplicaciones.
. .) y los datos alfanuméricos,
que
7
Bases de Datos
son losque contienen caracteres alfabéticos y dígitos numéricos. Estos datos al-
fanuméricos y
numéricos se puedencombinar para obtener tipos de datos más
elaborados. Por ejemplo, el tipo de dato Fecha contiene tres datos numéricos,
representando el día, el mes y el año de esafecha.
Campo: Un campo esun identicador para toda una familia de datos. Cada campo
pertenece a un tipo de datos. Por ejemplo, el campo F echaNacimiento repre-
senta las fechas denacimiento de las personasque hay en la tabla. Este campo
pertenece al tipo de dato Fecha. Al campo también se le llama columna.
Registro: Es una recolección de datos referentes a un mismo concepto o suceso.
Por ejemplo, los datos de una persona pueden ser su NIF, año de nacimiento,
su nombre, su dirección, etc. A los registros también se les llama tuplas o las.
Campo Clave: Es un campo especial que identica de forma única a cada registro.
Así, el NIF es único para cada persona, por tanto es campo clave. Hay varios
tipos de campos clave como se explicará en la. sección 2.6.2.
Tabla: Es un conjunto de registros bajo un mismo nombre que representa el con-
junto de todos ellos. Por ejemplo, todos los clientes de una base de datos se
almacenan en una tabla cuyo nombre es Clientes.
Consulta: Es una instrucción para hacer peticiones a una base de datos. Puede ser
una búsqueda simple de un registro especico o una solicitud para seleccionar
todos los registros que satisfagan un conjunto de criterios. Aunque en cas-
tellano, consulta tiene un signicado de extracción de información, en inglés
query, una consulta es una petición, por tanto, además de las consultas de
búsqueda de información, que devuelven los campos y registros solicitados,
hay consultas(peticiones) deeliminación o inserción deregistros, deactuali-
zación de registros, cuya ejecución altera los valores de los mismos.
Índice: Es una estructura
que almacena
los campos
clave de
una tabla,orga-
nizándolos para hacer más fácil encontrar y ordenar los registros de esatabla.
El índice tiene un funcionamiento similar al índice de un libro, guardando pa-
rejas de elementos: el elemento que se deseaindexar y su posición en la base
de datos. Para buscar un elemento que esté indexado, solo hay que buscar en
el índice de dicho elemento para, una vez encontrado, devolver el registro que
se encuentre en la posición marcada por el índice.
Vista: Es una transformación que se hace a una o más tablas para obtener una
nueva tabla. Esta nueva tabla es una tabla virtual, es decir, no está almacenada
en los dispositivos de almacenamiento del ordenador, aunque sí se almacena
su denición.
Capítulo 1.
Los sistemas de almacenamiento de la información
Informe: Es un listado ordenado de los campos y registros seleccionados en un
formato fácil de leer. Generalmente se usan como peticiones expresas de un
tipo de información por parte de un usuario. Por ejemplo, un informe de las
facturas impagadas del mes de enero ordenado por nombre de cliente.
Guiones: o scripts. Son un conjunto de instrucciones, que ejecutadas de forma
ordenada, realizan operaciones avanzadas de mantenimiento de los datos al-
macenados en la base de datos.
Procedimientos: Son un tipo especial de script que está almacenado en la base
de datos y que forma parte de su esquema.
1.2.2. Estructura de una base de datos
Una base de datos almacena los datos a través de un esquema. El esquema
es la denición de la estructura donde se almacenan los datos, contiene todo lo
necesario para organizar la información mediante tablas, registros (las) y campos
(columnas). Tambiéncontiene otrosobjetos necesarios
para el tratamiento de los
datos (procedimientos, vistas, índices, etc.) y que se estudiarán en este libro. Al
esquema también se le suele llamar metainformación, es decir, información sobre la
información o metadatos.
mysq1> select table_schema, tab1e_name, tab1e_rows
-> from information_schema.tables
-> where tab1e_schema=jardineria;
+ ------------ --+ -------------- --+ ---------- --+
I tab1e_schema I tab1e_name I tab1e_rows
jardineria Clientes
jardineria Deta11ePedidos
jardineria Empleados
jardineria GamasProductos
jardineria Oficinas
jardineria Pagos
jardineria Pedidos
jardineria Productos
9 rows in set (0,01 sec)
Figura 1.2: Consulta de un esquema de una base de datos en MySQL.
Los gestores de bases de datos modernos Oracle, MySQL y DB2, entre otros,
almacenan el esquema de la base de datos en tablas, de tal manera que el propio
9
Bases de Datos
esquema de la base de datos se puede tratar como si fueran datos comunes de le.
base de datos. Véase gura 1.2.
1.2.3. Usos de las bases de datos
Las bases de datos son ubícuas, están en Cualquier tipo de sistema informático.
a continuación se exponen solo algunos ejemplos de sus usosmás frecuentes:
IBases de datos Administrativas: Cualquier empresa necesita registrar y rela-
cionar sus clientes, pedidos, facturas, productos, etc.
IBases de datos Contables: También es necesariogestionar los pagos, balances
de pérdidas y ganancias, patrimonio, declaraciones de hacienda. . .
IBases de datos para motores de búsquedas: Por ejemplo Google o Altavista.
tienen una base deda.tos gigantescadonde almacenan información sobre todos
los documentos de Internet. Posteriormente millones de usuarios buscan en la
base de datos de estos motores.
- Cientícas: Recolección de datos climáticos y medioambientales, químicos.
genómicos, geológicos.. .
IConguraciones: Almacenan datos de conguración de un sistema informático.
como por ejemplo, el registro de windows.
n Bibliotecas: Almacenan información bibliográca, por ejemplo, la famosa tien-
da virtual amazon o la. biblioteca de un instituto.
ICensos: Guardan información demográca de pueblos, ciudades y
paises.
IVirus: Los antivirus guardan información sobre todos los potenciales software
maliciosos.
IOtros muchos usos: Militares, videojuegos, deportes, etc.
¿Sabías que . . . 7
La &#39;WDCC (World
Data ClimateCenter), centro
mun-
dial para datos del clima, es la base de datos más grande del mundo. Almacena
alrededor de 6 petabytes de información, esto es 6144 Terabytes de informa-
ción sobre clima, predicciones y simulaciones. La base de datos de Google
está situada como la 4a más grande del mundo (Abril-QOIO).
10
Capitulo 1.
Los sistemas de almacenamiento de la información
<> Actividad 1.5: Buscaen Internet
las 10bases de
datos más
grandes del
mundo.
Anota su nombre y su tamaño, y, en una hoja de cálculo, genera un gráco que
muestre la comparativa del tamaño de estas basesde datos.
El consejo del buen administrador. . .
Siempre hay que hacer copias de seguridad regularmente y
a ser posible, de
varios tipos. Cuando una base de datos tiene un tamaño brutalmente grande
como las del WDCC
o Google, hacer copias de seguridad se convierte en al-
go prácticamente imposible, puesto que se tardarian semanas en realizarlas,
y, además, es complicado encontrar dispositivos capaces de almacenar estas
copias, por lo que en lugar de hacer copias de seguridad, se recurre a sistemas
tolerantes a fallos, que logran que la probabilidad de perder un solo dato, sea
prácticamente nula.
1.2.4. Evolución y
tipos de base de datos
La clasicación de lasbases dedatos en tipos, está.ligada a su evolución histórica.
Según ha ido avanzando la tecnología, las basesde datos han mejorado cambiando
la forma de representar y extraer la información.
De esta manera, se presenta la evolución sufrida por las bases dedatos desde las
épocas prehistóricas de la informática hasta la actualidad:
En la década de 1950 se inventan las cintas magnéticas, que solo podían ser
leídas de forma secuencial y ordenadamente. Estas cintas, almacenaban cheros con
registros que se procesabansecuencialmente junto con cheros de movimientos para
generar nuevos
cheros actualizados. Estos sistemasse conocencomo aplicaciones
basadas en sistemas de cheros y constituyen la generación cero de las bases de
datos, pues ni siquiera entonces existía el concepto de basesde datos.
En la década de1960 segeneraliza el uso dediscos magnéticos,cuya característica
principal es que se podía acceder de forma directa a cualquier parte de los cheros,
sin tener que acceder a todos los datos anteriores. Con esta tecnología aparecen las
bases dedatos jerárquicas y en red, queaprovechan la capacidad de acceso directo a
la información de los discos magnéticos para estructurar la información en forma de
11
Bases de Datos
listas enlazadas y árboles de información. La losofía de las bases dedatos en red es
que un concepto principal o padre puede tener numerosas relaciones con conceptos
secundarios o hijos. Las bases dedatos jerárquicas, evolucionan para admitir varios
padres para un concepto hijo.
¿Sabías que . . . 7
En octubre de1969 se
concibe elprimer modelode
base dedatos en red. conocido como CODASYL (Conference on Data Systems
Language), que posteriormente IBM rena. y mejora mediante el modelo IMS
(Information Management System) para el programa Apollo de la NASA.
Edgar Frank Codd, cientíco informático inglés de IBM, publica en 1970 en un
artículo Un modelo relacional de datos para grandes bancos de datos compartidos
(A Relational Model ofData forLarge Shared
Data Banks), donde denió el modelo
relacional, basado en la lógica de predicados y la teoría de conjuntos. Nacieron, de
esta forma, las basesde datos relacionales, o segunda generación de basesde datos.
Larry Ellison, fundador de Oracle. se inspiró en este artículo para desarrollar el
famoso motor de basede datos, que comenzócomo un proyecto para la CIA (Central
Intelligence Agency) americana. La potente base matemática de este modelo, es el
gran secreto de su éxito. Hoy en día, el modelo relacional de Codd, pese a tener
muchas alternativas, sigue siendo el más utilizado a todos los niveles.
¿Sabías que . . . 7
Las leyes de
Codd son
un conjuntode 13reglas (de
la
regla O
a la regla 12) cuya nalidad es establecer las características que debe
tener una base de datos relacional. Actualmente. todos los gestores de bases
de datos implementan estas reglas. Puedes buscar en Internet estas reglas y
leerlas con detenimiento.
<>
Actividad 1.6: Busca en Internetla biografíade lossiguientes personajes,
y
comenta su principal contribución a la evolución de las basesde datos:
J Edgar Frank Codd J Bill Gates
J Larry Ellison J Michael Monty Widenius
J Roger Kent Summit
12
Capítulo 1. Los sistemas de almacenamiento de la información
En la década de 1980 IBM lanza su motor de bases de datos DB2, para la pla-
taforma MVS. Unos añosdespués, IBMcrea elSQL (Structured Query Language),
un potente lenguage de consultas para manipular información de bases de datos
relacionales.
A medidados de 1990, IBM lanza una versión de DB2 que escapaz de dividir una
base dedatos enorme en varios servidores comunicadospor líneas de gran velocidad,
creándose deeste modo las basesde datos paralelas. A
esta versión se le llamó DB2
Parallel Edition, que ahora, ha evolucionado hasta el DBZ Data Partition Feature,
único SGBD de este tipo en sistemas distribuidos.
A nales de 1990 IBM y Oracle incorporan a sus bases dedatos la capacidad de
manipular objetos, creando así, las basesde datos orientadas a objetos. Estas bases
de datos orientadas a objetos se basan en la existencia de objetos persistentes que
se almacenan para su procesamiento mediante programas orientados a objetos. En
lugar de la losofía de almacenar relaciones y tablas, se almacenan colecciones de
objetos que, además de información, tienen comportamientos (instrucciones sobre
cómo procesar los datos).
La aparición de Internet y el comienzo de la era de la información, crean nuevos
requirimientos para bases dedatos. La cantidad de información comienza a creceren
proporciones desconocidashasta el momento. De esta forma, se creanlas basesde da-
tos distribuidas, que consistenen multiplicar el número de ordenadoresque controlan
una basede datos (llamados nodos), intercambiándose información y actualizaciones
a través de la red. Este increible aumento de datos a almacenar, organizados muchas
veces en datos estadísticos recopilados con el trascurso de los años, hizo necesaria
la aparición de un software llamado Software de ayuda a la decisión. Este software
avanzado trata de dar respuestas concretasexaminando múltiples datos estadísticos
que se han recopilado a lo largo del tiempo en bases dedatos multidimensionales,
formando lo que se denominan cubos de información.
Ventas del 2do 172010
España, Huelva
Jamón de Bellota Q4
empo
¡z/broducto
Provincia &#39;
Figura 1.3: Ejemplo de cubo en una base de datos multidimensional.
13
Bases de Datos
También, a lo largo de la corta historia de la informática, han surgido otros tipos
de basesde datos que se enumeran a continuación:
- Bases de datos espaciales o geográcas: Son bases de datos que almacenan
mapas v
símbolos que representan supercies geográcas. Google Earth es
u
una aplicación que lanza consultas a bases dedatos de este tipo.
n Bases de datos documentales: Permiten la indexación de texto para poder
realizar búsquedas complejas en textos de gran longitud.
IBases de datos deductivas: Es un sistema de bases de datos que almacena
hechos y que permite, a través de procedimientos de inferencia, extraer nuevos
hechos. Sebasan en la lógica, por ello también se suelen llamar bases dedatos
lógicas.
Base de datos Datos almacenados
Sistemas de cheros Datos en cheros
Jerárquicas Estructuras de datos (listas y árboles) varios cheros
En red Estructuras de datos (árbolesy grafos)
Relacionales Teoría de conjuntos y relaciones
Orientadas a objetos Objetos complejos con comportamiento
Geográcas Puntos, Líneas y Polígonos una o varias BBDD
Deductivas Hechos y Reglas
Documentales Documentos
Distribuidas Múltiples varias BBDD en
Multidimensionales Cubos varios ordenadores
Cuadro 1.1: Resumen de los tipos de basesde datos.
1.3. Los Sistemas Gestores de Base de Datos
1.3.1. Concepto de Sistema Gestor de Base de Datos
Se dene un Sistema Gestor de Base de Datos, en adelante SGBD, como el
conjunto de herramientas que facilitan la. consulta, uso y actualización de una base
de datos. Un ejemplo de software Gestor de Base de Datos es Oracle 11g, que
incorpora un conjunto de herramientas software que son capaces deestructurar en
múltiples discos duros los cheros de una base de datos, permitiendo el acceso asus
datos tanto a partir de herramientas grácas como a partir de potentes lenguajes de
programación (PL-SQL, php, c++. . .).
14
Capítulo 1.
Los sistemas de almacenamiento de 1a información
1.3.2. Funciones de un SGBD
Los SGBD del mercado cumplen con casi todas funciones que a continuación se
enumeran:
1. Permiten a los usuarios almacenar datos, acceder a ellos y actualizarlos de
forma sencilla y con un gran rendimiento, ocultando la complejidad y las ca-
racterísticas físicas de los dispositivos de almacenamiento.
2. Garantizan la integridad de los datos, respetando las reglas y restricciones que
dicte el programador de la base de datos. Es decir, no permiten operaciones
que dejen cierto conjunto de datos incompletos o incorrectos.
3. Integran, junto con el sistema operativo, un sistema deseguridad quegarantiza
el acceso a la información exclusivamente a aquellos usuarios que dispongan
de autorización.
4. Proporcionan un diccionario de metadatos, que contiene el esquemade la base
de datos, es decir, cómo están estructurados los datos en tablas, registros y
campos, las relaciones entre los datos, usuarios, permisos, etc. Este diccionario
de datos debe ser también accesible de la misma forma sencilla que es posible
acceder al resto de datos.
5. Permiten el uso de transacciones, garantizan que todas las operaciones de la
transacción serealicen correctamente, y en caso dealguna incidencia, deshacen
los cambios sin ningún tipo de complicación adicional.
6. Ofrecen, mediante completas herramientas, estadísticas sobre eluso del gestor,
registrando operaciones efectuadas, consultas solicitas, operaciones fallidas y
cualquier tipo de incidencia. Es posible de este modo, monitorizar el uso de la
base de datos, y permiten analizar hipotéticos malfuncionamientos.
7. Permiten la concurrencia, es decir, varios usuarios trabajando sobre un mismo
conjunto de datos. Además, proporcionan mecanismos que permiten arbitrar
operaciones conflictivas en el acceso omodicación de un dato al mismo tiempo
por parte de varios usuarios.
8. Independizan los datos de la aplicación o usuario que esté utilizándolos, ha-
ciendo más fácil su migración a otras plataformas.
9. Ofrecen conectividad con el exterior. De esta manera, se puede replicar y
distribuir bases de datos. Además, todos los SGBD incorporan herramientas
15
Bases de Datos
estándar de
conectividad. Elprotocolo ODBC4está muyextendido como
forma
de comunicación entre bases de datos y aplicaciones externas.
10. Incorporan herramientas para la salvaguarda y restauración de la información
en caso de desastre. Algunos gestores, tienen sosticados mecanismos para
poder establecer el estado de una base dedatos en cualquier punto anterior en
el tiempo. Además, deben ofrecer sencillas herramientas para la importación
y exporta.ción automática de la información.
<> Actividad 1.72 Busca
en Internetlas leyes
de Coddpara elfuncionamiento de
sistemas gestores de bases de datos relaciones y establece una relación entre cada
una de las leyes de Codd y las funciones que proporcionan los SGBD actuales.
1.3.3. El lenguaje SQL
La principal herramienta de un gestor de base de datos es la interfaz de progra-
mación con el usuario. Este interfaz consiste en un lenguaje muy sencillo mediante
el cuál el usuario realiza preguntas al servidor, contestando este a las demandas del
usuario. Este lenguaje comúnmente se denomina SQL, Structured Query Language,
está estandarizado
por la 1805, esdecir, todaslas bases
de datosque soportenSQL
deben tener la misma sintaxis a la hora de aplicar el lenguaje. Se divide en 4 su-
blenguajes, el total de todos ellos permite al SGBD cumplir con las funcionalidades
requeridas por CODD:
- Lenguaje DML: o lenguaje demanipulación dedatos (Data Manipulation
Language). Estelenguaje permitecon 4sentencias sencillas
seleccionar deter-
minados datos (SELECT), insertar datos (INSERT), modicarlos (UPDATE)
o inclusoborrarlos (DELETE). En capítulosposteriores se
desarrollará lasin-
taxis de cada una de estas sentencias.
ILenguaje DDL: o lenguaje de denición de datos (Data Denition Langua-
ge). Estelenguaje permitecrear todala estructurade unabase de
datos (desde
tablas hasta usuarios). Sus cláusulas son del tipo DROP (Eliminar objetos) y
CREATE (Crear objetos). En capítulos posteriores
se detallarála sintaxis de
cada una de estas sentencias.
ODBC signica Open DatabaseConnectivity, y es unestándar deacceso a
datos desarrollado
por Microsoft
5180 esel acrónimode International Organization for Standardarization
16
Capítulo 1. Los sistemas de almacenamiento de la información
- Lenguaje DCL: o lenguaje decontrol de datos (Data Control Language).
Incluye comandos (GRANT y REVOKE) que permiten al administrador ges-
tionar el acceso a los datos contenidos en la base de datos.
- Lenguaje TCL: o lenguaje de control de transacciones. El propósito de este
lengua.je es
permitir ejecutar varios comandosde forma simultánea como si fue-
ra un comando atómico o indivisible. Si esposible ejecutar todos los comandos,
se aplica la transacción (COMMIT), y si, en algún paso de la ejecución, sucede
algo inesperado,
se pueden
deshacer todos
los pasosdados (ROLLBACK).
<> Actividad 1.82 Buscaen laWikipedia eltérmino SQLe indicalas revisiones
que ha sufrido el lenguaje a lo largo del tiempo. A continuación, busca el signicado
del término SQL Injection e indica por qué un administrador debe protegersefrente
a él.
1.3.4. Tipos de SGBD
Se puedenclasicar los SGBD de muchas formas, por ejemplo, según lasbases de
datos que gestionan, clasicando los SGBD según traten bases dedatos relacionales,
bases dedatos orientadas a objetos, etc. Puesto que en la actualidad, la mayoría de
los SGBD integran múltiples losóas y tipos de funcionamiento, en este libro se
clasican los de gestoresde basesde datos según sucapacidad y potencia del propio
gestor:
Los Gestores de Bases de Datos omáticas son aquellos que manipulan
bases dedatos pequeñas (omáticas) orientadas a almacenar datos domésticos o de
pequeñas empresas.Incluso estos gestores permiten construir pequeñas aplicaciones
para ayudar a un usuario inexperto a manipular los datos de una base de datos de
forma sencilla e intuitiva. Un ejemplo de un SGBD omático es Microsoft Access,
que poseetanto una interfaz de usuario muy sencilla como un potente lenguaje de
programación (VBA=VisualBasic forAplications) paraofrecer ausuarios avanzados
otras posibilidades de gestión mucho más especícas.
Los Gestores de bases de datos Corporativas son aquellas que tienen la
capacidad de gestionar bases de datos enormes, de grandes o medianas empresas
con una carga de datos y transacciones que requieren un servidor de grandes di-
mensiones (generalmente un Servidor Unix, o un Windows 2OOX Servercon altas
prestaciones). Estos gestores soncapaces demanipular grandes cantidades de datos
17
Bases de Datos
de formamuy rápiday eciente para poderresolver lademanda de
muchos (cientos)
de usuarios. Un ejemplo típico de servidor de base dedatos Corporativas es el antes
comentado Oracle, actualmente, junto con DB2, el servidor de base de datos más
potente del mercado (tambiénel más caro). Precisamente,ese costetan alto es el
que ha desencadenado quese haya recurrido a una solución intermedia entre gesto-
res de base dedatos omáticas y corporativas. Entre estas soluciones intermedias se
encuentra MySQL, un gestor de base de datos que, además de ser gratuito y senci-
llo, es capaz de manipular gran cantidad de datos cumpliendo prácticamente todos
los estándares de la arquitectura ANSI SPARC. Aunque implementa SQL, no tiene
un lenguaje de programaciónpropio como SQL Server u Oracle (aunque estáen
desarrollo), pero a cambio se integra fácilmente en las típicas soluciones XAMPP,
que son paquetes que incluyen, además de MySQL, una versión del servidor Web
Apache yvarios lenguajes
de script (php, perl. ..) que dotana MySQL de potentes
herramientas para acceso y publicación de los datos.
Contabilidad Administración
Usuario 1
Figura 1.4: Esquema típico de organización de un SGBD corporativo.
18
Capítulo 1. Los sistemas de almacenamiento de 1ainformación
1.4.
Prácticas Resueltas
Práctica 1.1: Introducción a Microsoft Access.
En esta práctica, se aprenderá a manipular de forma básica el gestor de basesde da-
tos Access
de Microsoft.Abre la base de
datos Neptunoaccdb que puedes
descargar
de www.garcetaes, y realiza las siguientes acciones. Será necesariomodicar algún
objeto de la basede datos, por tanto guarda una copia con el nombre practicalaccdb
7
y conserva laoriginal para repetir 1apráctica cuantasveces desees.
f í I
J&#39;/_
Organizar
v
Nueva carpen
lEscritorio «i: rw- Fama es núüiue. Tip:
,4 Sitios
recientes
¡a Neptuncuccdb " Z LC .5" Hicrcscft ¿Fi-ze
..
E] Vehiculosaccdb 3 I JLC . ":r;;:v:
d, Biblioteeas _
1 Documentos s_
h
Imagenes
¡v Musica
«A! _
¡Administrar B deos
n; Grupoen el
hogar
1&#39;- Equipc - 4
Hombre de
archivo: Neptuncmccdb
v
i Microsoft Office
Access (mccd
v]
rm
_
Herramientas
v ICancelar |
Abre Microsoft Access y
pulsa el botón de Office. Selecciona la opción abrir, y
en el cuadro de diálogo, busca
la base de datos neptuno.
1. ¿Qué tipo de información almacena la base de datos?
Neptuno es una basede datosque incorporanlas versiones
antiguas deMicrosoft Access
(hasta
Access 2003)
7accdb es la extensión de las bases de datos de Access 2007
19
Bases de Datos
Observando las tablas de la base de datos Neptuno, se puede ver que hay tablas de Clientes, Emplea-
dos, Pedidos, Productos, Proveedores, etc. Al abrir las tablas haciendo doble clic sobre ellas, se muestra la
infonnación que contiene, por ejemplo, la tabla de productos almacena información sobre alimentación y de-
rivados, por tanto, Neptuno es el sistema de información de una empresa que importa y eazportacomestibles
especialesde todo el mundo.
2.
¿Qué objetostiene la basede datos?
ÏrSBíaTM---wl < Id.d Todos
los
ObJQÍOS
deAccess
Dplazarse
l lacategoría 13m -
6
De leyar C°""&#39;*
s formularios
Iipode
objeto . m;
Catalogo
i
Si
Personalizado e
7)
K
((
(4
Iablas
yvistas
relacionadas
Fecha
de
¡reacion Etiquetas
decliente
fecha
de
modicacion nm".
Desplegando la lista del pa-
nel lateral izquierdo de Ac-
cess, se puede obtener un
listado
detodos
losobjetos 5°""
de la base de datos clasi- E°""&#39;-"¡°5
cados por tipos, es decir, Worms
tablas, consultas, formula- Eaginas
rios, informes, etc. Macro;
Módulos
Todos
los
objetos
de
Access
Filtrar
por
grupo Lista
alfabética
deproductos
¿EE
Twin Productos
por
categoría
Resumen
de
ventas
por
año
Resumen
de
ventas
por
trimestre
Subintorme
Catalogo
Subiriíorme
ventas
por
año
440040
Subiriionrie
ventas
por
categoria
4
4 TOÍMQS
d!VGHÍIS
D0!
Cllidld
o ventas
de
empleado
por
país
ventas
por
año
3. Explora todos los objetos de la base de datos, poniendoespecialénfasisen el
diseñode cada objeto, esdecir, en la forma en la que estánconstruidos.
Todos
los
obietos
de
Access <
r j pjd
- --r-- --- -- r >EtE|l¿:
e e c:
Consultas
Consuita
de
pedidos J pu,
A
Para explorar el conte-
nido de un objeto, bas-
ta con hacer un do-
ble clic con el botón
izquierdo del ratón y
examinar el panel fron-
tal. Para ver el diseño
se pulsa con el botón
derecho del ratón y
se selecciona la opción
Diseño. Por ejemplo,
la consulta Subtotales
por pedido consiste en
un listado de los pedi-
dos con su coste total.
Detalle
de
pedidos
con
descuento 7&#39;°P&#39;°°"°
iÏ
Precioumdad
L_
Facturas
Filtro
íacturas
Lista
ambetica
de
producto:
Lista
de
productos
actual
Los
die:
productos
mas
caros
C-mpo:
iapeaiao Subtotal:
SumaICMonedaIMetE
Tabla:
¿Detalles
de
pedidos
Productos
por
categoria l Total:
ihqrupnr
por Expresion
Orden:
Productos
sobre
elprecio
medio Mostrar: T}
Pedidos
trimestrales
Resumen
d!
VEMM
D0!
IÑO cmem:
i
Resumen
de
ventas
por
trimestre
E Zoom
Subtotalesporpedido &#39;
&#39;
y. " l
ÍSTototaI:
scanamdonedaweooLx-udadlcmhda
Totales
de
ventas
por
cantidad
r mnuwvloo
léiliíéi
Capítulo 1. Los sistemas de almacenamiento de Ia información
4. Añade
el campo Destinatario
a la consulta Subtotales por
pedido.
Entra en modo diseño y pulsando con el botón derecho en el panel superior, selecciona la opción Mostrar
Tabla. Después,
añade la tabla pedido. Verás cómo aparecen las dos tablas relacionadas, en una, los campos
genéricos del pedido (FechaPedido,FechaEntrega,etc.) y en la otra, el detalle
de cada uno de los pedidos.
A continuación, arrastra el campoDestinatario
de la tabla Pedido al panel inferior (en la tercera columna).
Deïaïle:
de[ELÏIZJC
a ïeaidr:
FecnaEntiega
FechaEnvio
FoimaEnvío
¡-
Cnigo
1 :
Destinatario
-
DirecdonDe
stin
riunannminn
&#39;
i Ianeaiao
9
ldPiodueto
PreeioUnidId
Cantidad
Descuento
Subtotal.
SumnCMonednIPvecioUmdad]cnntidldlu-[Descueiito]i100r100)
Destinatario i;
Pedidos
¡impresion Agiupnr
por
3.
5. Añade el
campo Email
a la
tabla Clientes,
es un campo de tipo
Texto y de
longitud 75. Examina las distintas propiedades
del campo y consulta la
ayuda de
Accessen
cada uno de ellos pulsando la tecla F1.
Entra en modo diseño y aparecerá la lista de campos
de la tabla.
Añade una nueva la y completa el nombre
de campo, el tipo y la descripción. A continuación, rellena las
propiedades del campo.
Puedes, por ejemplo,
poner una regla
de validación para quelos emails tengan el formato nombre@dominio, esdecir, que tengan
una @ en el terio del email. Para poner la regla
de validación, pon Como *@* en el campo Regla
de
validación
Nombre
de!
campo Tipo
de datos Descripción
i Idcliente Texto Código
únicobasado
enel nombre
delcliente.
Nombrecompañía Texto
Nombrecontacto Texto
Cargocoritacio Texto
Dirección Texto Ca|le
oapartado
de correos.
Ciudad Texto
Región Texto Estado
oprovincia.
códPostal Texto
País Texto
Telefono Texto incluye
código
de país
o
de área.
Fax Texto Incluye
codigo
de país
o
de área.
Email Texto Nuevo
Campo
añadido
Propiedaues
delcampo
General
aúsqueu
Tamaño
del
campo 75
Formato
Mascara
deentrada
Título
Bases de Datos
6. Examina las relacionesde las tablas que contienela.basede datos Neptuno.
&#39;.,¿¿u¿-¡¿
(¿te
12.1»;
re:;1c.=:¿_1¡¡¿ ¡l ÏW-Vï
nIaProuucto Í WIWGO uldPeaido " ¿Mm
rlombrePvodu
l l ÏÚPWÜ-W ¡atinente N°mh"c°"p&#39;ñ¡&#39;
ldProveedor P&#39;&#39;°U"&#39;°3°
ldEmpIeIdo N°mb"c°m&#39;d°
ldcategovíu ("5" FechaPedndo C"°°(°""°
CanhdaaPovU °°"° FecmEntrega D_"""°"
Preuounuaao FecnaEnvío (Wa
UnndadesEnb
,_._¿_4__ FonnaEnvio Sa?"
unidadesEnPi
&#39; r _
&#39;
u Cargo °° al
d .
* &#39; Empleada Duhnltlno p
-
A ua _ .
p.
&#39;
o L DvremonDest
a Nombre CIudadDemn.
Ho»
aeDFODICUBUQS Cargo I
Tratamiento Rlolonmmn" J * &#39;
. Depenaenuas
del
Objlïí (ogpoggmpg; ldc°m9"&#39;¡¡""&#39;°5
Fechannrnlent- . ¡qompucomnñ
&#39;¡
53&#39;
5""J" Fecnacontratna
Pmoemrm" 1,¡¿¡¿,na
I
l &#39;l"rvr
:c."-- Dirección
v
4
Íz-ncehx
seamic;
Las relaciones dictan cómo se puede enlazar la información de diferentes tablas para obtener información
más elaborada. Para ver las relaciones de la base de datos, se pulsa en Herramientas de Bases de Datos
y a continuación en el botón Relaciones
7. Un formulariova siempreasociadoa las operaciones
quesehacenconuna tabla,
a las que comúnmentesellama mantenimiento de tabla,observael funcionamiento
del formulario Clientes
y comentaqué operaciones
sonestas.Realiza al menosuna
vez cada una de las operaciones
que permite el formulario.
Las 4 operaciones queforman el mantenimiento de una tabla son la insertión o alta, eliminación o baja,
modicación o actualización y búsqueda o consulta de un registro. Todas estas opemciones se pueden
realizar de forma muy sencilla y visual a través del formulario.
8. Inserta un nuevo cliente en la base de datos.
Y
lo.declientev Nombre
decompañia v Nombre
delcontact
-
Insertar un cliente es muy sencillo, WANDK Diewandemde
Kuh Rita
Muller
se puede hace-ra través del forfnularío VJÁRTH Wála Herkku Dnrkxo
KOSKIXBÍO
&#39;C[ien¿¿3
o abñendo [a tabla (jaen- WELLI Wellington
Importadora Paula
Parents
tes! y desplazarseal último mgistm_ WHKTC white
Cloverrvlarkets Karllablonsku
WRLMK wllman
Kala MaruKamunen
WOLZA wclska
Zaiazd Zbyszek
DIestrzenIev_
ILMSR La
Cantina
deSan
Roman Antonio
Lopez
b
Registro.
K 492
de
92D
o . Busur 1Lv
En una la vacía, se agregan los va-
lonescorrespondientes a cada campo.
9. Elimina el registrocorrespondiente
al cliente Rancho Grande. ¿Es posible?Si
no esposible.¿Quéhabría que hacerpara poder eliminarlo?
22
Capítulo 1. Los sistemas de almacenamiento de la información
Para eliminar el cliente, hay que buscar el cliente Rancho Grande . A continuación, se señala. la la
con el botón derecho del ratón y se escoge la opción Eliminar Registro. Access mostrará una advertencia
indicando que no es posible eliminar el registro puesto que hay pedidos de ese cliente. Para poder eliminar
denitivamente el cliente, habría que eliminar previamente todos sus datos asociados.
j Clientes -- Y
Nombre
decompañia v Nombre
delcontact- Cargo
delcontacto - e
¡ Jensen «re-IMM»
L Sergio
Gutiérrez Representante
deventas Av.da
Nummgism nGrocery Paula
wilson Representante
agente
ventas
2817i
¡"""" "WW i Maurizio
Moroni Asistente
deventas Strad.
CMI! Janete
Limeira Asistente
deagente
deventaAv.Cr:
5gp." Michael
Holz Gerente
deventas Greni
Ale¡andra
Camino Gerente
decontabilidad Gran"
Rancho
Gun
I l D
¿no
de
fila... i l
10. Modica el valor del campo Nombre de Contacto del registro correspondiente
al cliente Romero
y Tomillo.
A continuación, modica el campo Id. de Cliente
cambiándolo su valor a ROMMY. ¿Es posible modicar el Id. de Cliente? Si es
posible, ¿conservael cliente aún sus pedidos?
Pana modicar el cliente, se localiza su la y se sitúa el cursor del ratón en el campo que se desea
modicar. Después, cambiar el valor del campo. En este caso, es posible modicar ambos campos, el primero,
el Nombre de Contacto no tiene conicto alguno puesto que no está implicado en ninguna relación. Modicar
el campo Id. de Cliente podría suponer la.pérdida de pedidos si no se actualizara a su vez todos los pedidos
del cliente. Access efectúa esta modicación automáticamente al cambiar el identicador del cliente, por
tanto, no hay pérdida de pedidos.
3 [lie-ita - Y
ld.decliente Nombre
decompañia
- Nombre
delcontact- Cargo
delcontacto DirA
QUEEN Queen
Cozlnha Lúcia
Carvalho Asistente
demarketing Alameda
d(
QUlCK QUICK-Stop Horst
¡(loss Gerente
decontabilidad Taucnerstre
RANCH Rancho
grande Sergio
Gutierrez Representante
deventas Av.delLibe
RATTC Rartlesnake
Canyon
Grocery Paula
Wilson Representante
agente
ventas
2817
Miltor
REGGC Reggiani
Caseifici Maurizio
Moroni Asistente
deventas Strada
prev:
RICAR Ricardo
Adocicados Janete
Limeira Asistente
deagente
deventaAv,Copacai:
Richter
Supermarkt Michael
Holz Gerente
deventas Grenzacher
I t Romero
vtomillo Jose
Modificado Gerente
decontabilidad Gran
Vía,1
.__*-SANTG__ __janteourmet_,_.__.__-,
__._._
_.Jonas Beraulisen Drooietario Erlinzskaki&#39;
Registro:
I< 4 69de
92
D N i. eroyTomillo 1 . l D
11. Abre la tabla de proveedores
y consulta qué productos proveeel proveedor Leka
Trading
Primero, se localiza el proveedor en la tabla de Proveedores mediante el cuadro Buscar. A continuación,
se pulsa el icono + del campo Id de Proveedor para desplegarlas relaciones que tiene con Productos.
18AuxJOyEUX
ecclesiastiques Guylene
Nodier Gerente
devent
19NewEngland
Seafood
Cannery Robo
Merchant Agente
decuent
20Leka
Trading Chandra
Leka Propietario
ld.deproducto- Nombre
deproducto Categoria - Cantidad
porUnidav
Tallarines
deSingapur Granos/Cereales 32- 1kgpaq.
43Cafe
deMalasia Bebidas 16- latas500
g
44Azucar
negra
Malacca Condimentos 20
- bolsas
2kg
(Nuevo)
,_..__¡_,_ ,-.s.... ».___.__i- __.
egistro:
I< l de3 D
H 0 - LeknTnding4 l
23
Bases de Datos
12. Consulta la ayuda de Accessy comenta los diferentes tipos de datos que puede
almacenar un campo en Access (Texto, Memo, Numérico).
En Access existen 10 tipos de datos básicos:
Datos adjuntosComo fotos digitales. En cada registro es posible adjuntar varios archivos. Este tipo de
datos no estaba disponible en versiones anteriores de Access.
AutonumérícoNúmeros que se generan automáticamente para cada registro.
Moneda Valores monetarios.
Fecha/HoraFechas y
Horas
HípervínculoComo direcciones de páginas web.
MemoBloques de tezto largos y
tezto que emplean formato de texto. Una utilidad típica de un campo Memo
sería una descripción de producto detallada.
Objeto OLEObjetos OLE (objeto OLE: objeto que admite el protocolo OLE para la vinculación e in-
crustación de objetos. Un objeto OLE de un servidor OLE (por ejemplo, una imagen de Paint de
Windows o una hoja de cálculo de Álicrosoft Excel), se puede vincular o incrustar en un campo,
formulario o informe.
Texto Valores alfanuméricos cortos, como un apellido o una dirección.
Número Valores numéricos, como distancias. Hay que tener en cuenta que existe un tipo de datos inde-
pendiente para la moneda.
Sí/No Valores Booleanos oLógicos. Admiten únicamente el valor Si y el valor No.
13. ¿Qué subtípos de datos tiene el campo numérico en Access?
El tipo numérico se puede dividir en subtípos dependiendo del tamaño de campo que se eli-
ja. Asi, los campos numéricos almacenarán un rango de valores muy distinto dependiendo del
tamaño del campo que se seleccione. Por ejemplo, los tamaños byte (1 byte), entero (2 by-
tes), entero lango (4 bytes), simple y doble precisión (coma otante de 4
y 8
bytes), etc.
GEMFN Búsqueda
Tamaño del
campo Entero lar -
Lugares decimales ¡"NFO
Mascara de
entrada Eme) ¿&#39;90
Titulo
Valor
predeterminado
Regla devalidación
i Textode validación
Requerido No
Indexado No
Etiquetas inteligentes
Alineación deltexto General
Doble
Id. dereplica
Decimal
24
Capítulo 1. Lossistemasde almacenamientode 1ainformación
14. ¿Quévaloresadmitiría un camponuméricode
1 byte?
Como 1 byte son 8 bits, se estima que los valores numéricos que se pueden almacenar en un campo de este
tipo son del 0 al 28-1, es decir del 0 al 255. Si se insertan en el campode tipo Byte valorespor encima
o por debajo del 0 y del 255, Microsoft Accesslos rechazará. Nótese que este cálculo se hace sin tener en
cuenta el signo del valor, puesto que el valor byte, no admite signo. Para utilizar números con signo ha
de escogerseel tipo Entero y pam utilizar númems reales, con.decimales, debe seleccionarse un campo en
formato de comaotante (simpleo doble)o el campodecimal.
15. Crea una tabla llamada Test conun únicocamponuméricode
1 byte. ¿Quéva-
loresmáximo y mínimo sepuedenalmacenar?Prueba a insertar registrospara ve-
ricarlo.
-/ Crear Datos
externos
ÍHICIO
La . &#39;.
l 3 _ Nombre
delcampo Tupo
dedaios
Para crear una tabla!sepulsa Tabla
Plantnllas
Lnstasae
DISEÑO Numem
en la pestaña Crear y se selec- 0mm Shmpm"!
&#39; d!"
. . . v,
. pn wca a
czonael icono Tabla. A contz- 3m _ &#39; &#39; &#39;
&#39;
&#39;
e e
nuación se pulsa el botón Ver 5mm _,Bús9us9I__AA__
___
y se seleccionala opciónDi-
- Cree
unanuevstablaracxa
Puede
a...nlos T""""°
°""°° 5V
- campcs
uuenamente
enuna
nueva
¡abla
o F°""¡°
seno Se Pone7mm? a l ta con!
launla
envlsxa
Duseño. Luoms
netimnles Automnko
bla, y se modica la línea que l _ Mnsaradunivldl
a anece
conelnombre
Id ti L: m: mu
P y po _J Valor
predelermmado
autonuméïico para poner los &#39;
Huevo
Aguggr
campo; Regll
aevaludauon
datosdel campo.En Tamaño Ei, 3&#39;39 m ° "°"°&#39;°
Requerido No
delcampo
hayque
seleccionar 2 &#39; l indexado snsm
GUDIICIGOS]
Byte _ 4 Etiquetas
inteligentes
Ahnenaon
del
texto Genem
Para insertar los valores de prueba, se abre la tabla y se insertan varios valores. Cuando se inserta un valor
fuera del rango[0-255], seproduce
el siguienteerror:
El
valor
que
ha
especicado
nacoincide
(un
eltipo
dedatos
Número
de
esta
eolumm.
Especique
un
valor
nuevo.
Ayuda
con
los
tipos
de
datos
yformatos.
25
Bases de Datos
Práctica 1.2: Manipulación deinformación enAccess.
Descarga dewww. garcetaes 1a basede datos de Vehículos (Vehiculosaccdb) y ábre-
la. Será necesario modicar algún objeto de la base de datos, por tanto guarda una
copia con el nombre practicalaccdb y conserva la original para repetir la práctica
cuantas VECES CÏGSGGS.
1. ¿Cuántos modelos de vehículos hay?
x
r
Modelo -censor-nro":
Se abre la tabla en modo Vista 1
A|a Romeo 147 1.6 rs
16V 10s
cv 3/5 8.1
de Hoja de Datos , y,
se con- 2 Alfa Romeo 147 1.o
rs 15v12o cv
3/5 3,2
sulta
el contador de 3Alfa
ROMEO 147 1.9
JTD IZÜ
CV 3/5
que hayen ¡aparte
¿nm-o, ¿el 4
Alfa Romeo 147
1.9 no
M-JET 15o
cv 3/5
paneLEn este
caso, 3654
mo_ 5 Alfa
Romeo 147
2.0TS 16v
3/5
d l . Alfa
Romeo 147 2.0
TS 16V
Selespeed 3/5
eos. , , , , _ _ ,,_ , ,,_ _ _
Mkagmro. If
@ Nv
. Í _ V
Desde el modo Vista de Hoja de Datos, hay que ordenar de mayor a menor (forma descendente)
la. tabla por el campo Consumo. Los 5
primeros modelos que apanecen son los que más consumen.
x
Mocelo -Ïioosumo -1 yFmamnnac
.v._ ,JU, . -
19
Ferran 612 agua. 20&#39;s Qrdenar
de menor
a
mayor
s20 Ferran raao/ =43osp 13.2 il Ovenvdc mmrnmenw
821 Ferran F599
GTB 17,5 -_¡gopm
1406
Maserati Coupé Granspor 17.5 3 ge,
&#39;
3° Hummer H2 6,2 VS
13" 17.4 L1»
1262 Jeep gnerokee 3.7V 16,5
1657 Mercedes-Ben
m. 63
AMG Autom.
(1641 16,5
Agcno de
tolumna,
Qculuv columnas
3. Inserta un nuevo modelo de automóvil completando todos los campos.
Se pulsa el icono insertar registro y,
a continuación, se rellenan todos los datos menos el
campo Id, que es autonumérico y
por tanto se rellena automáticamente. El campo ñmagen
se rellena haciendo doble clic sobre el dato adjunto y
se selecciona una imagen de tipo bmp.
juanma
Id -I Marca - 7 7
¡Mooeio y N
- Consumo -1 Emnsrones - n
t d 7A
3652 Volvo xcsc vsAWD AUT
7A 13.5 322
3653 volvo xcsc vsAWD Am
EXECUTPJE/SDOR 13.3 317
3554 votvo xcso vsAWD AUT 133
317
" 3655
Ferrari Tesïarossa 22.27
Huevo,-
Regístra
N4
365?
M3655 ¡
&#39;0-
J,
J.
m;
26
Capítulo 1. Los sistemas de almacenamiento de la información
4. Crea y ejecuta una consulta para ver los automóviles de la marca Seat, repite
el procedimiento para los automóviles de la marca Toyota y Volkswagen.
¿miente nao ¿QmmrooS"d&#39;mumfmh ¿Desea
ma wnsuudeoetaloeoremwm?
(QHSUKBS
Nededeádenúsdeuwmuhodia.
Automóvnes Seal
1-:
llmmaem 4, Ésta es
toda la
mfovmaoón que
natura el
¡sustenta para
crear la
consutn.
l Imagenoeïlags
flmagmyneumg l Desea
abnr
la mnsulm
o
moáwcar
ei dxseño
de la
COHSUÍG
g
ImagenFneTmeSmw
<1 e
enFueT _ .
ilzagmeg y
agravante consulta para
ver nxmoco. ..........
m
g íiodca
el dzseño
oe A
Se puede crear una consulta de varias formas: con el
asistente para creación de consultas, con vista diseño
o creando una consulta en modo
SQL. En esta solu-
ción se opta por la primera opción, se pulsa en la pes-
taña Crear y
se selecciona la opción Asistente
pam Consumo
consultas. Primero, se selecciona la opción Asistente E"""°
para consultas sencillas y después se eligen los cam-
pos que se mostrarán en la consulta, Marca, Modelo,
Consumo y
Emisiones. En segundo lugar se elige la :[Luna] {Consumo}
opción Detalle y
nalmente se da un nombre a la Automoviles Lutomovules áutomovules
tabla. Para tenninar, se seleccionará la opción Mo-
dicar diseño de la consulta.
A
continuación, se establece el criterio a ltm para la
búsqueda de los automóviles de la marca Seat. ponien-
do en el campo Criterios de la columna Marca, el
valor =Seat". Puedes crear las consultas para To- : ALHAMBRA L8AUT.5
yota y Volkswagen siguiendo la vista Diseño, pues se ALHAMBRA 1.8 MAN.6
realiza de forma idéntica a cuando se modica
el di- -»«HA&#39;4BRA1.9TD|AUT.5
seña de la consulta. . ÁLHAMBRÁ 1.9 ÏÜl
MAÑ.
5
Sea. A_r-;ANBF.A 2.0 NAAN.
6 y
Regnstvc N1 de
93 b
DI p .Busca:
27
Bases de Datos
5.
Abre el formulario Catálogo
Ferrari en
modo Diseño y describe cómo seenlazan
sus campos
a la base de datos.
Para abrir el formulario en modo diseño. se selecciona el objeto Catálogo Ferrari en el pa-
nel lateral y pulsando con el botón derecho del ratón se elige la opción Diseño del For-
mulario. A continuación, se selecciona cualquiera de los campos y se pulsa en. el botón Ho-
ja de Propiedades que esta. situado en la pestaña de Diseño para mostrar las propiedades de
los controles del formulario. En la hoja de propiedades aparece la opción Origen del control.
j (alüogofarui
&#39;
-n-|-I&#39;2"I&#39;3"I-4
- -&#39;
&#39;
&#39;
&#39;
&#39;
&#39;
&#39;
&#39;
-- «n-
HC]!
d:prcpmoades
Tipo
deselecclcn
Cuadro
oe(eno
Maru
FormnoUNOSEventos01m ïoaus
¡ ngen
delcontrol
u . y
Mascara
deentrada
¡mov
predeterminado
Regla
devahdaclon
6.
Crea una
tabla llamada Propietarios con los Campos DNI,
Nombre, Apellidos,
Fecha de
Nacimiento, Dirección y Teléfono. DNI será el Campo clavede
la tabla.
De la pestaña Crear, se escoge la opción Diseño de tabla, y se rellenan las las con cada uno de los
campos que va a tener la tabla. Se ha de poner atención en. el tamaño de cada uno de los campos.
¡DNI - Texto (10)
nNombre
- Texto (20)
¡Apellidos Texto (70)
¡Fecha de Nacimiento
- Fecha/Hora
nDirección - Texto (255)
I Teléfono
- Tezto(15)
Se seleccionará la la correspondiente al DNI, y se pulsará el icono Clave principal para designarlo como
campo clave. Para terminar. Access preguntará si se desea guardar los cambios y pedirá la asignación del
nombre de la tabla.
_
T; __: -¿.:;
Nombre delcampo
¿t i V DNI exto Doc
ama
manana:
una:
aeDueño»Nombre Texto Nor
detam: SharePoint
&#39; de
¡abla Apemdos Texto Ap¿
l Fecha
deNaccmuenio ¿erre/Hora Fec
DITECCIÓH Texto Dire
Telefono Texto Tele
28
Capítulo 1. Los sistemasde almacenamientode la información
7. Creaunatabla llamadaPropietariosAutomoviles
conloscampos
DNI
(del pro-
pietario), Id
(del automóvil)
y Fecha
de Compra. Establececomo
clave principal
de
la tabla, los camposDNI
e Id.
Se repite el procedimiento de la cuestión anterior, esta vez, teniendo en cuenta que el tipo y tamaño de
loscampos
DNI e Id
debe ser igualal de las tablasPropietariosy Automóviles,esdecir,DNI - Texto(10)
e Id (Numérico, Entero Largo). El campoFecha de Compraserá de tipo Fecha/Hora. Para establecer
la
clave principal se seleccionan las doslas correspondientes a los camposId y DNI y se pulsa el botón Clave
Principal. Finalmente, se asigna el nombre a la tabla.
8. Establece las relaciones entre las
tres tablas
de la.
base de datos.
Hay que pulsar en el icono relaciones del panel Herramientas de base de datos. A continuación, se-
leccionar las tres tablas y agregarlas al panel de relaciones. Para enlazar el campo Id de las tablas de Au-
tomóviles y PropietariosA-utomóviles se selecciona el campo Id de esta última y se arrastra hasta el campo
Id Automóviles. En la pantalla modicar relaciones que aparece, se marca las opciones Ezigir Integridad
Referencial y Actualizar en cascada los registros relaciones, para erigir que los propietarios que estén
relacionados con Vehículos (Id) realmente existan en la base de datos, y, para actualizar el campo Id en la
tabla PmpietariosAutomóviles de forma automática si se modica en la tabla Automóviles. Se repite este
procesopara el DNI. Observa el mapa
de relaciones como se ilustra a continuación.
Henarmentas
de
base
dedatos . __ r
"-*&#39;-&#39;
- 5- " ;:.x
&#39;. : ¡ZCEEIILL
. bld g Dm
e4 .
- Dependencias
del
crudo th". "WW"
¡ÏEÍHCIOHGS Idoaela ápelhdos
C°"W"° Fecha
de
Nacnmierr
Llamar
u ccpha: Emisnones ¡mamon
¡""9" Telefono
J Egg:
nmgndad
reference!
yV
&<sa.¿=2¿n_ rs¡.e99¿922á
arma
en
cascada
los
regsros
relacionados
29
Bases de Datos
9. Crea un formulario con todos los campos de Propietarios mediante el asistente
de creación de formularios. Usa la opción de diseño Justicado y un estilo a tu
elección.
Crear
En
lapestaña Crear
hay Élghmmaazgsïm
que desplegar
el menúMás , ¿i
fonulaoa y
después se- i ¿snstente panformularuos
leccionar la opción Asia- &#39;
y
tente para formularios. ¿apagones
Se siguen los pasos indica-
dos por
el asistente,
selec-
cionando todos los campos &#39;
y
eligiendo
la distribución
I:4 I, mmm,
Justicadoy
cualquier
es- Í L
tilo, por ejemplo, el estilo Ï
Técnico.
a
V
Quadro de
dialogo modal
Asistentzponfomulum
cQaédsvbuoándeseawlvcunlfotmalab
Euuuela Datos
30
Capítulo 1. Lossistemasde almacenamientode 1ainformación
10. Inserta
5 registrosen la tabla de propietariosa través del formulario creado
en el apartado anterior.
y a Continuación.inserta registrosen la tabla Propieta-
riosAutomóvilespara
hacer dueño de dos modelosde vehículosa cada uno de los
propietariosque has insertado.
Se abre el fonnulario Propietarios creado en el apartado anterior y se completan, todos los campos. Se
repite la operación para cada una de los 5 registros.
Propietarios
DNI Nombre Acelncos
52201928 José
carlos Garcia
Perez
Fecha
deNacimiento
Dueccnón
C/Los
álamos,
15.Madnd,
28034
Telétono
912234732!
LRegnstra
I;
Para el caso de PropietariosAutomóviles, se abre la tabla y se insertan los registros manualmente. Es
fundamental que los valores insertados en el campo DNI de la tabla conesponda exactamente con alguno
de los propietarios insertados. De igual modo, los valores del campo Id deben corresponder con la clave
del Automóvil del que es propietario, por ejemplo, José Carlos García Pérez , con DNI .52201928, es
propietario de los vehículos 89 y 98, es decir, del Audi A3 1.4 TFSI AUT. 7V y del Audi A3 1.9 TDIe
v Fechacomup
v Agregar
nuevo
(ya
Zampas
dnzpoynmles
enpma:
seI/agonacays
52201928 s9 0335552010 °&#39;"°"" 53"
W
, 52201928 98 02/04/2010: oPvopnetanos Eartaurama
i?
31
Bases de Datos
11. Realiza, con el asistente para la creación de informes, un informe con los propie-
tarios de los vehículos que hay en la base de datos, mostrando qué vehículos posee
cada propietario.
En la pestaña Cnear hay que seleccionar la opción Asistente para informes. Se selecciona el campo
Nombre de la tabla propietarios y
la marca y
el modelo de la tabla Automóviles.
Crear
1r:: g
Etcqueias
J
L] Intorme en
blanco - -
lnvorme Dueño de Tabla. metano:
[1 Asmente
para míormes
¡mmm Tabu: wwewmvhmbs
_
. ¡LAS
g
L""!I1Ñ&#39;HÏH¡E3L;,
._*_ en
14:79 1
-&#39;
Fecha de
Neumann)
Dnrecoón
Teléfono Ilmagenenate
&#39; lmogernFleïlags
lntaoenieatne
jlmapemñevrsesmm
Canceluv
¿Cómo desea
mr las
datos?
nor Aummóvnes
Se siguen los pasas indi-
cadas por el asistente, se- ¡gr m, N, mu
leccionando cómo se desea
ver los datos, si se pree-
re el informe agrupado por
algún nivel, la ordenación
de los registros y
nalmen-
te, la distribución, orienta-
ción y
estilo. Para termi-
nar, se abre el informe en
vista previa.
Propietarios
Aud A3 19
7De MAN.
S
Aun: A5 14
FS AU.
7V
muqrzolnx. :5
de n-Iv:
5|SCJ:
32
Capítulo 1. Los sistemasde almacenamientode la información
12. Crea una consulta
para ver el modelo
y la marca
de los vehículosdel
primer
propietarioque insertaste.
En la pestaña Crear hay
que seleccionar la opción
Diseño de consulta. A
continuación,
se seleccio- i ¡a Nom
nan las tres tablas de la ,_ ¡,,,,,¿,,,,,,, Apellidos
base de datos, mostrándo- Consumo
.  """°&#39;""""
seasílasrelaciones
entre ¡"mmm Ïgïggr"
ellas. Para seleccionar _
los campos que salen . La
en la consulta
hay que (nuvo:
umarn ¡Modelo rlombve DNI
aTTa-ïtm?
las ¿alumnas Tlbll:
áAutomovxles
Amomóvnles
Pvopuetanos
Propuetarios
Marca,Modelo,Nombne
y M°::"ï
¡ , ,
o m: ¡ y ,_; J y
DNI delastablas
al panel (mmm: ¡E1931
inferior. o:l
Posteriormente se añade
en la la Criterios y
columna DNI el valor
= 52201 928 . Para
_
terminar, con el botón l &#39;
Nombre v DN;
derecho sobre el título un A31.4TFS|AUT.7V Josécarlos 52201923
de la consulta, se elige la A31.9TDIeMAN.5 Josecarlos 52201925
opción guardar y se escribe
un nombre. Finalmente,
se puede ejecutar para ver
los resultados.
33
Bases
1.5.
de Datos
Prácticas Propuestas
Práctica 1.3: Base de datos de un instituto
Crea en Microsoft. Access2007 una base dedatos llamada lnstituto.accdb y realiza
los siguientes ejercicios.
1.
10.
11.
12.
Crea una tabla llamada Alumnos con los campos DNI, Nombre, Dirección,
Fecha de nacimiento, foto, grupo y curso. Elige cuidadosamente el tipo de
datos para cada campo.
.Inserta 6 registros a través de un formulario creado al efecto, tres registros
para el curso 1 y otros dos para el curso 2.
.Crea una consulta que muestre el campo DNI, Nombre y
Curso, ordenado por
Curso y Nombre.
Crea una consulta que muestre todos los campos de la tabla Alumnos, con el
criterio Curso=2.
. Crea un informe para visualizar los alumnos de cada grupo.
.Crea la tabla Asignatura con los campos NombreAsignatura, Codigo, Ciclo.
Crea la tabla Notas con los campos sucientes para insertar la nota de un
alumno en una asignatura.
.Establece las relaciones entre las tablas Notas, Asignaturas y Alumnos.
Insertar mediante un formulario 4 asignaturas para dos ciclos distintos.
Crea consultas distintas para ver qué asignaturas tiene cada ciclo.
Inserta 2 notas para cada alumno anteriormente introducido.
Intenta insertar notas para alumnos y asignaturas que no existan ¿Qué pro-
Capítulo 1. Los sistemas de almacenamiento de 1ainformación
Práctica 1.4: Base de datos de mascotas
Crea una base de datos llamada Mascotasaccdb y realiza los siguientes ejercicios:
1.
es»
10.
11.
12.
13.
Crea una tabla llamada Animales con los campos Nombre, Tipo, Raza, Peso
y Color. Añade a la tabla un campo clave.
. Inserta 5
registros en la tabla Animales.
Crea una consulta para ver los Animales de tipo Perro.
. Añade una nueva columna a
la tabla Animales llamada Dueño.
.Completa el Dueño de cada uno de los Animales de la tabla.
.Añade una nueva columna a la tabla Animales llamada PrecioDeCompra. Es-
ta columna contendrá un valor nulo (sin información) cuando el Animal fue
adquirido gratuitamente.
. Crea una tabla llamada Vacunaciones con los campos FechaVacunacion, Des-
cripcíónVacuna, Veterinario y un campo que relacione la vacunación con el
animal vacunado.
Crea las relaciones entre la tabla Animales y la tabla Vacunaciones.
.Inserta, para uno de los animales, 3 vacunas puestas por tres diferentes vete-
rinarios.
Crea
un informe
para listar
las vacunaciones
de los
animales.
Crea un informe basado en la consulta del tercer ejercicio para ver las vacu-
naciones de los perros.
Crea un formulario en vista diseño para poder añadir vacunaciones de los
animales.
Mediante la pestaña Datos Externos de Access, exporta los datos de la tabla
Animales a hlicrosoft Excel. Con la misma pestaña, crea una página web con
los datos exportados del informe de vacunaciones.
Bases de Datos
1.6.
36
Resumen
Los conceptos clave de este capítulo son los siguientes:
Un chero es una estructura de información que crea el sistema operativo para
almacenar información.
El tipo y formato del chero determina la forma de interpretar la información
que contiene. Se clasican según su contenido, organización y utilidad.
Los cheros de texto no requieren un formato para ser interpretado puesto
que contienen únicamente texto, sin embargo, los cheros binarios, como al-
macenan múltiplesformas dedatos (texto, imágenes, vídeo.
.. ) requierenuna
aplicación que sepa cómo está estructurada la información en ellos.
Una base de datos está organizada mediante tablas. Las tablas contienen re-
gistros de información o las. Cada registro está compuesto por múltiples
campos o columnas. Las tablas se relacionan entre sí para dar cierto sentido a
la información almacena.da en ellas.
Una base de datos almacena multitud de objetos como tablas, consultas, índi-
ces, vistas, informes, guiones y procedimientos.
Las bases de datos tienen múltiples aplicaciones, contables, administrativas,
motores de búsquedas, cientícas, bibliotecas, censos, virus, etc.
Las bases de datos se crean siguiendo un modelo o losofía. Así, han evolu-
cionado desde las basesde datos jerárquicas y en red hasta las más modernas
bases dedatos distribuidas. Las más comunes y utilizadas son las basadas en
el modelo relacional que propuso el ingeniero de IBM Edgar F. Codd.
Un SGBD es elconjunto de herramientas software que manipulan bases deda-
tos. Ofrecen a los usuarios funciones como almacenar y acceder datos, garanti-
zan la integridad y seguridad de los mismos y ofrecen, además, otras funciones
avanzadas comola concurrencia, conectividad, generación de estadísticas, etc.
El lenguaje SQL es una interfaz de programación entre el usuario y la base de
datos. Se compone de varios sublenguajes: DML, DDL, DCL y TCL.
Los gestores de basesde datos que manipulan bases dedatos pequeñas se lla-
man gestores de basesde datos omáticas, y los que manipulan bases de datos
medianas o grandes se denominan gestores de basesde datos corporativos.
Capítulo 1. Los sistemas de almacenamiento de la información
1.7. Test de repaso
1. El contenido de un chero binario
a) Es legible y se puede abrir con un editor
de textos
b) Debe ser interpretadomediante unforma-
to
c) Son caracteres imprimibles del código AS-
CII
d) Es un conjunto de pixels con colores
2. Un chero de texto contiene
a) Cualquier tipo de información
b) Caracteres codicados en código ASCII
o
UNICODE
c) Los datos de una base de datos
d) Datos que han de ser accedidos secuencial-
mente
3. Las tablas de códigos ascii
a) Usan 2 bytes para representar cada
carácter
b) Distancian las mayúsculas de las minúscu-
las en 64 unidades
c) Tienen 256 caracteres distintos
d) Todas las anteriores son correctas
4. Señala el chero que no es binario
Un chero .avi
Un chero .html
a)
b)
c)
Un chero
.mp3
d) Un chero .doc
5. Un campo clave es
a) Un campo numérico
b) Un campo especial que puede repetir un
mismo valor
c) Un campo especial que no puede repetir
ningún valor
d) Un campo alfanumérico
6. Una query es
a) Un comando o petición que se envíaa la
base de datos
b) Una. búsqueda de información
c) Una operación de ordenación
d) Una estructura deinformación
7. Un índice es útil para
a Insertar información
b Borrar información
C
d
Buscar y ordenar información
)
)
)
)
No repeti
valores
8. Una vista es una tabla virtual que
a Almacena los datos en la BBDD
)
b) No se almacena en la BBDD
Bases de Datos
1.8.
1.
Comprueba tu aprendizaje
N ombralos distintos tipos de bases
de datos que existen según el mo-
delo que siguen.
.Enumera 10 usos que puede tener
una base de datos.
.Explica para qué sirven las tablas
UN ICODE.
.Clasica los tipos de chero según
su contenido.
¿Dónde almacenan las basesde da-
tos la información?
.Nombre 6 tipos de objetos que pue-
de contener una base de datos.
.¿Qué es un script o guión?
. ¿Qué es una vista? ¿En qué se di-
ferencia de una consulta?
. Dene los siguientes conceptos:
IDato
n Tipo de Dato
ICampo
IRegistro
-Tabla
IRelación
- Consulta
IProcedimiento
10. ¿Qué tienen en común Larry Elli-
38
son y Bill Gates?
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
¿Conoces algunabase dedatos que
almacene conguraciones?
¿En qué consiste la función de se-
guridad de una BBDD?
¿Cómo garantiza la integridad de
los datos un SGBD?
¿Qué es el diccionario de metada-
tos?
¿Qué quiere decir que una base de
datos soporta transacciones?
¿Qué esODBC?
¿Qué quiere decir que una base de
datos permita concurrencia?
¿Cuál es la función del lenguaje
TCL? ¿ Y
la del lenguaje DML?
¿Cuál es la extensión de un che-
ro que contiene una base de datos
Access?
¿Qué operacionesforman el mante-
nimiento de una tabla?
Describe dos formas de crear un
formulario en Access.
¿Cuál es el tipo de datos que usa
Access paralos valoresmonetarios?
Nombre 5 tipos de datos que per-
mite Access.
Describe dos formas de crear una
consulta en Access.
CAPÍTULO 2
Diseño lógico relacional
Objetivos
W
Identicar el signicado de la
simbología de los diagramas
E/ R
Contenidos
Identicar las tablas
del diseño
Representación
del problema lógico
hïodelo de
datos Identicar los campos
que for-
Diagranlas E/R man parte
de las
tablas
.Identicar las relaciones entre
l l
E mode
o E/R
anïphado tablas del diseño
lógico
El modelo
relacional Identicar los campos
clave
Transformación E /R al modelo
relacional Aplicar reglas de
integridad
. . ,Identicar reglas de normaliza-
Normahzaclon , ,
cion
Identicar
y documentar
reglas
que no se puedenplasmar en el
diseño lógico
En este tema se trata a fondo e] diseño de una. base de datos, desde 1a inter-
pretación y
análisis de un problema hasta el diseño y
propuesta de un modelo
que dé solución al problema planteado.
39
Bases de Datos
2.1. Representación del problema
Una base de datos representa la información contenida en algún dominio del
mundo real. El
diseño de base de datos consiste en extraer todos los datos relevantes
de un problema, por ejemplo, saber qué datos están implicados en el proceso de
facturación de una empresaque vendevehículos agrícolas,o, qué datos sonnecesarios
para llevar el control veterinario de los animales de un zoológico.
Para extraer estos datos, se debe realizar un análisis en profundidad del dominio
del problema, y saber, de estaforma, qué datos son esenciales parala basede datos y
descartar los que no son de utilidad. Una vez extraídos los datos esenciales comienza
el proceso de modelización, esto es, construir, mediante una herramienta de diseño
de base de datos, un esquema que exprese con total exactitud todos los datos que
el problema requiere almacenar.
Típicamente, los informáticos analizan un problema a través de diversasreuniones
con los futuros usuarios del sistema. Nótese, que generalmente, el problema no solo
se resuelve poniendo una base de datos a disposición de un usuario, sino también
un conjunto de aplicaciones de software que automaticen el accesoa los datos y su
gestión. De estas reuniones,se extraeel documento más importante del análisis de un
sistema informatico, el documento de Especicación de Requisitos Software
o E.R.S. A partir de esta E.R.S. se extrae toda la información necesaria para la
modelización de los datos.
<> Actividad 2.1: Busca en Internet la estructura del documento estándar IEEE
830 SRS
o Software Requirements Specication. Descarga de internet algún ejem-
plo de SRS y examina cómo los analistas de software organizan los requisitos de una
aplicación extraídos de las conversaciones conusuarios.
2.2. El
modelo de datos
La modelización consiste en representar el problema realizando múltiples abs-
tracciones 1para asimilar toda la información de un problema, y de esta manera,
generar un mapa donde estén identicados todos los objetos de la base de datos.
¡Una de las acepcionesde la RAE para abstraer es: Separar por medio de una operación
intelectual las cualidades de un objeto para considerarlas aisladamente o para considerar el mismo
objeto en su pura esencia o noción
40
Capítulo 2. Diseño lógico relaciona]
Para modelar un problema de base de datos es necesario tener en cuenta las
siguientes consideraciones:
- Casi con toda probabilidad, la persona querealiza la modelización es un analis-
ta informático, por lo que puede no ser un experto en el dominio del problema
que debe resolver (Contabilidad, Medicina, Economía,etc.). Se ha de con-
tar con la experiencia de un futuro usuario de la base de datos que conozca
a fondo todos los pormenores del negocio, y que, a su vez, puede no tener
conocimientos de informática.
- Hay que modelar siguiendo unas directrices o estándares, esdecir, usando una
losofía estándar para que el resto de la comunidad informática pueda entender
y comprender el modelo realizado. De esta manera, será posible aprovechar las
herramientas informáticas software del mercado para realizar diseños.
n La base dedatos estará gestionada por un SGBD que tendrá unas característi-
cas técnicas, de esta manera, no se tratará igual la implantación de la base de
datos en un sistema l&#39;I_ySQL que
en uno DB2.
Para satisfacer estas necesidades,se suelerecurrir a tres modelados:
1. El modelo conceptual. Es un modelo que tiene un gran poder expresivo para
poder comunicarse con un usuario que no esexperto en informática. Tiene una
gran potencia para representar el dominio del problema tal y como elusuario lo
concibe. Elmodelo quese usará
en estelibro seráel modeloEntidad/Relación.
2. El modelo lógico. Este modelo es más técnico que el anterior. Los conceptos
expresados por este modelo, suelen serdifíciles de entender por los usuarios y
generalmente tienen traducción directa al modelo físico que entiende el SGBD.
El modelo lógico elegido dependerá de la implementación de la base de datos,
así, no es lo mismo modelizar una base de da.tos orientada a objetos, que
modelizar una base de datos relacional. El modelo que se usará en este libro
será el Modelo Relacional.
3. El modelo físico. Es el resultado de aplicar el modelo lógico a un SGBD concre-
to. Generalmente está expresado en un lenguaje de programación de BBDD
tipo SQL. Este libro transformará el Modelo Relacional en modelo físico a
través del sublenguaje DDL de SQL.
La interacción entre estos tres modelos es fundamental para un diseño de calidad:
1. Primero, se negocia con el usuario el modelo conceptual.
41
Bases de Datos
USUARIO
EXPERTO
MODELO lN FORMÁTICÓ
CONCEPTUAL DIS
EÑADOR BBD D
PROGRAMADOR
BBDD
DOMINIO
DEL
PROBLEMA
Figura 2.1: Interacción entre modelos.
2. Segundo, se pasael modelo conceptual al modelo lógico, realizando una serie de
transformaciones necesarias para adaptar el lenguaje del usuario al del gestor
de base de datos.
3. Finalmente, se transforma el modelo lógico en físico, obteniendo de esta forma
la base de datos nal.
En ocasiones, los diseñadores experimentados, realizan el diseño de Ia base de
datos directamente en el modelo relacional. Esto puede representar un ahorro 
de tiempo si el problema a resolver es relativamente sencillo. Pero, general- l
mente, en problemas más complejos, saltarse el diseño conceptual y
la opinión
del usuario, da como resultado diseños incompletos e incoherentes.
El consejo del buen administrador. ..
2.3. Diagramas E/R
Para representar el modelo conceptual se usará el modelo Entidad/Relación.
Este modelo consiste en plasmar el resultado del análisis del problema mediante
diagramas entidad-relación.
2
¡También llamados en otras fuentas diagramas Entidad-Interrelación, o en inglés Entity-
relationship
42
Capítulo 2. Diseño lógico relacional
Estos diagramas fueron propuestos por Peter P. Chen a mediados de los años 70
para la representación conceptual de los datos y establecer qué relaciones existían
entre ellos.
La notación es muy sencilla, y, precisamente, esta sencillez, permite representar
el mundo real de forma que el usuario pueda validar si el modelo propuesto se ajusta
perfectamente a la resolución del problema.
A continuación, se presentan las deniciones necesarias para comprender el mo-
delo entidad relación.
2.3.1. Entidad
Cualquier tipo de objeto o concepto sobre el que se recoge información: cosa,
persona, concepto abstracto o suceso. Se representan mediante un cuadrado. Por
ejemplo: coche, casa, empleado, cliente, etc. Las entidades se representan gráca-
mente mediante rectángulos y su nombre aparece en el interior (generalmente en
singular). Un nombre deentidad solopuede aparecer
una vezen el diagrama.
Emple
ados
Figura 2.2: Ejemplos de entidades.
Hay dostipos deentidades: fuertes
(o regulares)y débiles.Las entidades
débiles
se representan mediante un cuadro doble. Una entidad débil es una entidad cuya
existencia depende de la existencia de ot.ra entidad. Una entidad fuerte es una en-
tidad que no es débil, es decir, existe por méritos propios. Un ejemplo típico es la
existencia de dos entidades para la representación de un pedido. Por un lado, la
entidad pedido representa información genérica sobre el pedido como la fecha del
pedido, fecha de envío, el estado, etc. Por otro lado, la entidad Detalle de Pedido
recopila las líneas de información especíca sobre los artículos y unidades pedidas.
En este caso, Detalle de Pedido es unaentidad débil, puesto que la eliminación del
pedido implica la eliminación de las líneas de detalle asociadas al pedido, es decir,
no tiene sentido almacenar información especíca del pedido si se ha eliminado ese
pedido.
Entidad Fuerte Entidad Débil
Figura 2.3: Entidad fuerte y débil.
43
Bases
de Datos
2.3.2. Ocurrencia de una entidad
Es una instancia de una determinada entidad, esto es. una unidad del conjunto
que representa la. entidad. Ejemplo: La entidad coche tiene varias instancias, una
de ellas es el vehiculo seat ibiza con matrícula 1222FHD de color negro y con 5
puertas.
2.3.3. Relación
Una relación (o interrelación), es una correspondencia o asociación entre dos o
más entidades.
Cada relación tiene un nombre que describe su función. Normalmente debe utili-
zarse un nombre que exprese contotalidad la nalidad de la relación, evitando poner
un nombre que pueda signicar muchas cosas, por ejemplo, tener, hacer, poseer.
Las relacionesse representangrácamente mediante rombos y su nombre aparece
en el interior. Generalmente este nombre de relación corresponde a un verbo, pues
las relaciones suelen describir las acciones entre dos o más entidades.
Las relaciones están clasicadas según su grado. El grado es el número de en-
tidades que participan en la relación. Atendiendo a esta clasicación, existen los
siguientes tipos de relaciones:
IRelaciones binarias: (grado2), sonaquellas quese danentre dosentidades.
Figura 2.4: Ejemplo de relación binaria.
n Relacionesternarias: (grado3), sonaquellas quese danentre tresentidades.
Figura 2.5: Ejemplo de relación ternaria.
44
Capítulo 2. Diseño lógico relacional
n Relacionesunarias oreexivas: (grado 1), Esuna relacióndonde lamisma enti-
dad participa más deuna vez en la relación con distintos papeles. El nombre de
estos papeleses importante para determinar la función de cada participación.
Figura 2.6: Ejemplo de relación reflexiva.
IRelaciones n-arias: (grado >3) Son aquellas donde participan más de 3 enti-
dades. Aparecen en muy raras ocasiones, puesto que generalmente se pueden
descomponer en varias de grado 2 o de grado 3.
El consejo del buen administrador. . .
Si en tu diagrama entidad relación aparecen relacionesde grado >3, es posible
que la interpretación del problema seaincorrecta. Incluso si aparecenrelaciones
de grado 3, intenta descomponerlas en varias de grado 2 para simplicar tu
modelo. Eso SÍ, asegúrate de que no es posible descomponerlas en varias de
grado 2 sin perder semántica.
2.3.4. Participación
La participación de una ocurrencia de una entidad, indica, mediante una pareja
de números, el mínimo y máximo número de veces quepuede apareceren la relación
asociada a otra ocurrencia de entidad. Las posibles participaciones son:
Participación Signicado
Mínimo cero, Ináximo uno
Mínimo uno. máximo uno
Mínimo cero, máximo n (Muchos)
Mínimo uno, máximo n (lIuchos)
Las reglas que denen la participación de una ocurrencia en una relación son las
reglas de negocio, esdecir, se reconocen a través de los requisitos del problema.
45
Bases de Datos
La notación que seutiliza para expresar las participaciones en el diagrama entidad
relación esponer al lado de la entidad correspondiente, la pareja de números máximo
y mínimo de participaciones. Por ejemplo, los empleadospueden trabajar para varios
proyectos, o
pueden estar
de vacaciones
(sin proyecto).Por otro lado, enun proyecto
trabajan de 1 a varios trabajadores. En este caso, la participación de proyecto es
de (O,n), puesto que un empleado puede tener asignados de0 a n proyectos. La
participación del empleado es
de (1,11)
puesto queen un proyecto puedehaber de 1
a n empleados. De
esta manera,se indicaal ladode laentidad proyecto,el par (0,n)
y al lado de la entidad empleado el par (Ln).
Figura 2.7: Participaciones de ocurrencias en una relación.
<> Actividad 2.2: En un supermercado
hay productos
organizados en
categorías
(frutas, ultramarinos, carnes, pescados,etc.). Cada producto pertenece a una única
categoría, y
puede haber categoríasque todavía no tengan ningún producto asignado,
sin embargo, no puede haber productos sin categoría. Calcula las participaciones de
cada entidad en la relación Producto Pertenece a Categoría
Un producto puede y
debe pertenecer a una única categoría (mínimo 1 y
máximo 1
), por tanto la partici-
pación de categoría en la relación con el producto es de (1,1). A
una categoría pueden pertenecer muchos
productos (máximo n), y
puede no tener productos (mínimo 0), por tanto, los productos participan en las
categorías con cardinalidad (0.71).
n--. ..-.-¡
46
Capítulo 2. Diseño lógico relaciona]
<> Actividad 2.32 Laspáginas web
contienen controles
de muchos
tipos (campos
de texto,listas desplegables,
etc.). Sise quierealmacenar en
una base
de datos,cada
página web, qué tipos de controles tiene. ¿qué participaciones habría que asignar?
Justica tu respuesta respondiendo a preguntas del tipo ¿un control, (por ejemplo,
un cuadro de texto), en cuántas páginas puede estar como máximo y mínimo?
<> Actividad 2.4: Los clientes pueden
realizar pedidos
a travésde susrepresen-
tantes de ventas. Indica las entidades que hay, relaciones y sus respectivas partici-
paciones.
2.3.5. Cardinalidad
La cardinalidad de una relación se calcula a través de las participaciones de sus
ocurrencias en ella. Se toman el número máximo de participaciones de cada una de
las entidades en la relación. Por ejemplo, la relación organiza de la actividad 2.2,
tendría una cardinalidad de 1:N, puesto que por el lado de las categorías, el máximo
de (1,1)es 1,y por el lado de losproductos, elmáximo de(O,n) esN.
¡y 1:N ¡un
¿Ars 30m5
Figura 2.8: Cálculo de la Cardinalidad de una relación.
De esta manera, se clasican las siguientes cardinalidades:
a Cardinalidad 1:1 Esta cardinalidad especica que una entidad A puede estar
vinculada mediante una relación a una y solo una ocurrencia de otra entidad
B. A su vez una ocurrencia de la entidad B solo puede estar vinculada a
una ocurrencia de la entidad A. Por ejemplo, se puede limitar el número de
directores de departamento mediante una relación 1:1. Así, un empleado solo
puede ser jefe de un departamento, y un departamento solo puede tener un
jefe.
47
Bases de Datos
contabilidad
administración
informática
rrhh
Figura 2.9: Ejemplo de cardinalidad 1-1.
ICardinalidad 1:N (o 1:Muchos) Esta relación especica que una entidad
A puede estar vinculada mediante una relación a varias ocurrencias de otra
entidad B. Sin embargo, una de las ocurrencias de la entidad B solo puede
estar vinculada a una ocurrencia. de la entidad A. Por ejemplo, un represen-
tante gestiona las carreras de varios actores, y un actor solo puede tener un
representante .
fernando
Figura 2.10: Ejemplo de cardinalidad 1-N.
ICardinalidad M:N (o Muchos:Muchos) O también NzM, estacardinali-
dad especica que una entidad A puede estar vinculada mediante una relación
a varias ocurrencias de la entidad B. y
a su vez, una ocurrencia de la entidad
B puede estar vinculada a varias de la entidad A. Por ejemplo. un empleado
48
Capítulo 2. Diseño lógico relacional
puede trabajar para varios proyectos; al mismo tiempo, en un mismo proyecto,
pueden trabajar varios empleados.
Figura 2.11: Ejemplo de cardinalidad N-M.
Como puede observarse enlas guras anteriores, la notación para representar el tipo
de relación según su cardinalidad, consiste en escribir el tipo de cardinalidad justo
encima del rombo. Existen numerosas alternativas a esta nomenclatura, siendo muy
típicas las dos siguientes:
u Puntas de echa: En esta notación. la línea de la relación que termina en echa,
indica la rama N de la cardinalidad de la relación.
Figura 2.12: Ejemplo de notación puntas de echa.
n Notación classic de MySQL Workbench: En esta notación, las relaciones se
expresan con un pequeño rombo, rellenando en negro la mitad de la gura, en
7
el lado de la entidad cuya cardinalidad es l
Equlpm
¡asquoo INT l
Name vuaonnus)
Jugador
icuuqanor INT
Not-mn VARCHARQS)
Dasal
INT
Eutincsjcmho INT
(FK)
Figura 2.13: Ejemplo de Iiotación classic de MySQL Workbench.
49
Bases de Datos
<> Actividad 2.5: Haymultitud denotaciones distintas
para realizar
los diagramas
entidad relación. Todas ellas,tratan de expresar losconceptos expuestosen estelibro,
pero de diferentes formas y con diferentes elementosgrácos. Busca en Internet otros
tipos de notaciones para realizar diagramas entidad relación. Puedes buscar, entre
otros, las notaciones de Alartin, [DEF 1X
o Pies de cuervo (Crows foot).
2.3.6. Cardinalidad de relaciones no binarias
Para calcular la Cardinalidad de una relación ternaria se tomará una de las tres
entidades y se combinan las otras dos. A continuación, se calcula la participación de
la entidad en la combinación de las otras dos. Posteriormente, se hará lo mismo con
las otras dos entidades. Finalmente, tomando los máximos de las participaciones se
generan las cardinalidades.
CardinaIidad=max(0,1):max(1,1):max(0,n)
=
1:1:N
EMÉÉISA
EIÉEÏZENTE
Figura 2.14: Cardinalida.d de una relación ternaria.
Por ejemplo, en la gura 2.14 se distinguen tres participaciones, la que se produce
entre empresa y auditora-expediente, la que se distingue entre auditora y empresa-
expediente, y por último la de expediente con auditora-empresa:
- Una empresa ¿Cuántosexpedientes puedetener con una auditora? Puede tener
un mínimo de 0 y un máximo de n. Participación de Empresa (Ü,n).
IUna. auditora ¿Cuántos expedientes puedetener con una empresa?Puede tener
un mínimo de Oy un máximo de 1. Participación de Auditora (0,1).
u Un expediente ¿A cuántas empresasauditadas por la auditora puede pertene-
cer? Un expediente solo puede pertenecer a una empresa auditada (1,1), por
tanta Participación de Expediente (1.1).
50
Capítulo 2.
Diseño lógicorelaciona]
<>
Actividad 2.5: Calcula
la cardinalidad
dela siguiente
relación
ternaria:
Hay que contestar a las siguientes preguntas: ¿Cuántos autores puede tener un determinado libro publicado
en una detenninada editorial?
¡Mínimo1, máximon, participaciónde Autor (1,n).
¿Cuántos libms puede tener un detenninado autor publicados en una determinada editorial?
Mínimo 0, máximo n, participación de Libro (0,11).
¿En cuántas editoriales puede un detenninado autor publicar un
mismo libm?
Múzimo 1, máximo I. Participación de Editorial (1,1).
Tomando los máximos de cada participación
se obtiene que la cardinalidad de la relación de de 1:N:N
o Actividad 2.72 Calcula
la cardinalidad
delas
siguientes relaciones
binarias:
I Hombre
está casadocon Mujer, en una sociedad1nonogámica.
I Hombre
está casadocon Mujer, en una sociedadmachistapoligámica.
- Hombre
está casadocon Mujer, en una sociedad
poligámica liberal.
- PescadorpescaPez.
- Arquitecto
diseña Casa.
I Piezas forman Producto.
I Turista
viaja Hotel.
I Jugador
juega en Equipo.
u Político gobiernaen País.
51
Bases
de Datos
<> Actividad 2.8: Calcula la Cardinalidad
de lassiguientes relaciones
ternarias:
IMecánico arregla Vehículo en Taller.
n Alumno
cursa Ciclo en Instituto.
IVeterinario administra [bledicación al Animal.
2.3.7. Cardinalidad de las relaciones reexivas
En las relaciones reexivas, la misma entidad juega dos papeles distintos en la
relación. Para calcular su Cardinalidad hay que extraer las participaciones según
los dos roles existentes. Por ejemplo, en la relación reflexiva Es jefe, la entidad
Empleado aparece con dos Roles. El primer rol es el empleado como jefe, y el se-
gundo rol el empleado como subordinado. Así, se puede calcular las participaciones
preguntando:
I¿Cuántos subordinados puede tener un jefe? Un jefe puede tener un mínimo
de 1 y un máximo de n: (Ln)
I¿Cuántos jefes puede tener un subordinado? Un mínimo de O (un empleado
sin jefes sería el responsable de la empresa) y un máximo de 1 (suponiendo
una estructura,típicamente piramidal): (0,1).
Por tanto, la relación sería de Cardinalidad 1:N
1:N
(0,1)
Figura 2.15: Cardinalidad de una relación reflexiva.
52
Capítulo 2. Diseño lógico relacional
<> Actividad 2.9: Justica cuál serían
las participaciones
y la cardinalidad de
la
siguiente relación, teniendo en cuenta que:
n Una gura puede contenerse a
sí misma(como enel ca.so
de losfractales).
IUna gura puede estar formada por múltiples tipos distintos de guras.
2.3.8. Atributos y
Dominios
Los atributos de una entidad son las características o propiedades que la denen
como entidad. Se representanmediante elipsesconectadas directamente a la entidad.
Por ejemplo, para representar la entidad HOTEL. son necesarias suscaracterísti-
cas, esto es, el número de plazas disponibles, su dirección, la ciudad donde se en-
cuentra, etc.
Figura 2.16: Ejemplo de atributos.
Atributo Clave
En la gura anterior, aparece el atributo código, subrayado. Este atributo se
denomina clave, y designa un campo que no puede repetir ninguna ocurrencia de
entidad. Se dice. que este campo identica unívocamente a una entidad, es decir,
53
Bases de Datos
que con la sola referencia a un campo clave se tiene acceso al resto de atributos de
forma directa. Ejemplo: El DNI es el campo clave de una persona, pues ninguna
persona tiene el mismo DNI. Por tanto, si se especica el DNI de esa persona se
sabe exactamente a qué ocurrencia de persona sereere. Todas las entidades fuertes
deberían tener, al menos, un atributo clave. Nótese que una entidad puede formar
la clave mediante varios atributos, en este caso, se dice que la clave de la entidad
es la suma de esos atributos y que la entidad tiene una clave compuesta. Si la
clave está formada por un único atributo se dice que es atómica. Por ejemplo, para
identicar de forma única una oferta de trabajo se necesitaría el nombre del puesto
y el nombre de la empresa que lo oferta.
Atributo de relación
Un atributo de relación es aquel que es propio de una relación y que no puede
ser cedido a las entidades que intervienen en la relación. Por ejemplo, un mecánico
repara un vehículo, la reparación se realiza en una determinada fecha.
Figura 2.17: Ejemplo de atributo de relación.
Dominios
Cada una de las características que tiene una entidad pertenece a un dominio.
El dominio representa la naturaleza del dato, es decir, si es un número entero, una
cadena decaracteres oun número real. Incluso naturalezas más complejas, como una
fecha o una hora (con minutos y segundos). Por ejemplo, los siguientes atributos de
la entidad empleado pertenecen a los siguientes dominios:
Atributo
DNI Cadena de Caracteres de longitud 10
Nombre Cadena de Caracteres de longitud 50
Fecha_Nacin1iento Fecha
Dirección Cadena de Caracteres de longitud 100
Sueldo Números reales
Número de hijos Números enteros
Departamento Departamentos
54
Capítulo 2. Diseño lógico relaciona]
Si un dominio se especica mediante el tipo de datos, como en el caso de DNI,
Nombre o Fecha_Nacimiento se dice que se dene por zïntensión. Si se especica
mediante un conjunto de valores, como en el dominio Departamentos, que puede
tener los valores (RRHH, Informática. Administración o Contabilidad), la definición
del dominio es por extensión.
2.3.9. Tipos de atributos
Se pueden clasicar los atributos según las siguientes restricciones:
Atributos obligatorios: Un atributo debe tomar un valor obligatoriamente.
Atributos opcionales: Un atributo puede no tomar un valor porque sea desco-
nocido en un momento determinado. En este caso, el atributo tiene un valor
nulo.
Atributos compuestos: Un atributo compuesto esaquel que se puededescompo-
ner en atributos más sencillos, por ejemplo, el atributo hora_de_salida se puede
descomponer en dos (hora y minutos).
Atributos univaluados: Un atributo que toma un único valor.
Atributos multivaluados: Estos atributos pueden tomar varios valores,por ejem-
plo el atributo teléfono puede tomar los valores de un teléfono móvil y un
teléfono jo.
Atributo derivado: Son aquellos cuyo valor se puede calcular a través de otros
atributos. Por ejemplo, el atributo Edad, se puedecalcular a partir de la fecha
de nacimiento de una persona.
Al igual que con la mayoría de las notaciones, no existe unanimidad a la hora de
dibujar en un diagrama los tipos de atributos. Una de las más extendidas entre los
diseñadores debases dedatos es la siguiente:
Figura 2.18: Notación para los distintos tipos de atributos.
55
Bases
de Datos
2.3.10. Otras notaciones para los atributos
Al igual que para las entidades, los atributos tienen multitud de notaciones,
y, aunque la original adoptada por Peter Chen es la más usada hasta ahora, por
simplicar la construcción de mapas a través de herramientas software, se opta
por usar otras notacíones que producen mapas más manejables. Por ejemplo, la
herramienta MySQL Workbench utiliza una sintaxis muy similar a la que usa la
notación UML para representar las características de un objeto:
Nombre de la
entidad
Dominio
Nombre del atributo
Eqniposjcqubo INT (PK)
Figura 2.19: Otras formas de representar atributos
<> Actividad 2.1ÜZ Justica qué tipode atributosson los
siguientes atributos
de
la entidad Persona:
n Fecha de Nacimiento (p.ej. 24/11/1976)
ILugar de Nacimiento (p.ej. Zaragoza)
- Edad (p.ej. 36 años)
IEsMayorDeEdad (p. ej: Sí)
n
DNI (p.ej. 55582739A)
n
Teléfonos (p.ej. 925884721, 657662531)
- Apellidos
56
Capítulo 2. Diseño lógico relacional
2.3.11. Las entidades débiles
Como se ha expuesto anteriormente, las entidades débiles dependen de una en-
tidad fuerte mediante una relación. La relación que une ambas entidades también
es débil, puesto que también desaparece si desaparece la entidad fuerte. En estos
casos, la relación tiene una dependencia que puede ser de dos tipos:
n
Dependencia de existencia: Este tipo de dependencia.expresa que,las ocu-
rrencias de una entidad débil, no tienen ningún sentido en la base de datos sin
la presencia de las ocurrencias de la entidad fuerte con la que están relacio-
nadas. Por ejemplo, las transacciones que se dan en una cuenta bancaria, no
tienen sentido si no existe la cuenta bancaria a la que están asociadas.
CÏBIIÏA EAN CAE.
Figura 2.20: Ejemplo de entidad débil con dependencia de existencia.
- Dependencia de identicación: Este tipo se produce cuando, además de
la dependencia de existencia, la entidad débil necesita a la fuerte para poder
crear una clave, de tal manera que pueda completar la identicación de sus
ocurrencias. Por ejemplo, una empresa fabricante de software crea aplicaciones:
1. La compañía se
identica por su nombre(por ejemplo,Microsoft).
2. Las aplicaciones se identican por su nombre comercial, por ejemplo
(Office).
3. Cada compañía de software pone un nombre a ca.dauna de sus aplicacio-
nes.
c: M; ANIA :E : ïTwAiífz-Z
Figura 2.21: Ejemplo de entidad débil con dependencia de identicación.
De esta forma puede ocurrir que haya dos aplicaciones con el mismo nombre y que
pertenezcan ados compañíasdistintas (Ofce de Microsoft y Office de Sun). En
57
Bases
de Datos
este caso para identicar a cada aplicación de forma única, hace falta el nombre
de la aplicación y además, el nombre de la compañía. Así, Aplicación depende en
identicación de la Compañía y
el nombre de la aplicación es una clave débil. Se
expresa de la siguiente forma:
Una vez más, para representar las dependencias, cadaherramienta usa su propia
notación. Por ejemplo, en el caso de MySQL Workbench, no diferencia entre enti-
dades fuerteso débiles (las llama a todas tablas). y crea las relaciones conlíneas
discontinuas encaso deno tener dependencia de
identicación (non identifying re-
lationship), y con línea continuas en caso detener dependenciade identicación
(identifying relationship).
Rel-ciónn
&#39;°=°"°°"&#39; --- "°"°°"°.&#39;°°
Norma vmoweids) ¡kmlucmn
i___-_&#39; Relación con
dependencia de
identicación
¡cuenta Banca:
INT
Codigosuursal VARCJ-MRu)
000m Entidad
VARCHÁRM)
Doüftoi VAÉ-MÑ?)
Nuneroctiena VAÉHAHW)
DN Jldar
VARG-IARUO)
idfrmsaodon INT
Cüid DECNAL
Debe-IBM VAHZHAHH
Cuenta Buuajtnumta
Bancaria ¡NT
(PK)
Figura 2.22:
Ejemplo de notación. Dependencias en MySQL Workbench.
<> Actividad 2.11: ¿Qué tipo de relación dedependencia tienen
las siguientes
entidades?
IUn toro (entidad débil) pertenecea unaganadería (entidadfuerte). Al toro se
le identica por el número de toro, y el nombre de su ganadería, puesto que
puede haber varios toros con el mismo número, pero pertenecientes a distintas
ganaderías.
IEn el acceso
al parking de unaempresa unempleado (entidad
fuerte) tieneun
vehículo (entidad débil).
58
Capítulo 2. Diseño lógico relacional
El consejo del buen administrador. ..
Muchos diseñadoresse abstraen del hecho de tener entidades fuertes y débiles
y, tal y como hace A-IySQL Workbencli, no distinguen entre entidades fuertes y
débiles. En general, es buena idea simplicar el diseño (losofía KISS - Keep
it simple, sir), pero se ha de ser consciente de la pérdida de semántica que
implica.
<>
Actividad 2.12: Descarga
el software
DIA parala creación
dediagramas
de
diversos tipos. Puedes encontrarlo de forma gratuita en la página web
http: //sourceforge .net/projects/dia-installer/.
"5DiagramILdiI
(causeiswinwigng)
-dua
Arthivo Editar1er Lupi: QbjetosSelecciona!
ü Ü Q C Crea un diagrama nuevo y con los símbolos
iii] °°9&#39;°&#39;"°1-°°
" c.-. delosdiagramas
entidad
relación
delanota-
° ciónChen
(ER)modela
la relación
Cliente-
adquiere-Producto con los atributos que sete
ocurran. Identica el icono de cada gura con
los símbolos Entidad, Entidad Débil, Atribu-
to (con susmúltiples tipos) y Relación.
2.4. El modelo
E / R ampliado
La primera concepción del modelo entidad relación tuvo, por las limitaciones
tecnológicas de la época, un alcance bastante limitado, que, con los años, se ha ido
desarrollando hasta alcanzar un nivel satisfactorio para los diseñadores de basesde
datos. El modelo Entidad-Relación Extendido, o Ampliado, incorpora todos los ele-
mentos del modelo entidad relación incluyendo los conceptos de subclase,superclase
junto a los conceptos de especialización y generalización.
2.4.1. Generalización y Especialización
Una entidad
E es una generalización de un grupo de entidades E1, E2, En, si
cada ocurrencia de cada una de esas entidades es también una ocurrencia de E.
59
Bases de Datos
GENERALIZACIÓN ESPECIALIZACIÓN
Figura 2.23: Generalización y Especialización.
Todas las propiedades de la entidad genérica E son heredadas por las subenti-
dades. Además, cada subentidad tendrá sus propios atributos independientes de la
generalización.
Las subentidades son especializacionesde la entidad general, se puededecir que
las subentidades o subclasestienen una relación del tipo ES UN
con la entidad padre
o superclase.
La relación de generalización se representa mediante un triángulo ísósceles pe-
gado por la base a la entidad superclase. En la gura siguiente Empleado es la
superclase y los directivos, comerciales y técnicos son subclases. En la relación se
adjunta un atributo que indica cómo debe interpretarse la relación de la superclase
con la subclase. La generalización Empleado que puede ser un directivo, un técnico
o un comercial. Cada subentidad tiene sus propios atributos y
relaciones, pero todas
heredan losatributos nombrey DNI de la entidad padre(Empleado).
IIF JITZTC
Figura 2.24: Ejemplo de generalización.
60
Capítulo 2. Diseño lógico relaciona]
Tipos de especialización
Se puedeagregar más semántica al diagrama entidad relación extendido co1nbi-
nando los siguientes tipos de especialización:
IEspecialización Exclusiva: En este caso,cada una de las ocurrencias de la su-
perclase solopuede materializarse en una de las especializaciones. Porejemplo,
si un empleado es un directivo, no puede ser un técnico o un comercial. Para
representar esta especialización exclusiva, el triángulo de la jerarquía lleva un
arco.
Figura 2.25: Especialización exclusiva.
IEspecialización Inclusiva: Se produce cuando las ocurrencias de la supercla-
se pueden materializarse a la. vez en varias ocurrencias de las subclases. En
este caso, el empleado directivo, podría ser también técnico y comercial. Se
representa sin el arco, como en la gura 2.24.
IEspecialización Total: Se produce cuando 1a entidad superclase tiene que ma-
terializarse obligatoriamente en una de las especializaciones. Se representan
añadiendo un pequeño círculo al triángulo de la generalización:
Figura 2.26: Especialización Total.
n Especialización Parcial: La entidad superclase no tiene por qué materializarse
en una de las especializaciones (es
opcional). Se representa sinel pequeño
circulo, como en la gura 2.24.
61
Bases de Datos
<>
Actividad 2.13: Crea un E/R para almacenar
datos de
los distintos
tipos de
ordenadores quepuede tener una organización. Clasifícalos en Sobremesa, Portátiles
y Servidores, y asigna correctamente los atributos: N°Serie, Procesador, Memoria,
CapacidadDisco, TipoBatería, DuraciónBatería, N°Procesadores y TipoProxy.
2.5. Construcción de un diagrama E/ R
A cont.inuación se presentauna guía metodológica. para crear un entidad relación
a partir de un análisis de requisitos:
1. Leer varias vecesel problema hasta memorizarlo.
2. Obteneruna listainicial decandidatos a
entidades, relaciones
y atributos.Se
realiza siguiendo los siguientes consejos:
n Identicar las entidades. Suelen seraquellos nombrescomunes queson im-
portantes para el desarrollo del problema. Por ejemplo, empleado, vehícu-
lo, agencia, etc. En principio, todos los conceptos deberían estar perfec-
tamente especicados en el documento de requisitos, pero, de no existir
el documento ERS, quizá solo se disponga de extractos de conversacio-
nes con usuarios en las que se hacen referencias vagas a ciertos objetos,
teniendo que hacer un importante ejercicio de abstracción para poder dis-
tinguir si son entidades, atributos, etc. Por ejemplo, un mecánico que tan
solo habla de ciertos modelos de vehículos pertenecientes a determinadas
personas, pero que nunca hace referencia a los vehículos Diesel que serán
fundamentales identicar para el correcto diseño de la base de datos.
- No hay que obsesionarse enlos primeros pasos pordistinguir las entidades
fuertes de las débiles. Si estrivial, se toma nota de aquellas que parezcan
claramente entidades débiles. De lo contrario, se apuntan como entidades
sin especicar si son fuertes o débiles.
n Extraer los atributos de cada entidad, identicando aquellos que pueden
ser clave. Se suelen distinguir por ser adjetivos asociados a un nombre
común seleccionadascomo entidades. Por ejemplo, color, que es un adje-
tivo, puede ir asociado a la entidad vehículo. Además, se debe establecer
el tipo de atributo, seleccionando sies opcional, obligatorio, multivaluado,
compuesto o derivado. Si es compuesto se indica su composición, y si es
derivado, cómo se calcula. Es bastante útil apuntar sinónimos utilizados
para el atributo para eliminar redundancias.
62
Capítulo 2. Diseño lógico relacional
IEs fácil identicar las generalizaciones si se obtiene un atributo que es
aplicable a más de una entidad. En ese caso, se puede intentar aplicar
una generalización
/especialización,indicando cuáles lasuperclase y
cuál
las subclases. Además, se deben especicar los tipos de especialización
(inclusiva, exclusiva,
parcial, total).
IIdenticar los atributos de cada relación. Se suelen distinguir, al igual
que los de entidad, por ser adjetivos, teniendo en cuenta que para que
sean de relación, solo deben ser aplicables a la relación y no a ninguna
de las de las entidades relacionadas.
ITambién es posible que los nombres comunes contengan muy poca in-
formación y no sea posible incluirlas como entidades. En este caso, se
pueden seleccionar como atributos de otra entidad, por ejemplo, el autor
de un libro puede ser una entidad, pero si solo se dispone del nombre del
autor, no tiene sentido incluirlo como una entidad con un único atributo.
En este caso, sepuede incluir como atributo de la entidad Libro.
n Extraer los dominios de los atributos. Siempre es buenapráctica, ir apun-
tando, aunque en el diagrama entidad relación no se exprese explícita-
mente, a qué dominio pertenece cada atributo. Por ejemplo, el Salario
pertenece a los números reales (Salario: Reales), o el color de un objeto
puede serverde, amarilloo rojo (Color: Verde,Amarillo, Rojo).
- Identicar las relaciones.Se puedenver extrayendo los verbosdel texto del
problema. Las entidades relacionadasserán elsujeto y el predicado unidos
por el verbo que hace derelación. Por ejemplo, agente inmobiliario vende
edicio. En este caso el agente inmobiliario representaría una entidad el
edicio la otra entidad y vende sería la relación.
IUna vez identicada las relaciones, hay que anar cómo afecta la relación
a las entidades implicadas. Este esel momento de distinguir las fuertes de
las débiles haciendo preguntas del tipo ¿tiene sentido esta ocurrencia de
entidad si quito una ocurrencia de la otra entidad? ¿sepueden identicar
por sí solas las ocurrencias de cada entidad? Si a la primera pregunta
la respuesta es negativa, las dos entidades son fuertes, si no, alguna de
ellas esdébil. Si la respuesta a la segunda espositiva, dependerán solo en
existencia, si es negativa, alguna de las dos depende en identicación de
la otra.
3. Averiguar las participaciones y cardinalidades. Generalmente se extraen del
propio enunciado del problema. Si no vienen especicadas, se elegirá la que
almacene mayor cantidad de información en la base de datos.
63
Bases de Datos
4. Poner todos los elementos listadosen elpaso 2
en un mapa y volver a considerar
la pertenencia de cada uno de los elementos listados a su categoría. Así, se
replanteará de nuevo si cierto atributo es una entidad, o si cierta entidad
puede ser una relación, etc.
5. Renar el diagrama hasta que se eliminen todas las incoherencias posibles,
volviendo a los pasos anteriores en caso de encontrar algún atasco mental o
conceptos dudosos que diculten la continuación del análisis. Es bueno, en
estas circunstancias discutir con compañeros u otros expertos sobre el diseño
realizado.
6. Si hay dudas sobre elenunciado o sobre losrequisitos, o se hanquedado algunas
cosas enel tintero, será necesarioacudir al responsable del documento ERS o
volver a concertar una entrevista con el usuario para aclarar conceptos. En este
caso, seaclararán las dudas y se volverá al punto 2 para reiniciar el análisis.
¿Sabías que . . . 7
En muchas ocasiones,
cuando no
se sabe
cómo continuar,
o no se encuentra la solución de un problema, basta con explicarle el problema
a otra persona, aunque esa personano tenga ni idea del tema o no sea experta
en la materia. Automáticamente, la solución aparece. Se ha iniciado incons-
cientemente un proceso mental para ordenar las ideas que ha desembocado en
la resolución del problema.
2.6. El modelo relacional
El objetivo principal del modelo relacional es proteger a.l usuariode la obligación
de conocer las estructuras de datos físicas con las que se representa la información
de una base dedatos. Desvincular estas estructuras de datos. que son complejas por
naturaleza, del diseño lógico (Modelo Relacional), permite que la base de datos se
pueda implementar en cualquier gestor de bases dedatos relacional (Oracle, MySQL,
DB2, etc.) A continuación se enumeranlas características fundamentales del modelo
relacional:
n La relación es el elemento fundamental del modelo. Los usuarios ven la base
de datos como una colección de relaciones. Estas relaciones se pueden operar
mediante el Algebra Relacional.
-El modelo relacional es independiente de la forma en que se almacenan los
datos y de la forma de representarlos, por tanto, la base de datos se puede
64
Capítulo 2. Diseño lógico relacional
implementar en cualquier SGBD y los datos se pueden gestionar utilizando
Cualquier aplicación gráca. Por ejemplo. se pueden manejar las tablas de una
base de datos MySQL u Oracle con Microsoft Access. Véase práctica 5.3.
IAl estar fundamentado en una fuerte base nlatemática. se puede demostrar la
ecacia del modelo a la hora de operar conjuntos de datos.
2.6.1. Las relaciones en el modelo relacional
Se dene una relación como un conjunto de atributos. cada uno de los cualesper-
tenece aun dominio, y que posee unnombre que identica la relación. Se representa
grácamente por una tabla con columnas(atributos) y
las (tuplas). El conjunto de
tuplas de una relación representa el cuerpo de la relación y el conjunto de atributos
y el nombre representan el esquema.
Relación:lmpue5roVehículos Nombte jrE
m Teléfonooueño maní
Seat IbizaTDI1 9
einer-w &#39;
. 1
Volskwaen Polo TDI 1.o 918773621 4231
mo
Renault La
; una
Coupé m 929883762 741mm
Fiat Punto1.o 646553421 923mm:
Figura 2.27: Denición de Relación.
¿Sabías que . . . 7
Actualmente,los modelos
lógicos más
extendidos con
diferencia son el modelo relacional y los diagramas de clasesque utiliza UML
para modelar las basesde datos orientadas a objetos. El modelo relacional de
Codd se ajusta a la perfección al modelo entidad/relación de Chen creado en
la fase de modelización conceptual. No así el modelo de UML, que requiere
técnicas más complejas y especícas como los casosde uso o los diagramas de
transición de estados.
2.6.2. Otros conceptos del modelo relacional
A continuación se denen los conceptos necesarios para transformar el modelo
conceptual (diagrama entidad-relación) en el modelo lógico (modelo relacional).
u
Atributo: Características que describen a una entidad o relación.
IDominio: Conjunto de valores permitidos para un a.tributo. Por ejemplo,
cadenas de caracteres. números enteros, los valores Sí o No, etc.
65
Bases de Datos
- Restricciones de semántica: Condiciones que deben cumplir los datos para
su correcto almacenamiento. Hay varios tipos:
o Restricciones de clave: Es el conjunto de atributos que identican de
forma única a una entidad.
o Restricciones de valor único (UNIQ
UE): Es una restricción que impide
que un atributo tenga un valor repetido. Todos los atributos clave cum-
plen esta restricción. No obstante es posible que algún atributo no sea
clave y requiera una restricción de valor único. Por ejemplo, el número
de bastidorde unvehículo noes clave(lo esla matrícula) y sin embargo,
no puede haber ningún número de bastidor repetido.
o Restricciones de integridad referencial: Se da cuando una tabla tiene una
referencia a algún valor de otra tabla. En este caso la restricción exige
que exista el valor referenciado en 1a otra tabla. Por ejemplo, no se puede
poner una nota a un alumno que no exista.
o Restricciones de dominio: Esta restricción exige que el valor que puede
tomar un campo esté dentro del dominio denido. Por ejemplo, si se
establece que un campo DNI pertenece al dominio de los números de 9
dígitos +
1 letra , no es posible insertar un DNI sin letra, puesto que la
restricción obliga a poner al menos 1 letra.
o Restricciones de vericación (CHECK): Esta restricción permite compro-
bar si un valor de un atributo es válido conforme a una expresión.
o Restricción de valor NULO (NULL o NOT NULL): Un atributo puede
ser obligatorio si no admite el valor NULO o NULL,
es decir, el valor falta
de información o desconocimiento. Si admite como valor el valor NULL,
el atributo es opcional.
o Disparadores o triggers: Son procedimientos que se ejecutan para hacer
una tarea concreta en el momento de insertar, modicar o eliminar infor-
mación de una tabla.
o Restricciones genéricas adicionales o aserciones (ASSERT). Permite va-
lidar cualquiera de los atributos de una o varias tablas.
IClave: Una clave es un conjunto de atributos que identican de forma única
una ocurrencia de entidad. En este caso, las claves pueden ser simples (atómi-
cas) o compuestas. Además, hay varios tipos de clave:
o Superclave:Identican a una entidad(pueden ser
no mínimas).Por ejem-
plo, para un empleado, las superclavesposibles sonel DNI, o elDNI+Nombre.
o el DNI+Nombre+Numero de la Seguridad Social, etc.
66
Capítulo 2. Diseño lógico relacional
o Clave Candidata: Es la mínima Superclave (en el caso anterior el DNI, O
el Número de la seguridad social).
o Clave Primaria: Es la clave candidata elegida por el diseñador como cla-
ve denitiva (en el ejemplo anterior se elegiríael DNI por ser la. más
representativa paraun empleado).
o Clave foránea: Esun atributo de una entidad, que es claveen otra entidad.
Por ejemplo. la nota en un módulo de una asignatura corresponde a un
DNI, que es clavede Otraentidad. En este casoel DNI es unaclave foránea
en la tabla notas.
2.7. Transformación de un diagrama E / R al mo-
delo relacional
MODELO CONCEPTUAL
(CHEN) *MODELO RELACIONAL (CODD)
Figura 2.28: Transformación del modelo E/ R en relacional.
Para realizar esta transformación se siguen las siguientes reglas:
Transformación de entidades fuertes
Para cada entidad A, entidad fuerte. con atributos ((11,612,
.. .,a,,) se crea una
tabla A (con el nombre en plural) con n Columnas correspondientes a los atributos
de A,
donde cada la de la tabla A corresponde a una ocurrencia de la entidad A.
La clave primaria de la tabla A la forman los atributos clave de la entidad A.
Figura 2.29: Paso a tablas de entidades fuertes.
En el diagrama E-R de la gura 2.29, las tablas generadas son:
CATEGORIAS
67
Bases de Datos
Transformación de entidades débiles
Para cada entidad débil D,
con atributos Cd1,Cd2,. .. ,cd¿,d¿+1,dt+2,.. .,d,,, donde
cdl, Cdg,.. .,cd, son los atributos clave de la entidad D,
y una entidad fuerte F de la
que depende
D con atributos clave(c f1,c f2,. . .,cfm): se creauna tabla D con m+n
columnas Cd1,Cd2,.. .,cd,,, d¿+1,d¿+2,
.. .,d,,,cf1,cf2, .. ., cfm correspondientes a los
atributos de D y a los atributos clave de F. Si solo tiene dependencia de existencia, la
clave primaria de la tabla D
será la unión de los atributos clave de la entidad D.
Si la
entidad débil D,
además, tiene una dependencia de identicación, la clave primaria
de la tabla D será. launión de los atributos cd¡, Cdg,
. .. ,cdt, cfl, Cfg,.. .,cf,,,, es decir,
la unión de los atributos clave de la entidad débil D y de la entidad fuerte F.
Figura 2.30: Paso a tablas de una entidad débil.
En eldiagrama E-R
de lagura 2.30. las tablas
generadas son3:
CUENTAS_BANCARIAS(N°Cuenta, saldo)
TRANSACCIONES(Código,Tipo,Cantidad)
Transformación de relaciones
Por cada relación R entre entidades E1, E2, . . ., E
N.
La clave de E,- es C,-=
a,-1,a,2, . . .,a,-N.
Regla general para las relaciones: se crea una tabla con todos los campos claves
de las entidades relacionadas y los atributos de la relación. La clave primaria de la
tabla generada es la suma de los atributos claves de las entidades relacionadas, y
cada clave incorporada a la tabla. será una clave foránea que referencia a la tabla
de la que se importa.
Por ejemplo, en la gura 2.31 hay una relación ternaria con dos entidades con
clave compuesta, aula y asignatura, y otra, estudiante. que tiene una clave simple. La
transformación al modelo relacional exige la creación de una tabla para la relación.
La tabla ESTUDIOS, tendrá como columnas los atributos clave del aula, los de
asignatura y el atributo clave deestudiante, todos ellos formando la clave primaria y,
3Falta incorporar en la gura el atributo N°Cuenta a la tabla TRANSACCIONES, aquí se
ha omitido para centrar la atención en los atributos de las entidades. Consultar la sección de
excepciones en la transformación de relaciones.
68
Capitulo 2. Diseño lógico relacional
al mismo tiempo, actuando como clavesforáneas desus respectivastablas. Además,
se incorpora el atributo de relación hora.
Figura 2.31: Paso a tablas de una relación.
AULAS(Numero, Planta. Situación)
ESTUDIANTES(N°1Iatricu1a,NombreDireccion)
ASIGNATURAS(Nombre, Ciclobescripcion)
ESTUDIOS(Numero, Planta.N°IIatricu1a, Nombre,Ciclo,Hora)
El consejo del buen administrador. ..
Aunque en teoría, 1a tabla ESTUDIOS tiene como clave primaria Ia suma de
las claves primarias de las tablas que relaciona, tener en una base de datos
tablas con claves tan complejas, hace que e] sistema pueda funcionar más
lento de 1o esperado debido a 1a multitud de comprobaciones que el gestor
debe realizar cuando se inserta o modica un dato. Si es un sistema cuyo
funcionamiento se base en Ia inserción o modicación constante de datos, más
que en1a consultadelos mismos, quizá, en estos casos,se puedasaltar la teoría
y
crear un campo sencillo adiciona], identicador de Ia la, y
sustituirlo por Ia
clave primaria compuesta origina]. De esta forma, se simplica enormemente
Ia clave primaria en pos de un funcionamiento más eciente. Nótese, que en
estos casos,se pierde mucha semántica que, o se ignora o habría que controlar
de otros modos.
No siempre se aplica la regla general para crear una tabla por cada relación.
Generalmente, se pueden encontrar las siguientes excepciones ala regla general
69
Bases
de Datos
1. Relaciones con cardinalidad 1:N. En este caso.no secrea una tabla para la
relación, sino que seañade a la tabla de la entidad que actúa con participación
máxima N la clave de la entidad que actúa con participación máxima 1 (como
clave foránea).
Si además,
la relacióntuviera atributos se importaríantambién
a la entidad que actúa con participación máxima N:
N
REPRE
SENTANTE
S(N_L¡cenc¡aN°mb¡e) ÁCÏORE
S(Código.NombreAnístico
_Licencia_Representan
Contrato)
O
Figura 2.32: Excepción I. Relaciones l-N.
La transformación quedaría como se ilustra en la Figura 2.32. Se puedeobser-
var que en este caso, no se ha creado una tabla para la relación, sino que se ha
añadido a la tabla ACTORES la clave foránea N_Licencia_Representante que
referencia al campo N_Licencia de la tabla REPRESENTANTES. También se
ha añadido el campo Contrato, atributo de la relación, a la tabla ACTORES.
ACTORES(Codigo, NombreArtísitico, NombreReal,
N_Licencia_Represent ante,Contrato)
REPRESENTANTES(N_Licencia.Nombre)
2. Relaciones reexivas con cardinalidad l-N. En este caso, tampoco se
crea una tabla para la relación. Hay que crear una tabla con el nombre de la
entidad, añadiendo otra vez la clave cambiada de nombre.
Figura 2.33: Excepción II. Relaciones reexivas 1-N.
70
Capítulo 2. Diseño lógico relacional
En el ejemplo de la Figura 2.33, el empleado solo puede tener un jefe, por
tanto, se incorpora elDNI del jefe del empleado (DNISupervisor)como clave
foránea.
EMPLEADOS(DNLNombre,DNISupervisor)
<>
Actividad 2.14: En las relacionesreexivas con cardinalidad m-n, se
aplica la regla general para la transformación de relaciones. Expresa cómo
sería la regla para crear tablas con relaciones reexivas con cardinalidad m-
n. Después, aplica esa regla para transformar la Figura 2.33 suponiendo que
tuviera cardinalidad m-n.
3. Relaciones 1-1. Este tipo de relaciones tampoco generan tabla. El paso a
tablas se realiza de forma muy parecida a las relaciones 1-N.En este caso,
tampoco se genera tabla para la relación y se tiene la libertad de poder incor-
porar la clave de una de las dos entidades a la otra.
Figura 2.34: Excepción III. Relaciones 1-1.
En este caso existen las siguientes opciones:
IIncorporar la clave de Personajes como clave foránea en la tabla actores:
ACTORES(Codigo, Nombre, CodigoPersonaje)
PERSONAJES(CodigoNombrePelícula)
IIncorporar la clave de Actores como clave foránea en la tabla Personajes:
ACTORES(Codigo, Nombre)
PERSONAJES(Codigo,Nombre.Película.CodigoActor)
- Incorporar la clave de Actores como clave foránea en la tabla Persona-
jes y la. clavede Personajesa la tabla de Actores comoclave foránea:
ACTORES(Codigo. Nombre,CódigoPersonaje)
PERSONAJES(Codigo.Nombre.PelículaCodigoActor)
4Téngase en
cuenta, queen estecaso se
está introduciendouna pequeñaredundancia, peroque
puede ser de mucha utilidad para simplicar futuras consultas.
71
Bases de Datos
Participaciones O,x
Normalmente las participaciones son importantes para calcular la cardinalidad
de la relación, y transformar conforme a las reglas expuestashasta ahora. Incluso en
muchas ocasiones, las participaciones se omiten en los diagramas entidadrelación.
No obstante, es necesariotener en cuenta cuándo la participación tiene un mínimo
de O,para adoptar un campo de una tabla como opcional NULL,
u obligatorio NOT
NULL.
Generalizaciones y
especializaciones
Para transformar las generalizaciones se puede optar por 4 opciones. Cada op-
ción se adaptará mejor o peor a los diferentes tipos de especialización (Exclusiva,
Inclusiva, Total, Parcial).
Figura 2.35: Paso a tablas de generalizaciones.
1. Se puede crear una tabla. para la superclase y otras tantas para cada subclase,
incorporando el campo clave de la superclase a las tablas de las subclases.
EMPLEADOS(DNI, NombrePuesto)
DIRECTIVOS(DNI,Dpto)
TECNICOS(DNI.lIáquinas)
COMERCIALES(DNLComisión)
2. Se puede crear una tabla para cada subclase incorporando todos los atributos
de la clase padre, y no crear una tabla. para la superclase.
DIRECTIVOS(DNLNombrePuestoDpto)
TECNICOS(DNI,Nombre,Puest.o,Máquinas)
COMERCIALES(DNI,Nombre,Puesto.Comisión)
3. Se puede crear una sola tabla para la superclase, incorporando los atributos de
todas las subclases yañadir, para distinguir el tipo de la superclase, un campo
72
Capítulo 2. Diseño lógico relacional
llamado tipo, que contendrá el tipo de subclaseal que representa cadatupla.
Este tipo de opción se adapta muy bien a las especializaciones exclusivas.
EMPLEADOS(DNI, NombrePuesto. Dpto, Máquinas, Comisión, Tipo)
4. Se puede crear una sola tabla para la superclase como en la opción anterior,
pero en lugar de añadir un solo campo tipo, se añaden varios campos que
indiquen si cumple un perl, de este modo se soportan las especializaciones
inclusivas.
EMPLEADOS(DNI,
Nombre,Puesto, Dpto,
Máquinas, Comisión,
EsDirectivo, EsTécnico, EsComercial)
2.8. Normalización
Habitualmente, el diseño de una base de datos termina en el paso del modelo
entidad-relación al modelo relacional. No obstante, siempre quese diseñaun sistema,
no solo una base de datos, sino también cualquier tipo de solución informática,
se ha de medir la calidad de la misma, y si no cumple determinados criterios de
calidad, hay que realizar, de forma iterativa, sucesivos renamientos en el diseño,
para alcanzar la calidad deseada. Uno de los parámetros que mide la calidad de
una base de datos es la forma, normal en la que se encuentra su diseño. Esta forma
normal puede alcanzarse cumpliendo ciertas restricciones que impone cada forma
normal al conjunto de atributos de un diseño. El proceso de obligar a los atributos
de un diseño a cumplir ciertas formas normales se llama nomnalización.
r°----/ ---&#39;7
°°¿;:"° cotzzsasl
. L
GICO
PROBLEMA/ (Entldad/ (Relacional)
v, :z
A: W
l
____ sí
g ,
al
BASE
« . ¡NT L; ÉÍ
DE MODELO
Fisco ¿SUFIC
ENTEME E J
NORMALIZADO? »
Figura 2.36: Renamiento de un diseño de base de datos.
Las formas normales pretenden alcanzar dos objetivos:
73
Bases de Datos
1. Almacenar en la base de datos cada hecho solo una vez, es decir, evitar la
redundancia de datos. De esta manera se reduceel espaciode almacenamiento.
2. Que los hechos distintos se almacenen en sitios distintos. Esto evita ciertas
anomalías a la hora de operar con los datos.
En la medida que se alcanza una forma normal más avanzada, en mayor medida se
cumplen estos objetivos. Hay denidas 6 formas normales, cada una agrupa a las
anteriores, de forma que, por ejemplo, la forma normal 3 cumple la forma normal 2
y la forma normal 1.
Antes de abordar las distintas formas normales, esnecesario denir los siguientes
conceptos 5:
Dependencia funcional: Se dice que un atributo Y
depende funcionalmente de
otro atributo X, o que X
> Y, si cada valor de X tiene asociado en todo
momento un único valor de Y. También se dice que X
implica Y, y por tanto,
que X
es el implicante. Por ejemplo:
PRODUCTOS (CódigoProducto, Nombre, Precio, Descripcion)
CódigoProducto + Nombre, puesto que un código de producto solo puede
tener asociado un único nombre, dicho de otro modo, a través del código de
producto se localiza un único nombre.
Dependencia funcional completa: Dado una combinación
de atributosX
(X 1, X2, ..
se dice que Y
tiene dependencia funcional completa de X, o que X=> Y, si
depende funcionalmente de X, pero no depende de ningún subconjunto del
mismo. Por ejemplo:
COMPRAS (CódigoProducto, CódigoProveedor, Cantidad, FechaCompra)
CódigoProducto,CódigoProveedor => FechaCompra, puesto que la FechaCom-
pra es única para la combinación de CódigoProducto y CódigoProveedor (se
puede hacer un pedido al día de ca.daproducto a cada proveedor), y sin em-
bargo, se pueden hacer varios pedidos del mismo producto a diferentes provee-
dores, es decir, CódigoProductvoweFecha.
Dependencia funcional transitiva: Dada la tabla T, con atributos (X,Y,Z), don-
de X > Y, Y
+ Z
e Y
4+ X 6, se diceque X depende transitivamente
de Z,
o que, X > Z.
5No esobjetivo del libro entrar en los detalles matemáticosdel procesode normalización,y
sí proporcional al lector una idea intuitiva del mismo.
GY nodepende deX.
74
Capítulo 2.
Diseño lógico relacional
Ejemplo 1:
PRODUCTOS (CódigoProducto,Nombre, Fabricante,País)
CódigoProducto > Fabricante
Fabricante > País
CódigoProducto > País, esdecir, CódigoProducto depende transitivamente
de País.
Ejemplo 2:
PRODUCTOS (CódigoProducto,Nombre, Fabricante,País)
CódigoProducto > Nombre
Nombre > CódigoProducto
CódigoProducto -v» Nombre
A continuación, se describe de forma intuitiva las siguientes formas normales:
FN 1: En esta forma normal se prohíbe que enuna tabla haya atributos que puedan
tomar más un valor. Esta forma normal es inherente al modelo relacional,
puesto que las tablas gestionadas por un SGBD relacional, están construidas
de esta forma. Por ejemplo, en la Figura 2.37 se puede ver la diferencia entre
una tabla que cumple 1a fnl y otra que no:
La amenaza Fantasma 1999 Ewan McGregor
La amenaza Fantasma 1999
Ewan McGregor
Liam Neeson
Natalie Portman
Blade Runner 1982 Harrison Ford
Rutger Hauer
Avatar 2009
Sam Worthington
Zoe Saldana
Sigourney Weaver
Figura 2.37: Primera Forma Normal.
75
Bases de Datos
FN 2: Un diseño se encuentra en FN 2 si está en F N1 y además, cada atributo que
no forma parte de la clave tiene dependencia completa de la clave principal.
Ejemplo:
COMPRAS (CódigoProducto, CódigoProveedor, NombreProducto, Cantidad,
FechaCompra).
CódigoProducto > NombreProducto, por tanto, al no ser dependencia fun-
cional completa, no está en FN2.
FN 3: Un diseño se encuentra en FN3 si está en F N2 y además, no hay ningún
atributo no clave que depende de forma transitiva de la clave.
Ejemplo:
PRODUCTOS (CódigoProducto,Nombre, Fabricante,País).
CódigoProducto > Fabricante
Fabricante > País
CódigoProducto +> País
País dependetransitivamente de CódigoProducto, por tanto, no está entercera
forma normal.
FNBC: Esta forma normal, llamada Forma Normal de Boyce-Codd, exige que el
modelo esté en FN3, y que además, todo implicante de la tabla, sea una clave
candidata.
Ejemplo:
NOTAS (DNIAlumno, DNIProfesor,NombreProfesor, Nota).
DNIProfesor > NombreProfesor
NombreProfesor > DN IProfesor
DNIProfesonDNIAlumno > Nota
En este caso, la tabla está en 3FN porque no hay dependencias funcionales
transitivas, y sin embargo no está en FNBC porque NombreProfesor y DNI-
Profesor son implicantes, y no son claves candidatas. Para obtener la tabla en
F NBC habría que quitar de la tabla los atributos DNIProfesor y NombrePro-
fesor.
Otras formas normales: Existen más formas normales (FN4, F N5, FNDK, FN6
76
cuyo alcance excede el de este libro y cuya aplicación en el mundo real es
únicamente teórica). Las formas normales 4 y 5, se ocupande las dependencias
entre atributos multivaluados, la Forma Normal Dominio Clave (FNDK) trata
las restricciones y los dominios de los atributos, y nalmente la FN6 trata
ciertas consideraciones con las bases dedatos temporales.
2.9.
Capítulo 2. Diseño lógico relaciona]
Prácticas Resueltas
Práctica 2.1: Startrekfanscom v.1.0
Un club de fans de la famosa película startrek, ha decidido crear una página web
donde se pueda consultar información referente a todas las películas y capítulos de
la saga. El dominio startrekfans.com se redirigirá a un servidor web que consulte
una base de datos con la siguiente información:
Actores: Es necesario conocerel Nombre completo del actor, el personaje que
interpreta, la fecha de nacimiento y su nacionalidad.
Personajes: De los personajes es necesariosaber el nombre, su raza y gradua-
ción militar que desempeña
(ca.pítán. teniente,
almirante, etc.).Es importante
conocer el actor que interpreta el personaje, teniendo en cuenta que, un perso-
naje solo puede serinterpretado por un actor, y un actor solo puede interpretar
un personaje. Además, será necesario conocerel personaje del que depende di-
rectamente en graduación militar.
Capítulos: Hay que almacenar todos los capítulos, indicando a qué temporada
pertenece cada capítulo, el título, el orden en el que fue rodado, fecha de
su primera emisión en televisión y los personajes que participaron en cada
capítulo.
Películas: Se debe almacenar también, todas las películas que se proyectaron
en cines, cada una con su año de lanzamiento, título y director. También hay
que guardar los personajes que aparecenen cada película y cuál de ellos fue el
protagonista.
Planetas: En cada capítulo, se visita 1 o varios planetas, hay que almacenar el
código del planeta, su nombre, galaxia a la que pertenece,y el problema que se
resolvió en esa visita y la nave conla que se viajó al planeta. Para la descripción
del problema será suciente con un campo de texto de 255 caracteres. De la
nave sealmacenará el nombre, código y número de tripulantes.
1. Realizar un diagrama entidad relación que modele el diseño de la base de da-
tos. Puedes hacerlo en papel, con dia, con Visio. o con cualquier otro software de
diagramas.
2. Realizar la conversión al modelo relacional del diagrama realizado en el primer
Apartado, indicando qué claves primarias y foráneas sehan de crear.
77
Bases de Datos
78
Paso a tablas:
A CTORES(Código,Nombre,Fecha, Nacionalidad)
PERSONA JES(Código.Nombre,Raza, Grado, CádigoActor, CodigoSupeñor)
PLANETAóYCódigo,GalazimNombne)
CAPÍTULOS(Temporada,
Orden,
Título,Fecha)
PELÍCULASYCódigo,
Título,Director,A
ño)
PERSONA JESCAPITUL OS(CódigoPersonaje,Temporada.
Orden)
PERSONA JESPELICULA S(CódigoPersonaje, CódigoPelicula)
VISITAS(CódigoNave, CódigoPlaneta, Temporada, Orden)
NA VES(Código,N° Tripulantes,Nombre)
Obsérvese que:
En el enunciado no aparece explícitamente el campo Código para los personajes y actores, pero es necesario
incluirlo para dotar de un atributo clave a estas entidades.
La clave de la entidad Capítulo es compuesta, por tanto en las relaciones se importan los dos atributos
que forman la clave.
La relación ternaria tiene cardinalidad M:N:P, es decir, Aluchos-Aluchos-Aluchos.
En la relación interpreta se podría haber incorporando los dos campos claves a las entidades opuestas.
Aunque introduce redundancia de datos, es útil para agilizar consultas.
Nótese que a las dos relaciones Apanece, se les ha cambiado el nombre por una combinación de las dos
entidades que relaciona, para evitar la posible ambigüedad.
El nombre de las tablas aparece en plural, mientras que el de las entidades aparece en singular. Esto es
debido a que la entidad representa un concepto abstracto y la tabla un conjunto de datos.
Capítulo 2. Diseño lógico relaciona]
Práctica 2.2: Startrekfanscom v.2.0
El club de fans de Startrek ha pensado ampliar los requisitos de la página web para
hacer una segunda versión. Esta segunda versión consiste en incluir información ex-
tra para los personajes. De esta manera, si el personaje es un humano, se indicará su
fecha de nacimiento y ciudad terráquea donde nació. Si el personaje es de la raza
Vulcano, se almacenará el nombre del mentor y la fecha de graduación, y si es de
raza Klingon, se guardará su planeta natal y la fecha de su último combate.
1. Realizar una generalización de la entidad Personaje indicando las especializa-
ciones necesarias.
2. Transforma al modelo relacional la generalización del apartado anterior.
PERSONAJEóYCódigmNombre,Grado, CódigoActor.CodigoSuperior, Raza. Ciudad. F_Nacim, Planeta,
F. UlLCombate, ltlentor, Fecha_Grado)
Obsénrese que:
k Se ha optado por una de las 4
opciones que hay. En este caso. se ha creado una única tabla con
el campo Raza como discriminante de tipo. que indicará los campos a rellenar según su tipo. Por
ejemplo, si la raza es Klingon, tan solo se rellenarán los campos Planeta y
F_Ult_Combate. Esto
generará 4
valores nulas por personaje, pero evitará complejidad en el modelo al no tener tablas
extra.
Al tratarse de una especialización total y
exclusiva. cada personaje solo puede pertenecer a una de
las razas, y
además tiene que pertenecer a una de manera obligatoria.
79
Bases de Datos
Práctica 2.3: Startrekfanscom v.3.0
El club de fans de Startrek quiere la tercera versión de la base de datos de la si-
guiente forma:
En cada capítulo, 1a nave que viaja a un planeta, puede disponer de una nave pe-
queña llamada lanzadera con la que bajan a la supercie del planeta. La existencia
de la lanzadera, solo tiene sentido si existe la nave a la que pertenece. Se identi-
cará cada lanzadera mediante un número entero y el código de la nave. Es necesario
conocer la capacidad en personas de la lanzadera.
1. Incorporar los cambios de la tercera versión al modelo conceptual y lógico de
las prácticas anteriores.
Paso a, tablas:
LANZA
DERA S(CódigoNave, Número,
Personas) NAVES(Código, N 7Hpulantes,Nombre)
Obsérvese que:
i Al ser una relación 1-N se importa a LANZADERAS el atributo CódigoNave.
k El campo Número es una clave débil.
k Al tratarse de una dependencia de identicación, el CódigoNave forma parte de la clave primaria.
de la tabla LANZADERAS.
80
2.10.
Capítulo 2. Diseño lógico relaciona]
Prácticas Propuestas
Práctica 2.4: Peluquería
Una peluquería desea llevar el control de sus empleadas y de sus clientes así como
de los servicios que se prestan. Se deseaalmacenar la siguiente información:
Empleadas: DNI, Nombre, Especialidad (Masaje, Corte, Color, Brushing, Ma-
nicuras, Rulos,etc.)
Clientes: Datos personales (DNI, Nombre, Profesión, Teléfono y Dirección) y
los tratamientos médicos a los que está sometido el cliente.
Servicios prestados: Qué empleada atendió a qué cliente, y qué tipo de servicio
le prestó en qué fecha y hora.
Citas: Fecha y Hora en la que se cita al cliente y empleada que realizará el
servicio.
Cosméticos: Código, Nombre, Cantidad y Precio.
Ventas de cosméticos: Una empleada vende un cosmético a un cliente, obte-
niendo una comisión.
.Realiza. una lista de candidatos a entidades, relaciones y atributos, indicando
en cada entrada, si se admite o serechaza comotal razonando el porqué de tu
decisión. Por cada relación, razona su tipo y cardinalidad.
.Modeliza mediante un diagrama E/ R.
.Realiza el paso a tablas del modelo E/ R.
81
Bases de Datos
Práctica 2.5: Reyes Magos
sin fronteras
La ONG Reyes Magos sin fronteras desea hacer una base de datos para que esta
Navidad todos los niños pobres de España puedan recibir sus regalos la noche de los
Reyes Magos. La ONG contacta con vecinos de distintos barrios para disfrazarlos
de Reyes Magos y organizarlos en grupos lúdicos que realicen eventos para que los
niños los visiten y puedan formular sus peticiones. Cada niño es recibido por un Rey
Mago y puede hacer una única petición, la cual queda anotada en la base de datos
para posteriormente, el día 6 de enero, entregar esa petición. La ONG comprará los
regalos con el dinero que distintas organizaciones benécas aportarán a la causa.
Los datos que interesa almacenar son los siguientes:
82
De los vecinos: DNI, Nombre y apellidos, Rey Mago al que encarna y los
vecinos a los que ha conseguido convencer para que se unan a la causa.
De losniños: Nombre,Dirección yel Regaloque pideal ReyMago. (Losniños,
no tienen DNI, y necesitarán un dato identicativo).
De los grupos de vecinos senecesita saber a qué Barrio pertenecen, número de
integrantes del grupo y los Eventos que han organizado.
De los eventos interesa conocer la Ubicación física, la Fecha, la Hora y los
niños asistentes.
. Realiza una lista de candidatos a entidades, relaciones y atributos, indicando
en cada entrada, si se admite o se rechaza como tal justicando el porqué de
tu decisión. Por cada relación, razona su tipo y cardinalidad.
.Realiza el diagrama entidad-relación y el paso al modelo relacional.
Capítulo 2. Diseño lógico relaciona]
Práctica 2.6: Mundial de fútbol
Diseñar una base de datos para organizar el campeonato mundial de fútbol. Consi-
derar los siguientes aspectos:
IJugadores: un jugador puede pertenece a un único equipo y puede actuar en
varios puestos distintos, pero en un determinado partido solo puede jugar en
un puesto.
IÁrbitros: En un
partido intervienen
3 árbitros
titulares, linier
derecho, izquier-
do, principal y un árbitro secundario. Un árbitro puede realizar una función
en un partido y otra distinta en otro partido.
-Estadísticas: Se desea
saber losgoles queha marcado un jugador en quépartido
y en qué minuto, también se desea poder describir cómo sucedió el gol.
IPorteros: Se desea almacenar cuántas paradas ha realizado, en qué minuto,
y en qué situación se han producido: penalti, tiro libre, corner o jugada de
ataque.
IPartidos: Todos generan un acta arbitrar donde se pueden incluir todo los
comentarios que el árbitro considere oportuno: lesiones, expulsiones,tarjetas,
etc.
1. Realiza una lista de candidatos a entidades, relaciones y atributos, indicando
en cada entrada, si se admite o se rechaza como tal, justicando el porqué de
tu decisión. Por cada relación, razona su tipo y cardinalidad.
2. Realiza el diagrama entidad-re1a.ción yel paso al modelo relacional.
83
Bases
de Datos
Práctica 2.7: Supermercado virtual
Se va a desarrollar una aplicación informática para wwwxvirtualmarkeïïcom cuya
interfaz de usuario estará basada enpáginas webpara que los clientes puedan realizar
compras desde sus casas. La empresa dispone de una serie de repartidores que se
encargan dedistribuir los pedidos a los clientes. A continuación se muestrael informe
de un analista tras una entrevista con el cliente:
La aplicación permitirá registrar nuevos clientes. Para usar la aplicación, un
cliente deberá registrarse indicando sus datos personales (DNI, Nombre, Dirección,
Código Postal,Teléfono de
contacto, emaily password)a travésde unformulario de
registro. Una vez registrado podrá acceder a la realización de pedidos con su email
y su password.
Los productos que oferta el supermercado están divididos en diversas categorías.
Los datos necesarios para cada categoría son: nombre de la categoría, condiciones
de almacenamiento
(frío, congelado,seco) yobservaciones. Los
datos delos produc-
tos son: nombre, marca, origen, dimensiones (volumen y peso), una fotografía, la
categoría yunidades disponibles
7.
La aplicación permitirá visualizar un listado de productos ordenado por cate-
goría, permitiendo seleccionar losproductos que desee comprarmediante una caja de
texto donde se indicará el número de unidades seleccionadas. Laaplicación llevará la
cuenta (cestade la compra) delos productosque elcliente haido seleccionando.
La aplicación permitirá también efectuar un pedido con todos los productos que
lleve almacenados en su cesta de la compra. Los datos del pedido son: código del
pedido, fecha del pedido, cliente, dirección de entrega, productos pedidos, importe
total delpedido ydatos de
pago (número
de tarjetay fechade caducidad)?
Para poder generar un pedido se deberán dar dos situaciones:
IEl cliente deberá pertenecer a una zona (Código Postal) donde existan repar-
tidores. Un repartidor se ident.ica mediante un nombre, número de matrícula
de la furgoneta y zona donde reparte.
-Debe haber unidades sucientes por cada producto para satisfacer las deman-
das de cada pedido.
Una vez generado elpedido se mostrará al usuario una página con los datos de su
pedido, se restarán del stock las unidades pedidas y se emitirá una nota de entrega
7El control del stock está supervisadopor otra aplicación subcontratada,y por tanto no es
necesario preocuparse por él.
SEI pagodel pedidoestá automatizadomediante otrosoftware queproporciona elbanco.
84
Capítulo 2. Diseño lógico relaciona}
(albarán) a los responsablesde almacén para. quesirvan ese pedido.
Se pide:
1. Diseño Conceptual. Realizar el diagrama entidad relación de la aplicación. Se
ha de tener en cuenta que el entrevistado narra todo el proceso que necesita
la lógica de su negocio. Se deberán separar los procedimientos de los datos.
Diseño Lógico. Realizar el paso al modelo relacional.
.¿En qué forma normal está la tabla Clientes?
Práctica 2.8: Requisitos deuna aplicación
Busca alguna persona que tenga un negocio. Puedes trabajar haciendo equipo con
otros compañeros. Tenga informatizado el negocio o nó, pídele que sea tu cliente y
realiza las siguientes tareas de análisis:
Entrevístale, si es necesariograba la entrevista e intenta extraer una lista de
requisitos.
Extrae de esta lista de requisitos los que versen sobre almacenamiento de la
información en bases de datos y realiza un diagrama entidad relación que
satisfaga todos esos requisitos.
Reúnete de nuevo con el cliente y pídele que verique tu modelo E-R.
Repite este proceso hasta que el cliente de el visto bueno.
Cuando el cliente haya validado tu modelo, realiza el diseño de basede datos, trans-
formando el modelo E-R al modelo relacional y
después, implementando ese modelo
en Access. <>
85
Bases de Datos
Práctica 2.9: MySQL Workbench
El objetivo de esta práctica es conocer en profundidad un software de diseño de
base dedatos de licencia GNU. Debes tener en cuenta que los diagramas de MySQL
Workbench son una mezcla del modelo conceptual de Chen y del modelo relacional
de Codd, incluso más orientado al modelo relacional. Por ejemplo, no existen las
relaciones ternarias, y a las entidades las llama tablas, como en el modelo relacional.
Toda su nomenclatura está orientada a comunicarse con un SGBD sin necesidad de
transformaciones previas. Además, aunque tiene el apellido MySQL, este software
está basado en DB Designer, programa genérico de diseño de base de datos, y por
tanto se puede conectara cualquier SGBD (Oracle, DB2, Access.. y no solo a
MySQL.
1. Conectarse a la página web de lrIySQL Workbench. http://wb.mysq1.com/
2. Seleccionar 1a opción Download Workbench y mientras se descarga, selec-
ciona el enlace About - Screenshots y comenta para qué sirve el software.
3. Buscar en google MySQL Workbench manual y descárgate el manual de
instrucciones de MySQL Workbench.
4. Instalar el software. El proceso de instalación es muy sencillo.
5. Iniciar la aplicación y seleccionar la opción Add Dzïagram para comenzar a
dibujar un diagrama entidad relación (EER (Extended Entity Relationship
- Entidad Relación Extendido). En la opción de menú Model, seleccionar la
notación para los objetos y para las relaciones. Seleccionarla opción Classic
y compararlas con las otras notaciones.
6. Insertar los objetos necesarios para representar el siguiente diagrama E-R:
Se puede usar el panel inferior para incorporar los atributos y así, del panel
lateral izquierdo, poder seleccionar los objetos. Debe quedar así:
86
10.
Capítulo 2. Diseño lógico relacional
File Edit View Arrnnge Model Dnabne Plugins Tools Community Htip
H H ° F7
I} MySQL Model V Dlagram
<7
¡J ¡m1 1 -.-,
T 0:69am
u Nanhrevmmmqs) _
A mydb
u bles
¡g + :1 Ecume-
_ .:1 Jugador.
Selecciona aquí las
tablas y
relaciones
_¿ Routme
Groups
Atributos
i
I
i _*
JI en!
i
7
i
Coum Dennis ¡
_
, <domuednd< to
overwue mula
n (OÚIQO Column i
E _ 1
5
Dorsu ¿. ee _
in Nombre RCHARHS} cmmems,
l
Equmcjcdngo
c w O
» Tnble
Columns Xndexes Foreign
Keys TruggersPartmonan; Ovtxnns
lns 4 y J
Dcñpcn iwal
i Relationship
between Jugador
¡nd Equipo
created.
en la tabla jugador que representa el equipo en el que juega.
.Observar que al generar la relación, automáticamente se creauna clave foránea
. Experimentar con el diseño para crear la relación juega como n-m en lugar
de 1 n. ¿Qué sucede?Observar que automáticamente crea una nueva tabla.
. Descargar el chero sakila-db.zip de la página web de MySQL. Se encuentra
muy fácil escribiendo sakila-dazip en google. Descomprimir y abrir el archi-
vo sakilamwb. Observar cómo están organizadas en regiones las tablas y las
relaciones del modelo.
Realizar los diagramas de las prácticas anteriores con MySQL Workbench y
mediante la opción de menú Database, Forward Engineer, generar automáti-
camente los scripts de creación de base de datos.
Bases de Datos
2.11.
88
Resumen
Los conceptos clave de este capítulo son los siguientes:
u Modelizar un problema consiste en realizar múltiples abstracciones. En bases
de datos, se utilizan tres modelos: el modelo conceptual, o diagrama entidad-
relación, que es más cercano al usuario, el modelo lógico, que es un modelo
más técnico y que tiene traducción directa al modelo físico que soportan los
SGBD.
Los componentes que hay que detallar en un diagrama entidad relación son:
Entidades, Atributos, Relaciones, Participaciones, Cardinalidades y Generali-
zaciones.
Los tipos de Entidades son fuertes cuando su existencia no depende deninguna
otra, y débiles, cuando su existencia depende deotra. Esta dependencia puede
ser ampliada si la entidad también depende enIdenticación, es decir, necesita
el atributo clave dela entidad fuerte para poder identicar de forma única cada
ocurrencia de entidad.
Los atributos pueden ser clave o no clave, univaluados, multivaluados, com-
uestos derivados obli atorios u o cionales.
7
7
Las relaciones pueden ser, según su grado, binarias, ternarias, reexivas o
n-arias.
La cardinalidad de una relación se calcula tomando las participaciones máxi-
mas y mínimas de las ocurrencia de una entidad en la rela.ción. Estas pueden
ser 1-1, l-N o M-N.
Las generalizaciones pueden dar lugar a cuatro tipo de especializaciones, ex-
clusivas, inclusivas, totales o parciales.
El modelo relacional expresa, mediante relaciones, todos los conceptos deta-
llados en el modelo conceptual.
Se puede transformar el modelo entidad relación en un modelo relacional ge-
nerando una tabla para las relaciones de tipo NzM y las n-arias. Para las
relaciones de tipo l-N se importan los atributos clave de la entidad cuya car-
dinalidad es 1 a la que tiene como cardinalidad N. Las relaciones 1:1 y las
generalizaciones tienen varias opciones de transformación.
La normalización es un proceso que sirve para medir la calidad de un diseño,
la forma normal que cumple cada tabla es un indicador que seusa para evitar
redundancia; de datos.
2.12. Test de repaso
1. ¿Cuál es el modelo que más se apro-
xima a la visión del usuario?
a) El modelo conceptual
b) El modelo lógico
c) El modelo físico
)
d El lenguaje SQL
2. Una relación reflexiva es una entidad
de grado
a)Ob)1c)2d)3
3. La participación de una entidad en la
relación es:
a) El máximo de ocurrencias que pueden apa-
recer en la relación
b) El mínimo de ocurrencias que pueden apa-
recer en la relación
c) El máximo y
mínimo de ocurrencias que
pueden aparecer en la relación
d) El máximo y mínimo de ocurrencias de la
entidad
4. A
qué participaciones corresponde
una cardinalidad 1:N
a) (0a1)y(1»1)
b) (1,11)y (0,11)
C) (171)y (lan)
d) (0,1) y
(n,n)
5. Si un empleado puede trabajar en
múltiples proyectos
a) Trabajar es 1:1
b) Trabajar es N:N
c) Trabajar es NzM
l
d Trabajar es 1:N
Capítulo 2. Diseño lógico relaciona]
6. Un atributo de relación es
a) Consecuencia de la relación
b) Consecuencia de una de las entidades
c) De las dos entidades
d) Son atributos compuestos
7. La dependencia de identicación
a
b
) Incluye la dependenciade existencia
) No incluye la dependencia de existencia
c) No se aplica a entidades débiles
)
d Sólo es posible cuando hay dos entidades
fuertes
8. Una especialización inclusiva es aque-
lla que
a) Puede materializarse en más de una sub-
clase
b) Puede materializarse en solo una clase
c) Puede no materializarse en alguna clase
d) Tiene que materializarseen unaclase
9. La transformación de una relación con
cardinalidad 1-N al modelo relacional
a) Genera una tabla para la relación
b) Se incorpora unaclave ala entidad 1
c) Se incorpora una clave a la entidad N
)
d No se incorpora clave
10. Con la normalización:
a) Se rena el modelo conceptual
b) Se rena el modelo lógico
C) Se rena el modelo físico
)
d No sirve para. nada
qmr6?&#39;se&#39;¿v&#39;9o&#39;9o&#39;v&#39;9&#39;2&#39;qzv&#
Bases de Datos
2.13.
10.
90
.Nombra los distintos tipos de rela-
ciones que puede haber atendiendo
a su grado.
.Explica para qué sirve cada uno de
los modelos expuestos en el tema
para el diseño de una base de da-
tos.
.Pon un ejemplo de cada uno de los
tipos de cardinalidades.
.¿Qué son las relaciones reflexivas?
.¿Qué diferencia hay entre ocurren-
cia de entidad y entidad?
. ¿Cuándo una entidad es débil? ¿Y
cuándo lo es una relación?
¿Qué signica que una entidad
fuerte tenga una relación depen-
diente en existencia de otra entidad
débil? Pon un ejemplo.
.¿Cuándo dos entidades tienen de-
pendencia de identicación?
.¿Qué elementos incorpora el mode-
lo entidad-relación extendido?
Dene los siguientes conceptos:
IAtributo Clave
IAtributo Derivado
ISuperclave
IClave Candidata
- Dependencia Funcional
11.
12.
13.
14.
15.
16.
17.
18.
19.
Comprueba tu aprendizaje
- Dependencia Funcional Com-
pleta
IDependencia Funcional Tran-
sitiva
¿Qué diferencia hay entre una es-
pecia.lización total y otra parcial?
¿Qué diferencia hay entre una espe-
cialización exclusiva y otra inclusi-
va?
Crea una lista con los pasosque hay
que dar para pasar un diagrama en-
tidad relación al modelo relacional.
¿Qué esel Álgebra Relacional?
¿Para qué sirve?
Comenta cual es la utilidad de las
restricciones de integridad referen-
cial en una base de datos.
¿Qué esel valor NULO?
¿Qué esuna clave foránea?
Pon un ejemplo de especialización
y comenta 4 formas distintas de ge-
nerar las tablas.
¿Cómo representa MySQL Work-
bench las relaciones? ¿Y las depen-
CAPÍTULO 3
Diseño físico relacional
Objetivos
Ñ
Denir las estructuras físicas de
almacenamiento
Contenidos Crear tablas
@
Herramientas grácas y de Seleccionar tipos de datos ade-
texto proporcionadas por los cuados
SGBD
Denir campos Claves enlas ta-
El lenguaje de denición de da- blas
tos
Implantar las restricciones
es-
Creación, modicación y elími- tablecidas en el diseño lógico
nación de BBDD
Vericación mediante conjun-
Creación. modicación y elími- tos de pruebas
nación de tablas _ _
Uso de asistentes y herramien-
Implementación de restriccio- tas grácas
nes . _ _
Uso del lenguaje de denición
de datos (DDL)
Denir y documentar el diccio-
nario de datos
En este tema se detalla e] proceso de implantación denitiva, o diseño físico,
de la base dedatos en un sistema.informático. Se describe e] uso del lenguaje
SQL distinguiendo las peculiaridades de los principales SGBD.
91
Bases de Datos
3.1. Notación para la sintaxis
En informática, cuando sequiere utilizar cualquier tipo de lenguaje de programa-
ción, se necesita una sintaxis para. denir cómo construir sentencias en eselenguaje
de programación. Para expresar la sintaxis se utiliza una notación. Esta notación
está compuesta por componentes léxicos o tokens. Estos tokens pueden ser palabras
clave del lenguaje, deniciones de otros elementos sintácticos más básicos,expresio-
nes, variables, etc. La notación utilizada en este libro es la siguiente:
92
-Palabras en mayúsculas. Estas son las palabras reservadas del lenguaje. Por
ejemplo SELECT, DROP, CREATE son palabras reservadas, estoquiere decir
que no pueden utilizarse para nombrar objetos de la base de datos porque
tienen una misión especíca.
Palabras en minúscula. Se utiliza para realizar descripciones de sintaxis más
en detalle. Por ejemplo, el token especicacion_de_ltro se puede desplegar en
más deniciones para. realizar ltros en las consultas.
Corchetes. Un elemento sintáctico entre corchetes indica opcionalidad. Es de-
cir, lo que está encerrado entre corchetes se puede incorporar a la sentencia
o no, dependiendo de lo que el programador quiera expresar. Por ejemplo,
en la denición CREATE [TEMPORARY] TABLE, se puedeindicar de for-
ma opcional el token TEMPORARY para crear una tabla temporal, que solo
durará en memoria mientras el usuario permanezca conectado. Si varios ele-
mentos vanseparados mediante
el tokenpipe | , se puede elegiruno deellos.
Llaves. Indica alternativa obligatoria. Se debe elegir entre los elementos se-
parados mediante el token pipe | . Por ejemplo, en la denición de sintaxis
para crearuna basede datos,CREA TE{DA TABASE |SCHEMA}nombre_bd,
hay que escribir uno de los dos token entre llaves. Se puede optar bien por
CREATE DATABASE nombre.bd o por CREATE SCHEMA nombre-bd.
Puntos suspensivos. Signica repetición, es decir, el último elemento sintáctico
puede repetirse varias veces. Por ejemplo, para codicar una consulta se usa
la denición SELECT columna columna] ...FROM tabla. Los puntos sus-
pensivos signican que sepuede repetirel token columna] tantas veces como
se desee.Asi, es posible escribir SELECT Nombre, Direccion, Codigo FROM
Clientes.
3.2.
SGBD
Capítulo 3. Diseño sico relacional
Herramientas grácas proporcionadas por los
Es muy sencillo manipular una basede datos compleja si se disponede un interfaz
gráca de usuario que ayude al DBA, Database Administrator, a enviar comandos
de administración de forma automática y sin necesidad de conocer su sintaxis:
3.2.1. PhpMyAdmin de MySQL
MySQL dispone de un interfaz basada en páginas web llamada PhpMyAdmin,
que a través de un servidor Web, por ejemplo Apache, permite administrar las bases
de datos de un servidor desde cualquier equipo de la red.
íig/Ïgáffslï) LU Servidor: localhost
D
¿gilBase de
datos: ¡ardineria
¡EME o raciones
&#39;
Privilo
ios XEliminar
Base de
datos 1.5 ¡un ¡«khl
¡ardmena (8) V
¡amimna (a) Client-s ¡ S 2"" TÍ >< 3°
E ¿mas DculloPodldos Í¡ Ï-i ÏX 195
2351?? Empleados ÍES É
Ei Ï7 31
g°""°° GamasPmductos E; Si ÏX 1
m? Ocinas É :¿ ÏX 9
Productos p¡g°¡ É Si X 26
Pedidos Í É ÏÍ
l ÏX 115
Productos 73 ii ÍX 375
8
tablals) Número de filas 7"
t Marcar todos/as
IDesmarcartodos
&#39;._ Vista
de ÍmDFESlO
3, Dncoonano
de datos
Nombre:
¡g
Crear nueva tabla en la base de datos jardineria
ve
lnnoD
lnn
lnnoD
Bases de Datos
3.2.2. Oracle Enterprise Manager y Grid Control
El SGBD Oracle dispone de dos herramientas grácas, ambas con interfaz web
y montadas sobre un servidor web propietario de Oracle.
Enterprise Manager. Esta herramienta está incorporada directamente en el soft-
ware de Oracle, y es congurada por el asistente de creación de base dedatos.
Es capazde manipulartodas lasfunciones básicas
de unabase dedatos (crea-
ción detablas, usuarios,exportación eimportación deinformación, etc.)
Archivo Editar
yet Hostnnal
Marta Herramimxas
nda
¿a v a ¿a ¡(till/aluníoesk(ooilïsaiem/Snsoleíciambase/i
nstoncïeIs:Kcrnapïeveniéaouzadmargewnbaïá umricasryp
A
v ÏClv .;
ORACLE Enlernnse
Manager Hg >@A"&#39;
&#39;
&#39;
-&#39;--°""""&#39;
5-4" ¡hïï-h
&#39;"
z
- -. v- Base un
Datos
Cvweïiaoa ti:
f»C
Ji-J.
Instancia de
Base de
Datos: nbaalumno
Inido Rorrlodo Dasïnnhaaa Senasa
Esouema Mov
monto ne
Dam; Soítwme
¡ Sie
=a.. =c-rb;;:nu; -jurv-QOHJ
¡Mu cast 9,5,5", vovDatos Marais-Juanma
ng; v
General CPU del Host Sesiones Aciivas Tiempo de
Respuesla SOL
e - &#39;
10a: 4.o 1.o
Estan Activo 75
l ultima Recgglacnon
IEsaa I
Activa msm
¡Han-EW 1G!!!
CES?
5o Otros ¡o IE Cy
USM" 0,5 sgyucs
Namnmlo ¡maru
nn Irma ¡ Recgglacrrr
de
¡mm "¿min 25 í REWHGÜCAB segundos
Ha! anumwcesnzg 0
°-° °-°
u USFENER alumno
Cvl 2; ¡unieron tg Romano Banco
|tiempo oe Respuesta
sol. mi
ya)
Ve, ¿mas
mm
ma: Emu. Pecopulacum
ae Peruana:
Resumen de
Diagnostico: Resumen ue Espacio Alla Disponibilidad
Log
un
Novus No m,
m3.: evvov
DRA Tamaño oe la
Base de
Onzas
(GB) ïconsola Detalles
¡mans Mm, o
g rn-spaces Pvuiofndtcu
g _
namas ¡horacio nl
pm. su cm. 9
Roca-mucosas no! Autor
un segmentos
g umma cop-a oo
509mm wo
¡W801i OI
¡d&#39;un
4
C Rogsno
du
numericun San
on Dans
Desaczwnca
m. no vanesa:
una en rs
V
Alertas
Categoria Tono
"n Cvmu oAmancio o
4 _
Tennmado &#39;
&#39; &#39; " " &#39; &#39;
alunm-deskmpzusa a
Figura 3.2: Enterprise Manager de Oracle.
<> Actividad 3.1: A través de
una máquina
virtual conun sistema
operativo
de tipo Linux, por ejemplo, Ubuntu, instala los paquetes de mysql server y los
paquetes de phpmyadmin. Para ello, escribe en un terminal el comando sudo
apt-get install mysql-server y después, el comando sudo apt-get ins-
tall phpmyadmin. Es posible que antes de realizar esta operación necesites
actualizar el repositorio de paquetes mediante el comando sudo apt-get up-
date. Selecciona que la instalación congure phpMyAdmin automáticamente
para apache y
escribe una. contraseña de usuario. Cuando termine la instala-
ción, ya puedes abrir un navegador en la máquina virtual y escribir la dirección
9-1
Capítulo 3. Diseño físico relacional
http: 127 .O. O.1phpmyadminindex.php. Introduce el usuario phpmyad-
min y la. contraseñaque hayasescrito en la conguración. Finalmente, explora
las opciones que te da la interfaz de usuario. Si lo preeres, puedes descargar
del blog del libro la máquina virtual de prácticas, donde ya está instalado
mysql-server y phpmyadmin. Crea una base de datos que contenga dos tablas
de la temática que elijas.
<>
Actividad 3.2: Arranca el Enterprise
Manager de
la máquina
virtual de
prácticas (Linux) y accedeal servidorweb paraconsultar cadauna delas pes-
tañas de las que dispone y examinando la información de la base de datos que
te proporciona. Abre un terminal y con el usuario oracle, utiliza el comando
emctl start dbconsole para arrancar el enterprise manager. A continuación,
escribe en un navegador de internet la dirección http:1oca1host:1158em
o directamente pulsa dos veces en el enlace que hay en el escritorio. En el
cuadro de usuario y password introduce SYSMAN y manager.
Grid Control. Se ha de instalar aparte del software de Oracle. Permite gestionar
múltiples bases de datosen diversosservidores, permitiendo consultar el estado
y rendimiento de todas y cada una de ellas.
ORACLE Enterprise Manager 10g - asume:
mu i Flill!" Destinos Despliegues Alertas Politicas Trabaos Informes
Busqueda deDestino
V¡s¡°n Gener Buscar
ÏWÉW ____s
_,_ __
h, ____
_, _ _
o _
Total de
Destinos Controlados
12
551m0 (¡e
10305105 Desunos Violaciones de
Poimca de
Seguridad
Crítico
x .i_6
Advenencia a
informativo i 2
trueno en
las Últimas
24 Horas 1
IAgiirg
Asesores de
Parches Criricos
para Directorios
Raiz de
Oracle
Asesores de
Parches
0
Directorios Raiz
de Oracle
Afectados
O
credenciales de
Oracle rAetaLink
ugC
gng ¿vagas
Alertas de
Todos los
Desimcis
Critico x 1
Advertencia á)1
RÉS"EEÉÉ"ÉÏ&#39;ÏÉEÏÏ_, ,__,__
,%,,_W
Errores En 0
Ver Instalaciones de
Base de
Datos v
Jiolaciones de
Poliiica rie
Todos los
Ziesrinas
Cnïico X
AÜIEWEWCÉ ¿IB
L. Insialacioiies de Base
de Daios
¡"fmmalm i Z Oracle Daiabase 10g
10 1
04
0
Trabajos de
Todos los
Destinos onde amaba 19g1o2
o 3 o
Eiecuciones problemáticas
[últimos 7
días) J
0
Ejecuciones suspendidas
(últimos
7
días) «r 0
Figura 3.3: Grid Control de Oracle.
95
Bases de Datos
Ambas herramientas son extremadamente pesadas en términos de Consumo de
recursos, por lo que en muchas ocasiones seha de administrar la base de datos sin
su ayuda.
3.2.3. DB2 Data Studio
Este software sustituirá en un futuro próximo a una herramienta más antigua
llamada Control Center. Permite manipular los objetos de bases de datos DB2 e
Informix y sus permisos. Soporta la administración avanzada de DB2 tanto en Win-
dows comoen Linux, y simplica la construcción de consultas SQL. Su gran potencia
es que facilita la creación de Servicios Web que distribuyen datos de consultas SQL
a las aplicaciones cliente.
Q
Database Administration
-.sqlxeditor_projectlscript1
.sql -|BM Data
Studio
Edu hawgete
Serán Prayer.
Szrot ama-a.
web
" &#39;
a
_= g
Optrrsoluuorvs Vi&#39;
&#39;_
&#39;
&#39;
&#39;,&#39;
;&#39;
&#39;
5533:: SOJYCE
E1301? u ÏL; Sanmsqi L3
j- L ¿i Í: ¿su &#39; 7 :e.e:: &#39;
:::.-:. =.-r:_:;-.:::
a-._-:-::a:es:CÏ:e::a"s p &#39;¡3; (v; -;
¿,4 .&#39;..-
71- - -
. - Re se".
-e
r- a!54-95 ¿EMV
xxx. La.
en: &#39;..
-::r: s
m7, L Sa! c? -5
; @
Leste-te
i -I, s&#39;-&#39;-&#39;=&#39;.s s-ac 2- ázosw-t. o
l 0 _
Se? Does
9 =e:e&#39;a&#39;.e: 3855552
Dsgens
v _
mas
r b ¡este 95-2-59:
l o _
951m" 61.95 ,
: v
__ ioes 1m- v
| ,- __ Srras irse-e o
! n- -.. u
¡ &#39;
" l-¿ï -Reaeze D
i o _&#39;
n
ases _
Ír Q: mae-ces "ereñm"&#39;
593W??? Crzrt-ssss: (vr-Saez
l &#39;
* "ha" Caer-z: Cr -S&#39;=::»S:sa:e
5 * _
"T5 =o--a::-Q- c:- -sw=-.=
| &#39;
_&#39;
em-nes ogeca-m-v: Caro:
| o D
SW 95-25-95 ._ . . .... ...
. - x- -a a
.e ¿esquema ¡SV
.3:
l o
_, Se:.r:es
¡ ,5:, 5,01;, .62 ¿envase soñaste»...
&#39;
"m _ q .-
:1
| -_ ¿ves " "V
y , -¿C- _ Se:S:a2-"e":&#39;e-".-.e::&#39;
E , ÏCrko; ¡C1 xaiceze eve
ïlee&#39;e&#39;*:es
Figura 3.4: Interfaz de Data Studio para DB2.
<> Actividad 3.3: De la páginaweb httpJ/www-Ol. ibm.com/software/data/
db2/ descarga el DB2 express. Deberásregistrarte para poder descargar tres cheros:
db2exc_971_WIN_x86.zip
ibm_data_studio_standalone_win.zip
db2exc_vsai_971_WIN_x86.exe
96
Capitulo 3. Diseño fisico relacional
Para arrancar el asistente de la instalación. haz doble clic sobre db2exc_971_WIN_
x86.zipEXPCimagesetup.exe, pulsa sobre Instalar un producto y sigue los
pasos delasistente para realizar una instalación típica. Una vez nalizada la instala-
ción, con el Editor de mandatos,ejecuta el comando list db
directory para comprobar
alguno de sus parámetros.
É mznwruvaapamuaro b .3 -ra-e".esaeac-<wsrazóc eme-a
b
a r Bo
l a -r&#39;*a*ie-:as
se zcrFgxazóo
D
&#39;
I i l- P
l
a ...,...,...a¡_......... .
l Eawdemmdatos
Seleccionado Eater
ver HenmertasAwda , _ _ V
i
¡ m1
Q V_ _
h j erre-zas
se smc-uso- . a ¡"resaca-carmen
ce virutas
l
n i i _ A w
J ". ¡va , &#39;
i
1- Ü 71- & E; J
A ®
H :3 hñvnuoe ¡[IQ ueezawecemrsatos
l
Maristas
línia-m viaáémraeü
y
las: db dxzcczozï
Minera decnctadAx en
dxrcccorxe I1
lnzrad; J. dc han de datos:
Íuna: dc bno de datos ISAMPLE
Xíonbxc de
base dedatos ISLIM!
Dztoctorio dolanus duos Locuu - C:
Plural {alonsodc basodl datos r(1.00
Figura 3.5: Editor de mandatos para DB2.
El consejo del buen administrador. . .
Muchos administradores solo conocen las herramientas grácas de gestión y
administración de una basede datos, puesto que es máscómodo y más intuiti-
vo, y además, aprenderlos lenguajes de programación de basesde datos es una
tarea difícil y laboriosa. Sin embargo, conocerlos comandos y las instrucciones
que proporciona un SGBD,
otorga una visión extra que posibilita automatizar
tareas rutinarias y permite solucionar problemas que no se pueden solucionar
solo con las herramientas grácas. A
un administrador que conoce ala perfec-
ción todos estos comandos,le resulta muy sencillo actualizarse en los continuos
cambios de versiones enestas herramientas grácas.
3.3. Intérpretes de comandos de los SGBD
La utilidad principal de un SGBD es su intérprete de comandos. Es una aplica-
ción cliente cuya única misión es enviar comandos al SGBD y mostrar los resultados
devueltos por el SGBD en pantalla. El cliente del servidor lIySQL (mysql-server)
se llama mysql, el de Oracle se llama sqlplus y el de DB2 se llama db2. Para invo-
97
Bases de Datos
carlos desdeel sistema operativo (Windows o Unix), tan solo hay que escribir en un
terminal su nombre con ciertas opciones.
3.3.1. MySQL: El cliente de MySQL-Server
mysql
[options] [database]
options:
--help Visualiza la ayuda
{-p I --password}[=frase] Password con la que se conecta
{-P I --port}[=numero] Puerto TCPIP remoto al que se conecta
{-h I --host}[=numero] Nombre Host o IP al que se conecta
{-u I --user}[=usuario] Usuario con el que se conecta
{-s I --socket}[=nombre_fich] Fichero socket con el que se conecta
#ejemplo típico:
mysql -u root -p
Enter password: *********
Welcome to the MySQL monitor. Commands end with ;or g.
Your MySQL connection id is 37
Server version: 5.0.75-Oubuntu10.2 (Ubuntu)
Type help; or h for help. Type c
to clear the buffer.
El comando puede ir acompañado de dos tokens opcionales, options, que permite
especicar una serie deparámetros de conexión y database, queespecica en qué base
de datos se ejecutarán los comandosintroducidos. Las opciones queaquí semuestran
son soloalgunas delas disponibles, para más información consultarla documentación
de MySQL:
ILa
opción help
muestra un
resumen de
las opciones
disponibles.
- La opción -u o user permite especicar el usuario de conexión, por ejemplo
-u paco.
- La opción -p o password permite introducir un password para la conexión
del usuario. Se puedeescribir -p frase_password osolo -p para que el gestor la
solicite y la oculte con asteriscos para que nadie pueda espiar.
ILa opción -h o host permite seleccionar el host donde está el gestor de basede
datos. Puede ser localhost o 127.0.0.1 si la base de datos está en el ordenador
98
Capítulo 3. Diseño sico relacional
local y se deseaconectar vía tcp-ip u otra dirección IP. Si se omite, por defecto
se conecta al servidor por named pipes (o tuberías con nombre) que no salen
a la interfaz local de la tarjeta de red y son mecanismosde comunicación más
rápidos, pues son internos al ordenador.
n La opción -P o p permite especicar el número de puerto al que conectarse (si
se conectavía TCP-IP al ordenadorremoto). Si no seindica esteparámetro,
por defecto se conecta al puerto 3306.
- Permite especicar el nombre del socket por defecto. esto será necesariocam-
biarlo cuando exista más de una versión del gestor debase dedatos ejecutando-
se en un ordenador.
A continuación se muestran unos cuantos ejemplos de conexión:
#conexión sin usuario y password (se conecta como anónimo y sin password)
mysql
#conexión con usuario y password (se conecta como root y su password )
mysql -u root -p
Enter password: *********
#conexión con usuario y password en claro a la base de datos jardineria
mysql -u root -pPasswordDe1Usuario jardineria
#conexión con usuario y password en claro a la base de datos jardineria
#
del host 192.168.3.1OO
mysql -u root -pPasswordDe1Usuario -h 192.168.3.1OO jardineria
#conexión con usuario y password en claro a la base de datos jardineria
# del host 192.168.3.1OO con puerto 15300
mysql -u root -pPasswordDe1Usuario -h 192.168.3.1OO jardineria -P 15300
3.3.2. Ejecución de consultas en MySQL
Para ejecutar una consulta, tan solo es necesario arrancar el cliente mysql y
conectarse a una base de datos del gestor. A continuación, escribir en la consola el
comando SQL que se desea ejecutar y se obtienen los resultados. Cuando una línea
es precedida. del carácter #, el resto de la línea se ignora. Estas líneas se llaman
comentarios y son útiles para documentar las acciones realizadas. Por ejemplo:
99
Bases de Datos
itselecciona la version del gestor y la fecha actual
mysql> select version() ,current_date();
+
------------------ --+ -------------- --+
I version() I current_date() l
+
------------------ --+ -------------- --+
I 5.0.75-Oubuntu10.2 I 2009-8-20 I
+ ------------------ --+ -------------- --+
1
row in set (0.00 sec)
Este comando ilustra distintas cosas:
IUn comando consiste en una sentencia SQL terminada en punto y coma.
ICuando se escribeun comando, mysql lo manda al servidor para que lo ejecute,
muestra los resultados y vuelve al prompt, indicando que está listo para recibir
más consultas.
IMuestra los resultados en forma de tabla (las y columnas). La primera fila
contiene las etiquetas para las columnas y las las siguientes muestran los
resultados de la consulta.
n
Muestra las las devueltas y cuánto tiempo tardó en ejecutarse, lo cual puede
ofrecer una idea de la eciencia del servidor, aunque estos valores pueden ser
imprecisos puesdependen demuchos factores,tales como la carga del servidor,
velocidad de comunicación, etc.
Las palabras claves pueden ser escritas en mayúsculas o minúsculas, y los identi-
cadores detabla, campo, índice, etc son sensitivos a las mayúsculas y minúsculas en
las versiones
de unix (no asíen Windows).Por ejemplo,las siguientes
consultas son
equivalentes:
mysql> SELECT VERSIÜNO ,CURRENT_DATE();
mysql> SELect version() ,current_Date();
mysql> select version() ,current_date();
Es posible escribir más de una consulta por línea, siempre y cuando estén sepa-
radas por punto y coma:
mysql> select userOzselect nowO;
+ -------------- --+
I user() I
+
-------------- --+
I rootmocalhost I
+ -------------- --+
Capítulo 3. Diseño físico relacional
+
------------------- --+
I now() I
+ --+
I 2009-10-20 09:53:29 I
+ ------------------- --+
No es necesario escribir un comando en una sola línea, así que los comandos que
requieran de varias líneas no son un problema. MySQL determinará donde naliza
la sentencia cuando encuentre el punto y coma, no cuando encuentre el n de línea:
mysq1> select user() ,
-> current_date();
+ -------------- --+ -------------- --+
I user() I current_date() I
+ --+ -------------- --+
I root©1oca1host I 2009-10-20 I
+ -------------- --+ -------------- --+
Si no se deseaterminar de escribir la consulta, por ejemplo, por haber cometido
un error en la sintaxis, se escribe para terminarla sin ejecutar:
mysq1> select
-> user(),
-> c
mysq1>
El prompt se comunica con el usuario dándole información sobre qué ocurre, por
ejemplo:
-> Espera la siguiente línea del comando
> Espera que se cierre una comilla sencilla
"> Espera que se cierre una comilla doble
mysq1> Listo para una nueva consulta
Otra forma de ejecutar comandos SQL es almacenarlos en un chero de texto y
mandarlo a ejecución mediante el comando source, que recibe como parámetro un
chero de comandos y ejecuta uno por uno todos los comandos que tenga el chero:
átejecución del script de creación crear_bbdd_startrek.sq1
mysq1> source /home/ivan/crear_bbdd_startrek .sql
Por último, también es posible ejecutar los comandos de un chero de texto
desde la shell, esto es, en modo batch. redirigiendo al cliente mysql un chero de
entrada. Esto es útil para tareas administrativas donde se ejecutan varios cheros
«le comandos, además de otras tareas de maxitenimiento del servidor a través de un
shell script:
101
Bases
de Datos
#ejecucion en modo batch
"S mysql -u root -pPassWdUsuario <crear_bbdd_startrek.sql
#ejecucion en modo batch almacenando resultados
"S mysql -u root -pPasswdUsuario <crear__bbdd_startrek.sq1 >resu1tado
<> Actividad 3.4: Descarga
de lapágina Web
de lIySQLla últimaversión disponi-
ble para Windows. A continuación. instala el software. Asegúrate de recordar la clave
que eligespara el usuario root. Ejecuta la interfaz de comandos demysql. Podrás ha-
cerlo desdeun terminal de MS-DOS (símbolo del sistema) o desde elmenú de inicio.
Ejecuta una consulta para ver el usuario con el que te has conectado, la versión de
base de datos y la hora actual. Realiza las mismas consultas en la máquina virtual
Linux disponible en el blog del libro (http:bbdd-garceta.b1ogspot .com)
3.3.3. SQL*Plus: El intérprete de comandos de Oracle
El intérprete de comando de Oracle es el programa sqlplus. Se puede invocar
desde el sistema operativo con la siguiente sintaxis:
sqlplus [{usuario[/password>] [©<identificador_conexión>] | /| /no1og }]
[AS {SYSDBA I SYSOPERH
En Oracle, cada instancia está referenciada por uno o más identicadores de
conexión. ÍdGTZÉÍCGdOTLCOTLCIÍÓTZ
es el nombre de esta referencia.
#conexión a la instancia jardineria con el usuario paco
sqlplus paco/password_paco©jardineria
La opción /nolog arranca sqlplus sinconectarse a
la basede datos.
#arrancar sqlplus sin conexión
sqlplus /nolog
La opción/conecta a la instancia sinusuario. Suele
usarse para
tareas adminis-
trativas:
#conexión a la instancia SÜRACLE_SID como SYSDBA
sqlplus /as SYSDBA
Cada usuario se puedeconectar representando un rol: estos roles son el de adminis-
trador de la base de datos (SYSDBA) y operador de base de datos (SYSOPER).
SYSDBA y SYSOPER tienen privilegios para conectarse a la base de datos cuando
no está abierta, pudiendo de este modo. realizar tareas de administración y mante-
nimiento.
102
Capítulo 3. Diseño sico relacional
3.3.4. Ejecución de consultas en SQL*Plus
Al igual que en MySQL. una vez conectado sqlplus a una base de datos con un
usuario, passwordy nombre de servicio, se procedea escribir las consultasterminadas
en punto y coma, con las siguientes consideraciones:
ISQL*PLUS no es sensible a mayúsculas y minúsculas ni en las palabras reser-
Vadas, ni en los nombres de los objetos.
ISe puede escribir una consulta en múltiples líneas:
SQL> select *
2 from
3 nbajugadores; "comentario de línea
- Los comentarios de línea se realizan precediendo una línea de dos caracteres -
IExisten los comentarios de bloque. es decir, que afectan a más de una línea.
Comienzan con los caracteres /* y
terminan con los caracteres */
n Existe una tabla llamada Dual que está disponible para todos los usuarios, y
sirve para seleccionar variables del sistema o para evaluar una expresión:
SQL> select sysdate, user from dual;
SYSDATE USER
27/06/10 SYS
SQL> select 5+4 from dual;
5+4
¿Sabías que . . . 7
Existe un intérprete
de comandos
gráco en Oracle lla-
mado iSQL*Plus. con interfaz web. Se instala aparte del software de Oracle,
descargando de la página Web de Oracle (wvvv.oracle.com) el paquete isql-
plus.zip.
<> Actividad 3.5: Arrancala máquina
xirtual Ubuntuy
abre un terminal.
Conécta-
te con el usuario oracle mediante el comando:
103
Bases de Datos
su
oracle
Contraseña: oracle
A
continuación, arranca
sqlplus con el
usuario nba
y la passwordnba:
sqlplus nba/nba
Después, ejecuta las siguientes
consultas:
SQL> select tab1e_name from user_tab1es;
SQL> select tab1e_name from dba_tables;
Lee la
sección 3.8.5 y
comenta brevemente
qué hacenlas sentencias
anteriores
y en
qué se
diferencian.
3.4. El
lenguaje de denición de datos
El
sublenguaje de SQL que permite la
denición de datos es el DDL (Data
Denition Language).
Las
funciones de estesublenguaje son:
- Crear tablas,
índices y
otros objetos
de la base
de datos
(como vistas,
sinóni-
mos, etc.)
n Denir lasestructuras
físicas donde sealmacenarán
los objetosde lasbases
de
datos
(espacios de tablas(tablespaces),
cheros
de datos (datales), etc.)
Por
ejemplo, para crear
el esquemade la
práctica resuelta 2.1
se puede escribir
el siguiente código:
CREATE TABLE Actores(
Codigo INTEGER PRIMARY KEY,
Nombre VARCHAR(40),
Fecha DATE,
Nacionalidad VARCHAR(20),
CodigoPersonaje INTEGERREFERENCES
PERSONAJES(Codigo)
);
CREATETABLEPersonajes(
CodigoPersonaje INTEGER,
Nombre VARCHAR(30),
Raza DATE,
Grado VARCHAR(20),
CodigoActor INTEGERREFERENCES
Actores(Codigo),
Codigosuperior INTEGERREFERENCES
Personajes(Codigo)
J;
104
Capítulo 3. Diseño sico relaciona]
En el código anterior, las palabras reservadas del lenguaje se han escrito en
mayúsculas (CREATE. DATE, VARCHAR). y
los nombres deobjetos (Actores,
Grado, Nombre) se han escrito en minúsculas para que el lector pueda identicar
fácilmente qué parte de la sintaxis se debe respetar y
cuál se puedevariar.
DDL tiene 3 instrucciones básicas:
CREATE tipo_objeto Nombre Denición. Crea un objeto de un determinado
tipo (DATABASE, TABLE, INDEX, etc.) con un nombre (por ejemplo Actores
o Personajes)y una denición (CodigoPersonaje, Nombre, etc.).
DROP tipo_objeto Nombre. Elimina un tipo de objeto especicado mediante
un nombre. Por ejemplo, la sentencia DROP TABLE Actores, borraría de la
base de datos la tabla Actores junto con todos sus datos.
ALTER tipo_objeto Nombre Modicación. Modica la denición de un obje-
to. Por ejemplo, la sentencia ALTER TABLE Actores DROP COLUMN Fecha,
eliminaría la columna Fecha de la tabla Actores.
3.5. Creación de bases de datos
3.5.1. Creación de bases de datos en MySQL
En MySQL, para crear una base de datos se usa el comando CREATE DATA-
BASE:
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] nombre_db
[especificación_create [, especificación_create] ...]
especificación_create:
[DEFAULT]
CHARACTER SET
juego_caracteres
I [DEFAULT] CDLLATE nombre_co1ación
Por ejemplo, para crear la base de datos Startrek, en MySQL, habrá que teclear,
en la consola de comandos, la instrucciónl:
CREATE DATABASE Startrek CHARACTER SET Latinl CDLLATE 1atin1_spanish_ci;
Nótese que el término a elegir puede ser o DATABASE o SCHEMA, en cualquier
caso, el efecto es el mismo; MySQL usa algunos sinónimos para hacer más compa-
tible su sistema de gestión con otros SGBD. Por otro lado, el parámetro opcional
lTodas las sentencias mysql
deben terminaren un carácter puntoy
coma (2)
105
Bases de Datos
(especicación_create) permite elegir el juego de caracteres que va a usar la base de
datos (utf8, latinl, latin2, etc.), y la colación, que especica cómo tratar el alfabeto
del juego de caracteres, es decir, cómo seordena (por ejemplo, la ñ después de la m
y n y noconforme a
la tablade códigos
ascii), ycómo se
comparan los
caracteres
(por ejemplo,si A es iguala á)
Para poder utilizar una base de datos, primero hay que establecer que las opera-
ciones que se realicen a continuación se realicen sobre esta, es decir, hay que usarla.
Para usarla se utiliza el comando USE dbmame
Por ejemplo, para empezar a manipular la base de datos Startrek, habrá que
ejecutar el comando USE Startrek;
Otro comando muy útil para ver cuántas basesde datos está controlando el gestor
es el comando SHOW DATABASES, que obtiene un listado de las bases de datos
activas en el servidor.
mysql> snow DATABASES;
+
------------------ --+
I Database I
+ ------------------ --+
I information_schema I
I Startrek
I mysql
+ ------------------ --+
Tras la ejecución de este comando se puede ver que, además de NBA y Star-
trek, hay otras dos que están siempre presentes, "information_schema y mysql que
almacenan metadatos (datos sobre los datos) e información de usuarios y permisos.
<> Actividad 3.6: Ejecuta los siguientes
comandos en
la máquina
virtual Ubuntu
para crear una base de datos y una tabla:
mysq1> CREATE DATABASE Veterinario;
mysq1> USE Veterinario;
mysq1> CREATETABLE Mascotas (
Nombre VARCHAR(10),
106
Capítulo 3. Diseño físico relacional
FechaNacim DATE,
Amo VARCHAR(40) );
A continuación, prueba a crear una tabla llamada Vacunas, con una fecha y una
ilüfa para cada mascota. Si es necesario, leela Sección 3.8
3.5.2. Creación de bases de datos en Oracle
El proceso de creación de una base dedatos en Oracle esbastante más elaborado.
En MySQL, una sola instancia controla todas las bases de datos, pero en Oracle,
¡ada base de datos está asociada a una. instancia. Una instancia es el conjunto de
procesos de Oracle que están en ejecución en el sistema operativo y cuya misión
es controlar todo lo referente a la gestión de la base de datos. Para crear una base
de datos,primero hay que crearuna instanciapara procedera invocar el comando
«reate databasepertinente. Oracle dispone de la utilidad gráca dbca (database con-
guration assistant )que facilita este proceso. No obstante, a continuación se detalla
el procedimiento para crear una base de datos Oracle en un sistema operativo Unix
de forma manual:
#desde el sistema operativo
su oracle #conecta con el usuario oracle
cp SORACLE_HOME/dbs/init.ora SÜRACLE_HDME/dbs/initjardineria.ora
export 0RACLE_SID=jardineria #se conectará a la instancia jardineria
#editar los parámetros del fichero init que contiene los parámetros de
#inicio de la base de datos.
#Debe llamarse con el nombre initNombreInstancia.ora
gedit SORACLE_HUME/dbs/initjardineria.ora
#cambiar los siguientes parámetros
db_name=jardin
memory_target=100M
processes
=
40
audit_file_dest=/var/oracle/product/11.2.0/
audit_trail
=db
db_b1ock_size=8192
db_domain=
Bases de Datos
--dentro de SQL PLUS, conectarse sin montar la base de datos
SQL> Startup nomount
ORACLE instance started.
Total System Global Area 104611840 bytes
Fixed Size 1334828 bytes
Variable Size 83886548 bytes
Database Buffers 16777216 bytes
Redo Buffers 2613248 bytes
--a continuación, se invoca el comando CREATE DATABASE
SQL> CREATEDATABASE
jardin
MAXINSTANCES 1
MAXLÜGFILES 16
MAXLÜGMEMBERS
3
MAXDATAFILES 100
CHARACTER SET WE8ISO8859P15
DATAFILE /var/oracle/datos/jardineria/system01.dbf
SIZE 300M EXTENT MANAGEMENT LOCAL
UNDO TABLESPACE UNDOTBSI DATAFILE
/var/oracle/datos/jardineria/undotbsol.dbf
SIZE 550M SYSAUX DATAFILE
/var/oracle/datos/jardineria/sysauxol.dbf SIZE 300M
DEFAULT TEMPORARY TABLESPACE TEMP
TEMPFILE /var/oracle/datos/jardineria/tempO1.dbf SIZE 100M
LDGFILE GROUP1 (/var/oracle/datos/jardineria/redoO1.1og)
SIZE 512OOK,
GROUP
2 (/var/oracle/datos/jardineria/redo02.log) SIZE 51200K,
GROUP
3 (/var/oracle/datos/jardineria/redo03.log) SIZE 5120OK;
>Database created.
--Finalmente, se crea el catalogo de metadatos
SQL> Q/rdbms/admin/Catalog.sql
SQL> G/rdbms/admin/catproc.sq1
SQL> G/rdbms/admin/ut1rp.sq1
Las opcionesde
CREATE DATABASE para Oracle sonlas siguientes
I MAXINSTAN CES indica el número máximo de instanciasque puedenestar
usandoa la vez la basede datos objeto de la creación.Un valor distinto de
1 implicaría que la.basede datos puedeser usadaen RAC, Real Application
Cluster, lo cual signica que la basede datos puedeestar montada, abierta y
en uso desde más de un servidor.
- MAXLOGFILES esel númeromáximode gruposde cheros de logquepueden
crearse.Un chero log registratodaslasoperaciones
querealizan losusuarios.
I INIAXDATAFILES indica el númeromáximo de cheros de datos que pueden
usarse.
- DATAFILE esel chero para el tablespaceSYSTEM.
108
Capítulo 3. Diseño físico relacional
MAXLOGMEMBERS es el número máximo de cheros de los miembros de
un grupo. Los cheros log se combinan en grupos.
UNDO TABLESPACE es el tablespace que almacenará los datos originales
presentes encualquier tabla o índice antes de hacer cualquier transacción que
suponga una modicación sobre aquéllos.
SYSAUX TABLESPACE es unnuevo tablespaceaparecido enla versión 10g de
Oracle que permite independizar de SYSTEM objetos de aplicaciones, como el
Enterprise Manager, que antiguamente se alojaban en el tablespace SYSTEM.
DEFAULT TEMPORARY TABLESPACE es el tablespace temporal que uti-
lizarán los usuarios que no tengan explícitamente asignado otro tablespace
temporal.
LOGFILE GROUP es la denición de los grupos de cheros log.
CHARACTER SET especica el juego de caracteres que la base de datos.
utilizará para almacenar los datos (por ejemplo el WE8ISO8859P15 es el juego
que incluye todos los caracteres presentesen los idiomas de Europa Occidental,
incluyendo el signo del euro, ¬, acentos y la
Todo este farragoso proceso se puede simplicar utilizando el asistente de crea-
ción de base de datos de Oracle (dbca, database conguration assistant). Este asis-
tente conduce al administrador automáticamente por el proceso de creación de una
instancia con su base de datos. Además, congura automáticamente un repositorio
para poder ejecutar Enterprise Manager. Para invocar este asistente tan solo hay
que escribir en un terminal de un sistema operativo el comando dbca.
<>
Actividad 3.72 Abre la máquina
virtual Ubuntuy conun terminal,haz login
con el usuario oracle(su oracle).A
continuación, ejecuta elcomando dbcay sigue
los pasospara Crear una nueva instancia y su base de datos asociada.
109
Bases de Datos
---&#39;.&#39;...L.:u.a
v- dagu" 2&#39; LIaLgJL"
¿ÏJJUJLI3""1&#39;J"
Seleccione
laoperación
quedesea
realizar
i crear
Base
deDatos
l ::n:&#39;:
:: >_-
z tul&#39;
I&#39;m-n"
:1 ;;=&#39;»
r Gestionar
Plantillas
Í Las
operaciones
de
conguración
de
ASM
se
pueden
realizar
mediante
el
Asistente
. &#39;
deConguración
deGestión
deNmacenamiento
Automático
(ASMCA)
desde
el
directorio
raízde9nddeOracle.
Cancelar 44 AWÜG
Figura 3.6: Database Conguration Assistant.
3.6. Modicación de una base de datos
El comando
ALTER DATABASE permite cambiarlas característicasde funcio-
namientode una basede datos.Por ejemplo,en MySQL. tan solosepuedecambiar
el juego de caracteres
y su colación:
#cambia la colación de una base de datos
ALTER DATABASEStartrek COLLATE latin1_spanish_ci;
En Oracle, se puede cambiar cualquiera de sus múltiples parámetros, aquí se
muestranalgunosejemplos:
--Cambia el tamaño del fichero de datos del sistema
SQL> ALTER DATABASE DATAFILE
/var/oracle/datos/jardineria/systemoi.dbf&#39; SIZE 1G;
--Cambia el modo de acceso a la base de datos a solo lectura
SQL> ALTER DATABASEopen read only;
-Desactiva la opción de recuperación rápida
ALTER DATABASE flashback off;
110
Capítulo 3. Diseño sico relacional
3.7. Borrado de bases de datos
El comando DROP DATABASE es el utilizado para eliminar bases de datos. En
INIySQL, el comando se acompaña del nombre de la base de datos a eliminar:
>mysq1 -u root -p
drop database Proveedores;
En Oracle, no hay que especicarlo, tan solo es necesarioconectarse ala instancia
y escribir:
>sq1p1us /as sysdba
shutdown abort; --parada de la instancia
Startup mount exclusive restrict; --reinicio en modo exclusivo
drop database; --borrado
exit; --salir
Otra forma menos elegante de borrar una base de datos consiste en borrar físi-
camente todos los cheros binarios de la base de datos.
3.8. Creación de tablas
Para crear tablas se usa el comando CREATE TABLE:
CREATE [TEMPDRARY]
TABLE [esquema.]nombre_tab1a
[(definición_create, . ..)]
[opciones_tab1a]
def inición_create :
definición_columna
I [CÜNSTRAINT [símbolo]] PRIMARY KEY (nombre_co1umna,...)
I [CÜNSTRAINT [símbo1o]] FDREIGN KEY (nombre_co1umna,...)
[def inición_referencia]
definición_co1umna:
nombre_columna
tipo_datos [NOT
NULL l
NULL] [DEFAULT
valor]
[UNIQUE [KEY] Í [PRIMARY] KEY]
[def inición_referencia]
definición_referencia:
REFERENCES
nombre_tab1a [(nombre_columna,
...)]
[ON DELETE {CASCADE I SET NULL I NO ACTION} ]
[ON UPDATE {CASCADE | SET NULL I ND ACTION} ]
111
Bases
de Datos
El formato que aquí se presentaes unformato reducido, compatible con la mayoría
de los gestores debases dedatos, para más información sobre un comando CREATE
TABLE para un gestor en particular, se debe recurrir al manual de referencia del
gestor.
La porciónde sentencia
(denicióïncreate, .. .)especicará. ladenición de los cam-
pos que va a contener la tabla y sus restricciones. Los puntos suspensivos sugieren
que denicióïucreate se puederepetir tantas veces comosea necesario,por ejemplo
si hay una tabla con 5
columnas, habrá que especicar 5 veces denición_create.
El token opcional TEMPORARY se utiliza para crear tablas temporales(esto
es, una tabla invisible al resto de usuarios y que se borrará en el momento de la
desconexión del usuario que la creó). La primera cláusula que lleva la denición es
denicióïncolumna, donde se especicará la denición de un campo o columna de la
tabla:
definición_co1umna:
nombre_columna
tipo_datos [NOT
NULL I
NULL] [DEFAULT
valor]
[UNIQUE [KEY] I [PRIMARY] KEY]
[definicióngreferencia]
Se indica el nombre de columna y
el tipo de datos, por ejemplo, el Codigo Postal
podría ser un tipo NUMERIC(5,0) de MySQL, puesto que los códigos postales
tienen 5 dígitos enteros y O decimales.
NOT NULL y NULL especican que la columna admite o no admite valores nulos,
es decir si un campo puede quedar sin valor, o con valor desconocido.
DEFAULT indica el valor por defecto que toma el campo si no es especicado de
forma explícita. Por ejemplo, si se declara la. siguiente columna:
CodigoPostal Numeric(5,0) NÜT NULLDEFAULT 28941
Se indica que el campo Código Postal es un número de 5 dígitos enteros, que no
admite valores nulos, y que encaso deno especificarlo, por ejemplo, en una inserción,
el valor que tomará es 28941.
UNIQUE KEY especica la creación de un índice, esto es,una estructura de datos
que permite un accesorápido a la información de una tabla y además, controla que
no haya ningún valor repetido en el campo. Se producirá un error si se intenta
insertar un elemento que ya coincida con un valor anterior. A efectos prácticos, la
diferencia con una clave primaria es básicamente que un campo UNIQUE puede
admitir valores NULL, mientras que un campo que se dene como clave primaria
no puede admitir nulos (debe ser NOT NULL).
112
Capítulo 3. Diseño sico relacional
PRIMARY KEY indica que la columna denida es la clave primaria. Una tabla
tan solo puede tener una clave primaria. Si se especica. a nivel de colummdenition,
la clave solo puede tener un campo, si la clave se dene a nivel de tabla, la clave
puede ser multicolumna.
3.8.1. Implementación de restricciones
En la sintaxis de CREATE TABLE, deniciónJeferencia sirve para crear una
clave foránea. De esta manera, se enlaza el campo a su campo origen, es decir se
crea una referencia:
Si existe la siguiente tabla creada:
create table c1ientes(
dni varchar(9) PRIMARY KEY,
nombre varchar(50),
direccion varchar(60)
);
Se puedecrear otra tabla mascotas que contenga el registro de las mascotas de
una tienda veterinaria y con un campo que haga referencia al dueño de la mascota:
create table mascotas(
codigo integer PRIMARY KEY,
nombre varchar(50),
raza varchar(50),
cliente varchar(9) REFERENCES c1ientes(dni)
);
Las opciones ON DELETE y ON UPDATE establecen el comportamiento del
gestor encaso deque laslas de la tabla padre (esdecir, la tabla referenciada)se
borren o se actualicen. Los comportamientos pueden ser CASCADE, SET NULL y
NO ACTION.
ISi se usa NO ACTION y se intenta un borrado o actualización sobre la tabla
padre, la operación se impide, rechazando el borrado o la actualización.
ISi se especica CASCADE, la operación se propaga en cascada ala tabla hija,
es decir, si se actualiza la tabla padre. se actualizan los registros relacionados
de la tabla. hija, y
si se borra un registro de la tabla padre, se borran aquellos
registros de la tabla hija que estén referenciando al registro borrado.
113
Bases de Datos
ISi se indica SET NULL, se establecea NULL la clave foránea afectada por un
borrado o modicación de la tabla padre.
create table mascotas(
codigo integer PRIMARY KEY,
nombre varchar(50),
raza varchar(50),
cliente varchar(9) REFERENCES c1ientes(dni)
UN DELETE CASCADE ON UPDATE SET NULL
Si no se especica ON DELETE u ON UPDATE por defecto se actúa como NO
ACTION.
Oracle
no implementa
la opción
ON UPDATE
por lo
que hay
que recurrir
a otros
métodos para realizar las acciones de actualización, como por ejemplo, mediante
TRIGGERS (disparadores).
La siguiente parte de la sintaxis de CREATE TABLE hace referencia a las de-
claraciones globales sobre la tabla, esto es, restricciones, claves primarias y foráneas
compuestas, etc.
[CÜNSTRAINT [símbo1o]] PRIMARY KEY (nombre_co1umna,. ..)
I [CONSTRAINT [simbo1o]] FOREIGN KEY (nombre_co1umna, . ..)
[definiciómreferencia]
En SQL, todas las restricciones pueden tener un nombre para facilitar su poste-
rior referencia,por tanto cuando aparezca
el opcionalCONSTRAINT [símbolo] se
indica que la denición de una restricción tiene un nombre.
PRIMARY KEY sirve para especicar la creación de una clave primaria a nivel de
tabla. Existe la opción de crearla a nivel de columna, mediante denicióïncolumna
o denirla aquí. Por ejemplo, es posible denir la siguiente tabla de dos formas:
#primera forma -nivel de columna
create table vehicu1o(
matricula varchar(7) primary key,
marca varchar(20),
modelo varchar(20),
precio numeric(7,2)
Capítulo 3. Diseño sico relacional
#segunda forma -nivel de tabla
create table vehicu1o(
matricula varchar(7),
marca varchar(20),
modelo varchar(20),
precio
numeric(7,2)
primary key (matricula)
);
Ambas formas son equivalentes. la diferencia es que mediante la segunda forma,
es posible crear claves primarias compuestas por varios campos. Ejemplo:
#Clave primaria =
dni + n_ss
create table emp1eado(
dni varchar(9),
n_ss varchar(15),
nombre varchar(40),
PRIMARY KEY(dni,n_ss) #compuesta
De forma análoga, también se puede crear claves foráneas a.nivel de tabla, ha-
ciendo uso de:
[CONSTRAINT [symbo1]] FÜREIGN KEY(index_col_name, . ..)
[referencejefinition]
create table mascotas(
codigo integer PRIMARY KEY,
nombre varchar(50),
raza varchar(50),
cliente varchar(9),
FOREIGN KEY (cliente) references clientes(dni)
);
<> Actividad 3.8: Conéctatea MySQLy pruebaa ejecutar
los comandos
CREA-
TE TABLE anteriores. Posteriormente, Conéctate a.Oracle mediante SQL*Plus y
ejecútalos de nuevo. ¿Soncompatibles?
115
Bases de Datos
Para terminar, cada gestor de base de datos efectúa sus propias modicaciones
al formato de la sintaxis create table. La cláusula opcionesiabla permite especicar
las peculiaridades de cada gestor con respecto al almacenamiento en soporte físico
de sus tablas. Además, cada gestor incorpora diversas características, por ejemplo,
Oracle y DB2 implementan tipos de datos distintos a MySQL o a SQL Server y
Access.
3.8.2. Tipos de Datos
Los tipos de datos que pueden usarse tanto para MySQL como para Oracle en
la denición de una.columna son los siguientes:
MySQL
X
TINYINT [UNSIGNED] Entero
SMALLINT [UNSIGNED] Entero
MEDIUMIN T [UNSIGNED] Entero
INT [UNSIGNED] Entero
BIGINT [UNSIGNED] Entero
INTEGER [UNSIGNED] Entero
DOUBLE [UNSIGNED] Real Aproximado 8 bytes
FLOAT [UNSIGNED] 4 bytes
DECIMAL(longituddecimales) Real Exacto Variable
NUMERIC(longitud,decimales) Real Exacto Variable
NUMBER(longitudLdecimales]) Real Exacto Variable
DATE Fecha aaaa-mm-dd
TIME Hora hhzmmzss
TIMESTAMP Fecha y Hora aaaa-mm-dd hhzmmzss
DATETIME Fecha y hora aaaa-mm-dd hh:mm:ss
CHAR(longitud) caracteres Longitud Fija
VARCHARUongitud) caracteres Longitud Variable
VARCHAR2(longitud) caracteres Longitud Variable
BLOB Objetos binarios Longitud Variable
TEXT Campos Memo Longitud Variable
CLOB Campos Memo Longitud Variable
EN UM(valor1,valor2,valor3...) Enumeraciones Lista de valores
SET(valor1, valor2, valor3. . . )Conjuntos Conjuntos de valores
Cuadro 3.1:Tipos de datos enMySQL y Oracle/DBZ
ü
Puede verseque no todos los tipos de datos están en todos los gestores. Así por
ejemplo, el tipo de datos ENUM no está disponible en Oracle y si en MySQL.
Se utiliza para crear enumeraciones, esdecir, campos que admiten solo valores fijos,
por ejemplo Color EN UM(rojo , hmaïvillo , verde ). En Oracle, en su lugar, se puede
implementar utilizando la directiva CHECK.
116
Capítulo 3. Diseño fisico relacional
3.8.3. Características de la creación de tablas para MySQL
Las opciones de tabla para lvIySQL son las siguientes:
opciones_tab1a: opción_tab1a [opción_tab1a]
opción_tab1a:
ENGINE
=
nombre_motor
l AUTÜ_INCREMENT =
valor
I [DEFAULT] CHARACTER SET
juego_caracteres [COLLATE colación]
I CHECKSUM = {o I 1}
| COMMENT
= string
l MAX_ROWS =
valor
I MIN_ROWS = Valor
El almacenamiento fisico de una tabla en MySQL está controlada por un softwa-
re especial denominado Motor de almacenamiento. Mediante la opción ENGINE=
nombreJnotor se indica el motor de almacenamiento para la tabla. Puede ser, en-
tre otros, innodb, que son tablas transaccionales con bloqueo de registro y claves
foráneas, mylsam por defecto usado por MySQL y que genera tablas operadas a
gran velocidad, pero sin control de integridad referencial y Memory, que genera
tablas que están almacenadas en memoria en lugar de un archivo físico.
La opción AUTOJNCREMENT permite indicar el valor inicial para campos de
tipo AUTOJNCREMENT. AUTOJNCREMENT indica que ese campo es auto-
incrementado después de cada.inserción. Un campo denido como autojncrement
debe sernumérico; de esta manera, cuando en ese campose indica el valor NULL en
una inserción, el campo toma automáticamente el último valor incrementado en una
unidad. Este campo esmuy útil para los campos código donde seespecican valores
clave autogenerados. En MySQL para denir un campo AUTOJNCREMENT se
especica la palabra clave justo a continuación del tipo de datos. Para simular este
comportamiento enOracle, seutiliza una secuencia (SEQUENCE).
ÏDEFAULT] CHARACTER SET Especica el conjuntode caracteres
para lata-
bla y COLLATE dene la colación por defecto de la tabla. Si se especica CHECK-
SUM, MySQL mantiene una suma de vericación para todos los registros. El co-
mando CHECKSUM TABLE muestra esa sumade vericación (solo paramotores
de almacenamiento 1ilyISAll).
COMMENT es un comentario para la tabla, hasta 60 caracteres.También es posi-
ble crear comentarios para cada una de lascolumnas. Mediante el token COMMENT
117
Bases de Datos
se puede documentar el diccionario de datos. MySQL dispone de este token para
comentar no solo tablas, sino también columnas.
MAX_ROWS es el máximo número de registros que se quiere almacenar en la
tabla. No es un límite absoluto, sino un indicador que la tabla debe ser capaz de
almacenar al menos estos registros. MIN_ROWS es el mínimo número de registros
que se planea almacenar en la tabla.
Por último, al igual que en la creación de base de datos, MySQL dispone de la
cláusula IF NOT EXISTS,
para que solamente se cree la tabla si no está creada
previamente.
#Ejemp1o de creación de tabla en MySQL
create table if not exists Pedido(
codigo int auto_increment primary key,
fecha datetime,
estado enum(Pendiente,Entregado,Rechazado)
)
comment = tab1a de pedidos a proveedores
auto_increment =
10000
max_rows=100000O
checksum=1
engine=innodb;
3.8.4. Características de la creación de tablas para Oracle
En Oracle, la mayoría de las opciones tienen que ver con su almacenamiento
físico. Por ejemplo, las tablas deben ser almacenadas en un contenedor llamado
tablespace (Espacio
de tablas). Por defecto,si no se indicanopciones dealmacena-
miento, la tabla se ubica en el tablespace del usuario, pero si se quiereubicar en otro
tablespace, se puede incluir la opción tablespace nombrepara designar otro tables-
pace. Además, se puede denir cómo se reserva.el espacio en disco para controlar
el crecimiento desmedido del tamaño de una tabla mediante la cláusula storage.
Estas y muchas otras opciones. son propias de Oracle. Por último, cabe destacar la
capacidad de Oracle de permitir la creación de restricciones de tipo CHECK, que
permite validar el valor de un campo mediante una expresión.
--Ejemplo de creación de tablas con opciones propias de Oracle
create table Pedido(
codigo integer primary key,
fecha date,
estado varchar(10).
118
Capítulo 3. Diseñofísicorelaciona]
constraint c_estado
check (estado IN (Pendiente,Entregado,Rechazado))
)
tablespace Administracion
storage (initial 100k next 100k minextents 1
maxextents unlimited pctincrease 0);
3.8.5. Consulta de las tablas de una base de datos
Para consultarlas tablas disponiblesde una basede datosen MySQL, seutiliza
el comando SHOW
TABLES
mysq1> show tables;
+-------------------- --+
I Tab1es_in_jardineria
I
+ -------------------- --+
| Clientes
I Deta11ePedidos
I
I Productos
+ -------------------- --+
En Oracle, sepuedenconsultarlasvistasuser_tables,
dbajcables
y alLtables. En
Oracle,lasvistasquecomienzanpor usen, aportaninformaciónsobrelosobjetosque
poseeel usuarioconectado.Las vistas que comienzanpor dba- sonsoloaccesibles
por los administradoresde basesde datos
y muestraninformaciónsobretodos los
objetos.Finalmente,lasvistasquecomienzanpor all- muestranla informaciónsobre
losobjetosa losque el usuariotiene acceso,seansuyoso no.
SQL> select table_name from user_tables;
TABLE_NAME
PARTIDOS
ESTADISTICAS
JUGADORES
EQUIPOS
3.8.6. Consulta de la estructura de una tabla
Para conocerla estructurade una tabla ya creadaesposibleutilizar el comando
119
Bases de Datos
DESCRIBE [esquema
.] nombre_tab1a
Este comando muestra un listado con las Columnasde la tabla. aportando informa-
ción sobre los tipos de datos, restricciones, etc.
SQL> describe nba.equipos;
NOT NULL VARCHAR2 (20)
VARCHARQ (20)
CONFERENCIA VARCHARQ (4)
DIVISION VARCHAR2(9)
3.9. Modicación de tablas
El comando para modicar una tabla es ALTER TABLE y su sintaxis también
es bastante compleja:
ALTER TABLE nombre_tab1a
especificación_a1ter [, especificación_a1ter]
especificación_a1ter:
ADD
definición_co1umna [FIRST
I AFTER
nombre_co1umna ]
I ADD (definición_columna,...)
I ADD [CÜNSTRAINT [símboloïl]
PRIMARY KEY (nombre_co1umna,...)
I ADD [CONSTRAINT [símbo1o]]
UNIQUE (nombre_co1umna,...)
IADD [CONSTRAINT [simbo1o]]
FOREIGN KEY
(nombre_co1umna,...)
[definición_referencia]
I CHANGE [COLUMN] anterior_nombre_co1umna definición_co1umna
[FIRSTIAFTER nombre_columna]
RENAME COLUMN anterior_nombre_co1umna TD nuevo_nombre_co1umna
MDDIFY definición_columna [FIRST I AFTER nombre_columna]
DRÜP COLUMN nombre_co1umna
DROP PRIMARY KEY
DROP FOREIGN KEY fk_símbo1o
opciones_tabla
120
Capítulo 3. Diseño físico relacional
Al ver esta sintaxis se puedecaer en la tentación de pensar que es mejor borrar
una tabla y volver a crearla haciendo las modicaciones oportunas. Esto es posible
si la tabla no tiene datos, pero. .. ¿qué ocurre si hay un centenar o un millar de
registros? No queda otra opción que ejecutar una sentencia ALTER TABLE para
evitar la pérdida de datos.
ILa opción ADD permite añadir una columna, se puede especicar el lugar
donde seva a insertar mediante las cláusulas AFTER (después de una colum-
na) y FIRST (la primera columna).Oracle noadmite lascláusulas AFTERy
FIRST.
ICon la opción MODIFY se cambia el tipo de datos de una columna y seañaden
restricciones.
ICon la opción DROP se pueden eliminar las restricciones de clavesforáneas y
primarias, dejando el tipo de dato y su contenido intacto.
- Las opciones de tabla, al igual que en CREATE TABLE varían con cada
SGBD, y sirven principalmente para modicar las características del almace-
namiento físico.
- Para cambiar el nombre de una columna, Oracle usa la cláusula RENAME y
MySQL la cláusula CHANGE.
Por ejemplo, en MySQL, para añadir a la tabla mascotas el campo especie des-
pués del campo Raza, habría que ejecutar la siguiente instrucción:
ALTER TABLEMascotas ADD Especie VARCHAR(10) AFTER Raza;
Para eliminar la columna con clave primaria CodigoCliente de la tabla Clientes
en Oracle y establecer como clave primaria. el campo NIF , hay que ejecutar las
siguientes sentencias:
ALTER TABLE Clientes DRDP PRIMARY KEY;
ALTER TABLE Clientes DROP
CodigoC1iente;
ALTER TABLE Clientes ADD CÜLUMN Nif VARCHAR(10) PRIMARY KEY FIRST ;
121
Bases de Datos
3.10. Borrado de tablas
El formato de instrucción en lIySQL para el borrado de una tabla es muysencillo:
DRDP [TEMPORARY] TABLE
tb1_name [, tbl_name]
Ejemplo:
DRDP TABLE Mascotas;
DRDP TABLE Clientes, Empleados;
En Oracle, cambia un poco pero es muy similar:
DRDP [TEMPORARY] TABLE tbl_name [CASCADE CÜNSTRAINT]
No sepermite el borrado de varias tablas en la misma sentencia, y, de forma opcional,
CASCADE CONSTRAINT exige a Oracle que elimine las claves foráneas de las
tablas relacionadas (en cascada).
--Elimina la tabla Partidos
DRDP TABLE Partidos;
--Elimina la tabla Jugadores y
--borra las claves foráneas de otras tablas
DRDP TABLE Jugadores CASCADE CONSTRAINT;
3.11. Renombrado de tablas
Para renombrar una tabla en MySQL se usa el comando RENAME TABLE:
RENAME TABLE nombre_tabla TD nuevo_nombre_tab1a
[, nombre_tabla TD nuevo_nombre_tab1a]
Ejemplo:
RENAME TABLE Mascotas TD Animales;
En Oracle, no hay que indicar el token TABLE. basta con poner:
RENAME Jugadores T0 Baloncestistas;
122
Capítulo 3. Diseño sico relacional
3.12. Prácticas Resueltas
Práctica 3.1: Modelo físicopara stratrekfanscomv.1.0
En un chero de texto con nombre startreklsql, escribe las sentencias SQL para
crear el modelo físico de la práctica 2.1. Después, crea una base de datos llamada
startrek en un servidor MySQL y
ejecuta las sentencias con comando source. A
continuación, Conéctate
a Oraclecon elusuario administrador(sqlplus/as sysdba)
y crea un usuario en una instancia de oracle con el comando:
CREATE USERstartrek IDENTIFIED BY startrekpwd
QUOTA UNLIMITED ON USERS;
.Dale permisos al usuario startrek para iniciar sesion y crear tablas con:
GRANT CREATE SESSION,CREATE TABLE TO startrek;
Con ese usuario, Conéctate a sqlplus y ejecuta el chero que has creado.
startrek1.sq1
CREATE TABLE Actores(
Codigo integer PRIMARY KEY,
Nombre varchar(50) NOT NULL,
Fecha DATE NOT NULL,
Nacionalidad varchar(20) DEFAULT EEUU
);
CREATE TABLE
Personajes(
Codigo integer PRIMARY KEY,
Nombre varchar(50) NOT NULL,
Raza varchar(20) NOT NULL,
Grado varchar(20) NOT NULL,
CodigoActor integer NOT NULL,
Codigosuperior integer NULL,
FOREIGN KEY(CodigoActor) REFERENCES Actores(Codigo),
FOREIGN KEY(Codigosuperior) REFERENCES Personajes(Codigo)
);
CREATE TABLE P1anetas(
Codigo integer PRIMARY KEY,
Galaxia varchar(50) NULL,
Nombre varchar(50) NOT NULL
);
CREATE TABLECapitulos(
¡Temporada integer,
N Orden integer,
Titulo varchar(50) NOT NULL,
123
Bases de Datos
Fecha date NOT
NULL,
PRIMARYKEY (Temporada, Orden)
);
CREATE TABLE Pe1iculas(
Codigo integer PRIMARY KEY,
Titulo varchar(50) NOT NULL,
Director varchar(30) NOT
NULL,
Anyo Date
NULL
);
CREATETABLEPersonajesCapitu1os(
CodigoPersonaje integer PRIMARY KEY,
Temporada integer NOT
NULL,
Orden integer NOT
NULL,
FOREIGNKEY (Temporada,Orden)
REFERENCES Capitulos(Temporada,Orden)
);
CREATE TABLEPersonajesPe1icu1as(
CodigoPersonaje integer
REFERENCES Personajes(Codigo),
CodigoPelicu1a integer
REFERENCES Pe1icu1as(Codigo)
);
CREATE TABLE Naves(
Codigo integer PRIMARY KEY,
NTripu1antes integer
NULL,
Nombre varchar(50) NOT
NULL
);
CREATE TABLE Visitas(
CodigoNave integer
REFERENCES Naves(Codigo),
CodigoP1aneta integer
REFERENCES P1anetas(Codigo),
Temporada integer NOT
NULL,
Orden integer NOT
NULL,
FOREIGNKEY (Temporada,Orden)
REFERENCES Capitulos(Temporada,Orden)
Con el chero anterior llamado startreILsqI, en mysql:
mysql>
CREATE DATABASE Startrek; USE Stratrek;
mysql>source stratrelczsql
En Oracle: sqlplus
/ as sysdba
SQL>
CREA TE USER startrek IDENTIFIED BY startrekpwd;
SQL> GRANT
CREATE SESSIOMCREATE
TABLE TO startrek; SQL>ezit
sqlplus startrek/startrekpwd
SQL> @startrek.sql
124
Capítulo 3. Diseño físico relacional
Práctica 3.2: Restricciones para
startrekfanscom v.1.0
Se deseaimponer las siguientes características al modelo físico, pero son dependien-
tes del gestor de base de datos donde se van a codicar, así que se codican en
cheros independientes. Para MySQL se desea:
IQue todas las tablas tengan el motor de almacenamiento innodb para que las
claves foráneasno sean ignoradas.
-Que las claves primarias numéricas sean de tipo autojncrement.
n Que el campo Galaxia de la tabla Planetas seauna enumeración de los valores
(Via LácteaÚAndrómedafsombrero).
Para Oracle se desea:
-Que las tablas se encuentren ubicadas en el tablespace STARTREK.
IQue el campo NTripulantes de la tabla Naves solo pueda tener un valor entre
1 y 500.
IQue el campo Galaxia de la tabla Planetas solo pueda tener los valores (Via
Láctea,Andrómeda,Sombrero).
Las sentencias SQL para efectuar los cambios en MySQL son:
Cambios en MySQL
#Las tablas se pueden cambiar de dos formas:
ALTER TABLE Actores ENGINE=innodb;
ó, si están vacías se puede hacer:
DRÜP TABLE Actores;
CREATE TABLE Actores(
) ENGINE=innodb;
#Para cambiar a auto_increment la clave primaria
#se usa:
ALTER TABLE Actores MODIFY
Codigo integer auto_increment PRIMARY KEY;
#Para cambiar el campo Galaxia a una enumeración:
ALTER TABLE Planetas MODIFY
Galaxia ENUM (Via Láctea,Andrómeda,Sombrero);
Las sentencias SQL para efectuar los cambios en Oracle son:
125
Bases de Datos
Cambios en Oracle
-- Asignar el tablespace
STARTREK a las tablas, solo se puede
--hacer si están vacías,
y recrearlasz
drop table actores cascade constraints;
CREATE TABLE Actores(
Codigo integer
PRIMARY KEY,
Nombre varchar(50) NOT NULL,
Fecha DATE NOT NULL,
Nacionalidad varchar(20)
DEFAULT EEUU
) TABLESPACE STARTREK;
-- Para cambiar el campo NTripu1antes:
ALTER TABLE Naves
MDDIFY NTripu1antes integer
check (NTripu1antes>=1 and NTripu1antes<=500);
-- Para añadir la restricción a galaxia:
ALTER TABLE Planetas
MDDIFY Galaxia varchar(10)
CHECK (Galaxia IN (Via Láctea,Andrómeda,Sombrero));
Práctica 3.3: Modelofísicoparastratrekfanscom
v.2.0 Enun
chero de texto connombrestartreklsql, escribelassentencias
SQL para modicar
el modelofísicode la práctica 2.2. Después,creauna basede datosllamada startrek
en un servidorMySQL. Ejecuta lassentencias
del chero en un servidorde MySQL
con el comandosource.A continuación,Conéctatea Oracle con el usuariostartrek
y ejecutael chero que hascreado.
startrek2.sq1
ALTER TABLEPersonajes ADDCiudad varchar(50);
ALTER TABLE Personajes ADD FNacim date;
ALTER TABLEPersonajes ADDPlaneta integer
REFERENCES P1anetas(Codigo);
ALTER TABLEPersonajes ADDFU1tCombate date;
ALTER TABLEPersonajes ADDMentor varchar(50);
ALTER TABLE Personajes ADD FechaGrado date;
Can el chero anterior llamado startrek2.sql, en mysql:
mysql> USE Stratrek;
mysql>source stratrekísql
En Oracle: sqlplus startrek/startrekpwd
SQL> @startrek2.sql
126
Capítulo 3. Diseño físico relacional
Práctica 3.4: Modelo físico para stratrekfanscom v.3.0 Enun
chero de texto con nombre startrek3.sql, escribe las sentencias SQL para modicar
el modelo físico de la práctica 2.2. Después,crea una base dedatos llamada startrek
en un servidor MySQL. Ejecuta las sentencias del chero en un servidor de MySQL
con el comando source. A continuación, Conéctate a Oracle con el usuario startrek
y ejecuta el chero que has creado.
startrek3.sql
CREATE TABLE Lanzaderas(
CodigoNave integer,
Numero integer,
Personas integer,
PRIMARY KEY(CodigoNave,Numero),
FOREIGN KEY(CodigoNave) REFERENCES Naves(Codigo)
Can el chero anterior llamado startrekísql, en mysql:
mysql) USE Stratrek;
mysql>source stratrekzsql
En Oracle: sqlplus startrek/starirekpwd
SQL> @startrek2. sql
127
Bases de Datos
3.13. Prácticas Propuestas
Práctica 3.5: Modelo físico
para jerarquías
Dado el diagrama E / R de la gura siguiente, genera el modelo físico, codicando en
SQL todas las sentencias para crear las tablas de dos maneras posibles, generando
una tabla para cada especialización. y generando una sola tabla para los empleados.
Ejecuta los dos modelos tanto en Oracle como en lIySQL.
Práctica 3.6: Más modelos físico
Para los modelos lógicos creados en las prácticas 2.4. 2.5. 2.6 y
2.7, crea el modelo
físico asociado mediante varios cheros con extensión sql. En l&#39;IySQL
crea una base
de datos para cada modelo y ejecuta el chero correspondiente, y en Oracle, crea un
usuario distinto que contenga cada uno de los esquemas delas diferentes prácticas. <>
128
Capítulo 3. Diseño sico relacional
Práctica 3.7: Parque Ecológico
Un parque ecológico quiere informatizar la gestión de su sistema de información
para poder obtener datos más concluyentes sobre las especies migratorias que se
establecen en su territorio. El parque desea clasicar todas las especies animales
y contabilizar el número de individuos de cada especie que se establecen en el te-
rritorio en cada época del año. Se desea que la base de datos almacene datos de
nuevas especiesy nuevos individuos de cada especie animal. Para cada especie, se
requiere el nombre de la especie,características generalesde un individuo tipo y sus
periodos migratorios. Para cada individuo se tendrá en cuenta el peso, dimensiones,
y un código que identique de forma única cada individuo dentro de su especie.
Esta forma de identicación, irá almacenada en un pequeño dispositivo con una
batería autónoma implantada en el animal, y que servirá para detectar cuando el
individuo sale o entra en el territorio gracias a unas torretas de control instaladas
en el perímetro del parque. Estas torretas informan vía inalámbrica al sistema de
las idas y venidas de cada individuo. De esta manera, se pueden contabilizar sus
migraciones y los posibles descontroles quesufran en el periodo migratorio. Toda la
información sobre migraciones de individuos de determinadas especiesserá enviada
cada tres meses aun grupo de expertos biólogos, encargadosde haceruna valoración
sobre futuros periodos migratorios y posibles alteraciones del comportamiento de las
especies. Delos biólogos, se quierealmacenar, el nombre, la dirección, provincia y su
fecha de titulación. En principio, no se conocetodavía si se implementará en Oracle
o MySQL por lo que el diseño debe ser compatible para ambos gestores debases de
datos. <>
Práctica 3.8: BuscoPareja.net
Se va a crear una página Web decontactos en el dominio BuscoPareja.net. Cuando
un usuario se registra en el sistema, se almacenan sus datos personales, concreta-
mente su email, su nombre, dirección, ciudad, país, su sexo y orientación sexual, su
foto y una password que utilizará junto con su email para acceder al sistema. El
usuario a continuación rellena una lista de preferencias o gustos. De cada gusto o
preferencia se almacenará el tipo (Deporte, Música, Evento Social), la fecha de la
última. vez que hizo una actividad de ese estilo y si le gustaría o no que su pareja
tuviera la misma preferencia. A partir de esta información se organizan citas entre
los contactos en distintas ubicaciones. Sedesea registrar las citas entre los contactos
almacenando quién se cita con quién. en qué lugar y a qué hora, y si la cita fracasó.
Se desearealizar el diseño conceptual. lógico y físico de la base de datos, creando el
modelo físico para Oracle y para MySQL. <>
129
Bases de Datos
3.14.
130
Resumen
Los conceptos clave de este capítulo son los siguientes:
Las herramientas grácas ayudan al informático a gestionar los componen-
tes de una base de datos, pero además, un buen administrador debe conocer
los comandos necesarios para hacer las tareas administrativas. Entre las he-
rramientas grácas que dispone el mercado, se encuentran PhpMyAdmin, de
MySQL, Enterprise Manager y Grid Control, de Oracle y Data Studio de DB2.
Un intérprete de comandosenvía comandosen modo texto al SGDB y muestra
los resultados en una consola. Estos intérpretes de comandos suelen permitir
la ejecución remota de comandos a través de protocolos TCP-IP. Entre otros
están, mysqly SQL*Plus e iSQL*Plus(Oracle).
El DDL o Data Denition Language de SQL dene la sintaxis de los comandos
CREATE, DROP y ALTER, para crear, borrar y modicar objetos de una
BBDD.
El comando CREATE DATABASE permite crear bases dedatos en los SGBD.
Algunos SGBD permiten manipular varias BBDD mediante una sola instan-
cia, otros, como Oracle, permiten solo manipular una BBDD por instancia.
Además, existen asistentes grácos (como dbca de Oracle), que permiten de
forma sencilla crear bases de datos.
El comando ALTER DATABASE permite modicar ciertos parámetros de
funcionamiento de la BBDD. Estos parámetros dependen del funcionamiento
y de la arquitectura del SGBD, por tanto, no son estándar.
El comando DROP DATABASE borra una base de datos de un servidor.
Los comandos CREATE TABLE, ALTER TABLE y DROP TABLE están
denidos en el estándar SQL para poder crear, modicar y borrar tablas, y,
salvo pequeñasdiferencias, sepueden escribir estos comandoscompatibles para
la mayoría de los SGBD.
Para implementar restricciones se usan las cláusulas PRIMARY KEY (cla-
ves primarias) y REFERENCES (para claves Foráneas). Hay dos formas de
crearlas, a nivel de tabla y a nivel de columna. A nivel de tabla es posible
especicar claves compuestas. Es posible también, denir otras restricciones
como las UNIQUE, CHECK, NULL o NOT NULL, etc.
Los comandos DESCRIBE y RENAME sirven para mostrar la estructura de
una tabla y cambiarle el nombre a un objeto.
3.15. Test de repaso
1. ¿Qué función no permite realizar
phpMyAdmin?
a) Ejecución remota de comandos
b ) Copias de seguridad
c) Creación y borrado de tablas
)
d Parar y arrancar el servidor
2. Oracle Grid Control no permite
a Controlar el estado de múltiples BBDD
Creación y borrado de tablas
)
b) Controlar múltiples servidores
c)
)
d Parar y arrancar un SGBD
3. El comando CREATE DATABASE
no
a) Es una sentencia DDL
b) Es compatible entre los distintos SGBD
) Permite especicar los tablespaces de una
BBDD
C
d) Permite especicar el juego de caracteres
4. Una clave foránea
a) Se dene con FOREIGN KEY
b) Se dene con REF ERENCES
c) Puede ser compuesta
d) Todas las anteriores son correctas
5. Para arrancar el Enterprise Manager
a) No hay que hacer nada, viene instalado por
defecto
b) Hay que arrancarlocon el comando ernctl
start dbconsole
c) Hay que arrancarlocon el comando emctl
stop dbconsole
d) Es un entorno gráco basado en ventanas
Capítulo 3. Diseño sico relacional
6. La opción ON DELETE CASCADE
del comando CREATE TABLE
a) No funciona enOracle
b) No funciona en MySQL
c) Permite borrar registros relacionados en
cascada
d) Permite borrar claves foráneas en cascada
7. A una restricción
a) No se le puede poner nombre
b) Se le puede poner nombre mediante
CONSTRAINT
c) Se le puede poner nombre mediante RES-
TRICTION
d) Se le puede poner nombre mediante RE-
FERENCES
8. autojncrement es una opción
a) Sólo de MySQL
b) Para incrementar valores numéricos de for-
ma automática
c) Se suele aplicar a las claves primarias
d) Todas las anteriores son correctas
9. Con el comando ALTER, no se puede
a Borrar una columna
b Modicar el tipo de dato de una columna
c Cambiarle el nombre a la tabla
d Todas las opciones anteriores son posibles
)
)
Bases de Datos
3.16.
132
. Nombra los distintos tipos de ins-
trucciones DDL que puede haber,
distinguiendo el tipo de objeto que
se puede crear, borrar o modicar.
.Pon un ejemplo de un tipo de dato
numérico, otro alfanumérico y otro
de fecha/hora.
. ¿Cómo se instala phpMyAdmin en
Linux? ¿Necesitas algún otro soft-
ware para poder instalarlo?
Nombra tres herramientas grá-
cas y sus correspondientesgestores.
Añade alguno de los que no aparez-
can enel tema (por ejemplo,MMC
de SQL Server).
.¿Por qué es fundamental para un
administrador de bases de datos
(DBA) conocer los comandosSQL
además de saber usar las herra-
mientas grácas?
. Escribe, sin mirar la sintaxis, un
comando CREATE TABLE para
crear una tabla de alumnos con 5
campos a tu elección.
. Escribe, sin mirar la sintaxis, un
comando ALTER TABLE para
añadir un campo a la tabla. ante-
I&#39;lOI&#39;.
. Escribe, sin mirar la sintaxis, un
comando CREATE TABLE pa-
ra crear la tabla Notas y luego.
un comando ALTER TABLE para
11.
.Comenta para qué
Comprueba tu aprendizaje
añadir una clave foránea a la tabla
anterior.
. ¿Qué tipos de columna dene Ora-
cle que no son compatibles con
MySQL?
. Dene para qué sirven los siguien-
tes tokens de la creación de tablas
en lIySQL:
a ENGINE
n
AUTOJNCREMENT
ICOLLATION
n
CHARACTER SET
¿Qué diferencia hay entre VAR-
CHAR y CHAR?
.¿Qué diferencia hay entre un cam-
po F LOAT y uno NUMBER?
.Dene para qué sirven los tokens
de crea.ción de bases de datos TA-
BLESPACE y DATAFILE en Ora-
cle.
sirven las
cláusulas ON DELETE y ON UP-
DATE de REFERENCES.
.Para las cláusulas anteriores exis-
ten tres opciones SET NULL, CAS-
CADE y NO ACTION. Comenta
qué efecto tiene sobre los borrados
y las modicaciones de registros en
tablas relacionadas.
CAPÍTULO 4
Realización de Consultas
Objetivos
W
Identicar herramientas y sen-
Contenidos . .
tencias para reahzar consultas
W
La sentencia SELECT .
Identicar y crear consultas
B?
Consultas básicas, ltros y or- Simples 50m9
una tabla»
denación _
Identicar y crear consultas
Consultas resufnen que gGHCÏHH
valores resumen
subconsmtas Identicar y crear consultas
con composiciones internas y
Consultas multitabla. Compo- externas
siciones internas
y externas
Identicar y
crear subconsultas
Consultas reexivas
Valorar las
ventajas e
inconve-
COHSUÏWS COTI
tablas deïiVadas nientes de
las distintas
opciones
válidas para realizar una con-
sulta
Con este tema, se detalla Ia sintaxis completa de 1a sentencia SELECT en
toda su extensión. Se proporciona a1 estudiante métodos para construir con-
sultas simples y complejas de forma estructurada, con ltros, agrupaciones y
ordenaciones.
133
Bases de Datos
4.1. El lenguaje DML
Las sentencias DML del lenguaje SQL son las siguientes:
- La sentencia SELECT, que se utiliza para extraer información de la base de
datos, ya sea de una tabla o de varias.
ILa sentencia INSERT, cuyo cometido es insertar uno o varios registros en
alguna tabla.
ILa sentencia DELETE, que borra registros de una tabla.
ILa sentencia UPDATE, que modica registros de una tabla.
Cualquier ejecución de un comando en un SGBD se denomina.CONSULTA, término
derivado del anglosajón QUERY. Este término debe ser entendido más que corno
una consulta de información, como una orden, esdecir, las QUERYS o CONSULTAS
no son solo SELECT, sino también cualquier sentencia de tipo UPDATE, INSERT,
CREATE, DROP, etc, entendidas todas ellas como peticiones al SGBD para realizar
una operación determinada.
4.2. La sentencia SELECT
La sentencia SELECT es la sentencia más versátil de todo SQL, y por tanto la
más compleja de todas. Como seha expuesto anteriormente, se utiliza para consultar
información de determinadas tablas. Es posible ejecutar sentencias muy sencillas que
muestran todos los registros de una tabla:
#esta consulta selecciona todos los campos y muestra todos los
#registros de la tabla empleados
SELECT * FROM empleados;
O incluso consultas que obtienen información ltrada de múltiples tablas, usando
relaciones entre tablas e incluso tablas virtuales creadas a partir de una consulta.
#esta consulta obtiene el total de los pedidos
#de los clientes de una tienda
SELECT NombreC1iente,tot.Cantidad
FROM C1ientes,Pedidos,
(SELECT sum(Cantidad*PrecioUnidad) as Cantidad,NumeroPedido
FROM Deta11ePedidos GROUP
BY NumeroPedido) tot
WHERE Clientes.NumeroC1iente=Pedidos.NumeroC1iente
AND Pedidos.numeroPedido=tot.NumeroPedido ORDER
BY Cantidad;
134
Capítulo 4. Realización de Consultas
4.3. Consultas básicas
El formato básico para hacer una consulta es el siguiente:
SELECT [DISTINCT] se1ect_expr [,select_expr] [FROM tabla]
select_expr:
nombre_co1umna [AS alias]
| 4:
I expresión
nombre_columna indica un nombre de columna, es decir, se puedeseleccionar de
una tabla una serie de columnas, o todas si se usa *, o una expresión algebraica
compuesta por operadores, operandos y funciones.
El parámetro opcional DISTINCT fuerza que solo se muestren los registros con
valores distintos, o, dicho de otro modo, que suprima las repeticiones.
En la página siguiente, se muestran algunos ejemplos del uso de la sentencia
SELECT. Hay que prestaratención aalgunas curiosidadesl:
n En la consulta 4 se selecciona una columna calculada (1+5), con la selección
de los registros de una tabla, incorporándose esa nueva columna creada al
conjunto de las devueltas por el gestor.
- En la consulta número 5 se hace uso de una expresión algebraica para crear
una columna cuyo resultado será elde sumar 1 y
6. Para hacer esto, en MySQL
no es necesario indicar la cláusula FROM, pero en Oracle, hay que poner la
cláusula FROM con la tabla dual. Al no haber una tabla real seleccionada, el
resultado será una única la con el resultado.
- En la consulta 3 sehace usode la función concat cuyo cometido es concatenar
dos columnas creando una única columna. En Oracle, la función concat solo
admite dos parámetros, mientras que enMySQL se puede concatenarmúltiples
parámetros. Para concatenar en oracle múltiples columnas se puede hacer uso
del operador I I. Véase Sección6.4.
IEn las consultas 6 y
7 se muestran las marcasde losvehículos. La diferencia en-
tre ambas consultas estáen el uso del DISTINCT, que elimina las repeticiones.
Hay dos vehículos seat en la consulta 6 y uno en la 7.
¡La ejecuciónde lasconsultas que
se muestraa continuaciónestá realizada
en MySQL,pero son
perfectamente compatibles con Oracle, excepto la consulta 5, que hay que añadir FROM dual.
135
Bases de Datos
#consu1ta 4
#consu1ta
1 SELECT matricula, mode1o,1+5
SELECT * FROM vehiculos; FROM vehiculos;
+--------- + -+-----+
I matricula
I modelo
I 1+5
I
+ --+ --+----+
I 1129FGT ibiza gt
I 1129FGT
I ibiza gt
I 6
I
I 1132GHT leon tdi 105cv
I 1132GHT
I leon tdi 105cv
I 6
I
I M6836YX corolla g6
I M6836YX
I corolla g6
I 6
I
I 7423FZY coupe I 7423FZY
I coupe
I 6
I
I 3447BYD a3 tdi 130cv
I 3447BYD
I a3 tdi 130cv
I 6
I
+ + -------------- --+-----+
#consu1ta
5
SELECT 1+6;
#consu1ta 2 +-----+
SELECT matricula, modelo
I 1+6
I
FROM
vehiculos; +-----+
I
7 I
+---+
1129FGT ibiza gt #consu1ta 6
I 1132GHT leon tdi
105cv I SELECT
marca FROM vehiculos;
I M6836YX corolla g6
I +------- --+
| 7423FZY
coupe | marca
I
I 3447BYD
a3 tdi 130cv + ------- --+
I seat
I
I seat
I
l toyota
I
I hyundai
I
#consu1ta
3 I audi
I
SELECT matricula,
+ ------- --+
concat(marca,mode1o) as coche
FROM vehiculos;
+ --------- --+ ------------------- +
#consu1ta
7
SELECT DISTINCT marca
I matricula
I FROM vehiculos;
1129FGT seatibiza gt
I 1132GHT seatleon tdi 105cv
I M6836YX toyotacorolla g6
I 7423FZY hyundaicoupe
I 3447BYD audia3 tdi 130CV
136
Capítulo 4. Realización de Consultas
<>
Actividad 4.1: Crea una tablaen MySQLcon lasiguiente estructura:
MASCOTAS(Nombre, especie, raza, edad, sexo).
Introduce 6 registros2 y,a continuación,codica las siguientes querys:
IMuestra el nombre y la especie detodas las mascotas.
n Muestra el nombre y el sexo de las mascotas poniendo un alias a los campos.
IMuestra el nombre y la fecha de nacimiento aproximada de las mascotas (con-
sulta la documentación deMySQL y usa lafunción date_sub
y now).
Realiza el mismo procedimiento creando 1atabla en Oracle.
4.4. Filtros
Los ltros son condiciones que cualquier gestor de base dedatos interpreta para
seleccionar registros y mostrarles como resultado de la consulta. En
SQL la palabra
clave para realizar ltros es la cláusula WHERE.
A continuación se añade a la sintaxis de la cláusula SELECT la sintaxis de los
ltros:
SELECT [DISTINCT] select_expr [,select_expr]
[FROM tabla] [WHERE
filtro]
ltro es una ¡expresión
que indica
la condición
o condiciones
que deben
satisfacer
los registros para ser seleccionados.
Un ejemplo de funcionamiento sería el siguiente:
itselecciona los vehículos de 1a marca seat
SELECT *FROM vehiculos
WHERE
marca= seat ;
+
--------- --+ -------------- --+ ----- -+
| matricula l modelo
+
--------- --+ -------------- --+ ----- --+
I 1129FGT I ibiza gt
| 1132GHT l leon tdi 105cv I seat
+
--------- --+ -------------- --+ ----- --+
2 Véase
Capítulo 5
si es necesario.
137
Bases de Datos
4.4.1. Expresiones para ltros
Los ltros se construyen mediante expresiones. Una expresión, es una combina-
ción de operadores, operandos y funciones que producen un resultado. Por ejemplo,
una expresión puede ser:
#expresión 1
(oracle): (2+3)*7
SELECT (2+3)*7 from dual;
ttexpresión 2 (mysql): (2+3)>(6*2)
SELECT (24-3)>(6*2);
#0 =
falso, es falso que 5>12
itexpresión 3 (mysql): 1a fecha de hoy -31 años;
SELECT date_sub(now(), interval 31 year);
+ --------------------------------- +
I date_sub(now(), interval 31 year)
|
Se detalla a continuación los elementos que pueden formar parte de las expresio-
nes:
IOperandos: Los operandos pueden ser constantes. por ejemplo el número en-
tero 3, el número real 2.3, la cadena de caracteres España o la fecha C2010-
01-02; también pueden ser variables, por ejemplo el campo edad o o el campo
NombreMascota; ypueden sertambién otrasexpresiones 3.
IOperadores aritméticos: +, -, *, /, 7c.El operador+ y
el operador-se utilizan
para sumaro restar dos operandos(binario) o para ponerel signo positivo o
negativo a un operando (unario). El operador * es la multiplicación de dos
operandosy
el operador/es para dividir. El operador%
o resto dela división
entera a°7ob devuelve el resto de dividir a entre b.
3Todas los
operandos numéricos
ya seanreales oenteros vansin comillasimple,y
cualquier otra
cosa que no sea número, por ejemplo, cadenas de caracteres o fechas, van entre comillas simples.
138
Capítulo 4. Realización de Consultas
- Operadores relacionales: >, <, <>, >=, <=, =. Los operadores relacionales
sirven para comparar dos operandos. Así, es posible preguntar si un campo
es mayor que un valor, o si un valor es distinto de otro. Estos operadores
devuelven un número entero, de tal manera que si el resultado de la expresión
es cierto el resultado será 1, y si el resultado es falso el resultado será O.Por
ejemplo, la expresión a >b devuelve 1 si a es estrictamente mayor que b y O
en casocontrario. La. expresión d<>e devuelve 1 si d y e son valores distintos.
IOperadores lógicos: AND, OR, NOT. Los operadoreslógicos toman como ope-
randos valores lógicos, esto es, cierto o falso, en caso de SQL, 1 o O. Los
operadores lógicos se comportan según las siguientes tablas de verdad:
Operando 1 Operando 2 Opl AND Op2 Opl OR Op2 NOT Opl
falso falso falso falso cierto
falso cierto falso cierto cierto
cierto falso falso cierto falso
cierto cierto cierto cierto falso
Cuadro 4.1: Tabla de verdad de los operadores lógicos.
Por otro lado, se necesita un tratamiento de los valores nulos; hay que incluir
como un posible operando el valor nulo:
Operando 1 Operando 2 Opl AND Op2 Opl OR Op2 NOT Opl
falso falso falso falso cierto
falso cierto falso cierto cierto
cierto falso falso cierto falso
cierto cierto cierto cierto falso
nulo X
nulo nulo nulo
nulo nulo nulo
Cuadro 4.2: Tabla de verdad de los operadores lógicos con valores nulos.
-Paréntesis: Los operadores tienenuna prioridad, por ejemplo, en la ex-
presión 3+4*2, la multiplicación se aplica antes que la suma, se dice que el
operador * tiene ¡nas prioridad que el operador +. Para alterar esta prioridad,
se puedeusar el operador paréntesis, cuyo cometido es precisamentedar máxi-
ma prioridad a una parte deuna expresión.Así, (3+4)*2, no eslo mismoque
3+4*2.
139
Bases de Datos
u Funciones: date_add, concat, left, right. . .. Cada SGBD incorpora su propio
repertorio de funciones que en pocas ocasiones coincidecon el de otros SGBD.
En la tabla que se muestra a continuación aparecen los resultados que provoca
la ejecución de algunos de los operadores descritos:
í
í
(1o>=1o AND o<=1)+2
Cuadro 4.3: Tabla resumen de los operadores usadosen expresiones.
4.4.2. Construcción de ltros
A continuación, se muestran ejemplos de construcción de ltros para una basede
datos dejugadores de la liga americana debaloncesto (NBA), todos ellos compatibles
para Oracle y MySQL:
#1a tabla jugadores contiene todos los jugadores de la nba
describe jugadores;
+
l
l
l
l
l
l
l
l
l
l
l
l
l
l
l +
l
l
l
l
Capítulo 4. Realizaciónde Consultas
I Kobe Bryant
I
| Í
I Pau
Gasol I
+-------------------- --+
#Consu1ta que selecciona los jugadores españoles de los Lakers
SELECT codigo,Nombre,Altura
FROM jugadores WHERENombre_equipo=Lakers
and Procedencia=Spain;
+------ --+ --------- --+ ------
--+
I codigo I Nombre
| Altura
I
+------ --+ --------- --+ ------ --+
I 66
I Pau Gasol
I 7-0
I
+------ --+ --------- --+ ------ --+
#Consulta que selecciona los jugadores españoles
y eslovenos de los lakers
SELECT Nombre, A1tura,Procedencia FROM jugadores
WHERENombre_equipo=Lakers
AND (Procedencia=Spain OR Procedencia=S1ovenia);
+ --+ ------ --+ --+
I Nombre
I Altura
I Procedencia
|
4.4.3. Filtros con operador de pertenencia a conjuntos
Ademásdelosoperadores
presentados
anteriormente
(aritméticos,
lógicos,
etc.)
sepuedehacer usodel operadorde pertenenciaa conjuntosIN, cuya sintaxisesla
siguiente:
nombre_co1umna IN (Valuel, Va1ue2, ...)
Este operadorpermite comprobarsi una columnatiene un valor igual que cual-
quier de los que están incluidosdentro del paréntesis,así por ejemplo, si se desea
seleccionar
losjugadoresespañoles,
eslovenos
o serbiosde los Lakers, secodicaría
así
# versión larga
SELECT Nombre, Altura,Procedencia
FROM jugadores WHERENombre_equipo=Lakers AND
(Procedencia=Spain
OR
Procedencia=S1ovenia
OR Procedencia=Serbia & Montenegro);
141
Bases de Datos
I Pau Gasol
I Vladimir Radmanovic
I Serbia & Montenegro
I
I Sasha Vujacic
I Slovenia
#versión corta (con el operador IN)
SELECTNombre, A1tura,Procedencia
FROM jugadores
WHERENombre_equipo=Lakers AND
Procedencia IN (Spain,S1ovenia,Serbia & Montenegro);
+------------------- -+ -+ ------------------- -+
I Nombre
I Altura
I Procedencia
+------------------- -+ ------ -+ ------------------- -+
I Pau Gasol
I
I Vladimir Radmanovic
I Serbia
& Montenegro
I
I Sasha Vujacic
I Slovenia
I
+------------------- -+ ------ -+ ------------------- -+
4.4.4. Filtros con operador de rango
El operador de rango BETWEEN permite seleccionarlos registrosque estén
incluidosen un rango. Su sintaxises:
nombre_co1umna BETWEEN Valuel AND Va1ue2
Por ejemplo,para seleccionar
losjugadoresde la nba cuyopesoestéentre 270
y
300 libras secodicaría la siguientequery:
SELECT Nombre,Nombre_equipo,Peso FROM jugadores
WHERE Peso BETWEEN 270 AND 300;
+-------------- -+ ------------- -+ ---- -+
I Nombre
I Nombre_equipo
I Peso l
I Chris Richard
I Timberwolves
I Paul Davis
| Clippers
I |
I David Harrison
I Pacers
#sería equivalente a
SELECT Nombre,Nombre_equipo FROM jugadores
WHEREPeso >= 970 AND Peso <=300;
142
Capítulo 4.
Realización de Consultas
<> Actividad 4.2: Saca el pesoen kilogramos
de losjugadores de
la NBA que
pesen entre 120 y 150 kilos. Una libra equivale a 0.4535 kilos.
4.4.5. Filtros con test de Valor nulo
Los operadores IS e IS NOT permiten vericar si un campo es o no es nulo
respectivamente. De esta manera, es posible comprobar, por ejemplo, los jugadores
cuya procedencia es desconocida:
SELECT nombre,Nombre_equipo
FROM jugadores WHERE Procedencia IS null;
I Nombre_equipo I
+ -------------- --+ ------------- --+
I Anthony Carter I Nuggets I
+ -------------- --+ ------------- --+
#1a query contraria saca el resto de jugadores
SELECT nombre,Nombre_equipo
FROM jugadores WHERE Procedencia IS NOT null;
+
-------------------- --+ ------------- --+
I nombre I Nombre_equipo I
+
-------------------- --+ ------------- --+
I Corey Brever I Timberwolves I
I Greg Buckner I Timberwolves I
IMichael Doleac I Timberwolves I
| C.J. Watson | Warriors
I Brandan Wright I Warriors
+
-------------------- --+ ------------- --+
4.4.6. Filtros con test de patrón
Los ltros con test patrón seleccionan los registros que cumplan una serie de ca-
racterísticas. Se
pueden usar
los caracteres
comodines 7o
y _
para buscar unacadena
de caracteres. Por ejemplo, seleccionar de la tabla de vehículos aquellos vehículos
cuyo modelo sea t.di:
SELECT * FROM vehiculos where modelo like %tdiZ;
+
--------- --+ -------------- --+ ----- --+
143
Bases de Datos
I matricula I modelo I marca I
+ --------- --+ --+ --+
I 1132GHT | leon tdi 105cv I seat I
I 3447BYD I a3
tdi 130cv I audi I
+ --------- --+ -------------- --+ ----- --+
El
carácter comodín %
busca coincidencias de cualquier número de caracteres,
incluso cero caracteres. El
carácter comodín _
busca coincidencias de exactamente
un carácter.
Para ilustrar el funcionamiento del carácter _ ,se consultan aquellos equipos que
empiecen por R, que terminen por S
y que tengan 7 caracteres.
SELECT Nombre,Conferencia
FROM equipos WHERE Nombre like R_____s;
+ ------- --+ ----------- --+
I Nombre I Conferencia I
+ ------- --+ ----------- --+
I Raptors I East I
I Rockets I West
+
------- --+ ----------- --+
Ambos comodines se pueden usar en un mismo ltro, por ejemplo, para sacar
aquellos equipos que en su nombre como segunda letra la o, se usaría el patrón:
SELECT Nombre,Conferencia
FROM equipos WHERE
Nombre like _o%;
+ --+ ----------- --+
I Nombre I Conferencia I
+ --+ --+
I Bobcats I East I
I Hornets I West I
I Rockets I West I
+
------- --+ ----------- --+
4.4.7. Filtros por límite de número de registros
Este tipo de ltros no es estándar y
su funcionamiento varía con el SGBD.
Consiste en limitar el número de registros devuelto por una consulta. En
MySQL,
la sintaxis es:
144
Capítulo 4. Realización de Consultas
[LIMIT [desplazamiento ,] nf ilas]
nlas especica. el número de las a devolver y desplazamiento especica. a partir
de qué la. se empieza a contar (desplazamiento).
#devuelve las 4
primeras filas
SELECT nombre,Nombre_equipo
FROM jugadores limit
4;
+ -------------- --+ ------------- --+
I nombre I Nombre_equipo I
+
-------------- --+ --+
I Corey Brever I Timberwolves
I Greg Buckner I Timberwolves
I Michael Doleac I Timberwolves
I Randy Foye | Timberwolves
+ --+ ------------- --+
#devue1ve 3 filas a partir de la sexta
SELECT nombre,Nombre_equipo
FROM jugadores LIMIT
5,3;
+ ----------------- --+ ------------- --+
I nombre | Nombre_equipo I
+ ----------------- --+ ------------- --+
I Marko Jaric I Timberwolves
I A1 Jefferson I Timberwolves
I Mark Madsen I Timberwolves
+
----------------- --+ ------------- --+
Oracle limita el número de las apoyándose enuna pseudo columna, de nombre
rownum:
--Saca los 25 primeros jugadores
SELECT *
FROM jugadores
WHERE rownum <= 25;
4.5. Ordenación
Para mostrar ordenados un conjunto de registros se utiliza la cláusula ORDER
BY
de la sentencia SELECT.
145
Bases
de Datos
SELECT [DISTINCT] select_expr [,se1ect_expr]
[FROM tabla]
[WHERE filtro]
[ORDER BY{nombre_co1umna I expr l posición} [ASC I DESC] ,...]
Esta claúsula permite ordenar el conjunto de resultados de forma ascendente
(ASC) o descendente (DESC)por una o varias columnas. Si no se indica ASC
o DESC por defecto es ASC. La columna por la que se quiere ordenar se puede
expresar por el nombre de la columna, una expresión o bien la posición numérica
del campo que se quiere ordenar. Por ejemplo:
#estructura de la tabla equipos
DESCRIBE equipos;
I Nombre varchar(20)
ICiudad varchar(20)
I Conferencia varchar(4)
lDivision varchar(9)
#obtener los equipos de la conferencia oeste de la nba ordenados por división
SELECT Nombre,Division
FROM equipos wHERE Conferencia=west
ÜRDER
BY Division ASC;
+
------------- --+ --------- --+
I Nombre I Division I
+ ------------- --+ --------- --+
I Jazz I Northwest I
I Nuggets I Northwest I
I Trail Blazers I Northwest I
I Timberwolves I Northwest I
I Supersonics I Northwest I
I Clippers I Pacific I
I Kings I Pacific I
I warriors I Pacific I
I Suns I Pacific |
Í Lakers I Pacific I
| Hornets I Southwest I
I Spurs I Southwest I
I Rockets I Southwest I
I Mavericks I Southwest I
I Grizzlies I Southwest I
+ ------------- --+ --------- --+
146
Capítulo 4. Realizaciónde Consultas
#se puede ordenar por varios campos, p.ej: además de que cada
#división esté ordenada ascendentemente se ordene por nombre
#de equipo
SELECT Division,Nombre FROM equipos
WHERE Conferencia=west
ORDER BY Division ASC,Nombre DESC;
+--------- --+ ------------- --+
I Division
I Nombre
I
+--------- --+ ------------- --+
I Northwest
I Trail Blazers
I
| Northwest
I Timberwolves
|
I Northwest
I Supersonics
I
I Northwest
I Nuggets
I
I Northwest
I Jazz
I
I Pacific
I warriors
I
I Pacific
I Suns
I
I Pacific
I Lakers
I
I Pacific
I Kings
I
I Pacific
I Clippers
I
I Southwest
I Spurs
l
I Southwest
I Rockets
I
I Southwest
I Mavericks
I
I Southwest
I Hornets
I
I Southwest
I Grizzlies
I
+
4.6. Consultas de resumen
En SQL sepuedengenerarconsultasmáscomplejasqueresumencierta informa-
ción,extrayendoinformacióncalculadade variosconjuntosde registros.Un ejemplo
de consultaresumenseriala siguiente:
SELECT count(*) FROM vehiculos;
Esta consultadevuelveel númerode registrosde la tabla vehículos,esdecir, se
generaun resumende la informacióncontenidaen la tabla vehículos.La expresión
count(*)esunafunción
quetomacomoentradalosregistros
dela tablaconsultada
147
Bases de Datos
y cuenta cuántos registros hay. El
resultado de la función count es un único valor (1
la, 1 columna) conel número5
(número de registrosde la tabla vehículos).
Para poder generar información resumida hay que hacer uso de las funciones de
columna. Estas funciones de columna convierten un conjunto de registros en una
información simple cuyo resultado es un cálculo. A continuación, se expone una
lista de las funciones de columna disponibles en SQL:
SUM (Expresión) #Suma los valores indicados en el argumento
AVG (Expresión) #Ca1cu1a la media de los valores
MIN (Expresión) #Ca1cula el minimo
MAX (Expresión) #Ca1cu1a el máximo
COUNT
(nbCo1umna) #Cuenta el número de valores de una columna
#(excepto los nulos)
COUNT
(*) #Cuenta el número de valores de una fila
#Inc1uyendo los nulos.
A modo de ejemplo, se muestran algunas consultas resúmenes:
#consu1ta 1
#¿Cuánto pesa el jugador más pesado de la nba?
SELECT max(peso) FROM jugadores;
#consu1ta 2
#¿Cuánto mide el jugador más bajito de la nba?
SELECT min(a1tura) FROM jugadores;
#consu1ta 3
#¿Cuántos jugadores tienen los Lakers?
SELECT count(*) FROM jugadores WHERE
Nombre_equipo=Lakers;
#consu1ta 4
#¿Cuánto pesan de media los jugadores de los Blazers?
SELECT
avg(peso) FROM jugadores WHERE
Nombre_equipo=B1azers;
Con las consultas de resumen se pueden realizar agrupaciones de registros. Se
denomina agrupación de registros a un conjunto de registros que cumplen que tienen
una o varias columnas con el mismo valor. Por ejemplo, en 1atabla vehículos:
SELECT
* FROM vehiculos;
Capítulo 4.
Realización de Consultas
I 1129FGT ibiza gt
I 1132GHT leon tdi 105cv
IM6836YX corolla g6
I 7423FZY coupe
Í3447BYD a3 tdi 130CV
En esta consulta hay dos registros cuya marca=seat. Se puede agrupar estos
dos registros formando un único grupo, de tal manera que el grupo seat tiene los
modelos ibiza gt (1129FGT) y leon tdi 105cv (1132GHT). A este grupo de registros
se le puede aplicar una función de columna para realizar determinados cálculos, por
ejemplo, contarlos:
SELECT marca, count(*) FROM
vehiculos GROUP BY marca;
+ ------- --+ -------- --+
I marca I count(*) I
En este caso, si se agrupa (GROUP BY) por el campo marca, salen 4 grupos
(audi, hyundai, seat y toyota). La función de columna, cuandose agrupapor un
campo, actúa para cada grupo. En este caso, para cada. grupo se ha contado el
número de registros que tiene. En el caso de seat, cuenta los 2 antes mencionados.
La sintaxis para la sentencia SELECT con GROUP BY queda como sigue:
SELECT [DISTINCT] select_expr [,select_expr]
[FROM tabla]
[WHERE filtro]
[GROUP BYexpr [, expr] . ... ]
[ORDER BY{nombre_columna I expr I posición} [ASC I DESC] , ...]
Se observaque GROUP BY va justo antes de la cláusula ORDER BY. A conti-
nuación, a modo de ejemplo, se muestran algunas consultas con grupos y funciones
de columna.
149
Bases de Datos
#consu1ta 1
#¿Cuánto pesa el jugador más pesado de cada equipo?
SELECTNombre_equipo, max(peso)
FROM jugadores
GROUP BY Nombre_equipo;
#consulta 2
#¿Cuántos equipos tiene cada conferencia en la nba?
SELECTcount(*),conferencia
FROM equipos
GROUP BY conferencia;
+ --------
--+ ----------- --+
count(*)
I conferencia
I
+ -------- --+ ----------- --+
15
I East
I
+-------- --+ ----------- --+
#¿Cuánto pesan de media los jugadores de españa, francia e italia?
SELECTavg(peso),procedencia
FROM jugadores
WHERE
procedencia IN (Spain,Ita1y,France)
GROUP BY procedencia;
+--------- --+ ----------- --+
I avg(peso)
I procedencia
I
+--------- --+ ----------- --+
218.4000
I France
I
I 221.0000
I Italy
I
208.6000
I Spain
+ --------- --+ ----------- --+
IMPORTANTE: Seobservaquepara cadaagrupación.seha seleccionado
tam-
biénel nombredela columnapor la cualseagrupa.Esto noesposiblesinoseincluye
el
GROUP BY. Por ejemplo:
150
Capítulo 4. Realización de Consultas
mysq1> SELECT count(*),conferencia FROM
equipos;
ERROR 1140 (42000): Mixing of GROUP
Columns
(MIN(),MAX(),COUNT()....) with no GROUP
Columns is illegal
if there
is no GROUP BY clause
Precisamente, el SGBD advierte de que para mezclar funciones de columna y
columnas de una tabla hay que escribir una cláusula GROUP
BY.
4.6.1. Filtros de Grupos
Los ltros de grupos deben realizarse mediante el uso de la cláusula HAVING
puesto que WHERE actúa antes de agrupar los registros. Es decir, si se desealtrar
resultados calculados mediante agrupaciones se debeusar la siguiente sintaxis:
SELECT [DISTINCT] se1ect_expr [,se1ect_expr]
[FROM
tabla]
[WHERE
filtro]
[GROUP BYexpr [, expr].... ]
[HAVING fi1tro_grupos]
[ORDER
BY {nombre_co1umna I expr I posición} [ASC | DESC] ,...]
HAVING aplica los mismos ltros que la cláusula WHERE.
A continuación se
ilustran algunos ejemplos:
#query 1:
#Seleccionar los equipos de la nba cuyos jugadores
#pesen de media más de 228 libras
SELECT Nombre_equipo,avg(peso)
FROM
jugadores
GROUP
BY Nombre_equipo
HAVING avg(peso)>228 ORDER
BY avg(peso);
+ ------------- --+ --------- --+
I Nombre_equipo I avg(peso) l
228.8462
229.6923
Bases de Datos
#query 2
#seleccionar qué equipos de la nba tienen más de 1
jugador español
SELECT Nombre_equipo,count(*)
FROM jugadores
WHERE procedencia=Spain
GROUP BY Nombre_equipo
HAVING count(*)>1;
+ ------------- --+ -------- --+
I Nombre_equipo I count(*) I
4.7. Subconsultas
Las subconsultas se utilizan para realizar ltrados con los datos de otra consulta.
Estos ltros pueden
ser aplicados tanto en la cláusula WHERE
para ltrar registros
como en la cláusula HAVING para ltrar grupos. Por ejemplo, con la base dedatos
de la NBA, es posible codicar una consulta para pedir los nombres de los jugadores
de la división SouthEast:
SELECT
nombre FROM jugadores
WHERE
Nombre_equipo IN
(SELECT Nombre FROM equipos WHRE division=SouthWest);
+
------------------- --+
I nombre |
+ ------------------- --+
I Andre Brown I
| Kwame Brown I
I Brian Cardinal I
| Jason Collins I
I
+ ------------------- --+
Se
observa que la subconsulta es precisamente la sentencia SELECT
encerrada
entre paréntesis. De esta forma, se hace uso del operador in para tornar los equi-
pos de la división SouthEast. Si
se ejecuta la subconsulta por separado seobtiene:
152
Capítulo 4. Realización de Consultas
SELECT Nombre
FROM equipos
WHERE
division=SouthWest ;
"&#39; """"" "+ La subconsulta se convierte en algo equiva-
l Nmbre l lente a:
+ --------- --+
¡Hornets SELECT nombre FROM jugadores
I
¡ Spurs ¡WHERE Nombre_equipo IN
| Rockets | (Hornets ,Spurs ,Rockets ,
I
I
¡ Mavericks Mavericks ,Grizzlies)
I Grizzlies
+ --------- --+
En las siguientes secciones se detallan los posibles operadores que se pueden usar
con las subconsultas.
4.7.1. Test de Comparación
Consiste en usar los operadores de comparación --, >=, <=, <>, >y <para
comparar el valor producido con un valor único generado por una subconsulta. Por
ejemplo, para consultar el nombre del jugador de mayor altura de la nba, es posible
hacer algo como esto:
SELECT nombre FROM jugadores
WHERE altura =
(SELECT max(a1tura) FROM jugadores);
+
-------- --+
| nombre
+ -------- --+
I Yao Ming |
+ -------- --+
Se puedecomprobar que la subconsulta produce un único resultado, utilizándolo
para ltrar.
Nótese que con este tipo de ltro la subconsulta solo debe producir un único
valor (una la y una columna),por tanto, si secodica algo del tipo:
SELECT nombre FROM jugadores
WHERE altura =
(SELECT max(altura),max(peso) FROM jugadores);
ERROR 1241 (21000): Operand should contain 1 co1umn(s)
También fallaría que la subconsulta devolviera más de una la:
153
Bases de Datos
SELECT nombre FROM jugadores
WHERE
altura =
(SELECT max(a1tura)
FROMjugadores
GROUP BY Nombre_Equipo);
ERROR1242
(21000): Subquery returns more than 1 row
Una restricción importante es que la subconsulta debe estar siempre al lado
derecho del operador de comparación. Es decir:
Campo <= subconsulta
siendo invalida la expresión:
subconsulta >= Campo
4.7.2. Test de pertenencia a conjunto
Este test consiste enuna variante del usado para consultas simples, y es elque se
ha utilizado para ilustrar el primer ejemplo de la sección.Consiste enusar eloperador
IN para ltrar los registros cuya expresión coincida con algún valor producido por
la subconsulta.
Por ejemplo, para extraer las divisiones de la nba donde juegan jugadores es-
pañoles:
SELECT division FROM equipos WHERE nombre in
(SELECT Nombre_equipo FROM jugadores WHERE procedencia=Spain);
+ --------- --+
I division
+ --------- --+
I Atlantic
I Northwest |
I Pacific I
I Southwest I
+ --------- --+
4.7.3. Test de existencia
El test de existencia permite ltrar los resultados de una consulta si existen las
en la subconsulta asociada, esto es, si la subconsulta genera un número de las
distinto de O.
Para usar el test de existencia se utiliza el operador EXISTS:
154
Capítulo 4. Realización de Consultas
SELECT columnas FROM tabla
WHERE EXISTS
(subconsulta)
El
operador EXISTS
también puede ser precedido de la negación (NOT) para
ltrar si no existen resultados en la subconsulta:
SELECT columnas FROM tabla
WHERE
NOT EXISTS
(subconsulta)
Para seleccionar los equipos que no tengan jugadores españoles sepodría usar la
siguiente consulta:
SELECT
Nombre FROM equipos WHERE
NOT EXISTS
(SELECT
Nombre FROM jugadores
WHERE
equipos.Nombre =
jugadores.Nombre_Equipo
AND procedencia=Spain);
+ ------------ --+
I Nombre
+ ------------ -+
I Bobcats
Para comprender la lógica de esta query, se puede asumir que cada registro de-
vuelto por la consulta principal provoca la ejecución de la subconsulta, así, si la
consulta principal (SELECT
Nombre FROM Equipos) devuelve 30 registros, se en-
tenderá que se ejecutan30 subconsultas, una por cada nombre de equipo que retorne
la consulta principal. Esto en realidad no es así, puesto que el SGBD optimiza la
consulta para hacer tan solo dosconsultas y una operación join que se estudiará más
adelante, pero sirve de ejemplo ilustrativo del funcionamiento de esta consulta:
SELECT
Nombre from equipos;
+ ------------- -+
I Nombre
+ -+
subconsulta ejecutada #1
I Bobcats subconsulta ejecutada #2
|
|
l |
I Raptors |
l |
+ ------------- -+
subconsulta ejecutada #22
155
Bases de Datos
Cada subconsulta ejecutada sería como sigue:
#subconsulta ejecutada #1
SELECT Nombre FROM jugadores
WHERE 76ers =
jugadores.Nombre_Equipo
AND procedencia=Spain;
Esta subconsulta no retorna resultados, por tanto, el equipo 76ers es selecciona-
do para ser devuelto en la consulta principal, puesto que no existen (NOT EXISTS)
jugadores españoles.
Sin embargo para el registro 22 de la consulta principal, aquel cuyo Nombre es
Raptors, la consulta:
#subconsu1ta ejecutada #22
SELECT Nombre FROM jugadores
WHERE Raptors = jugadores.Nombre_Equipo
AND procedencia=Spain;
+
--------------- --+
I Nombre I
+
--------------- --+
I Jose Calderon
I Jorge Garbajosa I
+
--------------- --+
devuelve 2 jugadores, por tanto, existen (EXISTS) registros de la subconsulta y
por tanto el equipo Raptors NO es seleccionadopor la consulta principal.
En conclusión, se puede decir que la consulta principal enlaza los registros con
los devueltos por las subconsultas.
4.7.4. Test cuanticados ALL y ANY
Los test cuanticados sirven para calcular la relación entre una expresión y todos
los registros de la subconsulta (ALL) o algunos de los registros de la subconsulta
(ANY).
De esta manera se podría saber los jugadores de la nba que pesan másque todos
los jugadores españoles:
156
Capítulo 4. Realizaciónde Consultas
SELECT nombre,peso from jugadores
WHEREpeso > ALL
(SELECTpeso FROMjugadores WHERE
procedencia=Spain);
I Michael Doleac
I A1 Jefferson
I Chris Richard
A1 igualqueen el casodel operadorexists,sepuedeasumirquepor cadaregistro
de la consultaprincipal se ejecuta una subconsulta.En tal caso,para el jugador
Michae1Doleac cuyopesoes262 libras,secomprobaríasi262esmayorquelospesos
de todos losjugadoresespañoles,que son devueltospor la subconsulta(SELECT
peso
FROM jugadoresWHERE procedenciafspain).
También sepodría consultarlosbases(en inglésGuard
G) posicion=G, que
pesanmásquecualquier(ANY) pívot (en inglésCenter "C) posicion: C de la nba:
SELECT nombre,peso from jugadores
WHEREposicion=G AND
peso > ANY
(SELECTpeso FROMjugadores where posicion=C);
I Joe Johnson
I
+----------- --+ ---- --+
Secomprueba
queenelcaso
deJoe Johnson,supeso(235libras),esmayorque
algún pesode algún pívot de la nba, dándoseasí el peculiar casode un basemás
pesadoque algún pívot.
4.7.5. Subconsultas anidadas
Se puede usar una subconsultapara ltrar los resultadosde otra subconsulta.
De estamanerase anidan Subconsultas.
Por ejemplo.si sedeseaobtenerel nombre
de la ciudad dondejuega el jugador más alto de la nba, habría que pensarcómo
hacerlo de forma estructurada:
157
Bases de Datos
1. Obtener la altura del jugador más alto:
X <- (SELECT max(a1tura) from jugadores)
2. Obtener el nombre del jugador, a través de la altura se localiza al jugador y
por tanto, su equipo:
Y <
SELECT Nombre__equipo from jugadores WHERE
Altura = X
3. Obtener la ciudad:
SELECT ciudad FROM equipos WHERE nombre= Y
Ordenando todo esto, se puede construir la consulta de abajo a. arriba:
SELECT ciudad FROM equipos WHERE
nombre =
(SELECT
Nombre_equipo FROM jugadores WHERE
altura =
(SELECT
MAX(a1tura) FROM jugadores));
+ ------- --+
| ciudad
+ ------- --+
I Houston I
+ --+
Esta manera de generar consultas es muy sencilla, y a la vez permite explorar
la información de la base de datos de forma. estructurada. En opinión de muchos
autores esta forma. estructurada de generar consultas es la que dio a SQL
su S de
Structured.
4.8. Consultas multitabla
Una consulta multitabla es aquella en la que se puede Consultar información de
más de una tabla. Se
aprovechan los campos relacionados de las tablas para unirlas
(join). Para poder realizar este tipo de consultashay que utilizar la siguiente sintaxis:
SELECT
[DISTINCT] se1ect_expr [,se1ect_expr] ...
[FROM referencias_tab1as]
[WHERE filtro]
[GROUP BYexpr [, expr].... ]
[HAVING fi1tro_grupos]
[ORDER BY{nombre_co1umnas I expr I posición} [ASC
I DESC] , . .
158
Capítulo 4. Realización de Consultas
La diferencia con las consultas sencillas se halla en la cláusula FROM. Esta vez
en lugar de una tabla se puede desarrollar el token referencias_tablas:
referencias_tablas:
referencia_tab1a[, referencia_tabla] ...
I referencia_tabla [INNER I CROSS] JOIN referencia_tab1a [ON condición]
I referencia_tab1a LEFT [OUTER] JOIN referencia_tab1a ON condición
l referencia_tabla RIGHT [OUTER] JOIN referencia_tab1a ON condición
referencia_tab1a:
nombre_tab1a [[AS] alias]
La primera opción, (referencia_tabla[.
referenciajabla] es típica de SQL 1
(SQL-86) para las uniones, que consisten en un producto cartesiano más un ltro
por las columnas relacionadas, y el resto de opciones sonpropias de SQL 2 (SQL-92
y SQL-2003).
4.8.1. Consultas multitabla SQL 1
El producto cartesiano de dos tablas son todas las combinaciones de las las
de una tabla unidas a las las de la otra tabla. Por ejemplo, una base de datos de
mascotas con dos tablas animales y propietarios:
SELECT * FROM propietarios;
| 51993482Y | José Pérez I
I 28834177X I Matías Fernández I
I 37276317Z I Francisco Martínez I
+ --------- --+ ------------------ --+
SELECT * FROM animales;
+
------ --+ -------- --+ ----- --+ ----------- --+
I codigo I nombre I tipo I propietario I
+
------ --+ -------- --+ ----- --+ ----------- --+
I 1 I Cloncho I gato I 51993482Y I
| 2 I Yoda I gato I 51993482Y I
I 3 I Sprocket I perro I 372763172 I
+
------ --+ -------- --+ --+ ----------- --+
Un producto cartesiano de las dos tablas se realiza con la siguiente sentencia:
159
Bases de Datos
Cloncho
Yoda
Sprocket
Cloncho
Yoda
Sprocket
Cloncho
Yoda
Sprocket
SELECT * FROM animales,propietarios;
51993482Y
51993482Y
372763172
51993482Y
51993482Y
372763172
51993482Y
5199348
Capítulo 4. Realización de Consultas
Este mismo procedimiento se puede aplicar con N tablas, por ejemplo, con la base
de datos jardineria, cuyo gráco de relaciones esel siguiente:
cungc
Nombrecliente
Nombrecontacu:
Apellidocontacu:
Telefono
Fax
LheaD reccionl
LineaD reccion2
Ciudad
Region
Pais
Cod igoPostal
CodigoEITpleadoRepVentas
LimiwCreditD
,.
.4;
cuirrpbab
Nombre
Apellidol
Apellido
Extension
Email
Codigoofncina
codigoJefe
Cuidad
Pais
Region
CodigoPostaI
Telefono
Bases de Datos
Se observa que en est.e casohay dos JOIN,
el primer join entre la tabla Clien-
tes y Pedidos, con la condición Clientes.CodigoCliente=Pedidos.CodigoCliente y la
segunda join entre el resultado de la primera. join y la tabla Empleados (Emplea-
dos.CodigoEmpleado =
Clientes.CodigoEmpleadoRepVentas). Nótese que los dos
ltros de la join están unidas por el operador AND. De esta forma se va extrayen-
do de la base de datos toda la información relacionada, obteniendo así mucha más
potencia en las consultas.
También hay que jarse en que como hay dos camposCodigoCliente, para hacer-
les referencia,hay que precederlos desu nombre de tabla (p.e. PedidosCodigoCliente)
para evitar que el SGBD informe de que hay una columna con nombre ambiguo.
Realizar una consulta multitabla no limita las características de ltrado y agru-
pación que ofrece SQL, por ejemplo, si se desea realizar una consulta para obtener
cuántos pedidos ha gestionado cada empleado, se modicaría la consulta anterior
para agrupar por la columna Nombre de Empleado y contar la columna CodigoPe-
dido:
SELECT Emp1eados.Nombre,
COUNT(Pedidos.CodigoPedido) as NumeroDePedidos
FROM Clientes, Pedidos, Empleados
WHERE
Clientes.CodigoC1iente=Pedidos.CodigoC1iente
AND
Emp1eados.CodigoEmp1eado =
Clientes.CodigoEmpleadoRepVentas
GROUP BY Emp1eados.Nombre
ORDER BY NumeroDePedidos;
I Michael
I Lorena
4.8.2. Consultas multitabla SQL 2
SQL 2
introduce otra sintaxis para los siguientes tipos de consultas multitablas:
las joins (o composiciones)
internas, externasy productos cartesianos (tambiénlla-
madas composiciones
cruzadas):
1. Join Interna:
n De equivalencia (INNER JOIN)
162
Capítulo 4. Realización de Consultas
u
Natural (NATURAL JOIN)
2. Producto Cartesiano (CROSS JOIN)
3. Join Externa
n De tabla derecha(RIGHT OUTER JOIN)
IDe tabla izquierda (LEFT OUTER JOIN)
ICompleta (FULL OUTER JOIN)
Composiciones internas. INNER JOIN
Hay dos formas diferentes para expresar las INNER JOIN o composiciones in-
ternas. La primera, usa la palabra reservada JOIN, mientras que la segunda usa ,
para separar las tablas a combinar en la sentencia FROM, es decir, las de SQL 1.
Con la operación INNER JOIN se calcula el producto cartesiano de todos los
registros, después, cada registro en la primera tabla es combinado con cada registro
de la segunda tabla, y solo se seleccionanaquellos registros que satisfacen las con-
diciones que se especiquen. Hay que tener en cuenta que los valores Nulos no se
combinan.
Como ejemplo, la siguiente consulta toma todos los registros de la tabla animales
y encuentra todas las combinaciones en la tabla propietarios. La JOIN compara los
valores de las columnas dni y propiet.arío. Cuando no existe esta correspondencia
entre algunas combinaciones, estas no se muestran; es decir, que si el dni de un
propietario de una mascota no coincide con algún dni de la tabla de propietarios,
no se mostrará el animal con su respectivo propietario en los resultados.
SELECT *FROM animales INNER JOIN propietarios
ON anima1es.propietario =
propietarios.dni;
+ ------ --+ -------- --+ ----- --+ ----------- --+ --------- --+ ------------------ --+
I codigo I nombre I tipo Í propietario I dni I nombre
+ ------ --+ --+ ----- --+ ----------- --+ --------- --+
------------------ --+
1 I Cloncho I gato I 51993482Y Í 51993482Y I José Pérez I
2 I Yoda I gato I 51993482Y I 51993482Y I José Pérez I
3 I Sprocket I perro I 372763172 I 372763172 I Francisco Martinez I
+ ------ --+ -------- --+ ----- --+ ----------- --+ --+ --+
#
Nótese que es una consulta equivalente a la vista en el apartado anterior
#
select *from anima1es,propietarios
#
where animales.propietario=propietarios.dni;
163
Bases de Datos
Además, debe tenerse encuenta que si hay un animal sin propietario no saldrá en
el conjunto de resultados puesto que no tiene coincidencia en el ltro:
INSERT INTO animales VALUES (nul1,Arco,perro,nu11);
SELECT * FROM animales;
+ ------ --+ -------- --+ --+ --+
I codigo I nombre I tipo I propietario I
+
------ --+ --+ ----- --+ --+
I 1
I Cloncho I gato I 51993482Y I
I 2 I Yoda I gato I 51993482Y I
Í 3 I Sprocket I perro I 372763172 I
I 4 I Arco I perro I NULL I #nueva mascota sin propietario
+
------ --+ -------- --+ ----- --+ ----------- --+
SELECT * FROM animales INNER JOIN propietarios
ON anima1es.propietario =
propietarios.dni;
+
------ --+ -------- --+ ----- --+ ----------- --+ --------- --+ ------------------ --+
Icodigo I nombre Itipo I propietario I dni I nombre I
+ ------ --+ --+ ----- --+ ----------- --+ --------- --+ ------------------ --+
I 1
I Cloncho I gato I 51993482Y I 51993482Y I José Pérez I
l 2
l Yoda l gato I 51993482Y l 51993482Y l José Pérez l
I 3 I Sprocket I perro I 372763172 I 372763172 I Francisco Martinez I
+ ------ --+ -------- --+ ----- --+ ----------- --+ --------- --+ ------------------ --+
#LA NUEVA MASCOTA N0 APARECE!
Puede hacerse variantes de la inner join cambiando el operador del ltro, por
ejemplo:
SELECT *FROM animales INNER JOIN propietarios
DN propietarios.dni >= anima1es.propietario;
+ ------ --+ -------- --+ ----- --+ ----------- --+ --------- --+ ------------------ --+
I codigo I nombre I tipo I propietario I dni I nombre I
+ ------ --+ -------- --+ ----- --+ ----------- --+ --------- --+ ------------------ --+
1 I Cloncho I gato I 51993482Y I 51993482Y I José Pérez
3
I Sprocket I perro I 372763172 I 51993482Y I José Pérez
3 I Sprocket I perro I 372763172 I372763172 I Francisco Martínez
+ ------ --+ -------- --+ --+ --+ --+ ------------------ --+
I
2 I
Yoda I
gato I
51993482Y I
51993482Y I
José Pérez
|
I
I
Composiciones naturales. NATURAL JOIN
Es una especialización de la INNER JOIN. En este caso se comparan todas las
columnas que tengan el mismo nombre en ambastablas. La tabla. resultante contiene
solo una columna por cada par de columnas con el mismo nombre.
Capítulo 4. Realización de Consultas
DESCRIBE Empleados;
+
---- --+--+ ------- --+
I I | I
+ ------------ --+ ---- --+--+ ------- --+
I CodigoEmpleado I I I I I I
I Nombre I varchar(50) I N0 I I NULL I |
I Apellidol | varchar(50) I N0 I I NULL I I
I Ape1lido2 I varchar(50) I YES I I NULL I I
IExtension I varchar(10) I N0 II NULL I |
| Email I varchar(100) I N0 II NULL II
I Codigoüficina I varchar(10) I N0 I I NULL I I #relación
I CodigoJefe I int(11) I YES I | NULL I I
I Puesto I varchar(50) I YES I I NULL I I
+ -------------- --+ ------------ --+ ---- --+--+ ------- --+ --+
DESCRIBE Oficinas;
+ --------------- --+ ----------- --+ ---- --+--+ ------- --+ ----- --+
I Field I Type I Null I Key I Default I Extra I
+
--------------- --+ --+ ---- --+--+ --+ --+
I Codigoüficina I varchar(10) I N0 I PRI I NULL I I #relación
I Ciudad I varchar(30) I N0 I I NULL I I
I Pais I varchar(50) I N0 I I NULL I I
I Region I varchar(50) I YES I I NULL I I
I CodigoPostal I varchar(10) I N0 I I NULL I I
| Telefono I varchar(20) I N0 I I NULL I |
I LineaDireccion1 I varchar(50) I N0 I I NULL I |
I LineaDireccion2 I varchar(50) I YES I I NULL I |
+ --+ ----------- --+ ---- --+--+ ------- --+ ----- --+
#NATURAL JOIN coge los mismos nombres de campo, en este caso Codigoüficina
SELECT
CodigoEmpleado,Empleados.Nombre,
Oficinas.Codigo0ficina,0ficinas.Ciudad
FROM
Empleados NATURAL
JOIN Oficinas;
+
-------------- --+ --------------- --+ ------------- --+ -------------------- --+
I CodigoEmpleado I Nombre I Codigoüficina I Ciudad I
+ -------------- --+ --------------- --+ ------------- --+ -------------------- --+
I 1
I Marcos I TALES
I Talavera de la Reina l
2 I Ruben I TAL-ES I Talavera de la Reina I
I 31 I Mariko I SYD-AU
I Sydney I
Hay que jarse en que, aunque CodigoEmpleado es un campo que está en dos
tablas, esta vez noes necesarioprecederlo delnombre detabla puesto que NATURAL
JOIN devuelve un único campo por cada pareja de campos con el mismo nombre.
165
Bases de Datos
Producto cartesiano.CROSS JOIN
Este tipo de sintaxis devuelve el producto cartesiano de dos tablas:
#equiva1ente a SELECT * FROM anima1es,propietarios;
SELECT * FROM animales CROSS JOIN propietarios;
I codigo I nombre
+
I
l
l
l
l
I
|
I +
l
l
l
l
|
l
|
l
l
I
Cloncho
Cloncho
Yoda
Yoda
Capítulo 4. Realización de Consultas
SELECT
* FROM animales LEFT OUTER JOIN propietarios
DN animales.propietario = propietarios.dni;
+------ --+ -------- --+ ----- --+ ----------- --+ --------- --+ ------------------ --+
I codigo
I nombre
I tipo
I propietario
I dni
I nombre
I
+------ --+ -------- --+ ----- --+ ----------- --+ --------- --+ ------------------ --+
I 1
I Cloncho
I gato
I 51993482Y
I 51993482Y
I José Pérez
I
| 2
I Yoda
I gato
I 51993482Y
I 51993482Y
I José Pérez
I
I 3 I Sprocket
I perro
I 372763172
I 372763172
I Francisco Martinez
I
I 4 I Arco
I perro
I NULL
I NULL I NULL
I
+------ --+ -------- --+ ----- --+ ----------- --+ --------- --+ ------------------ --+
Se observa que se incluye el perro
Arco que no tiene propietario, por tanto, sus
campos relacionados aparecen con valor
NULL. El sentido de esta.query podría ser,
sacar todos los animales
y si tienen relación, sacar sus propietarios,
y si no tiene
propietario,
índicarlo
conunvalorN
ULO oconVACÍO.
¿Sabías que . . . 7 Oracleimplementaba
las consultas
externasantesde
la aparición de las OUTER
JOIN. utilizando el operador (+)= en lugar del
operador = en la cláusula WHERE. Esta sintaxis aún está disponible en las
nuevas versiones de este
SGBD.
Si los registros que admiten no tener correspondencia son los que aparecen en la
tabla de la derecha, sellama composición de tabla derecha
RIGHT JOIN (o RIGHT
OUTER JOIN):
#ejemp1o de RIGHT
OUTER JOIN
#anima1es RIGHT
OUTER JOIN propietarios
#anima1es está a la izquierda
#propietarios está a la derecha
SELECT
* FROM animales RIGHT OUTER JOIN propietarios
ON anima1es.propietario = propietarios.dni;
+------ --+ -------- --+ ----- --+ --+ --+ ------------------ --+
I codigo
I nombre
I tipo
I propietario
I dni
I nombre
I
+------ --+ -------- --+ ----- --+ ----------- --+ --------- --+ ------------------ --+
1 I Cloncho
I gato
I 51993482Y
I 51993482Y
I José Pérez
I
2 l Yoda
Í gato
I 51993482Y
I 51993482Y l José Pérez l
NULL I
NULL INULL I
NULL I 2883477X
| Matías
Fernández
I
|
3 I Sprocket
I perro
I 372763172
I 372763172
I Francisco Martinez
+------ --+ -------- --+ ----- --+ ----------- --+ --+ --+
167
Bases de Datos
En estecaso, losque aparecenson todoslos propietarios, incluido Matías Fernández
que no tiene una mascota. Seve que el perro Arco no aparece, puesesta vezlos regis-
tros que se deseanmostrar son todos los de la tabla derecha (es decir, propietarios).
La operación que admite registros sin correspondencia tanto para la tabla izquier-
da como para la derecha, por ejemplo. animales sin propietario y propietarios sin
animales, se llama composición externa completa o FULL JOIN (FULL OUTER
JOIN). Esta operación presenta los resultados de tabla izquierda y
tabla. derecha
aunque no tengan correspondencia en la otra tabla. La tabla combinada contendrá,
entonces, todoslos registros de ambastablas y presentará valoresnulos para registros
sin pareja.
#ejemp1o de FULL OUTER JOIN
#anima1es FULL OUTER JOIN propietarios
#anima1es está a la izquierda
#propietarios está a la derecha
SELECT * FROM animales FULL OUTER JOIN propietarios
DN anima1es.propietario =
propietarios.dni;
+ ------ -+ -+ -+ ----------- -+ --------- -+ ------------------ -+
I codigo I nombre I tipo I propietario I dni I nombre
Cloncho I 51993482Y 51993482Y l José Pérez
Yoda gato I 51993482Y 51993482Y I José Pérez
Sprocket perro I 372763172 372763172 I Francisco Martinez I
l NULL NULL NULL
2883477X Matias Fernández
¿Sabías que . . . 7
En SQL existe
el operador
UNION, que
añade al
conjun-
to de resultados producidos por una SELECT, los resultados de otra SELECT.
La sintaxis es:
SELECT FROM
UNION [ALL]
SELECT FROM
El parámetro ALL incluye todos los registros de las dos SELECT, incluyendo
los que son iguales. Si no se indica ALL, se excluyen los duplicados.
Aunque MySQL no implementa la característica FULL OUTER JOIN, sí que se
puede simular haciendo una unión de los resultados de un LEFT OUTER JOIN y
168
Capítulo 4. Realización de Consultas
los resultados de un RIGHT OUTER JOIN, puesto que UNION,
sin la opción ALL,
elimina los registros duplicados, por tanto, se podría codicar la FULL OUT ER
JOIN anterior de la siguiente forma:
mysq1> SELECT * FROM animales LEFT OUTER JOIN propietarios
-> ON anima1es.propietario -propietarios.dni
-> UNION
-> SELECT * FROM animales RIGHT
OUTER JOIN propietarios
-> ON
anima1es.propietario =
propietarios.dni;
+ -+ -+ -+ ----------- -+ -+ -+
I codigo I nombre I tipo I propietario I dni I nombre I
+ -+ -------- -+ ----- -+ ----------- -+ --------- -+ ------------------ -+
I Cloncho I gato I 51993482Y I 51993482Y I José Pérez I
I Yoda I gato I 51993482Y I 51993482Y I José Pérez I
I Sprocket I perro I 372763172 I372763172 I Francisco Martinez I
I Arco I perro I NULL
I NULL I NULL I
I I I
+
+ +
NULL NULL
I NULL
2883477X Matias Fernández I
4.9. Consultas reexivas
A veces, es necesario obtener información de relaciones reexivas, por ejemplo,
un informe de empleadosdonde junto a su nombre y apellidos apareciera el nombre
y apellidos de su jefe. Para ello, es necesario hacer una JOIN entre registros de la
misma tabla:
mysq1> desc Empleados;
+ -------------- -+ ------------ -+ ---- +--+ ------- -+ ----- -+
I F1e1d I Type I Null I Key I Default I Extra I
+
-------------- -+ ------------ -+ ---- --+-----+ ------- -+ ----- -+
I CodigoEmp1eado I int(11) I N0
I PRI I NULL
I |
I Nombre I varchar(50) I N0
I I NULL
I I
| Apellidol I varchar(50) I N0
I I NULL
I I
I Ape11ido2 I varchar(50) I YES I I NULL
I |
I Extension I varchar(10) I N0
I l NULL
I I
| Email I varchar(100) I ND
I I NULL
I |
I Codigoüficina I varchar(10) I N0
I I NULL
I I
I CodigoJefe I int(11) I YES I I NULL
I I #autore1ación
I Puesto I varchar(50) I YES I I NULL
I I
+
-------------- -+ ------------ -+ ---- -+----+ ------- -+ -+
SELECT concat(emp.Nombre, ,emp.Ape11ido1) as Empleado,
concat(jefe.Nombre, ,jefe.Ape11ido1) as jefe
169
Bases de Datos
FROM Empleados emp INNER JOIN Empleados jefe
ON emp.CodigoEmp1eado=jeÍe.CodigoJefe;
+ -+ ----------------------- -+
I Empleado I Jefe I
+ ----------------- -+ ----------------------- -+
I Marcos Magaña I Ruben López I
I Ruben López I Alberto Soria I
I Alberto Soria I Kevin
Fallmer I
I Kevin Fallmer I Julian Bellinelli I
l Kevin Fallmer I Mariko Kishi I
+
----------------- -+ ----------------------- -+
Analizando la query anterior, primero se observa el uso de la tabla empleados
dos veces,una con un alias emp que representa los empleados como subordinados y
otra con alias jefe que representalos empleadoscomo jefes.Ambas tablas (aunque en
realidad son la misma) se unenen una JOIN a través de la relación CodigoEmpleado
y CodigoJefe.
Por otro lado, el primer campo que se selecciona esla concatenación del nombre
y apellido del empleado (concat(emp.Nombre,&#39; ,emp.Apellido1)
al que a su vez
le damos un alias (empleado) y el segundo campo que es la concatenación de los
empleados jefes, al que le se le da el alias jefe.
Se puede observar que en esta query no aparecen los empleados sin jefe, puesto
que se ha utilizado un INNER JOIN. Para mostrarlos, habría. que usar un LEFT o
RIGHT OUTER JOIN.
4.10. Consultas con tablas derivadas
Las consultas con tablas derivadas, o inline views, son aquellas que utilizan sen-
tencias SELECT en la cláusula FROM en lugar de nombres de tablas, por ejemplo:
SELECT * FROM
(SELECT CodigoEmpleado, Nombre FROMEmpleados
WHERE CodigoOficina=TAL-ES) as tabla_derivada;
En este caso se ha de distinguir, por un lado la tabla derivada, (SELECT Co-
digoEmpleado, NombreFROM Empleados) que tiene un alias tabla_derivada, es
decir, una especie de tabla temporal cuyo contenido es el resultado de ejecutar la
consulta, su nombre es tabla_derivada y tiene dos columnas, una CodigoEmpleado
y otra Nombre. Este tipo de consultas ayudará a obtener información relacionada
de forma mucho más avanzada.
170
Capítulo 4. Realización de Consultas
Por ejemplo, en la base dedatos jardineria, si sedesea sacarel importe del pedido
de menor coste de todos los pedidos. hay que pensar primero como sacar el total
de todos los pedidos y de ahí, el pedido con menor coste con la función de columna
MIN:
#1: Para calcular el total de cada pedido, hay que codificar esta query
SELECT SUM(Cantidad*PrecioUnidad) as total,CodigoPedido
FROM Deta11ePedidos
GROUP BY CodigoPedido;
#2: Para calcular el menor pedido, se puede hacer una tabla
#
derivada de la consulta anterior y con la función MIN
#
obtener el menor de ellos:
SELECT MIN(total) FROM (
SELECT SUM(Cantidad*PrecioUnidad) as total,CodigoPedido
FROM Deta11ePedidos
GROUP BY
CodigoPedido
) AS TotalPedidos;
+ ---------- --+
I MIN(tota1) l
+ --+
| 4 I
+ ---------- --+
#Tota1Pedidos es la tabla derivada formada
#por el resultado de la consulta entre paréntesis
Las tablas derivadas no tienen limitación, es decir, se puedenunir a otras tablas,
ltrar, agrupar, etc.
171
Bases de Datos
4.11. Prácticas Resueltas
Práctica 4.1: Consultas simples
en MS-Access
Con la BBDD Automóviles, genera sentenciasSQL para obtener:
1. El nombre de las marcas y modelos de los vehículos.
2. El nombre de los modelos cuyas emisionesestén entre 150 y 165.
3. El nombre de los modelos cuyas emisiones estén entre 150 y 165 o que su
consumo esté entre 5
y 6 ordenado por consumo descendentemente.
4. Un listado de todas las Marcas que hay (sin repeticiones).
Para crear una consulta en modo SQL en Access, se pulsa en la pestaña. Crear,
opción Diseño de Consulta, y a continuación, se pulsa en el botón SQL. Final-
mente, se escribe la sentencia SELECT y, para ejecutarla, se pulsa en la admiración
de la pestaña Diseño .
#1
SELECT
Marca,Mode1o FROM
Automóviles;
#2
SELECT
modelo FROM
Automóviles WHERE
Emisiones >= 150 AND Emisiones <=165;
#3
SELECT mode1o,consumo,emisiones FROM Automóviles WHERE
(Emisiones >= 150 AND Emisiones <=165) OR (Consumo>=5 AND Consumo<=6)
ORDER BY consumo DESC;
#4
SELECT
DISTINCT Marca
FROM Automóviles;
Práctica 4.2: Consultas simples
con Ia BBDD jardinería
Codica en MySQL y Oracle sentencias para obtener la siguiente información:
1. Sacar el código de ocina y la ciudad donde hay ocinas.
Sacar cuántos empleados hay en la compañía.
Sacar cuántos clientes tiene cada país.
FP.
Sacar cuálfue el pago medioen 2005(pista: Usarla función YEAR de mysql
o la función to_char(fecha,yyyy) de Oracle).
Capítulo 4. Realización de Consultas
5. Sacar cuántos pedidos están encada estadoordenado descendentepor el núme-
ro de pedidos.
6. Sacar el precio del producto más caro y del más barato.
#1
SELECT CodigoOficina,ciudad FROM Oficinas;
#2
SELECT Count(*) FROM Empleados;
#3
SELECT Count(*),Pais FROM
Clientes GROUP
BY Pais;
#4
SELECT AVG(Cantidad) FROM
Pagos WHERE YEAR(FechaPago)=2005; #(mysql) ó
#4
SELECT AVG(Cantidad) FROM
Pagos WHERE TO_CHAR(FechaPago,YYYY)=2005;
#5
SELECT Count(*),Estado FROM
Pedidos GROUP BY Estado
ORDER
BY Count(*) DESC;
#6
SELECT Max(PrecioVenta),Min(PrecioVenta) FROM Productos;
Práctica 4.3: Subconsultas conIa BBDD jardinería
Codica en SQL sentencias para obtener la siguiente información:
1. Obtener el nombre del cliente con mayor limite de crédito.
2. Obtener el nombre, apellidol y
cargo de los empleados que no representen a
ningún cliente.
#1
SELECT
Nombrecliente
FROM
ClientesWHERE
LimiteCredito =
(SELECT Max(LimiteCredito) FROM
Clientes);
#2
SELECT Nombre, Apellidol, Puesto FROM
Empleados WHERE CodigoEmp1eado
NOT IN (SELECT CodigoEmp1eadoRepVentas FROM
Clientes );
173
Bases de Datos
Práctica 4.4: Consultas multitablacon la BBDD jardinería
Codica en SQL consultas para obtener:
1. Sacar un listado con el nombre de cada cliente y
el nombre y apellido de su
representante de ventas.
2. Mostrar el nombre de los clientes que no hayan realizado pagos junto con el
nombre de sus representantes de ventas.
3. Listar las ventas totales de los productos que hayan facturado más de 3000
euros. Se
mostrará el nombre. unidades vendidas, total facturado y total fac-
turado con impuestos (18
(7o IVA).
4. Listar la dirección de las ocinas que tengan clientes en Fuenlabrada.
#1
SELECT NombreC1iente, Nombre as NombreEmp, Apellidol as ApeEmp
FROM Clientes INNER JOIN Empleados ON
Clientes.CodigoEmpleadoRepVentas=Empleados.CodigoEmp1eado;
#2
SELECT NombreC1iente,Nombre as NombreEmp, Apellidol as ApeEmp
FROM Clientes INNER JOIN Empleados ON
Clientes.CodigoEmp1eadoRepVentas=Emp1ea
where
Codigocliente not
in (SELECT
CodigoC1iente FROM
Pagos);
#3
SELECT
Nombre, SUM(Cantidad) As Tota1Unidades,
SUM(Cantidad*PrecioUnidad) as Tota1Facturado,
SUM(Cantidad*PrecioUnidad)*1.18 as Totalconïmpuestos
FROM Deta11ePedidos NATURAL JOIN Productos
GROUP BY Nombre
HAVING Sum(Cantidad*PrecioUnidad)>3000;
#4
SELECT
CONCAT(0ficinas.LineaDireccion1,0ficinas.LineaDire
Dficinas.Ciudad
FROM Oficinas, Emp1eados,C1ientes
WHERE
Oficinas.CodigoÜficina=Emp1eados.Codigo0ficina AND
Empleados.CodigoEmp1eado=C1ientes.CodigoEmp1eadoRepVentas AND
Clientes.Ciudad=Fuenlabrada;
174
Capítulo 4. Realizaciónde Consultas
Práctica 4.5: Consulta con tablas derivadas
Sacar el clienteque
hizo el pedidode mayor cuantía:
Esta. consulta es mejor codicarla en un. amhivo de texto para no tener que escribirla múltiples vecessi
da errores. La estrategia para resolverlo es hacer pequeñas consultas (querys A,B y C) para luego unirlas
y generar la denitiva:
#query A: Sacar la cuantía de los pedidos:
(select CodigoPedido, Codigocliente,
sum(Cantidad*PrecioUnidad) as total
from Pedidos natural join DetallePedidos
group by CodigoPedido,CodigoC1iente) Tota1Pedidos;
#query B: Sacar el pedido más caro:
select max(tota1) from
(select CodigoPedido, Codigocliente,
sum(Cantidad*PrecioUnidad) as total
from Pedidos natural join Deta1lePedidos
group
by CodigoPedido,CodigoC1iente) Tota1Pedidos;
#query C: Sacar el código de cliente correspondiente
al pedido más caro (querydefinitiva.sq1)
querydefinitiva.sq1
Select Tota1Pedidos.Codigocliente,NombreCliente from
(select CodigoPedido, Codigocliente,
sum(Cantidad*PrecioUnidad) as total
from Pedidos natural join Detal1ePedidos
group
by CodigoPedido,CodigoCliente) Tota1Pedidos
inner join Clientes on
Clientes.CodigoC1iente=Tota1Pedidos.CodigoC1iente
where tota1=
( select max(tota1) from
(select CodigoPedido, CodigoC1iente,
sum(Cantidad*PrecioUnidad) as total
from Pedidos natural join Deta11ePedidos
group by CodigoPedido,CodigoCliente) TotalPedidos
);
175
Bases de Datos
4.12. Prácticas Propuestas
Práctica 4.6: Consultas simples
en MS-Access
Con la BBDD Automóviles, genera sentenciasSELECT para obtener esta informa-
ción:
1.
2.
3.
Modelos de vehículos TDlf
Modelos de la marca Audi y de la marca "Seat ordenado por lllarca y Modelo.
Alarcas de Vehículos que empiecen por T y terminen en a.
.Vehículos que tengan foto.
.El consumo de los vehículos está expresadoen litros / IOOkm.Listar el consumo
de losvehículos Seat en MPG, lIillas por galón (10MPG=23.49 1/100km).
O
Práctica 4.7: Consultas simples
con la BBDD jardinería
Codica en SQL (Oracle y MySQL) sentencias paraobtener la siguiente información:
1.
2.
OWNQF-l
Sacar la ciudad y el teléfono de las ocinas de Estados Unidos.
Sacar el nombre, los apellidos y el email de los empleados a cargo de Alberto
Soria.
Sacar el cargo, nombre, apellidos y email del jefe de la empresa.
Sacar el nombre, apellidos y cargo de aquellos que no sean representantes de
ventas.
Sacar el número de clientes que tiene la empresa.
Sacar el nombre de los clientes españoles.
Sacar cuántos clientes tiene cada país.
Sacar cuántos clientes tiene la ciudad de Madrid.
.Sacar cuántos clientes tienen las ciudades que empiezan por M.
4Hay quetener encuenta queen Access,
el comodín°7c es
un *
10.
11.
12.
13.
14.
Bases de Datos
3. Obtener los clientes cuya línea de crédito sea mayor que los pagos que haya
realizado.
4. Sacar el producto que más unidades tiene en stock y el que menos unidades
tiene en stock.
Práctica 4.9: Consultas multitabla
con IaBBDD jardinería
Codica en SQL las siguientes consultas:
1. Sacar el nombre de los clientes y el nombre de sus representantes junto con la
ciudad de 1a ocina a la que pertenece el representante.
2. Sacar la misma información que en la pregunta anterior pero solo los clientes
que no hayan echo pagos.
3. Obtener un listado con el nombre de los empleadosjunto con el nombre de sus
jefes.
4. Obtener el nombre de los clientes a los que no se les ha entregado a tiempo un
pedido (FechaEntrega>FechaEsperada).
Práctica 4.10: Consultas variadas
con la BBDD jardinería
Codica en SQL las siguientes consultas:
1. Sacar un listado de clientes indicando el nombre del cliente y cuántos pedidos
ha realizado.
2. Sacar un listado con los nombres de los clientes y el total pagado por cada uno
de ellos.
3. Sacar el nombre de los clientes que hayan hecho pedidos en 2008.
4. Listar el nombre del cliente y el nombre y apellido de sus representantes de
aquellos clientes que no hayan realizado pagos.
178
10.
11.
12.
13.
14.
15.
16.
17.
18.
Capítulo 4. Realización de Consultas
Sacar un listado de clientes donde aparezca el nombre de su comercial y la
ciudad donde está su ocina.
. Sacar el nombre, apellidos, ocina y cargo de aquellos que no sean represen-
tantes de ventas.
. Sacar cuántos empleadostiene cada ocina, mostrando el nombre de la ciudad
donde está la ocina.
. Sacar un listado con el nombre de los empleados,y el nombre de sus respectivos
jefes.
. Sacar el nombre, apellido, ocina (ciudad) y cargo del empleado que no repre-
sente a ningún cliente.
Sacar la media de unidades en stock de los productos agrupados por gama.
Sacar los clientes que residan en la misma ciudad donde hay una ocina, indi-
cando dónde está la ocina.
Sacar los clientes que residan en ciudades donde no hay ocinas ordenado por
la ciudad donde residen.
Sacar el número de clientes que tiene asignado ca.da representantede ventas.
Sacar cuál fue el cliente que hizo el pago con mayor cuantía y el que hizo el
pago con menor cuantía.
Sacar un listado con el precio total de cada pedido.
Sacar losclientes que hayan hecho pedidos en el 2008 por una cuantía superior
a 2000 euros.
Sacar cuántos pedidos tiene cada cliente en cada estado.
Sacar los clientes que han pedido más de 200 unidades de cualquier producto.
Bases de Datos
2. Equipos que comiencen por H
y terminen en S.
3. Puntos por partido de Pau Gasol en toda su carrera.
4. Equipos que hay en la conferencia oeste (w&#39;est).
5. Jugadoresde Arizona que pesenmás de 100 kilosy midan más de 1.82m (6
pies).
Puntos por partido de los jugadores de los cavaliers.
Jugadores cuya tercera letra de su nombre sea la v.
Número de jugadores que tiene cada equipo de la conferencia oeste West.
©9051?
.Número de jugadores Argentinos en la NBA.
10. Máxima media de puntos de Lebron James en su carrera.
11. Asistenciaspor partido de Jose Calderon en la temporada O7/O8.
12. Puntos por partido de Lebron James enlas temporadasdel 03/04 al 05/06.
13. Número de jugadores que tiene cada equipo de la conferencia este East.
14. Tapones por partido de los jugadores de los Blazers.
15. Media de rebotes de los jugadores de la conferencia Este East.
16. Rebotes por partido de los jugadores de los equipos de Los Angeles.
17. Número de jugadores que tiene cada equipo de la división N orthWest.
18. Número de jugadores de España y Francia en la NBA.
19. Número de pivots C que tiene cada equipo.
20. ¿Cuánto mide el pívot más alto de la nba?
21. ¿Cuánto pesa (en libras y en kilos) el pívot más alto de la NBA?
22. Número de jugadores que empiezan por "Y".
23. Jugadores que no metieron ningún punto en alguna temporada.
24. Número total de jugadores de cada división.
25. Peso medio en kilos y en libras de los jugadores de los Raptors.
180
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
Capítulo 4. Realización de Consultas
Mostrar un listado de jugadores con el formato Nombre(Equipo) en una sola
columna.
Puntuación más baja de un partido de la NBA.
Primeros 10 jugadores por orden alfabético.
Temporada con más puntos por partido de Kobe Bryant.
Número de bases "G que tiene cada equipo de la conferencia este East.
Número de equipos que tiene cada conferencia.
Nombre de las divisiones de la Conferencia Este.
Máximo reboteador de los Suns.
Nláximo anotador de la toda base de datos en una temporada.
Sacar cuántas letras tiene el nombre de cada jugador de los grizzlies (Usar
función LENGTH).
¿Cuántas letras tiene el equipo con nombre más largo de la NBA (Ciudad y
Nombre)?
Práctica 4.12: Consultas con tablas derivadas
Realizar las siguientes consultas con tablas derivadas con las BBDD NBA y jardi-
neria:
Sacar el importe medio de los pedidos de la BBDD jardineria.
Sacar un listado con el número de partidos ganados por los equipos de la NBA.
Sacar la media de partidos ganados por los equipos del oeste.
¿Cuál es el pedido más caro del empleado que más clientes tiene?
181
Bases
de Datos
4.13.
182
Resumen
Los conceptos clave de este capítulo son los siguientes:
La sentencia SELECT devuelve un conjunto de resultados en forma de tabla
compuesto porlas (o registros) y columnas (ocampos).
La cláusula FROM de la sentencia SELECT especica las tablas de las que
se extrae la información, y permite. a través de operaciones como el producto
cartesiano y las JOIN, construir conjuntos de datos de información relacionada.
Cuando se especica más de una tabla en la cláusula FROM se denomina
consulta multitabla. Pueden serescritas endos tipos de sintaxis, SQLI y SQL2.
SQLl solo permite composiciones internas (INNER JOIN), mientras que SQL2
permite, además, composiciones externas (OUTER JOIN). Las NATURAL
JOIN, son un tipo de INNER JOIN que hace coincidir la información de dos
campos con el mismo nombre.
Los registros de una SELECT se pueden F ILTRAR mediante el uso de la
cláusula WHERE. Los ltros se pueden construir mediante expresiones, el
operador depertenencia aconjuntos (IN), operador derango (BETWEEN),
test de valor nulo (IS, IS NOT), test de patrón (LIKE), y limitación de registros
(LIMIT y numrows).
Para ordenar un conjunto de resultados se utiliza la palabra clave ORDER
BY. Se puede ordenar ascendentemente (ASC) o descendentemente (DESC).
Las consultas de resumense usanpara calcular información en base aconjuntos
o grupos de datos. Los grupos se construyen mediante la cláusula GROUP BY.
Los ltros sobre grupos se generan mediante la cláusula HAVING.
Las subconsultas son SELECT usadas para ltrar información mediante test
de comparación,Test de Existencia (EXISTS), Test cuanticados (ANY y
ALL). Pueden ser anidadas.
Las consultas reexivas son las que forman en su cláusula FROM la misma
tabla dos o más veces.
Las tablas derivadas son tablas virtuales generadas a través de consultas en
tiempo de ejecución. Tienen un alias que las identica.
4.14.
Test de repaso
1. ¿Para qué sirve DISTINCT en una
SELECT?
a) Para mostrar las las idénticas
b) Para no mostrar las idénticas
c) Para mostrar, aparte, las las distintas
d) Ninguna de las anteriores
2. Un ltro WHERE puede incorporar
expresiones con
a) Operadores numéricos
b) Operadores relacionales
c) Llamadas a funciones
d) Todas las anteriores
3. El operador IN
no se puede usar para
a) Escribir en un ltro una lista de valores
b) Escribir en un ltro una subconsulta
c) Una ordenación
d) Encadenar varios condiciones
de tipo AND
4. El test de valor nulo
a) Sirve para comprobarsi un conjunto dere-
sultados es vacío
b) Sirve para comprobarsi elvalor deun cam-
po es desconocido
c) Sirve para comprobar si el valor de un cam-
po es o no es desconocido
d) Todas las anterioresson correctas
5. El patrón %AX_ _
seleccionaría el va-
lor
a) XXXAX11
b) AX1111
c) XXXXIF
d) XXXAX1
Capítulo 4. Realización de Consultas
6. Filtrar por el número de resultados
a) No se puede de ninguna manera en Oracle
b) Se puede mediante la cláusula LIMIT en
Oracle
c) Se puede mediante
la cláusulanumrows en
Oracle
d) No se puede hacer de ninguna manera en
MySQL
7.En SQL se puede ordenar por
a El número de columna (1,2,3. .
c Una expresión
d
)
b) El nombre de la columna
)
)
Todas las
anteriores
8. Si junto a una función de columna, se
selecciona un campo
a) Se debe agrupar por el campo
b No se debe agrupar por el campo
)
c) No se puede seleccionar el campo
d) No se puede seleccionar la función de co-
lumna
9. Una subconsulta
a) Es un tipo especial de tabla derivada
b) Se puede anidar con otras subconsultas
c) Sus resultados se pueden ordenar bajo de-
terminadas circunstancias
d) Todas las opciones anteriores son posibles
"q&#39;6v&#39;e&#39;p&#39;¿&#39;a&#39;9&#39;e&#39;9ow-o-svaqI ¡
183
Bases de Datos
4.15.
184
.Realiza una lista con los operado-
res que puedes escribir en un ltro,
clasicándolos según su tipo.
.La tabla alumno tiene un campo
llamado Nacionalidad. Escribe una
consulta para sacar los alumnos de
España, Italia y
Dinamarca de dos
formas, una con el operador IN, y
otra con operadores AND.
.Escribe la sintaxis de la senten-
cia SELECT con todas sus cláusu-
las correspondientes (ORDER BY,
HAVING, GROUP BY, etc.) y des-
cribe para qué sirve cada una.
. Haz un esquema clasicando los ti-
pos deJOIN que existen. Incorpora
un ejemplo de cada una de ellas.
. ¿En qué se diferencia LEFT OU-
TER JOIN de RIGHT OUTER
JOIN? Pon un ejemplo de una con-
sulta que afecte a dos tablas, indi-
cando la diferencia.
¿En qué se diferencia FULL OU-
TER JOIN de INNER JOIN? Pon
un ejemplo de una consulta que
afecte a dos tablas, indicando la di-
ferencia.
.¿Qué es una tabla derivada? ¿De-
be llevar alias una tabla derivada?
¿Por qué?
8.
10.
11.
12.
13.
14.
15.
.¿Para
Comprueba tu aprendizaje
Escribe un ejemplo de la ejecución
de una subconsulta con el opera-
dor EXISTS y otra con el operador
NOT EXISTS.
qué sirve el operador
UNION? Pon un ejemplo de su uso.
Dene para qué sirven los siguien-
tes operadores de ltros, y pon un
ejemplo de cada uno de ellos:
u
BETWEEN ...AND
u
ANY
n
ALL
n
IS
u
IS NOT
u
LIKE
¿Qué diferencia hay entre HAVING
x>y y WHERE x>y?
¿Para qué sirve un CROSS JOIN?
¿Qué diferencia hay entre NATU-
RAL JOIN e INNER JOIN? Pon
un ejemplo usando ambas de dos
consultas que hagan produzcan los
mismos resultados.
¿Qué esuna consulta reexiva? Pon
un ejemplo de una sentencia SQL
con una consulta reflexiva.
¿Se podría utilizar una tabla deri-
vada dentro de una subconsulta?
CAPÍTULO 5
Tratamiento de los datos
Objetivos
C°ntenid°5 Identicar herramientas y
sen-
tencias para modicar el conte-
e H
&#39; t - ,
erramlen as
gra caspTOpOÏ nldo de labase de
datos
cionadas por el SGBD
Insertar, borrar y actualizar
Sentencia INSERT datos en
las tablas
INSERT y SELECT
Incluir en una tabla informa-
sentencia UPDATE ción de una consulta
Adoptar medidas para mante-
ner la integridad y consistencia
de la información
Sentencia DELETE
UPDATE y DELETE con sub-
consultas
Reconocer el funcionamiento
Borrado y modicación de re-
gistros con relaciones
Transacciones
de transacciones y anular par-
cial o totalmente cambios pro-
ducidos por una transacción
Identicar efectos de las políti-
Acceso concurrente a los datos .
cas de bloqueo de registros
Vistas. usuarios y privilegios . . .
e " Crear vistas y usuarios y asig-
nar privilegios
En este capítulo se detalla la sintaxis de las sentencias INSERT, UPDATE
y
DELETE. Se expone el tratamiento de las transacciones y los problemas del
acceso concurrente a los datos. Además, se introducen las principales herra-
mientas grácas de edición de datos y se explica cómo crear Vistas, usuarios y
otorgar y revocar permisos.
185
Bases de Datos
5.1. Herramientas grácas para la edición de los
datos
Existen multitud de herramientas grácas para la edición de datos, algunas,
incorporadas como parte del software del gestor de base de datos, por ejemplo, el
entorno gráco de Access;otras herramientas se distribuyen como paquetes a añadir
a.l SGBD, como phplyAdmin de MySQL: y
el software de terceros, programas por
los que hay que pagar una licencia aparte como TOAD o Aqua Data Studio. Otros
gestores como Oracle, no incorporan expresamente una herramienta de edición de
datos como tal (se pueden consultar, pero no se puedeeditar datos desde Enterprise
Manager), perose aprovechan
de herramientasde tercerospara estalabor.
5.1.1. Edición con phpMyAdmin
Una de las muchas utilidades de phpMyAdmin es la inserción de datos a través
de formularios web, donde, de forma muy sencilla, se escriben los valores para cada
campo de la tabla deseada. Tan solo hay que seleccionar la pestaña Insertar y
seleccionar la tabla donde se va a insertar los registros. Se rellenan los valores y se
pulsa continuar.
Ép;jÉ=}._;JJL,"-.¿ u! Sorvidor: localhost
b
¡y late dodatos: startrok
D
¡suTabla: Aduna
_
¡Examinar inruttura ÍJSOL , Buscar ENWWÜJ E
nar Im nar o racimos
Ïvaciav ¿Eliminar
y
Base de
datos Campo Tipo Función nulo Valor
stamek (9) v
Codigo mll) v 1 L
nmng Nombre varcharíso) y
597097,57 pimp!V
i i: L
Ikm5 Fecha date o J
1531_o3:v26
&#39;
_
a
Em Nacional-dad vmmñzm v
EELÏLÏÏW &#39;
""4 ;T "
IHnculas
=
wm mu COHUHUBI
| Mwmekhculas
E Ignorar
Campo
Tipo Función
nulo Valor
Codugo mui) y É z &#39;
"
N°m°&#39;° V3&#39;<"3&#39;(5° v wnnam Shazner
¡ha date v
¡sama-n 3
Nacionalidad varcharQO) v v/ VEEUU1
Continuar
Figura 5.1: Inserción de datos a través de phpmyadmin (paso 1).
De estaforma, segenera elcódigo SQL automáticamente para insertar los valores.
¿Sabías que . . . 7
En MySQL existe
la sintaxis
extended insert,que
permite insertar varios registros con un solo INSERT. Véase Figura. 5.2
186
Capítulo 5. Tratamiento de 10s datos
2
lísi fueron insertadas.
La Id
de la
la msertada
es:3
Ï-sín {nÏ --- -
1 e!
9:,u"
í&#39;l"v&#39;
2-1. ,3
L. Ez. "
l: Editar]!
(near código
PHP]
Ejecutar lau)
consultan) SOL
en labaso de
datos sum-uk:
m
INSERT {VO
suryet una; 4
(5129:
.hast; . Fejhn
.Ivmnaïgaax
¡ALUES Campos
n1
. Leonard
Puro;
.l93lw83-26
. ECW
I. 12,¡Hizo! Shun!.¡LH-II . coúgo _
EEUU
M Nombre
Fecha
NBCIOHEÍIÜBÚ
<<
Guardar esta
consulta en
fovontos:
Penmhr que
todo usuario
puede ¡raider
a este
favorito
Reempluar el
favorito QXISÍBHIQ
que tenga
el mnsmo
nombre
Cent: nuar
Figura 5.2:Inserción através dephpmyadmin.(paso 2).
Para eliminar o modicar registros, se utiliza la pestaña Examinar:
HEHWÜM Estructura ¿[SOL
Buscar idmorhr E
nar Im rnds-anos
¡Vaciar E Eliminar
«v; noisrtrando-regcstvïais
0-1-(2total. La
Consul-Álamo seg) i
mm
FW t":v
LIIH 4
PorllPorlnmnentol Edntarll
Explicar e!
SOL]
[Crear
CÓÚIQO PHP
I [ÁCUJBÍIZIÍ
Mostrar: ¿30 mas empezando
de o
en modo
nonzontal v ympelurlos encabezadoscaoauoo
celdas
Drgamzarsegúnla clave:
nmgum y
v Opcuones
codigo
nombro loan Nacionalidad
, X 1
LeonardNimoy 1931-03-26
EEUU
, >< 2 Williamshacner 1931-03-22
eeuu
t Marcar todos/as
IDesmarcar
todos Para
loselementos
que estan marcados:
f x I
Mostrar: 3o
mas empezando de
o
en modo
horizontal v
y repeorios encabezados
cada 10o celdas
(¡p-raciones
sobra
los nsuiudos dola zonsulu
__
Vista
deampresuon .&#39;
Prevusualuzacron para
¡mpnmnrtdocumento completo)
Exportar
Q
CREATE
VIEW |
Figura 5.3: Modicación y eliminación de datos a través de phpMyAdmin.
5.1.2. Access como entorno gráco para otros gestores
Si se conoce el entorno Access es muy sencillo conectarlo con otros gestores,
y de esta manera, aprovecharse del conocimiento de la interfaz de Microsoft para
administrar otros gestores debases dedatos. Esto es posible gracias a la utilización
de conectores ODBC. ODBC son las siglas de Open Database Connectivity. Es una
187
Bases
de Datos
herramienta que, de forma estándar, permite conectar aplicaciones a cualquier gestor
de bases de datos. Muchas aplicaciones omáticas, como Excel, Word y el propio
Access permite el accesoremoto a datos de un SGBD. Para esto, tan solo es necesario
instalar el driver ODBC para ese SGBD. De esta manera, se puede crear una DSN
o Data Source Name, es decir, una referencia a cierta base de datos.
MySQL Comedor/ODBC
Dm Senna:
Conguration
Cannon Puameters
Data Source
Name:
:192. 168.
224.
128
Figura 5.4: Creación de un origen de datos ODBC para MySQL.
Esta referencia se crea en Windows a través del panel de Control, Herramientas
Administrativas, y la opción Onyenes de Datos ODBC. Cada origen de datos requie-
re, ademásde un nombre para el propio origen, el nombre del usuario, la contraseña,
el nombre de la base dedatos y los datos de conexiónal servidor (Dirección IP y
puerto TCP/ UDP por dondese conecta).
A través de un origen de datos ODBC, se puedenenlazar a Access lastablas de
un SGDB para el cual se ha congurado la DSN. Para ello, a través de la pestaña de
Access Datos Externos, opción más, seelige la opción bases de datos de ODBC y a
continuación se siguen los pasos delasistente. Después,se eligela opción de vincular
al origen de datos creando una tabla vinculada, y nalmente, se seleccionala DSN
creada anteriormente desde la pestaña Origen de datos de equipo.
<> Actividad 5.1: Descargadesde la
página web
de mysql
wwmmysql
.org, apar-
tado Downloads, connectors, el conector ODBC para MySQL. Instálalo en tu
ordenador y Conéctate a la base de datos jardinería de la máquina virtual de
prácticas disponible en wwwgarcetaes. Si lo preeres, Conéctate a algún otro ser-
vidor que tengas disponible. (Asegúrate, en ese caso,de tener desactivada la opción
188
Capítulo 5. Tratamiento de los datos
bind-address del
servidor mysqlen elchero / etc/mysql/ my.cnfpara poderconectar
desde fuerade la propia máquinavirtual).
Creu 01:3:enema: HQVVÍÜHCÜÏ.
ae nu
ue ¡nox
,7; 7 n, n: a ** me o
A.» umvolml v &#39; su onoenoenaooaowwo Mo-óeuovdenno
m: ss
Ene! una
de v. w
E-conwones Ene!
Snavebmm Lgf}: _
quruncas 7 g
Nowbvvedongeneowm
Too Dowpaón
Irporïay ¡ Wdegmkm ¿aseoecaosnnmenï Sue-n
"3V lrlnernv n
nncuinr n
un: tuu
de ¡nos th
,99m3 g, n,
«m, no! ejemplo una
nu ne
emos de
SQL Se
t
:1 panama-no
HTML
lmccrur a
nnzum a
un euumenw
HTML
Selecoone el
origen y
el destno
de los
datos.
ïamemrvnmdmdeduenúvucerwbsdomsenhbasedeomxui
¡mpwhreiuboldehumninevlbhhdehbnc v
sselememesoeeudamnsrmnmmbaeris-daopmewec --
nophonortndmwswhosveuzuosmmwxmaeaw
-
densidad.
encsrghccensuvawiwvuwodrvnbrndd
datosucllsühmserekyïrvenbbseae
&#39;EéEEEEï¡h6En29-bïíí
Accesscreráuwuveuuermtwüimvi-nxabsamue
-
mdommvvusvu.
cnwbnurnhndosenbsnnmsenkznnsnreewü
l Amt! 1 (mehr
Figura 5.5: Vínculo de INIySQL a Access.
5.2. La sentencia INSERT
La sentencia INSERT de SQL permite insertar una la en una tabla, es decir,
añadir un registro de información a una tabla.
El formato de uso es muy sencillo:
INSERT [INTO] nombre_tab1a [(nombre_columna, . ..)]
VALUES ({expr I DEFAULT},...)
nombre_tabla es el nombre de la tabla donde se quiere insertar la la. Después
del nombre de la tabla, de forma optativa, se pueden indicar las columnas donde
se va a insertar la información. Si se especican las columnas, la lista de valores
(VALUES) a insertar se asociará correlativamente
con los valores a las columnas
indicadas. Si no se especican las columnas, la lista de valores seescribirá conforme
al orden de las columnas en la denición de la tabla. A continuación se muestran
unos cuantos ejemplos:
desc mascotas;
+ ------- --+ ----------- --+ ---- --+-----+ ------- --+
I Field I Type I Null I Key I Default I
189
Bases de Datos
varchar(50)
varchar(50)
varchar(9)
#INSERT especificando la lista de columnas
INSERT INTO mascotas (Codigo, Nombre, Raza)
VALUES
(1,Pequitas,Gato
Común Europeo)
Este tipo de INSERT, hace corresponder a la columna Codigo el valor 1, a la
columna Nombre el valor Pequitas y a la columna raza el valor Gato Común Eu-
ropeo. La columna cliente, queda con un valor NULL, puesto que no se ha indicado
un valor.
#INSERT sin especificar la lista de columnas.
INSERT INTO mascotas VALUES
(2, Ca1cetines, Gato Común Europeo, 59932387L)
En este caso, al no especicarse la lista de columnas, hay que indicar todos los
valores para todas las columnas en el orden en que están denidas las columnas en
la tabla.
#INSERT con columnas con valores por defecto
INSERT INTO vehiculos VALUES (1215 BCD,To1edo TDI, DEFAULT);
Aquí, se ha usado el valor DEFAULT para asignar el valor por defecto a la
tercera. columna de la tabla vehículos, es decir, la columna marca tiene denida la
asignación por defecto del valor Seat.
Si se construye una sentencia INSERT con más campos en la lista de valores que
el número de columnas especicadas (o número de columnas de la tabla) el SGBD
informará del error.
#INSERT Erronea
insert into vehiculos (Matricula,Mode1o,Marca)
VALUES (4123 BFH,Ibiza);
Capítulo 5. Tratamiento de los datos
5.3. La sentencia INSERT extendida
La sintaxis extendida de INSERT para gestores tipo MySQL es la siguiente:
INSERT [INTO] nombre_tabla [(nombre_co1umna,...)]
VALUES ({expr I DEFAULT},...),(...),...
Los puntos suspensivos delnal indican que sepuede repetir varias vecesla lista de
valores. Así, MySQL admítiría algo del estilo:
insert into vehiculos (Matricula,Mode1o,Marca)
VALUES (4123 BFH,Ibiza,Seat),
(1314 FHD,To1edo,Seat),
(3923 GJS,León,Seat);
5.4. INSERT y
SELECT
Una variante de la sentencia INSERT consiste en una utilizar la sentencia SE-
LECT para obtener un conjunto de datos y, posteriormente, insertarlos en la tabla.
INSERT
[INTO] nombre_tabla [(nombre_co1umna,...)]
SELECT ... FROM ...
Se puedeejecutar la siguiente consulta:
#Inserta en una tabla Backup todos los vehículos
INSERT INTO Backupvehiculos
SELECT * FROM vehiculos;
La sentencia SELECT debe devolver tantas columnas como columnas tenga la
tabla donde se introduce la información. En el ejemplo anterior, la tabla Backup-
Vehiculos tiene una estructura idéntica a la tabla vehículos.
Se puede ver, además, que la sentencia SELECT puede ser tan compleja como
se desee,usando ltros, agrupaciones, ordenaciones,etc.
191
Bases de Datos
5.5. La sentencia UPDATE
La sentencia UPDATE de SQL permite modicar el contenido de cualquier co-
lumna y de cualquier la de una tabla. Su sintaxis es la siguiente:
UPDATE nombre_tab1a
SET nombre_col1=expr1 [, nombre_co12=expr2 ]
[WHERE filtro]
La actualización se realiza dando a las columnas nombre_col1, nombre_col2...
los valores exprl, expr2,... Se actualizan todas las las seleccionadas por el ltro
indicado mediante la cláusula WHERE. Esta cláusula WHERE, es idéntica a la que
se ha utilizado para el ltrado de registros en la sentencia SELECT.
Por ejemplo, si se desea actualizar el equipo de Pau Gasol porque ha chado
por otro equipo, por ejemplo, los Knicks, habría que ejecutar la siguiente sentencia:
UPDATE jugadores SET Nombre_equipo=Knicks
WHERE Nombre=Pau Gasol;
Query DK, 1
row affected (0.02 sec)
Rows matched: 1
Changed: 1
Warnings: O
El gestor informa de que el ltro seleccionó una la, y que, por tanto, cambió 1
la, en este caso, la columna Nombre_equipo de esa la seleccionada.
Es posible cambiar más de una Columna a la vez:
UPDATE jugadores SET Nombre_equipo=Knicks, Peso=21O
WHERE Nombre=Pau Gasol;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1
Changed: 1 Warnings: 0
Si se omite el ltro, el resultado es la Inodicación de todos los registros de la
tabla, por ejemplo, para cambiar el peso de los jugadores de la NBA de libras a
kilos:
UPDATE jugadores SET Peso=Peso*0.4535;
192
Capítulo 5. Tratamiento de los datos
5.6. La sentencia DELETE
En SQL se utiliza la sentencia DELETE para eliminar las de una tabla. Su
sintaxis es:
DELETE FROM nombre_tab1a
[WHERE filtro]
El comando DELETE borra los registros seleccionados porel ltro WHERE, que
es idéntico al de la sentencia SELECT.
Si se desea borrar al jugador Jorge Garbajosa de la base de datos, habría que
escribir la siguiente sentencia:
DELETE FROM
jugadores WHERE Nombre=Jorge Garbajosa;
Query OK, 1
row affected (0.01 sec)
Si se omite el ltro, el resultado es el borrado de todos los registros de la tabla:
DELETE FROM jugadores;
Query OK, 432 rows affected (2.42 sec)
5.7. La sentencias UPDATE y DELETE con sub-
consultas
Es posible actualizar o borrar registros de una tabla ltrando a través de una sub-
consulta. La única limitación es que hay gestores que no permiten realizar cambios
en la tabla que se está leyendo a través de la subconsulta.
Por ejemplo. si se desea eliminar los empleados Representante Ventas que no
tengan clientes se podría codicar:
DELETE FROM Empleados
WHERE CodigoEmp1eado Not in
(SELECT CodigoEmp1eadoRepVentas
FROM Clientes)
AND Puesto=Representante Ventas;
193
Bases de Datos
No sería posible. sin embargo, escribir una sentencia de este tipo para borrar los
clientes con LimiteCreditozü, puesto que se leen datos de la misma tabla que se
borran:
DELETE FROM Clientes
WHERE CodigoC1iente in
(SELECT Codigocliente
FROM Clientes WHERE LimiteCredito=0);
ERROR 1093 (HY000): You cant specify target table Clientes for update
in FROM clause
5.8. Borrado y modicación de registros con re-
laciones
Hay que tener en cuenta que no siempre se pueden borrar o modicar datos:
Considérese por ejemplo, que un cliente llama a una. empresapidiendo darse de baja
como cliente, pero el cliente tiene algunos pagos pendientes. Si el operador de la
BBDD intenta eliminar el registro (DELETE), el SGBD debería informar de que no
es posible eliminar ese registro puesto que hay registros relacionados.
O por ejemplo, sedesea cambiar
(UPDATE) el nombre deun equipo de la NBA
(que es su clave primaria), ¿qué sucede conlos jugadores? También habrá que cam-
biar el nombre del equipo de los jugadores, puesto que el campo Nombre_Equipo es
una clave foránea.
En este punto, hay que recordar las cláusulas REFERENCES de la sentencia
CREATE TABLE para crear las relacionesde claveforánea-clave primaria de alguna
columna de una tabla:
definiciómreferencia:
REFERENCES
nombre_tab1a[(nombre_columna,
...)]
[ON DELETEopción_referencia]
[DN UPDATEopción_referencia]
opción_referencia:
CASCADE
I SET
NULL I
ND ACTION
Las cláusulas
ON DELETEy ON UPDATE personalizan
el comportamiento
de
estos dos casos. Si por ejemplo, se intenta eliminar un registro con otros registros
194
Capítulo 5. Trataznientode los datos
relacionados,
y se ha seleccionadola opción ON DELETE NO
ACTION y ON
UPDATE NO ACTION el comportamientoseríael siguiente:
#dos tablas relacionadas en mysql
#han de ser innodb para soportar FOREING KEYS
CREATE TABLE clientes
(
dni varchar(15) PRIMARY KEY,
nombre varchar(50),
direccion varchar(50)
) engine=innodb;
CREATETABLEpagos_pendientes(
dni varchar(15),
importe double,
FOREIGN KEY(dni) REFERENCES clientes(dni)
on delete NO ACTION
on update NO ACTION
) engine=innodb;
#un cliente
y dos pagos pendientes
INSERT INTO clientes
VALUES(5555672L,Pepe Cifuentes,C/Los almendros,23);
INSERT INTO pagos_pendientes VALUES(5555672L,500);
INSERT INTO pagos_pendientes VALUES(5555672L,234.5);
#Se intenta borrar el cliente y no es posible
DELETE FROM clientes WHERE dni=5555672L;
ERROR1451 (23000): Cannot delete or update a parent row:
a foreign key constraint fails (gestion/pagos_pendientes,
CONSTRAINT
pagos_pendientes_ibfk_1
FÜREIGN KEY (dni) REFERENCES &#39;clienteS (&#39;dni))
#Se intenta modificar el dni del cliente y no lo permite
UPDATE clientes set dni=55555555L WHERE dni=5555672L;
ERROR1451
(23000): Cannot delete or update a parent row:
a foreign key constraint fails (gestion/pagos_pendientes,
CONSTRAINT
pagos_pendientes_ibfk_1
FOREIGN KEY (dni) REFERENCES clientes (dni))
#de igual modo si se intenta borrar la tabla clientes,
#tampoco podemos
DROP TABLE clientes;
ERROR1217
(23000): Cannot delete or update
a parent row: a foreign key constraint fails
Sin embargo,sila creaciónde la relaciónestuviese
personalizadaconlasopciones
ON UPDATE CASCADE y ON DELETE CASCADE, el comportamientosería:
195
Bases de Datos
#dos tablas relacionadas en mysql
create table clientes (
dni varchar(15) primary key,
nombre varchar(50),
direccion varchar(50)
) engine=innodb;
create table pagos_pendientes(
dni varchar(15),
importe double,
foreign key (dni) references c1ientes(dni)
on delete CASCADE on update CASCADE
) engine=innodb;
#un cliente y dos pagos pendientes
INSERT INTO
clientes
values (5555672L,Pepe Cifuentes,C/Los a1mendros,23);
INSERT
INTO pagos_pendientes VALUES (5555672L,500);
INSERT INTO
pagos_pendientes VALUES (5555672L,234.5);
#se borra el cliente...
DELETE
FROM clientes WHERE dni=5555672L;
Query DK, 1 row affected (0.00 sec)
#además, se verifica que ha borrado en cascada sus pagos pendientes.
SELECT * FROM pagos_pendientes;
Empty set (0.00 sec)
#si en lugar de borrar el cliente, se hubiera cambiado el dni:
UPDATE clientes set dni=55555555L WHERE
dni=5555672L;
Query OK, 1 row affected (0.02 sec)
#ha cambiado el dni de los pagos en cascada.
SELECT
* FROM pagos_pendientes;
+
--------- --+ ------- --+
I importe I
+ --------- --+ ------- --+
I 55555555L I
I 55555555L I 234.5 I
+ --------- --+ ------- --+
Recuerda. En
Oracle. solo existe
la cláusula
ONDELETE.
Para implemen-
tar ON UPDATE. se debe generarun TRIGGER (Véase Capítulo6)
196
Capítulo 5. Tratamiento de los datos
<>
Actividad 5.2: Crea las tablasde mascotas
y clientescon laopción ONUP-
DATE y ON DELETE a SET NULL y comprueba el resultado de ejecutar las
inserciones, actualizaciones y borrados de los ejemplos anteriores.
5.9. Transacciones
Un SGBD actualiza múltiples datos a través de una transacción. Una transacción
es un conjunto de sentencias SQLque setratan como una sola instrucción (atómica).
Una transacción puede serconrmada (commit). si todas las operacionesindividua-
les seejecutaron correctamente,
o, abortada (rollback) a la mitad de suejecución si
hubo algún problema (por ejemplo, el producto pedido no está en stock, por tanto
no se puede generar el envío). Trabajar con transacciones puede ser esencial para
mantener la integridad de los datos. Por ejemplo, se puede dar el caso de que se
descuenta el stock de un producto antes de proceder a su envío, pero cuando se vaa
generar la cabecera del pedido, la aplicación cliente sufre un corte en las comunica-
ciones y no da tiempo a generarlo. Esto supone una pérdida de stock. La transacción
garantiza la atomicidad de la operación: O se hacen todas las operaciones, o
no se hace ninguna.
Generalmente, cuando se conectacon un cliente a un SGBD, por defecto está ac-
tivado el modo AU
TOCOMMI T =ON, es decir, cada comando SQL que se ejecute,
será consideradocomo una transacción independiente. Para activar las transacciones
de múltiples sentencias hayque establecerel modo A UTOCOMMI T=OF F.A partir
de esemomento, todos los comandosSQL enviados al SGBD tendrán que terminarse
con una orden COMMIT o una orden ROLLBACK. De este modo, se asegura la
integridad de los datos a un nivel más alto. Muchos SGBD requieren de una orden
START
TRANS/l CTI ON
o START
WORK para comenzar una transacción y otros
lo hacen de forma implícita al establecer el modo autocommit=off.
#MySQL, 3 formas para comenzar una transacción:
SET AUTDCOMMIT=O; #6
START
TRANSACTIDN; #6
BEGIN WORK;
--Oracle:
SET AUTOCOMIT OFF
Para terminar una transacción, tanto en MySQL como en ORACLE, hay que acep-
tar, o rechazar los cambios mediante:
197
Bases de Datos
#La palabra clave WORK es opcional
COMMIT WORK; #Acepta los cambios.
RÜLLBACK WORK; #Cancela los cambios
Cualquier conjunto de sentencias SQL se considera cancelado si termina abrupta-
mente la sesión de un usuario sin hacer COlIlIIT. Un ejemplo de transacción en
MySQL sería la siguiente:
SET AUTÜCDMMIT 0;
#se actualiza el stock
UPDATE Productos SET Stock=Stock-2 WHERE CodigoProducto=AAAF102;
#se inserta la cabecera del pedido
INSERT
INTO Pedidos VALUES
(25,now(),Francisco Garcia,Pendiente de Entrega);
#se inserta el detalle del pedido
INSERT
INTO Deta11ePedidos
(CodigoPedido,CodigoProducto,Unidades) VALUES
(25,AAAF102,2);
#aceptar transacción
COMMIT WORK;
5.10. Acceso concurrente a los datos
Cuando se utilizan transacciones, pueden suceder problemas de concurrencia en
el acceso a los datos, es decir, problemas ocasionados por el acceso al mismo dato
de dos transacciones distintas. Estos problemas están descritos por SQL estándar y
son los siguientes:
Dirty Read (Lectura Sucia). Una transacción
lee datos
escritos poruna transac-
ción que no ha hecho COMMIT.
Nonrepeateable Read (Lectura No Repetible). Una transacción vuelve
aleer
datos que leyó previamente y encuentra que han sido modicados por otra
transacción.
Phantom Read (Lectura Fantasma). Una transacción lee unos datos que no
existían cuando se inició la transacción.
Cuando setrabaja con transacciones, el SGBD puede bloquear conjuntos de datos
para evitar o permitir que sucedan estos problemas. Según el nivel de concurrencia
198
Capítulo 5. Tratamiento de los datos
que sedesee, esposible solicitar al SGBD cuatro niveles de aislamiento. Un nivel de
aislamiento dene cómo los cambios hechospor una transacción son visibles a otras
transacciones:
Read Uncommited (Lectura no acometida). Permite que sucedan
los trespro-
blemas. Las sentencias SELECT son efectuadas sin realizar bloqueos, por
tanto, todos los cambios hechos por una transacción pueden verlos las otras
transacciones.
Read Commited (Lectura acometida). Los datos leídos por una transacción
pueden ser modicados por otras transacciones. Se pueden dar los problemas
de Phantom Read y Non Repeteable Read.
Repeateable Read (Lectura Repetible). Tan solo se permite el problema del
Phantom Read. Consiste enque ningún registro leído con un SELECT se puede
cambiar en otra transacción.
Serializable. Las transacciones ocurren de forma totalmente aislada a otras transac-
ciones. Sebloquean las transacciones detal manera que ocurren unas detrás de
otras, sin capacidad de concurrencia. El SGBD las ejecuta concurrentemente
si puede asegurar que no hay conflicto con el accesoa los datos.
En MySQL, las tablas innodb tienen el nivel de aislamiento por defecto esta-
blecido en REPETEABLE READ, y se puede alterar cambiándolo en el chero de
conguración mycnf o ejecutando:
SET TRANSACTION ISÜLATION
LEVEL {READ UNCÜMMITTED I READ COMMITTED
I REPEATABLE READ I SERIALIZABLE}
En Oracle, el nivel por defecto es READ COMMI T
ED y,
además de este, solo
permite SERIALIZABLE. Se puedecambiar ejecutando el comando:
SET TRANSACTIDN ISÜLATIDN LEVEL {READ CÜMMITTEDISERIALIZABLE};
¿Sabías que . .. 7
Algunas transacciones pueden
quedar interbloqueadas
dependiendo del nivel de aislamiento seleccionado. Esta situación de interblo-
queo, odeadlock entredos transacciones.consiste enque ninguna de ellaspuede
seguir ejecutándoseporque la primera intenta acceder aun bloque de datos que
tiene bloqueada la segunda, y la segunda, intenta acceder aun bloque de datos
que tiene bloqueada la primera. En esta situación de interbloqueo, el SGBD
elimina a una de las dos transacciones. siendo la víctima del interbloqueo la
que hace rollback de sus operaciones.
199
Bases de Datos
5.10.1. Ejemplo de problemas en el acceso concurrente
A continuación se muestran, mediante una serie de consultas en MySQL cómo
reproducir los problemas típicos de la concurrencia en bases dedatos. Primero, para
consultar el tipo de aislamiento y cambiarlo a read uncommited, que permite que se
produzcan los tres problemas, se puedeejecutar los comandos:
#consu1ta tipo de aislamiento
mysql) select @@tx_isolation;
+ -+
I @@tx_iso1ation
+ --------------- -+
I REPEATABLE-READI
+ --------------- -+
1
row in set (0.00 sec)
#estab1ecer el tipo de aislamiento a read uncommitted
mysq1> set session transaction isolation level read uncommitted;
Query DK, 0 rous affected (0.00 sec)
Para el siguiente ejemplo se utilizará la tabla coches creadacon el motor innodb:
create table coches (nombre varchar(20)) engine=innodb;
insert into coches values (toyota),(audi),(seat);
La lectura no repetible
A continuación, dos sesiones distintas, de dos usuarios distintos, consultan la
base de datos en el siguiente orden para producir una lectura no repetible:
Lectura no repetible-1
#sesión 1
mysq1> start transaction;
Query DK, 0
rows affected (0.00 sec)
mysq1> select t from coches;
+ ------ -+
Inombre I
+ ------ -+
I toyota I
Iaudi I
+ ------ -+
3 rows in set (0.00 sec)
200
Capítulo 5. Tratamiento de los datos
La sesión 1 inició una transacción para hacer operaciones y segundos despuésuna
segunda sesión realiza cambios en la tabla mientras la transacción continúa en la
sesión 1:
Lectura no repetible-2
#sesión 2
mysq1> update coches
set nombre=vo1vo vhere nombre=audi;
Query
DK, 1
row affected (0.00 sec)
Rows
matched: 1
Changed: 1
Warnings: 0
La sesión 2
ha realizado un cambio en los datos, por tanto, la transacción de la
primera sesión no será capaz de reproducir la situación anterior puesto que se ha
producido una lectura no repetible:
Lectura no repetible-3
#sesi6n 1
mysq1> select *from coches;
+
------ --+
I nombre I
+ ------ --+
I toyota I
I volvo |
+ ------ --+
3
rows in set (0.00 sec)
La lectura fantasma
Si a continuación, el cliente 2 inserta un nuevo registro en la tabla, la sesión 1
podrá inmediatamente ver los cambios. Esto es loque sellama una lectura fantasma:
Lectura fantasma-1
#cliente 2
mysq1> insert into coches values (renault);
Query OK, 1
row affected (0.00 sec)
Lectura fantasma-2
#c1iente 1
mysq1> select *from coches;
rovs in set (0.00 sec)
201
Bases de Datos
La potencial situación problemática tanto de la lectura no repetible como de la
lectura fantasma es quedatos que participan en una transacción cambian o aparecen
sin previo aviso, pudiendo provocar que la transacción genere información que no es
del todo íntegra.
La lectura sucia
El último problema, y
más grave, es el de la lectura sucia. A continuación, si-
guiendo con las dos sesiones delos ejemplos anteriores, se reproduce esta situación.
En este caso, la sesión 2 inicia una transacción y realiza operaciones DML sobre los
datos:
Lectura sucia-1
#sesión 2
mysq1> start transaction;
Query OK, 0 rows affected (0.00 sec)
mysq1> insert into coches values (alfa);
Query DK, 1
row affected (0.00 sec)
mysq1> update coches set nombre=honda where nombre=toyota;
Query OK, 1
row affected (0.00 sec)
Rovs matched: 1
Changed: 1
Harnings: 0
Después, la sesión 1 lee los datos que hay en la tabla:
Lectura sucia-2
#sesión 1
mysq1> select t from coches;
rows in set (0.00
sec)
Se puedeobservar, que gracias a esa lectura la sesión 1 puedegenerar nueva informa-
ción o realizar algún trabajo que implique trabajar con la información modicada
por la sesión 2. Pero, supóngase que ahora, la sesión 2
realiza un rollback de sus
operaciones:
202
Capítulo 5. Tratamiento de 10s datos
Lectura sucia-3
#sesión 2
mysq1> rollback;
Query OK, 0
rows affected (0.00 sec)
Se puedeobservar que la sesión 1, aunque ya no puede accedera la información que
fue insertada por la sesión 2, puesto que se ha efectuado un rollback, puede haber
estado trabajando con datos, que, en realidad, nunca han estado en la base dedatos.
Esto, es una lectura sucia:
Lectura sucia-4
sesión 1
mysq1> select *from coches;
rows in set (0.00 sec)
5.11. El acceso a la información
Cuando se administra la. seguridad en el acceso a información de una base de
datos, escomún utilizar dos tipos de seguridad, la integrada con el sistema operativo
y la proporcionada por el SGBD (nativa). En la seguridad integrada, se suele contar
con los usuarios de un sistema de dominio o un servicio de directorio (LDAP) para
proporcionar el acceso a determinados recursos del gestor de base de datos. En
la seguridad nativa del SGBD, es el propio software servidor el que proporciona
los mecanismos mediante los cuales se autoriza a un usuario a utilizar distintos
elementos de bases de datos.
El alcance de este libro es tratar la seguridad nativa de un SGBD a través de
SQL explicando el funcionamiento básico de la seguridad en MySQL, Oracle y DB2.
5.12. Las vistas
Una vista es una tabla sin contenido, totalmente virtual, que devuelve las las
resultado de ejecutar una consulta SQL. La diferencia con una consulta ejecutada
directamente es que, mientras cada sentencia SQL enviada al SGBD tiene que pasar
203
Bases de Datos
por un proceso de compilación, la vista es una consulta cuya denición ha sido
almacenada previamente y que ya ha sido compilada, siendo por tanto el tiempo de
ejecución bastante menor. También tiene una implicación importante en el hecho
de que un usuario podría no tener acceso a la información de varias tablas y, sin
embargo, sí tener accesoa la Vista que consulta esas tablas, proporcionando de esta
manera un acceso controlado solo a detern1inadas las y columnas de esastablas.
¿r Usuario
de Madrid
L a
xústaii j
CLIENTES
DE
Figura 5.6: Vistas.
Por ejemplo, en una tabla de clientes, un usuario de una ocina de Madrid
podría tener solo acceso a la información de los clientes de Madrid, y tan solo a
ciertos campos. De esta manera, no tendría acceso a ningun campo de la tabla de
clientes y, sin embargo, podría tener acceso auna vista que consulte aquellos clientes
cuya provincia sea Madrid.
La sintaxis para crear una vista es la siguiente:
CREATE [ORREPLACE] VIEW [esquema.]nombre_vista [(1ista_co1umnas)] AS
sentencia_se1ect
La ejecución del CREATE VIEW provoca que secompile la sentencia selecty que
se almacene con el nombre nombremista. Los nombres de las columnas de la vista
se pueden especicar mediante lista_columnas. Si se especica la lista de columnas,
cada columna tendrá el alias correspondiente, si no, se obtendrá el nombre devuelto
por la consulta. Si la vista ya existe, se puede reemplazar con OR REPLA CE.
204
Capítulo 5. Tratamiento de los datos
Un ejemplo de CREATE VIEW es el siguiente:
CREATE VIEW nba.jugadoresMiami AS
SELECT Nombre, Posicion FROM nba.jugadores WHERE Nombre_equipo=HEAT;
SELECT * from nba.jugadoresMiami;
Además, sepueden crear vistas para que los usuarios no expertos puedan acceder
de forma fácil a la información, proporcionándoles, a través de una vista, información
obtenida a través de una sentencia SQL compleja:
CREATE VIEWVistaPedidos (CodigoPedido,C1iente,Tota1) AS
SELECT CodigoPedido, NombreC1iente, SUM(Cantidad*PrecioUnidad)
FROM Clientes NATURAL JOIN Pedidos NATURAL JOIN Deta11ePedidos
GROUP BY
CodigoPedido;
Para eliminar una vista se hace uso del comando DROP VIEW:
DROP VIEW[esquema.]nombre_vista;
Hay pequeñas variaciones en la sintaxis de los comandos CREATE VIEW y
DROP VIEW dependiendo del SGBD que se utilice. Además, se dispone también
de un comando ALTER VIEW para hacer modicaciones a la denición de la vista.
Para más información sobre estas variaciones,consultar los manuales decada gestor.
5. 13. Los usuarios
Para crear cuentas de usuario que permitan a los usuarios acceder a ciertos
objetos con un nivel determinado de privilegios hay que hacer uso del comando
CREATE USER.
CREATE USER
nombre_usuario IDENTIFIED BY password [opciones];
Esta sencilla sentencia crea una cuenta usuario que permite la autenticación
de un usuario en el SGBD a traves de la password identicada mediante la opción
IDENTIFIED BY. Esta sintaxis de create user es válida tanto para MySQL como
205
Bases
de Datos
para Oracle, aunque a Oracle se le pueden incluir multitud de opciones extras para
dar características adicionales, como la asignación de cuota para añadir información
a un tablespace o bloquear la cuenta temporalmente. En DB2 no se utiliza el co-
mando CREATE USER puesto que la mayor parte de la gestión de usuarios sehace
de forma integrada con el Sistema Operativo. A continua.ción semuestran ejemplos
de creación de usuarios:
#creación de usuario en MySQL
CREATE USER paco IDENTIFIED BY o99238kjkA;
--creación de usuario en Oracle
CREATE USER paco
IDENTIFIED BY o99238kjkA
DEFAULT TABLESPACE Nominas
QUÜTA UNLIMITED DN Nominas
ACCÜUNT LOCK;
<>
Actividad 5.32 Crealos usuarios
Pedro yJavier enlos SGBDmysql yOracle
con passwords apropiadas. En Oracle, asigna quota de 1MB en algún tablespace.
Para eliminar usuarios, se puede utilizar la sentencia DROP USER:
DRÜP USER nombre_usuario [CASCADE];
En Oracle, se puede incluir el token CASCADE para indicar que junto con el
usuario se borren todos los objetos de su esquema. En liIySQL, se pueden borrar
la vez varios usuarios, separando los nombres de los usuarios mediante comas.
Para modicar usuarios, Oracle utiliza el comando ALTER USER, que no estádis-
ponible en MySQL. Este comando ALTER USER usa las mismas opciones que
CREATE USER.
--Modificación de usuario en Oracle
ALTER USER Paco
IDENTIFIED BY nueva_pass DEFAULT Tablespace Facturas;
En MySQL hay que modicar los usuarios actualizando sus datos en la propia
tabla mysq1.user del sistema. Por ejemplo, para cambiar el host desde el que el
206
Capítulo 5. Tratamiento de los datos
usuario Javier se puedeconectar, habría que ejecutar la siguiente sentencia. Cuando
en MySQL se modica algún permiso modicando el contenido de las tablas del
sistema, hay que ejecutar además el comando FLUSH PRIVILEGES para forzar al
gestor a volver leer las tablas de permisos y que los cambios en los permisos sean
efectivos desde ese momento.
#Modificación de usuario en mysql.
UPDATE mysql.user
SET host=192.168.3.1 where user=JAVIER;
FLUSH PRIVILEGES;
En MySQL también se puede renombrar un usuario conservando todos sus pri-
vilegios utilizando el comando RENAME USER y
cambiar la password mediante el
comando SET PASSWORD:
#Modificación de usuarios en MySQL. Cambiar nombre y password al usuario Paco
RENAME USER Paco@1oca1host to PacoSanchez@1ocalhost;
SET PASSWORD
for Pacoclocalhost =
PASSw0RD(nueva_pass);
<> Actividad 5.4: Ejecuta el siguiente
comando para
cambiar lapassword de
un
usuario en mysql:
UPDATE mysql.user
SET Password =
PASSWORD("nueva_pwd")
WHERE user=paco AND host=loca1host;
o Actividad 5.5: Cambia la passwordde losusuarios Pedroy Javier creados en
Oracle y bloquea sus cuentas mediante la opción ACCOUNT UNLOCK.
5. 14. Los privilegios
Un usuario puede obtener privilegios para manipular objetos de una base de
datos con el comando GRANT. Asimismo, se le pueden denegar permisos con el
207
Bases
de Datos
comando REVOKE. Estos comandos varian en su sintaxis dependiendo del SGBD
que se está usuando puesto que el sistema de seguridad de cada uno es distinto.
Además, inuye también la forma en que el subsistema de permisos del SGBD se
integra con el sistema operativo.
5.14.1. El sistema de privilegios de MySQL
La sintaxis del comando GRANT para MySQL es la siguiente:
GRANT tipo_privi1egio [(co1umnas)] [, tipo_privi1egio [(co1umnas)]]
ON {nombre_tab1a I * I *.* I base_datos.* I base_datos.nombre_tabla}
T0 usuario [IDENTIFIED BY [PASSWORD] password]
[, usuario [IDENTIFIED BY [PASSWORD] password]]
[WITH opcion [opcion]
opcion =
GRANT DPTION
| MAX_QUERIES_PER_HOUR count
I MAX_UPDATES_PER_HOURcount
I MAX_CDNNECTIÜNS_PER_HDURcount
I MAX_USER_CONNECTIONS count
En MySQL se puedeotorgar a un usuario permisos para hacer cualquier opera-
ción a nivel de host, de base dedatos, de tabla o de columna. Así, es posible asignar.
por ejemplo, permisos de SELECT sobre las columnas NombreCliente, Dirección y
Telefono de la tabla clientes:
GRANT
SELECT (Nombrecliente,Telefono,Ciudad)
ON Clientes TU paco@1oca1host;
Con esta sentencia el usuario paco@localhost solo podrá seleccionar las colum-
nas NombreCliente, Telefono y
Ciudad de la tabla clientes, siéndole denegada una
consulta del tipo select * from clientes.
tipo_privi1egio es la clase de permiso que puede ser a otorgar, típicamente pueden
ser select, insert, update. . . .Pueden ser de los más variados. En el Cuadro 5.3 de
la página 210 hay algunos ejemplos de los permisos disponibles en MySQL.
208
Capítulo 5. Ïiatamiento de los datos
Estos tipos de privilegio se pueden aplicar a las siguientes expresiones:
Expresión Se aplica el permiso a
nombre_tabla La tabla nombre_tab1a
Todas las tablas de la base de datos que se está usando
*.* Todas las tablas de todas las bases de datos
base_datos.* Todas las tablas de la base de datos db_name
base_datos.nombre_tabla Solo la tabla nombre_tabla de la base de datos db_name
Cuadro 5.1: Tipos de objetos a los que se puedeotorgar permisos.
Finalmente con TO usuario se indica el usuario al que se quiere otorgar el
permiso. Si el usuario user noexiste, secrea, opcionalmente con la password indicada
mediante la cláusula identied by.
Adicionalmente, se puede indicar ciertas opcionesprecedidas dela cláusula WITH:
Expresión
GRANT OPTION Permite conceder a otros usuarios los permisos
que tiene el usuario, por tanto, el administrador
debe ser muy cauto a la hora de conceder
esta opción a los usuarios de la base de datos.
MAX_QUERIES_PER_HOUR count
Permite restringir el número de consultas
por hora que puede realizar un usuario.
MAX_UPDATES_PER_HOUR count
Permite restringir el número de modicaciones
MAX-CONNECTIONS_PER_HOUR count
Permite restringir las conexiones
(logins) por hora que realiza un usuario.
MAX_USER-CONNECTIONS count
A
Permite limitar el número deconexiones
simultáneas que puede tener un usuario.
En cualquiera de las opciones MAX- si a count se le da el valor O. signica ilimitado.
Cuadro 5.2: Opciones adicionales a los permisos.
209
Bases de Datos
Privilegio Signicado
ALL [PRIVILEGES] Da todos los permisossimples exceptoGRANT OPTION
ALTER Permite el uso de ALTER TABLE
ALTER ROUTINE Modica o borra rutinas almacenadas
CREATE Permite el uso de CREATE TABLE
CREATE ROUTINE Crea rutinas almacenadas
CREATE TEMPORARY
TABLES Permite el uso de CREATE TEMPORARY TABLE
CREATE USER Permite el uso de CREATE USER,
DROP USER, RENAME USER, y REVOKE.
Permite el uso de CREATE VIEW
CREATE VIEW
DELETE Permite el uso de DELETE
DROP Permite el uso de DROP TABLE
EXECUTE Permite al usuario ejecutar rutinas almacenadas
FILE Permite el uso de SELECT INTO OUTFILE
y LOAD DATA INFILE
INDEX Permite el uso de CREATE INDEX y DROP INDEX
INSERT Permite el uso de INSERT
LOCK TABLES Permite el uso de LOCK TABLES en
tablas para las que tenga el permiso SELECT
PROCESS Permite el uso de SHOW FULL PROCESSLIST
RELOAD Permite el uso de FLUSH
REPLICATION CLIENT Permite al usuario preguntar dónde
están los servidores maestro o esclavo
Necesario para los esclavos de replicación
Permite el uso de SELECT
SHOW DATABASES muestra todas las bases de datos
Permite el uso de SHOW CREATE VIEW
Permite el uso de mysqladmin shutdown
Permite el uso de UPDATE
Sinónimo de no privileges,
permite únicamente la conexión al gestor
GRANT OPTION
Cuadro 5.3: Tipos de privilegios en mjysql.
REPLICATION SLAVE
SELECT
SHOW DATABASES
SHOW VIEW
SHUTDOWN
UPDATE
USAGE
10
Capítulo 5. Tratamiento de los datos
Algunos ejemplos de consultas para asignación de permisos en MySQL son los
siguientes:
#0torga permisos de select e insert a todas las tablas de nba
GRANT SELECT, INSERT
on nba.* T0
paco@loca1host;
#0torga todos los privilegios a la tabla Clientes de jardineria
GRANT ALL PRIVILEGES on jardineria.C1ientes TD
paco©localhost;
#Ütorga permisos de select a todas las tablas de todas las bases de datos
#permitiendo al usuario ceder esos permisos a otros usuarios
GRANT SELECT
on *.* to paco@1oca1host WITH GRANTDPTIÜN;
#0torga permisos de SELECT, INSERT,
UPDATE y DELETE
con un límite de 10
#consu1tas a la hora en la tabla jugadores de la nba
GRANTSELECT,INSERT,UPDATE,DELETE
on nba.jugadores to paco@1oca1host
WITH
MAX_QUERIES_PER_HOUR 10 MAX_UPDATES_PER_HGUR 10
La sentencia revoke deniegapermisos aun usuario sobre un objeto. A continuación
se describe la sintaxis:
REVDKE tipo_privi1egio [(columnas)] [, tipo_privi1egio [(co1umnas)]]
ON {nombre_tabla I *I *.* I base_datos.* I base_datos.nombre_tab1a}
FROM usuario [, usuario]
La sintaxis es muy parecida a la de la sentencia grant, a continuación se muestran
unos cuantos ejemplos:
#quita el permiso de select en la tabla jardineria.C1iente
revoke select on jardineria.Clientes from paco@localhost;
#e1imina el permiso ALL PRIVILEGES de todas las tablas
revoke all privileges on *.* from paco@1oca1host;
#quita los permisos de select e insert de todas las tablas de jardineria
revoke se1ect,insert on jardineria.* from paco@1ocalhost;
Otra forma de asignar y eliminar permisos en MySQL es utilizando las tablas
del catálogo de metadatos, es decir, las tablas de la base de datos mysql creada
en toda instalación del SGBD
y que almacena toda la información sobre todos los
211
Bases de Datos
ob jetosmanejados por el gestor. En esta base dedatos existen 5 tablas relacionadas
con el sistema de permisos de MySQL, user, db, host, tables-priv y columns_priv.
Estas tablas se pueden manipular manualmente con inserts y deletes para otorgar
y denegar permisos a nivel de usuario, base de datos, equipo, tablas y columnas
respectivamente.
A continuación se ilustra cómo MySQL procesa una consulta. Al recibir la ins-
trucción SQL, se comprueba si el acceso alos diversos objetos están autorizados en
cualquiera de estas tablas. Si ninguno de los niveles permite el acceso, la consulta
es denegadapor falta de permisos.
5.14.2.
El sistema de privilegios de Oracle clasica los permisos en dos tipos, privilegios
del sistema y privilegios de objetos. Además dene los siguientes conceptos:
u
ROLES Conjunto de privilegios que se puedenasignar a un determinado usua-
Grado "l: Consulta
de permisos a
Grado 2: Consulta
de permisos a
nivel db. y @host
Grado 3; Consulta
Grado 4: Consulta
dbiablacolumna
AUTORIZACIÓN
DE
EJECUCION
DE CONSULTA
CONSULTA DE
PERMISOS EN
¡Va -&#39;- LA TABLAHSH
PERMISOS EN
LAS TABLAS
ob h
a
PERMISOS EN
LA TABLAS
tables a
riv
de permisos a
nivel dbiabla
o -n
PERMISOS EN
LA TABLAS
-,u .-
de permisos a
nivel
N0
ACCESO
/, DENEGADO
Figura 5.7: Estructura de permisos en mysql.
El sistema de privilegios de Oracle
rio. Un usuario puede pertenecer a múltiples roles.
212
Devuelve
resultados
Capítulo 5. Tratamiento de los datos
IPERFILES Un perl es un conjunto de restricciones sobre el uso de recursos.
Cada usuario puede pertenecer a un único perl.
De esta manera, Oracle permite asignar a un usuario privilegios del sistema, de
objetos, roles y perles, todo ello a través de la sentencia GRANT:
GRANT privilegio [ON [esquema Jobjeto] T0 {usuario I rol I PUBLIC}
[WITH {GRANT I ADMIN} OPTION]
privilegio =
tipo_privi1egio [(co1umnas)] [, tipo_privi1egio [(co1umnas)]]
I privi1egio_sistema
I rol
El privilegio a otorgar puede ser de varios tipos:
IUn privilegio sobre un objeto a un usuario o rol. Si el privilegio es INSERT
o UPDATE se puede indicar sobre qué columnas se tiene el permiso. En este
caso, se debe incluir la cláusula ON para indicar sobre qué objeto se va a
aplicar el permiso.
-- permiso de select y update en dos columnas de la tabla Clientes
GRANT SELECT, UPDATE (NombreC1iente, Telefono)
ON Jardineria.C1ientes To Javier;
--
todos los permisos sobre Pedidos al rol ADMINISTRACION
GRANT ALL PHIVILEGES UN Jardineria.Pedidos to ADMINISTRACION;
IUn privilegio de sistema sobre un usuario o rol.
--permiso para crear tablas
GRANT CREATE TABLE to Javier;
--permiso para crear tablas al rol ADMINISTRACION
GRANT CREATE TABLE to ADMINISTRACION;
IUn rol sobre un usuario u otro rol. El rol puede estar predenido (rol de
sistema.) opuede ser denido por el usuario.
--asignar Rol de acceso y consumo a otro Rol
GRANT CONNECT, RESOURCE to ADMINISTRACION;
213
Bases de Datos
Privilegio
ALTER
DATABASE
ALTER SYSTEM
AUDIT SYSTEM
CREATE [ANY]
ALTER [ANY] objeto
SYSDBA
ANALYZE [ANY] objeto
"asignar el rol
ADMINISTRACION a Javier
GRANT ADMINISTRACION to Javier;
I Un privilegio
deobjetoo sistema
a todoel mundo
(PUBLIC).
--pemiso de acceso y consumo de recurso a todos
GRANT CONNECT,
RESOURCE to
PUBLIC;
--permiso de update sobre las columnas Nombre
y email de empleados
GRANT UPDATE
(Nombre, email) UN Jardineria.Emp1eados to Public;
Privilegio
ALL
[PRIVILEGES
DELETE
INSERT
SELECT
UPDATE
REFERENCES
EXECUTE
ALTER
INDEX
Signicado
Da todos los permisossimplesincluido
GRANT OPTION
Permite el uso de
DELETE
Permite el uso de
INSERT
Permite el uso de
SELECT
Permite el uso de
UPDATE
Permite crear claves foráneas
Permite ejecutar un procedimiento,función, paquete.. .
Permite cambiar la denición de un objeto
Permite crear índices de una tabla
l
Cuadro 5.4: Tipos de privilegiosde objeto en Oracle.
¿Ï
En
É
Permite ejecutar el comando
ALTER DATABASE
Permite el uso de
ALTER SYSTEM
Permite la auditoría mediante la sentencia
AUDIT
Permite el usode
CREATE para un tipo de objeto
(TABLE, VIEW, PROCEDURE, USER, PROFILE, etc...)
Permite el usode
ALTER para un tipo de objeto
(TABLE, VIEW, PROCEDURE, USER, PROFILE, etc...)
Permite ejecutar operacionesde parada
y puesta en marcha de la BBDD
objeto
Capítulo 5. Tratamiento de los datos
REVOKE privilegio
[ON [esqnema.]objeto]
FROM {usuario I rol I PUBLIC}
privilegio =
tipo_privi1egio [(co1umnas)] [, tipo_privi1egio [(co1umnas)]]
I privi1egio_sistema
I rol
Algunos ejemplos de esta sentencia son los siguientes:
--Denegar permiso de select en Clientes al rol ADMINISTRACION
REVOKE SELECT ON Jardineria.C1ientes FROM ADMINISTRACION;
--Denegar rol CONNECT a todos
REVOKE CONNECT FROM PUBLIC;
--Denegar los roles ALMACEN Y
CONTABILIDAD A
Javier;
REVOKE ALMACEN,CONTABILIDAD FROM Javier;
--Denegar todos los privilegios a Javier en la tabla Pedidos
REVOKE ALL PRIVILEGES ON Pedidos FROM Javier;
Cuando se elimina. un privilegio de un usuario, el SGBD elimina el permiso de
ese usuario de forma inmediata a él y a todos los usuarios a los que se les haya
concedido el privilegio con la opción WITH GRANT o WITH ADMIN.
Los roles
Para simplicar la tarea de organizar los permisos, Oracle permite la creación
de Roles con la sentencia CREATE ROLE:
CREATE ROLE
nombre_ro1 [opciones_identificacion];
opciones_identificacion:
NOT IDENTIFIED
I IDENTIFIED
{BY
password I
EXTERNALLY I
GLOBALLY I
USING [esquema].pack
Al crear un rol, se puede especicar el tipo de autenticación. Si se especica
NOT IDENTIFIED, el rol está autorizado por la base de datos y no es necesaria
ninguna contraseña para. activarlo, sin embargo si se especica IDENTIFIED, el
215
Bases de Datos
usuario debe ser autorizado antes de activar el rol. Dentro de IDENTIFIED existen
varias posibilidades:
- BY password, donde el usuario debe indicar la contraseña antes de activar el
papel.
n
EXTERNALLY,para ser autorizado mediante un servicio externo (como el sistema
operativo).
I GLÜBALLY,
que cede la autorización al servicio Oracle Security Service.
ISi se elige USING, se elige crear un rol de aplicación segura, es decir, un rol
que solo puede ser activado por las aplicaciones que usen el paquete.
Cuando un usuario se conecta al SGBD, este otorga al usuario los permisos que
se le hayan concedido explícitamente mediante la orden GRANT y los permisos que
tengan los roles por defecto del usuario. Para asignar un rol por defecto a un usuario
se utiliza la sentencia ALTER USER de la siguiente forma:
ALTER USERusuario DEFAULT RDLE [opciones_ro1];
opciones_ro1:
rol
[, rol]...
I ALL
[EXCEPT rol]
I NÜNE
Se puede anular el rol por defecto mediante la opción N ONE, o habilitar todos los
roles mediante ALL, o todos menos uno mediante ALL
EXCEPT rol, o conceder
varios separadospor coma. Por ejemplo, para asignar los roles ADMINISTRACION
y CONTABILIDAD al usuario Javier:
GRANT Contabilidad,Administracion to Javier;
ALTER USER Javier DEFAULT ROLE ADMINISTRACION,CONTABILIDAD;
Finalmente, se puede utilizar también la sentencia SET ROLE para dotar mo-
mentáneamente de ciertos privilegios a un usuario que tenga autorizado su uso. Por
ejemplo, se puede crear el rol ALMACEN, con todos los privilegios sobre la tabla
Productos y asignarselo al usuario Javier. Si el usuario Javier no activa el rol AL-
MACEN mediante SET ROLE y su contraseña, no podrá disfrutar de susprivilegios
216
Capítulo 5. Tratamiento de los datos
CREATE ROLE ALMACEN IDENTIFIED BY AlmacenPwd;
GRANT ALL Privileges UN Jardineria.Productos TD ALMACEN;
GRANT ALMACEN to Javier;
--conexión con el usuario Javier
SQL> select count(*) from Jardineria.productos;
select count(*)
from Jardineria.productos
*
ERROR
en línea 1:
ORA-00942: la tabla o vista no existe
SQL> SET ROLE ALMACEN identified by A1macenPwd;
Rol definido.
SQL> select count(*) from Jardineria.productos;
Creación de perles
Los perles se usan para limitar la cantidad de recursos del sistema o de la
base de datos disponibles para un usuario. Existe un perl llamado DEFAULT que
concede recursos ilimitados a todos los usuarios. Para evitar esto, se puede hacer
uso de la sentencia CREATE PROFILE para crear nuevos perles.
CREATE PROFILE perfil LIMIT
recursos ...
recursos =
recurso {cantidad I UNLIMITED I DEFAULT }
I password
recurso =
SESSIONS_PER_USER
I CPU_PER_SESSION
I CPU_PER_CALL
I CONNECT_TIME
I IDLE_TIME
I LOGICAL_READS_PER_SESSION
Í LÜGICAL_READS_PER_CALL
I COMPOSITE_LIMIT
I PRIVATE_SGA
password =
parametro {cantidad I UNLIMITED I DEFAULT }
I PASSw0RD_VERIFY_FUNCTIDN {función I NULL I DEFAULT }
217
Bases de Datos
parametro =
FAILED_LÜGIN_ATTEMPTS
I
PASSWORD_LIFE_TIME
I PASSWÜRD_REUSE_TIME
l PASSWÜRD_REUSE_MAX
|
I
PASSWORD_LOCK_TIME
PASSWORD_GRACE_TIME
Los diferentes límites que se puedenutilizar están denidos en la siguiente tabla:
Límite
SESSIONS_PER_USER
CPU.PER_SESSION
CPU_PER_CALL
CONNECT_TIME
IDLE_TIME
LOGICALBEADS_PER_SESSION
LOGICALBEADS-PER-CALL
PRIVATELSGA
COMPOSITELLIMIT
Flmción
Número máximo de sesiones abiertas a la vez
por un usuario
Tiempo límite para una sesión expresado
en centésimas de segundos
Tiempo límite de respuesta.para una. llamada
(parse. fetch o ejecución) en centésimas de segundos
Tiempo límite total de una sesión,
expresado en minutos
Tiempo máximo de inactividad de una sesión
expresa.dos enminutos
Número máximo de bloques de datos leidos
en una sesión
Número máximo de bloques de datos leidos
en una llamada
Tamaño de memoria que una sesión puede
reservar del espacio privado de memoria del SGA
Coste total en recursos de una sesión,
expresado mediante el promedio de ciertos parámetros
Cuadro 5.6: Tipos de recursos.
Por ejemplo, se puede crear el perl OPERADOR con los siguientes límites:
CREATE PROFILE OPERADOR LIMIT
Capítulo 5. Tratamiento de Ios datos
CONNECT_TIME 120 -- 2 horas totales de conexion
J
También es posible alterar un perl mediante la sentencia ALTER PROFILE:
--modificar el perfil DEFAULT para que la password no caduque
alter profile DEFAULTLIMIT
PASSWORD_LIFE_TIME Unlimited;
--modificar el perfil OPERADOR para que su limite de sesión sea de 1
hora
--
y un máximo de 10 sesiones concurrentes
alter profile OPERADORLIMIT
CONNECT_TIME 60 SESSIONS_PER_USER 10;
Un perl se puede asignar en el momento de crear o modicar el usuario, por
ejemplo:
-- creación de un usuario con el perfil OPERADOR
CREATE USER Francisco IDENTIFIED BY FrancisPwd
QUOTA UNLIMITED ON Users
PROFILE OPERADOR;
5.14.3. El sistema de privilegios de DB2
Desde el punto de vista de la seguridad, se puededecir que en DB2 existen tres
grandes puntos de gestión de los privilegios de acceso:
1. Autenticación
2. Autorización
3. Privilegio
La autenticación busca responder a las siguientes preguntas: ¿quién puede acce-
der a la instancia o base de datosï, ¿dónde severicará la password de usuario? En
DB2 los usuarios de autenticación deben estar dados de alta en el sistema operati-
vo, es decir, que para resolver la primera pregunta, bastaría con decir que solo los
usuarios del sistema pueden acceder a la instancia o base de datos, pero ¡ojo!, los
usuarios pueden serlo del sistema local o de un sistema cliente remoto que esté in-
tentando la conexión, esto sería así en función de cómo se dena la variada política
de autenticación que dará respuesta a la segunda pregunta. La política de autenti-
cación no solo permite o no la conexión desde clientes, sino que, entre otras cosas,
indica si habrá encriptación o no del usuario y password, e incluso de los datos
intercambiados durante la comunicación con el servidor.
219
Bases de Datos
La autorización hace referenciaal nivel de permisoscon queun usuario materializa
el acceso a la instancia o base de datos. También determina los comandos que el
usuario puede ejecutar, los datos que puede leer o modicar, o los tipos de objetos de
base dedatos que se lepermite crear, modicar o borrar. Todas estas consideraciones
están preprogramadas en siete grupos de autorizaciones que pueden ser concedidos,
en función del caso, a
un grupo de usuarios o a un usuario determinado.
ISYSADM: es el único al que se le permite modicar los parámetros de la
instancia. Comparable a la autoridad del usuario root en Unix, puede ejecutar
cualquier comando contra la instancia, contra todas las bases de datos de la
instancia y contra todos los objetos de cualquier base de datos.
ISYSCTRL: puede hacer todas las actividades de administración (crear y bo-
rrar bases de datos y tablespaces) y mantenimiento (hacer backups, pasar
estadísticas, actualizarparámetros de la base de datos), pero no podrá ac-
ceder a ningún dato de las bases de datos a no ser que le sean concedidos
explícitamente los privilegios adecuados.
n
SYSMAINT: solo puede ejecutar labores de mantenimiento (hacer backups,
pasar estadísticas, actualizar parámetros de la base de datos).
ISYSMON: pueden obtener fotos estáticas de monitorización (en inglés database
system monitor snapshots) de la instancia o sus bases dedatos.
IDBADM: solo existe en el contexto de una basede datos concreta. Le está per-
mitido crear y borrar tablas, ejecutar estadísticas, y conceder o quitar privile-
gios, pero en ningún caso podrá borrar la base de datos, ni crear tablespaces,
ni
hacer backups, o modicar parámetros de conguración.
ILOAD: permite ejecutar cargas de datos sobre las tablas y pasar estadísticas.
Es
un permiso a nivel de usuario.
ISECADM: es la autorización encargada de gestionar toda la implementación
de las LBAC
(del inglés label-basedaccess control=LBA C ), esto es el control
de accesobasado en etiquetas.
Los privilegios propiamente dichos pueden ser a nivel de toda la base de datos
o solo estar referidos a un objeto concreto. En
esencia son prá.cticamente iguales
que los permisos de Oracle, se conceden con el comando GRAN T y se revocan con
el REVOKE.
Van desde elsimple CONNECT, pasando por los DML (SELECT,
INSERT, DELETE, UPDATE),
hasta los típicos ALTER, DROP.
. .
220
Capítulo 5. Tratamiento de los datos
5.15. Prácticas Resueltas
Práctica 5.1: Inserciones, Actualizaciones
y Borrados
Con la base dedatos Jardinería, crea y ejecuta un script "actualiza.sql que realice
las siguientes acciones:
1. Inserta una ocina con sede en Fuenlabrada.
2. Inserta un empleado para la ocina de Fuenlabrada que sea representante de
ventas.
3. Inserta un cliente del representante de ventas insertado en el punto 2.
4. Inserta.un pedidodel clienteanterior (consu detalle)de almenos 2productos
con una transacción.
5. Actualiza el código del cliente insertado y
averigua si hubo cambios en las
tablas relacionadas.
6. Borra el cliente y verifica si hubo cambios.
actua1iza.sq1
#1
INSERT INTO
Oficinas VALUES
(FUE-ES,Fuen1abrada,España,Madrid,
28941,918837627,C/Las
suertes,27,Bajo A);
#2
INSERT
INTO
Empleados
(CodigoEmp1eado,Nombre,
Apellidol,Email,Codigo0ficina,Puesto) VALUES
(400,Ismae1,Sánchez,isanchezQjardineria.com,FUE-ES,Rep.Ventas);
#3
INSERT INTO
C1ientes(CodigoC1iente, Nombrecliente, Telefono,
CodigoEmp1eadoRepVentas)
VALUES
(288,Riegos Pérez,918882763,400);
#4
START TRANSACTION;
INSERT INTO
Pedidos (CodigoPedido, FechaPedido, Estado, CodigoC1iente)
VALUES
(1900,2010-O6-03,Pendiente,288);
INSERT INTO
DetallePedidos (CodigoPedido, CodigoProducto,Cantidad,
PrecioUnidad,NumeroLinea) VALUES
(1900,OR-99,1,15.99,1);
INSERT INTO
Detal1ePedidos (CodigoPedido, CodigoProducto ,Cantidad,
PrecioUnidad,NumeroLinea) VALUES
(1900,OR-251,3,168,2);
COMIT WORK;
#5
UPDATE
Clientes SET CodigoC1iente=290 WHERE
CodigoC1iente=288;
#no permite la modificación, deberia tener la FK con ON UPDATE CASCADE
221
Bases de Datos
#6
DELETE FROM Clientes WHERE CodigoCliente=288;
#tampoco permite el borrado, debería tener la FK con ON DELETE CASCADE
Práctica 5.2: Actualizaciones yborrados consubconsultas
Usa subconsultas en los ltros y realiza las siguientes actualizaciones y
borrados:
1. Borra los clientes que no tengan pedidos.
2. Incrementa en
un 20
(7o el preciode losproductos queno tengan
pedidos.
3. Borra los pagos del cliente con menor límite de crédito.
4. Establece a Oel límite de crédito del cliente que menosunidades pedidas tenga
del producto OR-179.
#1
delete from Clientes where
CodigoCliente not in
(Select distinct Codigocliente from Pedidos);
#2
update Productos set PrecioVenta=PrecioVenta*1.2 where
not exists
(Select distinct CodigoProducto from DetallePedidos
where
DetallePedidos.CodigoProducto=Productos.CodigoProducto);
#3
delete from Pagos where
CodigoCliente=
(Select Codigocliente from Clientes where
LimiteCredito =
(Select min(LimiteCredito) from Clientes)
);
#4
update Clientes set LimiteCredito=0 where
CodigoCliente=
(Select Codigocliente from Pedidos natural join Deta11ePedidos
where
Cantidad =
(Select Min(Cantidad) From Deta11ePedidos where
CodigoProducto=0R-179) AND CodigoProducto=ÜR-179
);
222
Capítulo 5. Tratamiento de los datos
5.16. Prácticas Propuestas
Práctica 5.3: Vincular tablasa través de Access/ODBC
Mediante el driver ODBC para MySQL, enlaza a una BBDD Access las tablas de
la NBA y las tablas de la BBDD jardineria. A continuación, realiza las siguientes
acciones:
1. Exporta a Excel la tabla jugadores de la NBA.
2. Con Word, crea una carta modelo de felicitación de navidad a los clientes de
la base de datos y combina la correspondencia para que, automáticamente, se
genere una carta para cada cliente.
3. Inserta dos registros en la tabla Empleados de jardineria mediante un formu-
lario creado en Access.y después, inserta dos jugadores de la NBA siguiendo
el mismo procedimiento. Hay que asegurarsede que, efectivamente, están los
registros insertados.
Se puede repetir esta misma operación con el driver ODBC para Oracle, pero hay
que tener en cuenta que junto al driver, se debeinstalar el software cliente de Oracle
(sqlplus, tnsnames,
etc.) para que funcione. <>
Práctica 5.4: Actualizaciones yborrados variados
1. Modica la tabla DetallePedido para insertar un campo numérico llamado IVA.
Mediante una transacción, establece el valor de esecampo al 18 para aquellos
registros cuyo pedido tenga fecha a partir de Julio de 2010. A continuación
actualiza el resto de Pedidos estableciendo al 16 el IVA.
2. Modica la tabla DetallePedido para incorporar un campo numérico llamado
TotalLinea, y actualiza todos sus registros para calcular su valor con la fórmula
TotalLineazPrecioUnidad*Cantidad*IVA/ 100.
3. Borra el cliente que menor límite de crédito tenga. ¿Es posible borrarlo solo
con una consulta? ¿Por qué?
4. A través de phpMyAdmin o, mediante Access (vinculado vía ODBC), inserta
dos clientes nuevos para un empleado a tu elección. A continuación, inserta un
pedido con al menos 3 líneas de detalle. Después, ejecuta una consulta para
rebajar en
un 5
%
el precio de
los productos
que sean
Inás caros
de 200
euros.
<>
223
Bases de Datos
Práctica 5.5: Inserciones, Actualizaciones
y Borrados
En Oracle, con la BBDD Jardinería, codica en SQL las siguientes acciones:
1.
2.
3.
6.
224
Inserta una ocina con sede en Leganés y dos empleados.
Inserta un cliente de cada empleado insertado.
Inserta dos pedidos de los clientes anteriores (con su detalle) de al menos 2
productos con una transacción.
.Borra uno de los clientes y comprueba si hubo cambios en las tablas relaciona-
das. Si no hubo cambios, modica las tablas necesarias estableciendola clave
foránea con la cláusula ON DELETE CASCADE.
.Ejecuta el siguiente código para simular el ON UPDATE CASCADE de la
tabla Pedidos y modica el código de algún pedido. Comprueba que haya
modicado los registros relacionados en la tabla DetallePedidoz
CREATE OR REPLACE TRIGGER Actua1izaPedidos
AFTER UPDATE
UN Pedidos FUR EACHROW 3
BEGIN
UPDATE Deta11ePedidos SET CodigoPedido =
WHERE CodigoPedido= :o1d.CodigoPedido;
END Actualizaclientes;
:new.CodigoPedido
Crea ahora el siguiente disparador y prueba a cambiarle el código a un Emplea-
do. ¿Qué sucede? Buscael concepto de tabla mutante y estudia el problema.
CREATE OR REPLACE TRIGGER Actualizaclientes
AFTER UPDATE ON Empleados FOR EACH RDW
BEGIN
UPDATE
Clientes SET
CodigoEmp1eadoRepVentas =
:new.CodígoEmp1ead
WHERE CodigoEmp1eadoRepVentas =
:o1d.CodigoEmp1eado;
UPDATE Empleados SET CodigoJefe =
:new.CodigoEmp1eado
WHERE CodigoJefe = :old.CodigoEmp1eado;
END Actualizaclientes;
/
Capítulo 5. Tratamiento de los datos
Práctica 5.6: MySQL: Crear usuarios y asignar permisosen
local
Realiza las siguientes operaciones y almacena los comandos y los resultados en un
chero:
1. Crea un usuario llamado paco@localhost con la sintaxis create user con per-
misos de solo conexión y comprueba que se pueda conectar.
2. Crea un usuario llamado juan@localhost con la sintaxis grant con permisos de
solo conexión y comprueba que se pueda conectar.
3. Otorga al usuario paco@localhost permisosde selecten la tabla jardineria.Clientes
y comprueba que se pueda consultar la tabla.
4. Otorga al usuario juan@localhost permisos de select, insert y update en las
tablas de la base de datos jardineria con opcion GRANT.
5. Conéctate con el usuario juan y otorga permisos a paco deselección enla tabla
jardineriaEmpleados.
6. Quítale ahora lospermisos apaco deselección sobrela tabla jardineria.Clientes.
7. Conéctate con root y elimina todos los permisos que has concedido a Paco y
Juan.
8. Otorga a juan los permisos de SELECT sobre las columnas CodigoOcina y
Ciudad de la tabla Ocinas de la base de datos jardineria.
9. Conéctate con juan y ejecuta la query SELECT * from jardineriaOcinas
¿Qué sucede?.
10. Borra el usuario paco@localhost.
225
Bases de Datos
Práctica 5.7: MySQL: Crear usuarios y asignar permisosen
remoto
Realiza las siguientes operaciones y almacena los comandos y los resultados en un
chero:
1.
226
Crea un nuevo usuario llamado usuarioíldireccionip donde direccion_ip es una
máquina de un compañero tuyo y usuario su nombre.
.Otórgale permisos de seleccion en todas las tablas de la base de datos jardi-
neria. Ten cuidado, es posible que tu servidor solo permita conexiones desde
el ordenador local, para permitir conexiones remotas debes comentar la linea
bind-adress de tu chero mycnf que impide conexiones desde otros sitios que
no seael especicado (127.0.0.1). Asegúrate
de reiniciar el servidor.
.Pide a tu compañero que se conectedesde sumáquina y que averigue qué per-
misos le has otorgado. El a tí te pedirá lo mismo, es decir, que te conectes a
su máquina, indica qué instrucción sql ejecutas para conocer los permisos que
tienes.
Revócale los permisos concedidos al usuario usuario@direccion_ip.
.Concédele ahora permisos de creación de tablas en una nueva base de datos
que has creado.
.Solicítale que se conecte y que pruebe a crear una tabla. ¿Puede consular la
informaciónï.
. Borra ahora el usuario usuario@direccion_ip.
.Con la bbdd mysql consulta qué privilegios tiene el usuario juan@localhost
a nivel de servidor, a nivel de base de datos, a nivel de tablas y a nivel de
columnas. Utiliza el comando show grants for usuario.
Capítulo 5. Tratamiento de los datos
Práctica 5.8: Oracle: Creación
de usuarios,
roles yperfiles
1. Crea dos roles, uno llamado ADMINISTRACION con todos los privilegios
sobre la tabla CLIENTES y PEDIDOS del esquema JARDINERIA y
otro
llamado CONTABILIDAD con todos los privilegios sobre la tabla PAGOS del
mismo esquema. El rol CONTABILIDAD estará identicado por contraseña,
.A continuación, crea un usuario Fernando en Oracle con las siguientes opcio-
nes: DEFAULT TABLESPACE Users, TEMPORARY TABLESPACE Temp,
QUOTA 100 Megabytes en Users y
otorga el rol CONNECT y
RESOURCE.
. Otorga como Rol por defecto ADMINISTRACION al usuario Fernando.
.Con el usuario Fernando, prueba a ejecutar una consulta sobre latabla Clientes
y otra sobre la tabla PAGOS.
.A continuación, activa el Rol CONTABILIDAD y repite la consulta sobre la
tabla PAGOS con el usuario Fernando.
.Desactiva todos los roles del usuario Fernando, incluyendo el rol por defecto.
.Consulta la tabla Clientes.
227
Bases de Datos
5.17.
228
Resumen
Los conceptos clave de este capítulo son los siguientes:
La sentencia INSERT se utiliza para insertar una la o registro en una ta-
bla. Algunos SGBD, como MySQL, permiten la inserción de más de una la
mediante la sintaxis extended-insert. Con INSERT se pueden insertar valores
para todas las columnas o solo para algunas de ellas.
La sentencia UPDATE se utiliza para actualizar uno o varios registros de una
tabla. DELETE sirve para eliminar registros de una tabla. Se puede ltrar la
información a modicar o borrar mediante un ltro WHERE. El ltro, puede
tener todas las características del ltro de la SELECT. Si no seespecíca ltro,
se actualizan o borran todas las las de la tabla. También se pueden actualizar
o borrar las con UPDATE y
DELETE ltrando a través de una subconsulta.
En este caso, la limitación consiste en no poder modicar o borrar registros
de una tabla a la que se accedeen la subconsulta.
Se puederealizar la inserción de múltiples registros en una tabla con los resul-
tados devueltos por una SELECT. La SELECT debe devolver tantas columnas
como se especiquen en la sentencia INSERT.
No siempre es posible actualizar o borrar información de tablas puesto que
existen restricciones. Además, algunas restricciones provocan cambios en cas-
cada en tablas relacionadas.
Las transacciones son conjuntos de operaciones SQL que se ejecutan de for-
ma atómica. Una vez iniciadas, se pueden acometer (COMMIT) o cancelar
ROLLBACK.
El tratamiento de transacciones, produce problemas de concurrencia, es decir.
problemas que se presentan al haber varios usuarios actualizando, borrando
y consultando un conjunto de datos. Estos problemas están clasicados por
ANSI/ISO en 3 problemas típicos. Los SGBD permiten que ocurran o no.
dependiendo del nivel de aislamiento que se seleccione.
El comando CREATE VIEW sirve para crear vistas, personalizando la forma
en la que el usuario obtiene la. información.
Se puede crear usuarios mediante el comando CREATE USER al cual se le
puede asignar un perl y varios roles. Mediante los comandos GRANT y RE-
VOKE se otorgar y deniegan permisos.
5.18.
1. En la sentencia INSERT
Test de repaso
a) No se puedenomitir valores de columnas
b) Se pueden especicar un número distinto
de valores y columnas
c) Se pueden omitir los nombresde columnas
d) Ninguna de las anteriores
2. Con GRANT y
REVOKE
a) Se pueden otorgar permisos de select a una
o varias tablas
b) Se pueden otorgar permisos para borrar
una tabla
c) Se puede otorgar permisos para ejecutar
comandos DDL
d) Todas las anteriores
3. Para poner una columna al valor por
defecto
a) Se tiene queponer NULL
b) Se tiene queponer DEFAULT
c) No es posiblehacerlo
d) Ninguna de lasanteriores
4. En sentencias UPDATE y
DELETE
a) Se puede especicar el mismo tipo de ltro
que para WHERE
b) Se puede especicarel mismotipo de ltro
que para HAVING
c) Se puede ltrar mediante unasubconsulta
d) Todas las anteriores
5. Si se especica ON DELETE CAS-
CADE
a)
No se
puede borrar
el registro
referenciado
b) Se borra encascada el
registro referenciado
c) No se puedeborrar el registro quereferen-
cia
d) Se borra encascada el
registro quereferen-
cia
Capítulo 5. Tratamiento de los datos
6. En una sola sentencia UPDATE
a) Sólo se puedemodicar un campo de un
registros
b) Sólo se puedemodicar un campo de varios
registros
c) Sólo se pueden modicar varios campos de
un registro
d) Se pueden modicar varios camposde va-
rios registros
7. Una transacción
a) Puede tener sentencias SELECT
b) No puede tener sentencias INSERT
c) No puede tener sentencias SELECT
d) Sólo puede tener sentencias UPDATE
8. Para comenzar una transacción se usa
a) START WORK
b) START TRANSACTION
)
)
c SET AUTOCOMMIT=OFF
d Todas las anteriores
9. Los perles en Oracle
a) Al igual que los roles, sirven para limitar
los recursos
b) No se pueden limitar recursos mediante
perles
c) Sirven para agrupar conjunto de permisos
d) Ninguna de lasanteriores
&#39;P6P&#39;89&#39;¿&#39;P9&#39;q&#39;9P?&#39;q&#39;¬&#39;P
Bases de Datos
5.19.
230
.Escribe el formato de la sentencia
INSERT y, ejemplica su funcio-
namiento mediante dos inserciones,
una especicando la lista. de cam-
pos y otra indicando todos los va-
lores para todas las columnas.
.Transforma las dos sentencias IN-
SERT anteriores en un único IN-
SERT con sintaxis extendida.
. Escribe el formato de la sentencia
UPDATE y, ejemplica su funcio-
namiento mediante tres querys, una
que actualice una columna de una
la, una que actualice dos columnas
de varias las, y otra que actualice
todas las las de una tabla.
.Escribe el formato de la sentencia
DELETE y, ejemplica su funcio-
namiento mediante dos querys, una
que borre una sola la y otra que
borre todos los registros de una ta-
bla.
. ¿En qué consiste un INSERT-
SELECT? Pon un ejemplo de su
funcionamiento.
.¿Qué condiciones deben darse pa-
ra que al hacer una modicación
en una tabla, sus cambios se pro-
paguen a la tabla. que la.referencia
mediante una clave foránea?
10.
11.
12.
13.
Comprueba tu aprendizaje
. Imagina una situación, y pon un
ejemplo de borrado en cascada de
registros.
.Imagina otra situación distinta, y
pon un ejemplo de actualización en
cascada tanto en Oracle, como en
1IySQL.
.¿Qué quiere decir que una actuali-
zación o borrado se ltra mediante
una consulta? ¿Existe alguna res-
tricción al respecto?
Dene el concepto de transacción
indicando en qué situaciones son
útiles y qué problemas puede oca-
sionar.
Dene los tipos de problemas oca-
sionados por la concurrencia en el
acceso a los datos:
a) Dirty Read o Lectura Sucia
b) N onrepeateable Read o Lectu-
ra No Repetible
c) Phantom Read o Lectura Fan-
tasma
¿Qué signica que un SGBD tenga
una política de aislamiento?
Enumera. los tipos de aislamiento
estándar.
CAPÍTULO 6
Programación de bases de datos
Objetivos
Contenidos ,
Introducir el Concepto de pro-
Introducción a loslenguajes de graïnacïón de
133595 de
datos
programación de bases dedatos
Aprender los Inecanismos bási-
Tipos dedatos, identicadores C05 de
la P1
ogïalïïaCïólï de
bases
y
variables de datos
operadores y
expresiones Diseñar y codicar scripts para
tareas complejas
Estructuras de
control
Incorporar el uso
de las
Gestión de BTTOTGS transacciones en tareas com-
._. plej as
Transacciones enscripts
Manejar cursores
En este tema e] alumno aprenderá a programar una base de datos, desarro-
Ilando programas y
guiones utilizando las técnicas apropiadas.
231
Bases de Datos
6.1. Introducción a la programación de bases de
datos
Programar una base de datos es la forma en la que el desarrollador o adminis-
trador de la base de datos interactúa con ella.
Hay muchas maneras de programar una base de datos, la elección del modo más
adecuado depende
de con qué tecnologíade basede datosse estátrabajando (por
ejemplo, Oracle),de quécompiladores se
tengan instaladosen la máquina objetode
ejecución (por ejemplo, C++), de qué ventajas e inconvenientes sepersigan, o de la
naturaleza de la aplicación de base de datos que se va a desarrollar. La aplicación
de base de datos puede ser de tres tipos distintos:
n Codicación en el lado del servidor: La lógica de la aplicación reside en-
teramente en la base de datos. La aplicación está basadaen la implementación
de disparadores que seejecutan automáticamente cuando ocurre algún cambio
en los datos almacenados. y en el almacenamiento de procedimientos y funcio-
nes que son llamados explícitamente. Una ventaja importante es que, de esta
forma, se puede reutilizar el mismo código para muchos clientes.
n Modelo cliente/servidor (también llamado modelo en dos niveles):
El código de la aplicación corre en otra máquina distinta del servidor donde se
encuentra la base de datos. Las llamadas a la base de datos son transmitidas
desde lamáquina cliente al servidor. Los datos son transmitidos desde elcliente
al servidor para las operaciones deinserción y actualización, y desde elservidor
al cliente durante las consultas. Los datos sonprocesados enla máquina c1ient.e.
Normalmente, estas aplicaciones se escriben usando precompiladores con las
sentencias SQL embebidas en el código.
IModelo en tres niveles: Al modelo en dos niveles se le añade un servidor de
aplicación separado que procesa las peticiones. Este podría ser, por ejemplo.
un servidor Web básico, o un servidor que realizara funciones de cacheo de
datos y balanceo de carga. Aumentar la potencia de procesamiento de esta
capa intermedia permite disminuir los recursos necesarios para los clientes.
pudiendo estos llegar a ser simples navegadores Web.
Para el desarrollo de aplicaciones. ademásde necesitarun interfaz de programación
donde hacer el desarrollo. se precisa de un software de cliente que enlace el código
desarrollado con la base de datos. Los interfaces más comunes son:
- SQL incorporado: Las aplicaciones de bases de datos de SQL incorporado
se conectan a. las bases de datos y ejecutan directamente sentencias de SQL
232
Capítulo 6. Programación de bases
de datos
incorporado que se encuentran insertadas dentro de una aplicación escrita en
un lenguaje principal (típicamente C, C++ o COBOL). Las sentencias SQL
se pueden ejecutar estática o dinámicamente.
IODBC: Microsoft desarrolló una interfaz SQL denominada Open Database
Connectivity (ODBC) para los sistemas operativos de Microsoft. Los contro-
ladores ODBC especícos de la BBDD se cargan dinámicamente en el tiempo
de ejecución, mediante un gestor de controladores basado en la fuente de da-
tos (nombre de la base dedatos) proporcionadaen la petición de conexión.
La aplicación se enlaza directamente con una única biblioteca del gestor de
controladores, en lugar de con la biblioteca de cada motor de basede datos. El
gestor de controladores media entre las llamadas de función de la aplicación
en el momento de la ejecución y asegura que estas se dirijan hasta el contro-
lador ODBC adecuado que sea especíco para el motor. Dado que el gestor
del controlador ODBC solo conoce las funciones especícas de ODBC, no se
podrá acceder a las funciones especícas del motor de base de datos. ODBC
no está limitado a los sistemas operativos de Microsoft; otras implementacio-
nes están disponibles en varias plataformas. Para el desarrollo de aplicaciones
ODBC, debeinstalarse unODBC SoftwareDevelopment Kitl.
ICLI: Call Level Interface (intefaz a nivel de llamada). Es una interfaz de pro-
gramación de aplicaciones C y C++ para el acceso a bases de datos relacio-
nales, que utiliza llamadas de función para pasar sentencias deSQL dinámico
como argumentos de función. Es una alternativa al SQL dinámico incorpora-
do, pero a diferencia de SQL incorporado, CLI de DB2 no necesita variables
del sistema principal o precompilador. Se basa enla especicación ODBC 3,51
y en la Norma Internacional para SQL /CLI. Estas especicaciones se escogie-
ron como la base para proporcionar una curva de aprendizaje más corta para
aquellos programadores de aplicaciones, ya familiarizados con cualquiera de
estas interfaces de bases de datos.
u JDBC: Java Database Connectivity es un API (Applications Programming
Interface, interfaz de programación de aplicaciones) que permite enviar sen-
tencias SQL a una base de datos relacional.
ISQLJ: Es un estándar ANSI SQL-1999 para incorporar sentencias SQL en
código fuente Java. Proporciona una alternativa al JDBC para el acceso a
datos desde Java tanto en el lado cliente como en el lado servidor. Un código
fuente SQLJ es más breve que su equivalente en código fuente JDBC.
lPara la plataforma Windows, el SDK de ODBC es parte del SDK de Microsoft Data Access
Components (MDAC),disponible paradescarga en
httpz/ /mm.microsoft .com/data.
233
Bases de Datos
n OCI y
OCCI: Oracle Call Interface (OCI) y Oracle C++ Call Interface
(OCCI) son APIs
que permiten crear aplicaciones que invocan procedimien-
tos y funciones nativas para acceder y controlar todas las fases de ejecución
de sentencias SQL en bases dedatos Oracle. Permite desarrollar aplicaciones
combinando la potencia de acceso a los datos del SQL, con la capacidad de
hacer bucles, crear estructuras de control. ..
Interfaz de base de datos Perl: Combina la potencia del lenguaje inter-
pretado Perl y el SQL dinámico. Estas propiedades convierten a Perl en un
lenguaje perfecto para crear y revisar rápidamente aplicaciones de bases de
datos (DB2). El Módulo DBI de Perl utiliza una interfaz que es muy parecida
a las interfaces CLI y JDBC, lo cual facilita la traducción de las aplicaciones
Perl a aplicaciones CLI y JDBC, y viceversa.
Hypertext Preprocessor (PHP): Es un lenguaje de programacióninter-
pretado. La primera versión de PHP fue creada por Rasmus Lerdorf y reci-
bió contribuciones bajo una licencia de código abierto en 1995.Principalmente
pensado para el desarrollo de aplicaciones Web, inicialmente era un motor
de plantillas HTML muy sencillo, pero con el tiempo los desarrolladores de
PHP
han ido añadiendo funciones de acceso a bases de datos, han reescrito
el intérprete, han incorporado soporte orientado a objetos y han mejorado el
rendimiento. Actualmente, PHP
se ha convertido en un lenguaje muy utilizado
para el desarrollo de aplicaciones Web porque se centra en soluciones prácticas
y da soporte alas funcionesmás utilizadasen aplicaciones
Web?
OLE DB: Microsoft OLE DB es un conjunto de interfacesOLE/ COM que
proporciona a las aplicaciones un acceso uniforme a datos almacenados en
distintas fuentes de información. La arquitectura OLE DB dene a los consu-
midores de OLE DB y a los proveedoresde OLE DB. Un consumidor de OLE
DB puede ser cualquier sistema o aplicación que utiliza interfaces OLE DB:
un proveedor de OLE DB es un componente que expone las interfaces OLE
DB.
El consejo del buen administrador. . .
Toda programación debe ir acompañada de su correspondiente depuración de
errores. Hayestudios queconcluyen quese dedicaun 60-80%
del tiempo in-
vertido en fabricar un programa a 1a deteccióny corrección de errores.
¿Para Windows,
se pueden
encontrar versiones
binarias precompiladas
de PHPen http: //php.
net.
234
Capítulo 6. Programación de bases dedatos
6.2. Los lenguajes de programación de bases de
datos
Se puede programar una base de datos en multitud de lenguajes, desde el C,
pasando por el Java, hasta el nuevo e innovador XQuery, pero todos, en mayor o
menor medida, terminarán recurriendo a sentencias SQL para extraer o insertar
datos de la base de datos, por lo que es imprescindible y fundamental conocer y
desenvolverse adecuadamentecon SQL.
Para añadir más potencia de ejecución a las sentencias SQL,Oracle desarrolló un
lenguaje propio llamado PL/ SQL, con él, es posible denir variables, crear estruc-
turas de control de ujo y toma de decisiones, crear funciones, procedimientos, pa-
quetes. . . .
Con el mismo objetivo, en DB2 viene incorporadoel lenguajeSQL/PL que, al
contrario que el de Oracle, respeta la totalidad del estándar de SQL, pero además,
DB2, desde su versión 9.7, ofrece la posibilidad de desarrollar directamente en
PL/SQL, existiendo compatibilidadplena conOracle, locual haceque lasmigracio-
nes de la lógica de la aplicación de una base de datos Oracle a DB2 9.7 sean prácti-
camente transparentes para el desarrollador, facilitando además la reutilización del
conocimiento y evitando la necesidad de tener que aprender las características del
nuevo gestor (el equipo de trabajo sigue siendo productivo desde el mismo día de la
migración).
Los programas
PL/SQL, pueden ejecutarse
haciendo uso
del SQL*Plus;los tipos
básicos de
un programaPL/SQL son: procedimientos,
funciones ybloques anónimos.
Todos ellos están compuestos de tres bloques bien diferenciados:
Partes de un programa
DECLARE
--declaración
de variables
que se
usarán en
la sección
de ejecución
--es opcional, ya que no siempre la complejidad del programa a
--realizar precisa del uso de variables y constantes
BEGIN
--sentencias
a ejecutar,
bloque de
ejecución propiamente
dicho.
EXCEPTION
--chequeo
de errores
de interés
ocurridos durante
todo la
ejecución
--y acciones a tomar en consecuencia
--Bs opcional, pero si existe, está ubicado junto antes de END
END;
Bases de Datos
El consejo del buen administrador. . .
Cuantos más comentarios se pongan en un programa, más fácil será su man-
tenimiento y posterior modicación, sobre todo si 1a persona encargada de
retocarlo no esla misma que la persona que creó el programa originalmente.
Los bloques anónimos solo se pueden utilizar en el momento de su creación.
ya que al no tener nombre que los identique, no pueden ser referenciados. Si lo
que se pretende es reutilizar el código, habrá que guardar el programa PL/ SQL en
el catálogo de la base de datos, ya sea como procedimiento almacenado o función
almacenada, de modo que quedeidenticado unívocamente con un nombre
y un tipo.
Tanto el procedimiento como la función podrán aceptar parámetros de entrada, pero
solo la función devolverá a su vez un valor al término de su ejecución. En caso de
querer crear un procedimiento, se sustituirá la palabra DECLARE por la sentencia
CREATE PROCED
URE.
CREATE
UR REPLACE PROCEDURE
nombre_de1_procedimiento (lista_de_parámetros) AS
Y si lo que sedeseaescrear una función, sesustituirá la palabra DECLARE por
la sentencia
CREATE F UN CTI ON.
CREATE
DR REPLACEFUNCTIÜNnombre_de_la_funcion(1ista_de_parámetros)
RETURNtipo_de_dato_devuelto IS
En ambos casos,la lista de parámetros esopcional, de modo que si no seprecisa
pasarparámetro alguno,bastacon omitir la lista (incluyendolos paréntesis).
Para hacer uso de un procedimiento basta con invocar la instrucción CALL.
CALL nombre_de1_procedimiento(lista_de_va1ores);
En el caso de las funciones, puesto que estastienen necesariamenteque devolver
un valor, para hacer uso de ellas es obligatorio recoger dicho valor. Una forma fácil
sería asignándoselo a una variable que fuese del mismo tipo que el valor devuelto
por la función, o también. invocarla desdeuna sentencia SELECT.
SELECT
nombre_de_1a_función(1ista_de_va1ores)
FROM
DUAL;
236
Capítulo 6. Programación de bases dedatos
También se pueden agrupar procedimientos y funciones en objetos más grandes
llamados paquetes, los cuales están compuestos por dos componentes:
ILa cabecera: encargada de almacenar la denición de todos los subprogramas
(procedimientos yfunciones) queincluye el paquete, asícomo la declaración
de las variables y constantes globales al paquete (que podrán usarse en todos
los subprogramas que lo componen).
I El
cuerpo: que contiene el código de todos los subprogramas.
cabecera del paquete
CREATE DR REPLACE
PACKAGE nombre_de1_paquete AS
PROCEDURE
nombre_de1_procedimiento_1 (1ista_de_sus_parámetros);
PROCEDURE
nombre_de1_procedimiento_2 (lista_de_sus_parámetros);
FUNCTION nombre_de_1a_función_1 (1ista_de_sus_parámetros) RETURN
tipo_de_dato_devue1to;
--declaración de variables y constantes globales al paquete
END nombre_de_paquete;
/
Cuerpo del paquete
CREATE OR REPLACE PACKAGE BODY
nombre_del_paquete AS
PRÜCEDURE
nombre_del_procedimiento_1 (lista_de_sus_parámetros) IS
--declaración de variables y constantes locales al procedimiento
BEGIN
--código del nombre_del_procedimiento_1
END nombre_de1_procedimiento_1;
PRÜCEDURE
nombre_del_procedimiento_2 (lista_de_sus_parámetros) IS
--declaración de variables y constantes locales al procedimiento
BEGIN
--código del nombre_de1_procedimiento_2
END nombre_del_procedimiento_2;
FUNCTION nombre_de_la_funcion_1 (lista_de_sus_parámetros) RETURN
tipo_de_dato_devue1to IS
--declaración de variables y constantes locales a la función
BEGIN
--código
del nombre_de_1a_funcion_1
END nombre_de_la_funcion_1;
END nombre_del_paquete;
/
237
Bases
de Datos
Recuerda. En Oracle, latabla DUAL es unatabla auxiliarmuy útil para
ejecutar todo tipo de funciones. Concretamente las que proporciona el gestor
para por ejemplo, extraer el DDL de un objeto de la base de datos, o para
conocer qué fecha es:
SELECT SYSDATE FROM
DUAL;
En DB2, la tabla auxiliar se llama S
YSIBALS YSD UMMYl. El mismo ejemplo
para obtener la fecha actual se haría con la sentencia:
SELECT CURRENT. TIMESTAAÍP FROM
SYSIBALSYSD UMMYI;
Los procedimientos y funciones que están dentro de paquetes, también pueden ser
invocados individualmente y, de la misma manera que los procedimientos y funciones
independientes, basta con calicarlos por delante con el nombre del paquete al que
pertenecen, ya que esta es la.única forma de identicarlos unívocamente respecto de
la totalidad de objetos que tiene la base de datos.
Llamada dentro de un paquete
--llamada a procedimiento
CALL nombre_de1_paquete.nombre_de1_procedimiento(1ista_de_va1ores);
--llamada a función
SELECT nombre_del_paquete.nombre_de_1a_función(1ista_de_va1ores)
FROM dual;
<>
Actividad 6.1: Creados tablas
que se
llamen igual
pero en
distintos esquemas.
Crear, en el mismo esquema. dos objetos que se llamen exactamente igual, por
ejemplo, una tabla y un procedimiento.
Aparte de los programas mencionados (procedimientos, funciones y paquetes).
también se puede codicar lógica de negocio en los dispara.dores o TRIGGERS
asociados a tablas, vistas o eventos. que podrán ejecutarse una.vez (por ejemplo al
intentar un usuario conectarse a la base de datos). o tantas veces como las de una
tabla se vayan a insertar, borrar o actualizar. El disparador podrá programarse para
que se active inmediatamente antes o después del evento.
Para dar de alta o recrear un disparador basta con sustituir la palabra DECLARE
por la sentencia de denición del disparador. Un ejemplo para denir un disparador
de tabla que se ejecute en cada la antes de ser insertada. es el siguiente:
238
Capítulo 6. Programación de bases dedatos
Creación o recreación de un disparador
CREATE DR REPLACE TRIGGER
nombre_de1_disparador BEFORE INSERT
DN nombre_de_1a_tab1a FOR EACH RÜW
En
ese caso, elmomento enel quese ejecutael disparadoresBEFORE
(antes),
y el evento que lo dispara es la instrucción DML INSERT
(inserción en la tabla
destino del disparador). Otro momento de ejecución podría ser AFTER
(después),
y otros eventos, además de la inserción, podrían ser el borrado (DELE TE)
y la
actualización (UPDATE OF
lista_de_columnas), o inclusovarios ala vez (INSERT
OR DELETE
OR UPDATE).
Además. también se podría añadir una condición
(WHEN
Por ejemplo, sepodría crearun disparadorllamado actualizaSueldoMini-
mo denido antes (BEFORE)
de la actualización (UPDATE OF)
del campo sueldo
de la tabla nominas del esquema contratados. que se activara solo cuando se cum-
pliese la condición de que el valor del campo que se quiere actualizar fuese menor
de 1000 euros, de modo que impidiese que se pudieran asignar sueldos por debajo
de los 1000 euros.
CREATE
OR REPLACE TRIGGER contratados.actua1izaSue1doMinimo BEFORE
UPDATE OF
sueldo ON
contratados.nominas FOR EACH ROW
WHEN (new.sue1do < 1000)
BEGIN
:new.sue1do := 1000;
END;
/
¿Sabías que .. . 7
Se puede denir más deun disparador
para lamisma
tabla y para la misma combinación de momento y evento, pero el orden en el
que Oracle los ejecutará.será indeterminado. por ello es mejor opción agrupar
la lógica de negocio en un solo disparador.
DB2, en cambio, los ejecutaría según el orden en el que fueron creados.
Dentro de la programación del disparador, :old.nombre_del_campo haráreferen-
cia al valor antiguo del campo llamado nombre_del_campo.mientras que
:new.nombre_del_campo seráel nuevo valor que pretende asignársele al campo lla-
mado nombre_del_campo,pudiendo este valor new ser modicado en el bloque de
ejecución del disparador. Nótese que en la cláusula WHEN.
las variables :old y mew
no deben ir precedidas de los dos puntos (z).
239
Bases de Datos
Recuerda. En una base
de datos
todos losobjetos son
únicos, es
decir, que
estan perfectamente identicados por su nombre y por su tipo y no pueden re-
petirse. Por ejemplo. un mismo usuario o esquemade basede datos no podría
tener dos tablas que se llamen exactamente igual. pero sí podría existir una
tabla llamada nominas en dos esquemas distintos (contratados y subcontra-
tados), ya que la base de datos las conocería comocontratadosnominas y
subcontmtadosmominas.
En el caso delos procedimientos y funciones, existe ademásel nivel de paque-
tes, esdecir, que podría existir un procedimiento independiente que se llamara
calculaNominas que perteneciera al usuario pepito, pero además podría tam-
bién haber otro procedimiento calculaNominas dentro de un paquete paque-
teDeContabilidad del mismo esquema contratados. Se referenciarían por con-
tratadoscalculaNominas, contratadospaqueteDeContabilidad.calculaNominas,
respectivamente. Incluso podría existir una función que se llamara también
contratados. calculaNominas, pues al ser objetos de distinto tipo, en una sen-
tencia SQL determinada, la base de datos los distinguiría por el contexto.
6.3. Tipos de datos, identicadores y variables
En Oracle existen varios juegos de datos soportados, unos especícos de Oracle.
otros compatibles con el estándar ANSI y los tipos de datos del DB2 de IBM, otros
denidos por el usuario a partir de los dos tipos anteriores mediante el uso de la
instrucción CREA TE TYPE, y otros como los tipos de datos XML (para la consulta
y tratamiento de documentosXML) o los tipos de datosespa.ciales (para
tratar la
información geográca). Aquí solo se tratarán los tipos básicos del primer juego:
ICHAR(tamaño): cadena detamaño jo. El número máximo de caracteres
es 2000. Los valores de tipo cadena deberán ir entrecomillados con comilla
simple.
IVARCHAR2(tamaño): cadena delongitud variable. El tamaño máximo es
4000 caracteres. Los valores de tipo cadena deberán ir entrecomillados con
comilla simple.
INUMBER(precisión,escala): número decimal.La precisión puede tomar
valores entre 1 y 38. La escala puede estar entre 84 y 127. Un número de
escala positivo indica cuántos dígitos signicativos de entre el total de la pre-
cisión se guardarán a la derecha de la coma decimal. Un número de escala
240
Capítulo 6. Programación de bases dedatos
negativo indica el número de dígitos que se redondearán del número a la iz-
quierda de la coma. Tanto la precisión como la escala son opcionales, pero
si hubiera escala, necesariamente tendría que haberse indicado la precisión.
Por ejemplo, para crear una Variable que pueda albergar valores del 999999
hasta el999999, basta
con denir una detipo NUlIBERl(6). Una variablede
tipo NUMBER(6,2) aceptará valores de hasta seis cifras, pero las unidades
y las decenas seredondearán, por ejemplo, el número 123456,44 se almace-
nará como 123500. En
cambio, NUMBER(6,2) guardará cuatro dígitos a la
izquierda de la. comay redondeará los dígitos a la derecha de la coma dejando
solo dos. Los subtipos INTEGER,
IN T,
y SMALLIN T también pueden usarse
para denir números enteros con un máximo de 38 dígitos de precisión.
- BINARYILOAT: número de coma otante de 32 bits de precisión. Los
valores positivosestán enel intervalo (1. 17549E-38,3, 40282E+38).
IBINARYDOUBLE: número de coma otante de 64 bits de precisión. Los
valores positivos están en el intervalo
(2, 22507485850720E308,
1, 79769313486231E+308).
- DATE:
fecha y hora. La función TO_DATE
es muy útil para insertar datos ti-
po fechao comparar dos fechas:TO_DA
TE (31-01-2010 , DD-MM- YYYY).
- TIMESTAMP: es una extensión del tipo DA
TE que guarda además fraccio-
nes de segundo.
IBLOB,CLOB,BFILE 3: datosmuy grandes
y desestructurados,
por ejemplo
texto, imágenes, vídeos o datos espaciales. Pueden guardarse en tablespaces
diferentes al resto de la tabla, o en el caso de los BFILE, en cheros externos
a la base de datos.
IROWID: es el tipo de la pseudocolumna ROWID, una. columna interna de
la tabla que almacena la dirección física de cada la. Mediante esta dirección
se puede localizar el número de objeto, chero de datos, tablespace donde
se encuentra y la posición dentro del bloque de datos respecto del chero de
datos, formando con todo ello un valor único en toda la base de datos. Los
accesos a los datos a través de la localización de un valor en esta columna son
rapidísimos.
Además de estos tipos, existen otros no soportados por el estándar SQL, que no
pueden usarse
para denir columnas, perosí en la programaciónde PL/ SQL, por
ejemplo el tipo BOOLEAN, que puede albergar los valores lógicos TR UE
(verdade-
ro), FALSE
(falso) o NULL
(nulo) muy útiles en comparaciones.
3Oracle recomienda
sustituir los datos tipo LONG, LONG RAW y RAW por estos tipoLOB.
241
Bases de Datos
Basándose en estos tipos de datos, se podrá proceder a la definición de variables
y constantes en los bloques DECLARE. y en la denición de los procedimientos y
funciones.
Sintaxis para la definición de variables.
nombre_de_la_variable tipo_de_dato ;
o
nombre_de_1a_variab1e tipo_de_dato := va1or_de_inicia1ización;
Sintaxis para la definición de constantes
nombre_de_la_constante CONSTANT tipo_de_dato := va1or_de_inicia1ización;
¿Sabías que . . . ?
Los valores de
tipo cadena
van entrecomillados
con
comilla simple.
En PL/SQL, la asignación del valor a una variable o constante siempreva
precedida de los signos :=. En la asignación u operación con valores, PL /SQL
puede convertir implícitamente el tipo de dato para adecuarlo al tipo de la
variable al que se asigna el valor o al tipo necesario en la operación. En el
siguiente ejemplo, se puede hacer la resta gracias a la conversión implícita de
los meses.En casode quelos mesestuvieran alguna letra, la opera.ción arro
j aria
un error.
DECLARE
mesInicio
CHAR(2) :=
6;
mesFin CHAR(2) := &#39;10;
mesesTranscurridos NUMBER(2);
BEGIN
mesesTranscurridos
:= mesFin
-meslnicio;
END;
/
Cuando sedesee declararuna variable con el mismo tipo que otra variable conocida
del mismo programa o el tipo de una columna de una tabla concreta. o incluso como
una la. completa de una tabla, existen dos atributos que facilitan la denición y cor.
ello el mantenimiento del programa PL /SQL. ya que la modicación del tipo original
se extenderá. al resto de variables derivadas sin necesidad de tener que cambiar
ninguna línea de código. Esos atributos son el %
TYPE y el %ROWTYPE.
Capítulo 6. Programación de bases dedatos
Atributos%TYPE y%ROWTYPE
nombre_de_1a_variab1e nombre_de_1a_otra_variableZTYPE;
nombre_de_1a_variable esquema.tab1a.co1umna%TYPE;
nombre_de_1a_variable_tipo_registro esquema.tab1a%TYPE;
En el caso delos procedimientos y funciones, las variables de su lista de paráme-
tros pueden ser de tres tipos: IN
(parámetro de entrada), OUT (parámetro de
salida) e IN
OUT (parámetro deentrada y de salida). Si no se especica nada, el
parámetro en cuestión sería IN. Hacer que un procedimiento tenga parámetros OUT
es un truco muy bueno para conseguir que el procedimiento devuelva datos.
Procedimiento con parámetro de salida
CREATE OR REPLACE PROCEDURE contratados.dameSue1doMinimo
(sueldoMinimo OUT contratados.nominas.sue1do%TYPE) AS
BEGIN
sue1doMinimo:=1000;
END;
/
¿Sabías que . .. 7
La función SUBSTR(
cadenaxzrgumento, posi-
cióminicial, longitud_de_la_subcadena) sirve para extraer trozos de la cade-
nanrgumento, de modo que se devolveránun total de longitud_de_la_subcadena
caracteres comenzando por los que van desde la posiciónjnicial. En caso de
omitir el parámetro longitud_de_la-subcadena,la función devolverá la subcade-
na desde la posiciónjnicial hasta el nal de la cadencuzrgumento.
6.4. Operadores y expresiones
Para relacionar variables y constantes entre sí. seusan los operadores, que com-
binándolas con aquéllas darán lugar a expresiones cuyosresultados serán el funda-
mento de la lógica de programación de la base de datos.
Las operaciones que se pueden realizar y el orden en el que se ejecutarían (en
ausencia de paréntesis) son:
243
Bases de Datos
ÍHHHHHIÍÍÍÍIÑHÜHÍÍÍÍÍÍÍ""""III"lI&#39;||"&#39;I||
Í¡l"""&#39;HÑHMHIlÍl&#39;ll&#39;l&#39;l&
Signo positivo o
negativo
*nmltiplicación
/ división
+
suma
resta
concatenación.
Muy útil
para juntar
varias caden
en una
comparaciones: igual, menor, mayor, menor o igual
.mayor o igual, distinto, distinto
IS NULL, LIKE es nulo, como
BETWEEN, IN entre, en
negación lógica de un tipo boolean
operador AND lógico entre tipos de dato boolean
operador OR lógico entre tipos de dato boolean
Teniendo en cuenta esto, se podría decir que las siguientes expresiones sontodas
verdaderas (TRUE):
(6+8)/2=7 6+8/2=1O 6a2=&#39;6"||a2
7 != 10 O <> NULL O IS NULL = FALSE
0 IS NOT NULL =
TRUE 6 BETWEEN 2
AND 8
6a2 LIKE %24
6a2 LIKE 6% 6 IN (6,82) a IN (b
( 5 )
,a)
b NOT IN (b,a) (3 <
5) AND 5
>= ) (3 <
5 OR (5 <= 3)
Además de los operadores, existen funciones tremendamente útiles para la toma
de decisiones. Tal es el ejemplo de las funciones DECODE, NVL y REPLACE.
-DECODE(argumento, patrónl, resultadol, patrón2, resultado2. .. ,
resultado_por_defecto): Compara el valor del argumentocon cadauno de
los patrones y en cuando encuentra la coincidencia devuelve elresultado corres-
pondiente, o el resultadmporxdefecto en casode que no encuentre coincidencia
en ningún patrón proporcionado. Cualquiera de los patrones puede tornar el
valor NULL.
n NVL(valor1, valor2): Si el valorl es nulo,entonces se
devuelve elvalor2, en
Capítulo 6. Programación de bases dedatos
6.5. Estructuras de control
Cuando se crea. un programa, todas las sentencias se ejecutan siguiendo una
secuencia, esdecir, el ujo de ejecución del programa Consiste en ejecutar una ins-
trucción detrás de otra. Las estructuras de control sirven para controlar ese ujo del
programa, la toma de decisiones yprogramar las acciones enconsecuencia. Todaslas
estructuras de control están basadas enla evaluación de una expresión lógica más o
menos compleja que constituye en sí misma una condición. En caso de cumplirse la
condición, es decir, en caso de que la evaluación de la condición dé como resultado
el valor TR
UE, se tomará una acción, en caso negativo otra o nada. Hay dos tipos
de sentencias de control de ujo, condicionales e iterativas. En las condicionales, la
decisión que se toma es alternativa, es decir, se ejecuta un bloque de sentencias u
otro. En las iterativas o bucles, la decisión que se toma es si repetir la ejecución de
un bloque de instrucciones o no repetirlo.
6.5.1. IF..THEN-ELSIF..THEN-ELSE-END IF
Hay tres formas de usar la sentencia condicional IF: evaluando una única condi-
ción (IF-THEN
), más deuna condición(ELSIF- THEN), y/o añadiendouna opción
de acción por defecto en casode que no se cumpla ninguna condición de las exigidas
(ELSE Las cláusulas ELSIF
y ELSE son opcionales.
Ejemplo de condicional
CREATE OR REPLACE PROCEDURE Calificacion(Nota NUMBER) as
BEGIN
IF
Nota >=
0
AND
Nota
<5
THEN
DBMS_0UTPUT.PUT_LINE(Suspenso);
ELSIF Nota >= 5 AND Nota < 6
THEN
DBMS_0UTPUT.PUT_LINE(Suficiente);
ELSIF Nota >= 6 AND Nota <
7 THEN
DBMS_ÜUTPUT.PUT_LINE(Bien);
ELSIF Nota >= 7 AND Nota <
9 THEN
DBMS_0UTPUT.PUT_LINE(Notable);
ELSIF Nota >= 9
AND Nota <= 10 THEN
DBMS_0UTPUT.PUT_LINE(Sobresa1iente);
ELSE
DBMS_0UTPUT.PUT_LINE(Ca1ificación
errónea);
END
IF;
END;
/
En el ejemplo anterior se haceuso de la función DBMSLOU
TP U
T.P U
T_LINE para
escribir el resultado de la evaluación de cada condición. La misión de dicha función
Bases
de Datos
es la de mostrar por pantalla un mensaje visible al usuario, pero para que este pueda
verlo, ha de activarse la variable de entorno del SQL*Plus llamada SERVEROU T-
PU T, que es local a la sesión actual en curso.
6.5.2. CASE-WHEN..THEN-ELSE-END
CASE
Es
una estructura de control condicional que permite ejecutar distintas sentencias
ante los distintos valores posibles de la
misma condición.
En
los ejemplos siguientes se exponen dos formas de programar esta estructura,
una escribiendo cada vez la condición candidata, y la otra, poniéndola solo una vez.
Ejemplo 1 de CASE-WHEN..THEN-ELSE-END
CASE
SET SERVERÜUTPUT DN
CREATE OR REPLACE
PROCEDURE Ca1ificacion(Nota NUMBER) as
BEGIN
CASE
WHEN
Nota
>= O
DBMS_OUTPUT.
WHEN
Nota >= 5
DBMS_OUTPUT.
WHEN
Nota >= 6
DBMS_OUTPUT.
WHEN
Nota >= 7
DBMS_OUTPUT.
WHEN
Nota >= 9
DBMS_OUTPUT.
END CASE;
END;
/
AND Nota < 5 THEN
PUT_LINE(Suspenso);
AND Nota <
6 THEN
PUT_LINE(Suficiente);
AND Nota <
7 THEN
PUT_LINE( Bien); j
AND Nota < 9 THEN
PUT_LINE(Notab1e);i
AND Nota <= 10 THEN
PUT_LINE(Sobresa1iente);
ELSE
DBMS_0UTPUT.PUT_LINE(Calificación errónea);
Capítulo 6. Programación de bases dedatos
Ejemplo 2 de CASE-WHEN..THEN-ELSE-END
CASE
SET SERVERDUTPUT ON
CREATE DR
REPLACE PRÜCEDURE Ca1ificacion(Nota VARCHAR) as
BEGIN
CASE
Nota
WHEN
Suspenso THEN
DBMS_0UTPUT.PUT_LINE(Calificación menor
de 5.);
WHEN
Suficiente THEN
DBMS_0UTPUT.PUT_LINE(Calificación entre 5 y 6.);
WHEN
Bien THEN
DBMS_OUTPUT.PUT_LINE(Ca1ificación entre 6 y
7.);
WHEN
Notab1e THEN
DBMS_0UTPUT.PUT_LINE(Ca1ificación entre 7 y 9.);
WHEN
Sobresaliente THEN
DBMS_0UTPUT.PUT_LINE(Ca1ificación entre 9 y 10.);
ELSE
DBMS_DUTPUT.PUT_LINE(Ca1ificación errónea);
END CASE;
END;
/
6.5.3. LOOP-EXIT WHEN-END LOOP
Para construir sentencias iterativas o bucles existen varias opciones, la primera
de ellas es esta, que garantiza que por lo menos una vez, la ejecución del programa
entra en la codicación hecha dentro del bucle.
Existen dosformas desalir del bucle, encualquier circunstancia(EXIT), o po-
níendo unacondición (EXIT WHEN).
Ejemplo de LOOP-EXIT WHEN-END
LOOP
SET SERVEROUTPUT ON
DECLARE
contador NUMBER(3);
BEGIN
contador :=
1;
LOOP
EXIT WHEN
contador > 99;
contador := contador + 1;
END
LOOP;
DBMS_OUTPUT.PUT_LINE (E1 valor de salida deberia ser 100: || contador);
END;
/
Bases de Datos
Ejemplo equivalente de LOOP-EXIT WHEN-END LÜÜP
SET SERVERÜUTPUT DN
DECLARE
contador
NUMBERCS);
BEGIN
contador
:=1;
LOOP
IFcontador
>
99THEN
EXIT;
END IF;
contador := contador
+ 1;
END LOOP;
DBMS_0UTPUT.PUT_LINE (E1 valor de salida deberia ser 100: II contador);
END;
/
6.5.4. WHILE..LOOP-END LOOP
Esta sentenciaiterativa es otro tipo de
bucle. Se diferencia
del anterior en
que
la ejecución
del programatiene
que evaluar
la condiciónantesde ejecutar
el bloque
de sentencias del
bucle.
Ejemplo de WHILE..LDDP-END LOOP
SET SERVERDUTPUT ON
DECLARE
contador
NUMBER(3);
BEGIN
contador
:=1;
WHILE contador
< 100 LOOP
contador := contador
+ 1;
END LOOP;
DBMS_OUTPUT.PUT_LINE (E1 valor de salida deberia ser 100: II contador);
END;
/
Capítulo 6. Programación de bases
de datos
Usando en vez de IN, la opción IN RE
VERSE, se conseguiríaque el bucle fuera
contando de manera descendente,de mayor a menor.
En el siguiente ejemplo, el contenido del bucle se ejecuta 100 veces,desde el 1
hasta el 100. Si el límite inferior del contador coincide con el superior (FOR z" IN
100..100 LOOP),el cuerpodel buclese ejecutaríauna solavez, otorgandoel valor
100 a la variable i.
Ejemplo de FOR. .IN. .LDOP-END LODP
SET SERVERÜUTPUT ON
DECLARE
contador NUMBER(3);
BEGIN
FOR contador IN
1..100 LOÜP
DBMS_OUTPUT.PUT_LINE (El valor del contador es: II contador);
END LODP;
END;
/
Es posible interrumpir la ejecución del bucle y salir de él. Como en el caso delos
bucles simples, pueden usarseen cualquier momento dentro de la programación del
bucle FOR las cláusulas EXI T
y EXI T
WHEN.
Los bucles FOR son ideales para recorrer los registros resultantes de una consulta
(sentencia SELECT),ya seamediante eluso decursores5
o directamente incluyendo
la sentencia en la cláusula IN. Véase los ejemplos.
Ejemplo de FOR. .IN. ¿DOP-END LOÜP con consulta
SET SERVEROUTPUT ON
DECLARE
BEGIN
DBMS_0UTPUT.PUT_LINE
(Los sueldos
ordenados de
menor a
mayor son:
);
FOR i IN
(SELECT sueldo
FROM contratadosmominas
ORDER
BY sueldo) LÜDP
DBMS_0UTPUT.PUT_LINE (i.sue1do);
END
LDÜP;
END;
/
5Un cursor es una estructura de datos concebidapara recorrer el resultado de una consulta
(sentencia SELECT). Mediante el uso de la instrucción FETCH nombre_del_cursorINTO lis-
ta_de_var¿ables, el
registro objeto de la consulta se extrae del cursor y
se introduce dentro de una
variable, listo para ser referenciado.
Bases de Datos
Ejemplo de FDR..IN..LOOP-END LOOP
con cursor
SET SERVEROUTPUT
DN
DECLARE
vSue1do
contratados.nominas.sue1do%TYPE;
CURSOR
curSueldo IS SELECT
sueldo FROM contratados.nominas
ORDER
BY sueldo DESC;
BEGIN
OPEN
curSue1do;
DBMS_OUTPUT.PUT_LINE
(Los diez sueldos más altos (de mayor a menor):);
FOR
i IN 1..10 LOOP
FETCH
curSueldo INTO
vSue1do;
DBMS_OUTPUT.PUT_LINE
(vSue1do);
END LOOP;
CLOSE
cursueldo;
END;
/
Pero, ¿qué pasaría si en el ejemplo del bucle FOR
con cursor no hubiera más de
3 registros en la tabla contratadosnominas? Al intentar imprimir el dato del sueldo
tras hacer el FE TCH
cuando i fuese >=
4, aparecería repetido el valor del último
sueldo recuperado, esto es debido a que, como la tabla no tiene más registros, el
FE TCH
no consigue volver a inicializar la variable vSueldo. Para evitar ese mal
funcionamiento se podría optar por incluir una cláusula EXI T WHEN
que obligara
a abandonar el lazo al llegar al nal del cursor (atributo N OTF
O UND
del cursor).
Ejemplo de FOR..IN..LOOP-END LOOP
con cursor y EXIT WHEN
___________¡
SET SERVEROUTPUT
ON
DECLARE
vSue1do
contratados.nominas.sue1do%TYPE;
CURSOR
cursueldo IS SELECT
sueldo FROM contratados.nominas
ORDER
BY sueldo DESC;
BEGIN
OPEN
cursueldo;
DBMS_OUTPUT.PUT_LINE
(Los diez
sueldos más altos (de mayor a menor):);
FOR i IN 1..10 LOOP
FETCH
cursueldo INTD
vsueldo;
EXIT WHEN
curSue1do%NOTFOUND;
DBMS_OUTPUT.PUT_LINE
(vsueldo);
6.6.
Capítulo 6. Programación de bases dedatos
Gestión de errores
Algo imprescindible en toda programación es la codicación de una sección para
interceptar posibles errores que pudieran ocurrir durante la ejecución del programa
(ya seanerrores conocidos
o desconocidos,
previstos oimprevistos), yen consecuen-
cia, tomar las medidas oportunas o escribir un mensaje apropiado. Para ello se usa
el bloque EX CEPTI ON
con la cláusula WHEN THEN
que sirve para ltrar el tipo
de error deseado.
Algunos de los errores predenidos que pueden interceptarse son:
CASE_NOT.FOUND: ninguno
de las condiciones de la sentencia
WHEN en 1a estructura CASE
se
corresponde conel valor evaluado y
no existe cláusula ELSE.
CURSOR_ALREADY_OPEN:
el cursor que intenta abrirse ya
está abierto.
INVALID_CURSOR: la opera-
ción que está intentando realizar-
se con el cursor no es válida, por
ejemplo, porque quiera cerrarse un
cursor que no se ha abierto previa-
mente.
INVALID_NUMBER o VA-
LUE_ERROR: la conversión de
una cadena a valor numérico no es
posible porque la cadena no repre-
senta un valor numérico válido.
VALUEERROR: error ocurrido
en alguna operación aritmética, de
conversión otruncado, por ejemplo,
cuando se intenta insertar en una
variable un valor de más tamaño.
LOGIN_DENIED: un programa
está intentando acceder a la base
de datos con un usuario o password
incorrectos.
NOT_LOGGED_ON: un progra-
ma está intentando ejecutar algo en
la base de datos sin haber formali-
zado previamente la conexión.
NO_DATA_FOUND: una sen-
tencia SELECT IN T0
no devuelve
ningún registro.
TOO_MANY_ROWS: una sen-
tencia SELECT INTO
devuelve
más de un registro.
TIMEOUT_ON_RESOURCE:
se ha acabado el tiempo que el
SGBD puede esperar por algún re-
curso.
ZERODIVIDE: algún programa
intenta hacer una división de un
número entre cero.
OTHERS: es la opción por defec-
to. Interceptará todos los errores no
tenidos en cuenta en las condicio-
nes WHEN
de la cláusula EXCEP-
TI ON
donde se encuentre.
251
Bases de Datos
Ejemplo de gestión de errores
SET SERVERDUTPUT ON
DECLARE
meslnicio
CHAR(2) :=
6a;
mesFin CHAR(2) := 10;
mesesTranscurridos NUMBER(2);
BEGIN
mesesTranscurridos
:= mesFin
-meslnicio;
EXCEPTIDN
WHEN
INVALID_NUMBER
THEN
DBMS_OUTPUT.PUT_LINE(Error INVALID_NUMBERinterceptado.);
WHEN
VALUE_ERRDR THEN
DBMS_OUTPUT.PUT_LINE(Error VALUE_ERROR
interceptado.);
END;
/
Ejemplo de CASE-WHEN..THEN-END
CASE sin ELSE
y con gestión de errores
SET SERVERÜUTPUT DN
CREATE OR REPLACE PROCEDURE Nota(Calificacion VARCHAR) as
BEGIN
CASE
Calificacion
WHEN
Suspenso THEN
DBMS_0UTPUT.PUT_LINE(Nota >=0 y <5);
WHEN
Suficiente THEN
DBMS_0UTPUT.PUT_LINE(Nota >=5 y <6);
WHEN
Bien THEN
DBMS_ÜUTPUT.PUT_LINE(Nota>=6 y <7);
WHEN
Notab1e THEN
DBMS_ÜUTPUT.PUT_LINE( Nota>=7y <9) ;
WHEN
Sobresa1iente THEN
DBMS_UUTPUT.PUT_LINE(Nota>=9 y <=10);
END
CASE;
EXCEPTION
WHEN
CASE_NÜT_FOUND
THEN
DBMS_0UTPUT.PUT_LINE(Calificación errónea);
Capítulo 6. Programaciónde basesde datos
Ejemplo de gestión de errores extrayendo los códigos de error
SET SERVEROUTPUT UN
DECLARE
sue1doMaximo
NUMBER(4);
--saltará
excepción
sisueldo>9999
codigoError NUMBER;
textoError VARCHAR2(64);
BEGIN
SELECT
MAX(sue1do)
INTO
sue1doMaximo
FROM
contratados.nominas;
DBMS_0UTPUT.PUT_LINE(E1 sueldo más alto es:|Isue1doMaximo);
EXCEPTIDN
WHEN
ÜTHERS
THEN
codigoError := SQLCDDE;
textoError := SUBSTR(SQLERRM, 1, 64);
DBMS_ÜUTPUT.PUT_LINE(E1código del error interceptado es: II
codigoError
II y su texto: II textoError);
La variable sueldoMazrimo
estádenida comoNUMBER(4)
y soloadmitirá valores
entre
-9999 y 9999. Si en la tabla de nóminashay algún empleadoque ganemás de
9999 euros,la sentencia
SELECT Max(sueldo) retornará un valor que no puedeser
almacenadadentro de la variable sueldoMazimogenerándose
así una excepción:
El código del error interceptado es:
-6502 y su texto: ÜRA-O6502:
PL/SQL: error: precision de numero demasiado grande
6.7. Transacciones en scripts
Cuando en los programasademásde consultarlos objetosde la basede datos
también sehacenmodicaciones en los mismos,resulta de vital importancia cono-
cer qué es una transacción.Es la herramienta que tienen las basesde datos para
garantizar la integridad de losdatos.
Tal
y como se introdujo en el capítulo 5, una transacciónes una seriede ins-
truccionesde manipulaciónde datos (DML) queconstituyenuna unidad de trabajo
completa.Si el programafallara en mitad de una transacción,deberíasercapazde
deshacertodoslos cambioshechoshasta esemomentoen la transacciónpara dejar
lastablas de la basede datostal y comoestabanoriginalmente.
Por ejemplo,en cualquieroperaciónde transferenciabancaria,una unidad com-
pleta de trabajo sería sumar el dinero a la cuenta destinoy restarlo de la cuenta
origen.Si despuésde sumar el dinero a la cuenta destino,la transacciónfallara a1
restarlo de la cuenta origen,el programadebería deshacer1asuma del dinero a la
Bases de Datos
cuenta destino, de otro modo. el banco origen perdería el dinero de la transferencia.
Recuerda. A la operación
de deshacer
se laconoce como
hacer ROLLBA
CK,
mientras que la operación de validar el total de la transacción es hacer
COJMMI T.Explícitamente. se pueden escribir esos comandos(ROLLBA CK y
COMMI
T) en el programa para terminar la transacción, no obstante, debe
tenerse en cuenta que existen operaciones que implican un commit implícito.
Tal es el caso de las sentencias de denición de datos (DDL), es decir, si en
medio de una transacción se creara una nueva tabla. implícitamente se estaría
haciendo un commit, con lo que quedarían validadas todos las operaciones
anteriores y se pondría n a la transacción. Otras formas de hacer commit
implícito es ejecutar un simple DISCONNECT para cerrar la conexión del
usuario actual a la base de datos. o ejecutar EXIT o QUIT para salir de la
sesión actual del SQL*Plus: en cambio, si en vez de sa.lir ordenadamente del
SQL*Plus se abortara su sesión, la base de datos haría un rollback implícito.
<> Actividad 5.2: Para comprobar el
commit orollback implícito
en Oracle,
crea
con SQL*Plus una tabla y haz pruebas con ella: insértale un registro, valídalo con
COMMI T, inserta otro y aborta la sesión del SQL*Plus, vuelve a abrir una sesión
de SQL*Plus, comprueba que el número de registros que hay en la tabla. essolo uno.
inserta otro, crea otra tabla (se hará commit implícito de la sesión), aborta la sesión
de SQL*Plus y comprueba que esta vez sí que hay dos registros en la tabla original.
¿Sabías que . . . 7
En muchos SGBD
también es
muy usado
lo quese cono-
ce como TWO_PHASE-COMIIIT. que es una forma de denir transacciones
en dos partes. de modo que una parte pertenecería a una base de datos y otra
a otra. Esto esmuy corriente en sistemasque están distribuidos en varias bases
de datos, por ejemplo. los datos de banca tradicionalmente se han encontrado
almacenados en bases dedatos residentes en máquinas HOST. a las que tiene
que accedersedesde basesde datos localizadas en máquinas UNIX para hacer
determinadas operaciones, las cuales solo podrán quedar validadas si las ope-
raciones hechas en las bases de datos del HOST han tenido éxito, por lo que
la transacción completa está dividida en dos partes, una en HOST y otra en
UNIX, pero solo podrá ser validada si tuvo éxito en ambos entornos.
254
Capitulo 6. Programación de bases dedatos
A continuación se ofrece un ejemplo en el que se actualiza el sueldo a todos
los empleados contratados. La actualización consiste en subirles el IPC, pero solo
deberá validarse en el caso de que todas las actualizaciones hayan tenido éxito.
Ejemplo de subida de sueldo
SET SERVERÜUTPUT ON
DECLARE
ipc
NUMBER(2,1) :=
3.2;
codigoError NUMBER;
textoError VARCHAR2(64);
BEGIN
FOR
i IN(SELECT sueldo,
nif
FROM contratados.nominas) LOOP
UPDATE contratados.nominas SET sueldo =
sueldo + sueldo *ipc /100
WHERE nif =
i.nif;
END LÜOP;
CÜMMIT;
EXCEPTIDN
WHEN ÜTHERS THEN
codigoError :=
SQLCDDE;
textoError := SUBSTR(SQLERRM, 1, 64);
DBMS_0UTPUT.PUT_LINE(E1 código del error interceptado es: II
codigoError II y
su texto: II textoError);
ROLLBACK;
Otro ejemplo servirá para ilustrar el mismo caso anterior de subida de sueldo
masiva, pero en esta ocasión, en vez de validar la transacción solo si todas las
actualizaciones han ido bien, se irá haciendo commit cada mil sueldos modicados,
de modo que se minimice el espacio necesarioen el tablespace de UNDO de la base
de datos.
El consejo del buen administrador. . .
En actualizaciones, inserciones o borrados masivos, hay que tener presente e]
espacio para
deshacer los
cambios de
que sedispone (espacio
del tablespace
de
UNDO).
255
13ases de [Datos
SET
SERVERDUTPUT ON
DECLARE
ipc
contador
codigoError
textoError
contadorErrores
BEGIN
FOR
i IN(SELECT
BEGIN
EXCEPTION
WHEN
DTHERS
1 J
END;
contador
:=
IF contador >=
CDMMIT;
contador
:=
END IF;
END LODP;
-- (que no hayan
Ejemplo de subida de sueldo cada 1000 actualizaciones
FROM contratados.nominas) LDOP
UPDATE contratados.nominas
SET sueldo "
WHERE nif
--Se pone un bloque de excepción aqui para evitar que en caso de error
--en la sentencia de actualización el programa se acabe, de este modo,
--el bucle continuaría actualizando el resto de sueldos
codigoError
textoError
DBMS_DUTPUT.PUT_LINE(Error
en
el
UPDATE:
II codigoError
II
II textoError);
contadorErrores :=
CÜNSTANT NUMBER(2,1) :=
NUMBER(4) := 0;
NUMBER;
VARCHAR2(64);
NUMBER(38)
:=
3.2;
0:
sueldo, nif
sueldo
+ sueldo
* ipc / 100
Capítulo 6. Programación de bases dedatos
6.8. Las secuencias
En Oracle, al contrario que en IIySQL no existe el tipo AUTOJNCREh/IENT.
En su lugar, hay un objeto especial llamado secuencia quesirve para obtener valores
secuenciales autoincrementados.Es másmanual que el campo AUTOJNCREMENT
de MySQL, pero también es muchomás versátil, pudiendo ser utilizado en otros sitios
aparte de la clave primaria de una t.ab1a.
La sintaxis para la creación de estos objetos es:
CREATE SEQUENCE secuencia
INCREMENT BY n
START WITH n
{MAX
VALUE n I NÜMAXVALUE}
{MIN
VALUE N
I NÜMINVALUE}
{CACHE N
I NÜCACHE};
Por ejemplo:
CREATE SEQUENCE NumFactura INCREMENT BY 1 START
WITH 20
NÜMAXVALUE CACHE 40;
Con este comando se obtiene un objeto secuencia llamado N umFactura que comen-
zará en20 y se incrementará de uno en uno sin valor máximo. Además, en la memoria
caché del SGBD se almacenarán los 40 números siguientes por lo que el accesoa la
secuencia serámuy rápido.
Se puedeutilizar este tipo de objetos mediante una SELECT de forma muy sen-
cilla haciendo uso de las funciones CURRVAL (valor actual) y NEXTVAL (valor
siguiente).
-para incrementar la secuencia y devolver el número siguiente
SELECT NumFactura.NEXTVAL from DUAL;
--para devolver el número de factura actual
SELECT NumFactura.CURRVAL from DUAL;
257
Bases de Datos
6.9. Prácticas Resueltas
Práctica 6.1: Bajada desueldo un5 %
Con motivo de una crisis económica se tiene que proceder a bajar el sueldo a todos
los funcionarios un 5%. Implementar un procedimiento en PL-SQL de Oracle que,
basándose en una tabla inventada, simule cómo se haría esa disminución masiva del
sueldo, para ello:
1. Crea el esquema funcionarios al que pertenecerán todos los objetos del pro-
blema, otorgarle permiso de DBA
y abrir una sesión con él.
solución
CREATE USER funcionarios IDENTIFIED BY passfun
DEFAULT TABLESPACE users TEMPORARY TABLESPACE temp;
ALTER USER funcionarios QUÜTA UNLIMITED ON users;
GRANT DBA TU funcionarios;
conn funcionarios/passfun
2. Crea la tabla nominas con un campo llamado sueldo tipo N
UMBER(8,2) y
otro llamado nif tipo VARCHAR2(9).
solución
--La tabla se creará en el tablespace por defecto
CREATE TABLE nominas
(nif VARCHAR2(9) NOT NULL,
sueldo NUMBER(8,2) NOT NULL);
3. Crea una tabla donde seregistren los errores en la actualización del sueldo. La
tabla se llamará erroresBajadaSue1do y tendrá tres campos: nif, codigoError
y tezrtoError.
solución
--La tabla se creará en el tablespace por defecto
CREATE TABLE erroresBajadaSue1do
(nif VARCHAR2(9) NOT NULL,
codigoError NUMBER,
textoError VARCHAR2(64));
4. Crea un paquete que sellame paq_bajada_sueldo
que seráel que contenga todas
las funciones y procedimientos para llevar a cabo el problema. Dene una
258
Capítulo 6. Programación de bases dedatos
constante para el porcentaje de bajada de sueldo. El
paquete deberá tener
además:
a) Un procedimiento paq_bajada_sueldo.
bajmsueldos queabrirá un cursor pa-
ra recorrer todos los sueldos de los funcionarios y proceder a su dismi-
nución. Además, el procedimiento será capaz de ir rellenando la tabla
erroresBajadaSuveldo conlos errores encontrados en la actualización del
sueldo.
b) Una función llamada paq_bajada_sueldo.hubo-erroresjajandmsueldos que
evalúe la tabla de errores y determine si ha habido algún error o no. La
función tendrá como parámetro de salida un booleano que indicará si
hubo algún error o no.
solución
CREATE OR REPLACE PACKAGE paq_bajada_sue1do AS
PRDCEDURE
baja_sue1dos;
FUNCTIÜN
hubo_errores_bajando_sue1dos RETURN BOOLEAN;
--El porcentaje de bajada se define como
--una constante global al paquete
porcentaje CDNSTANT
NUMBER := 5;
END paq_bajada_sue1do;
/
CREATE OR REPLACE PACKAGE BODY paq_bajada_sue1do AS
PROCEDURE baja_sue1dos IS
codigoE NUMBER;
textoE VARCHAR2(64);
BEGIN
FOR i IN (SELECT nif, sueldo
FROM nominas) LOOP
BEGIN
UPDATE
nominas
SET
sueldo
-i.sueldo
-i.sueldo
*porcentaje
/ 100
WHERE
nif =
i.nif;
--Se pone un bloque de excepción aqui para evitar que
--en caso de error en la sentencia de actualización el
--programa se acabe, de este modo, el bucle continuaría
--actualizando el resto de sueldos
EXCEPTION
WHEN
ÜTHERS
THEN
codigoE :=
SQLCODE;
textoE := SUBSTR(SQLERRM, 1, 64);
INSERT INTO
erroresBajadaSue1do (nif, codigoError, textoError)
VALUES (i.nif, codigoE, textoE);
END;
COMMIT;
END
LÜOP;
END
baja_sue1dos;
Bases de Datos
FUNCTION hubo_errores_bajando_sue1dos RETURN BÜOLEAN
IS
res
BDOLEAN := FALSE;
numErrores NUMBER;
BEGIN
SELECT
COUNT(*)
into
numErrores
from
erroresBajadaSue1do;
IF numErrores >
O THEN
res :=
TRUE;
END IF;
RETURN res;
END hubo_errores_bajando_sue1dos;
END paq_bajada_sueldo;
/
5. Escribecómoseinvocaríala operativa completa:borrado del contenidode la
tabla de errores,llamada al procedimientobajmsueldos
y llamada a la función
hubo-erroreabajandmsueldos.
solución
SET SERVERDUTPUT DN
--Se borra el contenido antiguo de la tabla de errores
DELETE FROM erroresBajadaSue1do;
--Se invoca el procedimiento de bajada de sueldos
CALLpaq_bajada_sueldo.baja_sueldos();
--Se comprueba si hubo algún error
BEGIN
IF paq_bajada_sueldo.hubo_errores_bajando_sue1dos
THEN
--Hubo errores. Se presentan por pantalla.
FOR iIN (SELECT *
FROMerroresBajadaSue1do) LOÜP
DBMS_0UTPUT PUT_LINE(Error al actualizar el sueldo del II
funcionario con NIF II i.nif II. Código II i.codigoError
Il
y su texto: II i.textoError);
END LOOP;
END IF;
END;
/
0
Práctica 6.2: Procedimientos
almacenados
en
MySQL Crea
una
tabla innodb en la
BBDD jardineria llamada ActualizacionLímíteCredito con tres
260
Capítulo 6. Programación de bases dedatos
campos: Fecha, CodigoCliente, Incremento. Crea un procedimiento almacenado pa-
ra actualizar los límites de crédito de los clientes en un°7o del total pedido entre
2008 y 2010 registrando el incremento en la tabla creada. Al
terminar, invoca al
procedimiento paraactualizar ellímite de Crédito enun 15
(7o.
solución
CREATE TABLE ActualizacionLimiteCredito(
Fecha DATETIME,
CodigoC1iente INTEGER,
Incremento NUMERIC(15,2)
) engine=innodb;
delimiter //
CREATEPROCEDURE
IncrementaLimCredito (IN
porcentaje INTEGER)
BEGIN
DECLARE
Tota1Pedidos,Credito,Incremento NUMERIC(15,2);
DECLARE
C1iente,Terminado INTEGER DEFAULT
O;
#cursor para recorrer clientes
DECLARE
curclientes CURSOR
FOR
SELECT
Limitecredito,CodigoC1iente FROM
Clientes;
#A1 terminar de recorrerse, se activará la variable terminado
DECLARE CONTINUE HANDLER
FOR SQLSTATE
O2000 SET
Terminado =
1;
#Si ocurre alguna excepción se producirá un rollback
DECLARE EXIT HANDLER
FOR NOT FOUND
rollback;
DECLARE EXIT HANDLER FOR SQLEXCEPTION
rollback;
OPEN
curC1ientes;
START TRANSACTION;
FETCH
curC1ientes INTO
Credito,C1iente; #primer cliente
WHILE
NOT Terminado DO
SELECT
SUM(Cantidad*PrecioUnidad) INTO
Tota1Pedidos #Tota1 de pedidos?
FROM
Deta11ePedidos
NATURAL JOIN
Pedidos WHERE
YEAR(FechaPedido)
BETWEEN
2008 AND 2010 AND Pedidos.CodigoCliente=Cliente;
IF Tota1Pedidos IS NOT NULL THEN
#Si hay pedidos
SET
Incremento=Tota1Pedidos*Porcentaje/100;
UPDATE
Clientes SET LimiteCredito=LimiteCredito+Incremento
WHERE
CodigoC1iente=C1iente;
INSERT INTO
ActualizacionLimiteCredito VALUES(now(),C1iente,Incremento);
END IF;
FETCH
curC1ientes INTO
Credito,C1iente; #siguiente cliente
END WHILE;
COMMIT;
END;
//
delimiter ;
call IncrementaLimCredito(15); #Invocar al procedimiento
261
Bases de Datos
6.10. Prácticas Propuestas
Práctica 6.3: Bajada desueldo v.2.0
Se vaa efectuar una segundaversión del procedimiento de bajada de sueldo. Consiste
en bajar el sueldo a todos los funcionarios, esta vez en base a un determinado
porcentaje en función de su escala salarial. Extrapolar los objetos de la actividad
anterior para contemplar esta nueva situación, para ello:
1. Añade a la tabla funcionaosmominas un campo que represente la escala
salarial. El campo se llamará grupo y
será. de tipo CHAR
2. Crea una función llamada dame_porcentaje_segun_escaladentro del paquete
paq_bajada_sueldo queacepte como parámetro la escala salarial y devuelva
el porcentaje de disminución a aplicar. La equivalencia entre uno y otro se
hará mediante constantes globales al paquete: grupo A-10 7o, grupo B-8 (7o,
grupo C-5%, grupo D-3%.
3. Modica la función baja_sueldos dela práctica anterior para que llame a la
nueva damaporcentajasegun-escala para extraer el porcentaje.
4. Escribe cómo se invocaría la operativa completa: borrado del contenido de la
tabla de errores, llamada al procedimiento baja_sueldos yllamada a la función
hubmerrores-bajandmsueldos.
Práctica 6.4: Bajada desueldo v.3.0
Modica la función damaporcentajejegun_escala para que en vez de extraer la in-
formación a través de constantes, la extraiga de una tabla creada a tal efecto. La
tabla deberá tener dos campos, uno con la escala (A,B. ..) y
otro campo con el
porcentaje a descontar.
Sustituye el último punto de la práctica anterior por un procedimiento que también
esté almacenado en el paquete funcionarios. paq_bajada_sueldo. <>
262
Capítulo 6. Programación de bases
de datos
Práctica Facturación Se
desea codicar
un programa
en PL-SQL
para
poder lanzar el proceso de facturación de la BBDD jardineria. Para ello, se deberán
crear tres tablas con los siguientes comandos DDL:
solución
CREATE TABLE Facturas (
Codigocliente integer,
Baselmponible Numeric(15,2),
IVA Numeric(15,2),
Total Numeric(15,2),
CodigoFactura INTEGER);
CREATE TABLE Comisiones(
CodigoEmp1eado integer,
Comision Numeric(15,2),
CodigoFactura integer);
CREATE TABLE AsientoContab1e(
Codigocliente integer,
DEBE Numeric(15,2),
HABER Numeric(15,2));
A continuación programar, en un paquete llamado Facturación:
1. Una función llamada UltimaFactura que devuelva el último código de factura
generado. Si no hay ningún registro en la tabla Facturas, devolverá un 1.
2. Procedimiento Facturar: Este procedimiento grabará un registro en la tabla
de facturas por cada uno de los pedidos de la BBDD. Al mismo tiempo guar-
dará en la tabla de comisiones una comisión del 5 %
del total del pedido para.
el emplea.doque haya generado la factura.
3. Procedimiento GenerarContabilidad: Este procedimiento guardará en la tabla
AsientoContable un registro por cada grupo de facturas, almacenando en el
campo DEBE la suma de las facturas que han sido generadas.
263
Bases de Datos
6.11.
264
Resumen
Los conceptos clave de este capítulo son los siguientes:
Las aplicaciones de basede datos pueden serde tres tipos distintos: codicada
en el lado del servidor, modelocliente/ servidory modelo en tresniveles.
Las sentencias SQL se pueden ejecutar de forma estática o dinámica. Una
sentencia estática debe precompilarse, vincularse y compilarse antes de ser
ejecutada en la aplicación. Una sentencia dinámica. es creada en el momento
de la ejecución.
El lenguaje PL/SQL fue desarrollado por Oracle para añadir más potencia
de ejecución a las sentencias SQL, con él es posible denir variables, crear
estructuras de control de ujo y toma de decisiones.. .
Las partesde un programa PL/SQL sonel bloqueDECLARE, el bloque BE-
GIN..END y el subbloque EX CEPTION.
Los distintos programas quepueden crearse
con el uso dellenguajePL
/ SQL
son: procedimientos, funciones, bloques anónimos y triggers.
Los procedimientos y funciones pueden estarcontenidos dentro de otros objetos
más grandes llamados paquetes, los cuales están compuestos por la cabecera y
el cuerpo.
SQL*Plus es la herramienta que proporciona Oracle para conectarse a la base
de datos por línea de comandos y ejecutar todo tipo de comandos de base de
datos, incluidos programas PL /SQL.
En PL/SQL hay datos de tipo carácter, numérico,fecha, booleanos,
y datos
grandes entre otros. Además existen muchas funciones para gestionarlos, aun-
que aquí solo se ha tratado la S
UBS TR. Existen también, operadores para
hacer operaciones aritméticas, comparaciones y concatenaciones.
Las estructuras de control sirven para controlar el ujo del programa, la toma
de decisionesy programar las accionesen consecuencia.Aquí se han estudiado
el IF, CASE, LOOP,
WHILE y FOR. Los tres últimos son bucles, y son muy
útiles para recorrer cursores.
El control de excepciones es un bloque opcional dentro de la programación
pero muy recomendable. Sirve para interceptar los errores de ejecución del
programa y tomar las medidas oportunas en consecuencia, de otro modo el
programa terminaría abrupta y descontroladamente.
6.12.
Capítulo 6. Programación de bases dedatos
Test de repaso
1. ¿Qué tipo de variable tendría que de-
nirse para albergar el dato 3.2?
a) CHAR(3)
b) NU1IBER(2,1)
c) NUMBERU(3)
d) a) y b)
2. ¿Qué es el ROWID?
a) Es una la especial de la tabla
b) Es una funciónideal paragenerar las au-
tomáticamente
c) Es una columna interna que almacena la
dirección física de cada la
d) Es un tipo de excepciónmuy utilizada
3. ¿Cómo se dene una constante?
a) nombre_de_]a_constante CONSTANT ti-
po_de_dato := valor;
b) nombre-de.la-constante tipo_de_dato :=
valor CONSTANT
c) CONSTANT nombre_de_la_const.ante ti-
po_de_dato := valor:
d) nombre_de_1a_constante
CONSTANT ti-
po_de_dato := valor
4. La expresión 5 =
5 es:
a) FALSE
b) TRUE
5. El extracto de denición
dame_sueldo() RETURN
NUMBER(6)
IS
corresponde a
a) Un procedimiento
b) Una función
C) Un disparador
)
d Un paquete
6. Si la variable suspenso es TR UE,
qué valor tendrá la expresión NOT sus-
penso
a) NULL
b) FALSE
c) TRUE
7. Si la variable gallo es Wikir-ikí,
qué valor resultará de la función
REPLACE(gallo, i, o):
a) o
b) oooooooo
c) kokoroko
)
d kokorokí
8. ¿Qué función se usa para escribir
mensajes por pantalla en los programas
PL/SQL?
a) PUT_LINE
b) DBMS_OUTPUT.PUTLINE
c) DB1ISOUTPUT.PUT_LINE
d) PUTLINE
9. ¿Qué variable de entorno del
SQL*Plus hay que activar para que la
función de la pregunta 8 escriba por la
salida estándard?
a) La función escribe siempre
b) SEVER_OUTPUT
c) SERVEROUTPUT
a&#39;s&#39;esp&#39;¿&#39;q&#39;9q&#39;9qr&#39;e&#39;sn&#39
265
Bases de Datos
.Explica qué es la
¿Qué esuna transacción?
¿En qué consiste la validación
transaccional implícita?
¿Para quése usael atributo %TYPE?
¿y %ROWTYPE?
Pon ejemplos con todos los opera-
dores de comparación.
Ventajas del uso del R0 WID.
¿Dónde se puede usar la cláusula
EX] T WHEN?
¿Para qué sirve la tabla de sistema
¿Cuál es el signo comodín en las
comparaciones entre datos de tipo
cadena?, ¿cómose usa?
¿Qué hace la instrucción FETCH
en el contexto de los cursores?
El atributo NOTFOUND, ¿de
dónde es, para qué es y cómo se
conversión
implícita de tipos de datos.
¿Qué signica que en una base de
datos todos los objetos tienen que
estar identicados unívocamente?
Expon las diferencias entre proce-
dimientos y funciones.
6.13. Comprueba tu aprendizaje
1. Dene qué es un cursor, para 15.
qué sirve y distintas formas de re-
correrlo. 16&#39;
2. Dene los distintos bloques de que
se compone
un programa
PL
/SQL. 17&#39;
3. ¿Para
qué se
usan los
paquetes? 18
4. Dene qué esun disparador y los ti-
pos distintos que hay. Pon un ejem-
plo. 19&#39;
5. Enuncia las diferencias entre el 20&#39;
SQL dinámico y el estático.
6. ¿Qué
son los
datos tipo
LOB? ¿Pa-21&#39;
ra qué
sirven? D UAL?
7. Enumera
los tiposde datos
tipo 22&#39;
carácter.
8. Enumera los tipos y subtipos de da-
tos tipo
numérico. 23&#39;
9. Enumera los tipos de datos tipo fe-
Cha_ 24.
10. Ventajas del CASE
frente al usa?
IF..ELSIF y
al revés. 2_
o
11. Ventajas del LOOP frente al WHI-
LE y
al revés.
26.
12. ¿Qué error intercepta el evento
NO_DATA_FOUND?
13. ¿Cuándo se producirá un 27.
T00_MANY_RO WS?
14. Explica cómo se usan las funcio- 28.
266
nes especiales SQLCODE y SQ-
LERRM.
Explica los distintos tipos de apli-
caciones debase de datos que exis-
ten.
CAPÍTULO 7
BBDD distribuidas
Contenidos Qbjet ¡VOS
É BBDD Y
SGBD distribuidos "S? Reconocer la
utilidad de las ba-
g Colnponentes
de una
BBDD ses de datos
distribuidas
distribuida Conocer cómo realizar consul-
,. ., tas
Tecnicas de fragmentacion
W
Conocer el funcionamiento de
Consultas distribuidas las transacciones
distribuidas
Transacciones distribuidas . . . . , .
Describir las distintas politicas
bre bases de datos distribuidas C101-
En este capítulo se explican las peculiaridades de las consultas en bases de
datos distribuidas, se realizan operaciones básicaspara que e] alumno aprecie
Ia complejidad de este tipo de sistemas y
a1 mismo tiempo su sencilla implan-
tación, gracias a las propias herramientas proporcionadas por 10s SGBD.
267
Bases de Datos
7.1. BBDD y SGBD distribuidos
Cuando una base de datos está controlada por más de un servidor se dice que
está distribuida. Estos servidores están interconectados mediante una red de te-
lecomunicaciones y los SGBD proporcionan mecanismos para poder consultar la
información independientemente del servidor y la ubicación de los datos. Así por
ejemplo, una consulta con una join entre la tabla de pedidos y la de clientes puede
estar accediendo a dos servidores con dos instancias de bases de datos distintas.
Incluso, si las tablas están particionadas es posible que la misma consulta esté acce-
diendo a más de dos servidores. Esto proporciona una especie de balanceo de carga
para que la información pueda ser accedida lo más rápidamente posible. De esta
manera se consiguen los siguientes benecios:
1. Más rapidez en el acceso a los datos y capacidad de almacenamiento. Al au-
mentar el número de ordenadores donde se depositan los datos, aumenta la
capacidad de computación, y por tanto, la capacidad de búsqueda de la infor-
mación.
2. Acceso más exible. El número de usuarios conectados quepuede mantener el
sistema se incrementa al haber más capacidad de cómputo y,
gracias a la red
de la BBDD distribuida, los usuarios pueden acceder desde más ubicaciones.
3. Escalabilidad. Distribuyendo una base de datos en distintas ubicaciones se
permite incrementar de forma muy sencilla los recursosen cualquier momento
para acomodar el sistema a las demandas de los usuarios y
las aplicaciones.
4. Fiabilidad y cierta capacidad de tolerancia a fallos. Realizando una buena
política de fragmentación de la base de datos es posible conseguir que aunque
algún nodo de la base de datos distribuida sufra algún percance, el resto del
sistema siga funcionando con normalidad.
Por otro lado, no todo son benecios, no hay que perder de vista que estos sis-
temas son muy costosos de implementar no solo por la duplicidad de recursos en
términos de red y servidores, también por la dicultad de la administración de los
datos ubicados en distintas localizaciones y porque se introduce un elemento caótico
como la dependencia delas redesde comunicacionespara el correcto funcionamiento
del intercambio de los datos. Ademas, la atomicidad de las operaciones esmás com-
plicada de conseguir por lo que la gestión transaccional tiene dicultades añadidas
como se comentará en la sección 7.3.2.
7.1.1. Componentes de una BBDD distribuida
Para poder crear una base de datos distribuida hay que tener los siguientes
componentes.
268
Capítulo 7. BBDD distribuidas
1. Sistemas gestores con capacidades distribuidas o un SGBD distribuido en
sí mismo.
2. Un conjunto de bases dedatos locales a cada uno de los servidores que alber-
garán la BBDD.
3. Una red de comunicaciones, generalmentebasada enel protocolo TCP-IP para
poder aprovechar las infraestructuras existentes.
4. Enlaces entre las BBDD locales. Los SGBD deben ser capaces de establecer
enlaces entre las diversas bases dedatos locales, de tal manera que cualquier
consulta pueda ser redirigida al servidor donde está la BBDD local.
5. Un diccionario de datos global que indique en qué ubicación está cada uno de
los datos que componen la BBDD distribuida.
BASE DE DATOS DISTRIBUIDA
BBDD Ventas A BBDD Marketing B
Red de Comunicaciones 1_
select sun (Total)
from Pedidoseventas:
insert into Balances values. ..
update Pronocionrï-llarketinq
..
Cosmic:
Enlace A-C Nace B-C
BBDD Contabilidad C
Figura 7.1: Componentes de una base de datos distribuida.
Dependiendo del tipo de componentes elegidos en la formación de una base de
datos distribuida se pueden tener:
1. BBDD distribuidas homogéneas: En estas el SGBD utilizado es el mismo para
todas las BBDD locales. Generalmente, el SGBD proporciona. la tecnología
para el enlace de las distintas BBDD locales.
2. BBDD distribuidas heterogéneas: Las bases de datos están distribuidas inde-
pendientemente del SGBD utilizado como local. En este caso, las aplicaciones
269
Bases de Datos
que consultan la base de datos distribuida juegan un papel fundamental como
media.dor.
7.2. Técnicas de fragmentación
El contenido de una tabla puede separarse envarios fragmentos que contendrán
suciente información como para poder reconstruir la tabla original en caso de que
sea necesario.Cada fragmento se encontrará en un nodo diferente, pero esta distri-
bución a través de distintos nodos no duplica los registros, solo existirá una copia
de cada elemento, por lo que, al no haber replicación. disminuye el coste de alma-
cenamiento en detrimento de la disponibilidad y abilidad de los datos en caso de
caída de algún nodo.
La fragmentación puede ser horizontal o vertical y se puede aplicar sucesiva y
alternativamente sobre la misma tabla:
Horizontal: los fragmentos son subconjuntos de una tabla y se denen a través
de una operación de selección. La tabla original se reconstruye en base a una
operación de unión de los fragmentos componentes.
Vertical: los fragmentos son subconjuntos de los atributos con susvalores. Para po-
der recomponer la tabla original, cada fragmento debe incluir la clave primaria
de la tabla.
Mixta: se mezclan las dos técnicas anteriores.
Para que una fragmentación sea correcta, esta debe cumplir con las siguientes
reglas:
IDebe ser completa, es decir, cada elemento de la tabla debe estar en algún
fragmento.
n Debe ser reconstruible, lo cual implica que debe serposible conseguir una tabla
completa a partir de la combinación de todos los fragmentos.
ILos fragmentos deben ser disjuntos, esto signica que si la fragmentación es
horizontal, un elemento que esté en un fragmento concreto no puede estar en
ningún otro fragmento más que en aquél. En el casode fragmentación vertical,
puesto que es necesarioque serepitan las claves primarias, esta condición solo
se tiene que cumplir para el conjunto de atributos que no son clave primaria.
270
Capítulo 7. BBDD
distribuidas
7.3. Consultas distribuidas
Algunos SGBD manejan el concepto de sistemas de bases dedatos distribuidas
de forma que cualquier aplicación que haga consultas al gestor pueda acceder a su
base de datos de forma local y además, acceder a datos de bases dedatos remotas.
Oracle basa su concepto de basesde datos distribuidas en un objeto llamado DA-
TABASE LINK (Enlace abase de
datos). LosDATABASE LINKs son unaconexión
unidireccional entre una basede datos (cliente) y otra (servidor). Oracle puedesopor-
tar bases de datos homogéneas yheterogéneas. Parasoportar sistemas heterogéneos
es necesario que Oracle pueda acceder a los datos como si estuviese accediendo a
otra base de datos Oracle, por lo que cuenta con agentes llamados Transparent Ga-
teways (Pasarelas transparentes). Estos agentes son interfaces que proveen todo lo
necesario para poder recuperar, insertar, actualizar o borrar información de forma
transparente para las aplicaciones que se ejecutan desde Oracle.
7.3.1. DB Links
Un database link es una conexión entre bases de datos. Es unidireccional por
lo que se crea desde una base de datos que quiere referenciar a otra. Para que un
usuario pueda crear estos DB Links son necesarioslos siguientes privilegios:
n CREATE DATABASE LINK (En local).
u
CREATE PUBLIC DATABASE LINK (En local).
ICREATE SESSION (En remoto).
Es posibleconsultar los DB Links en lasvistas USER_DB_LIN KS, ALL_DB-LINKS
y DBA_DB_LINKS dependiendo del usuario con el que se estéconectado al SGBD.
Existen también los enlaces compartidos o SHARED DB LINKS. La diferencia
es quemúltiples procesos clientes pueden usar el enlace compartido simultáneamen-
te. Para crear un DB link es necesario que exista la conexión entre las bases de
datos a través de Oracle Net Services, por lo que se debe crear una entrada en el
tnsnames.ora de la base de datos a la que se quiere referenciar. Dentro de la de-
nición se puede elegir si la conexión es dedicada o compartida, y no es lo mismo
denir que la conexión que va a usar el DB link sea compartida a crear un DB
link compartido. A continuación, se muestra un ejemplo de creación de un DB link
para conectar una BBDD en versión 10gR2 con una BBDD 11gR2. La entrada en
el chero tnsnames.ora es:
271
Bases de Datos
t11r2_u =
(DESCRIPTION=
(ADDRESS=
(pnorocor = TCP)(HOST =
192.168.1.129)(PORT =
1521))
(CDNNECT_DATA
=
(SERVER=
DEDICATED)
(SID =
t11r2)
)
)
t11r2_u en este caso, es el nombre de la entrada para la conexión remota al
servidor con dirección IP 192.168.1129.
Una vez agregada la entrada al chero se puede utilizar la herramienta tnsping
para comprobar que hay conectividad:
C:Documents and Settingsusuario>tnsping t11r2_u
TNS Ping Utility for 32-bit Windows: Version 10.2.0.4.0 -Production on 05-MAY-2011 23:23:47
Copyright (c) 1997, 2007, Oracle. A11 rights reserved.
Archivos de parámetros utilizados:
C:orac1eproduct10.2.0db_1networkadminsq1net.ora
Adaptador TNSNAMBS utilizado para resolver el alias
Attempting to contact (DESCRIPTIDN = (ADDRESS =
(PROTOCOL = TCP)(HOST =
192.168.1.129)
(PORT =
1521)) (CONNECT_DATA
=
(SERVER =
DEDICATED) (SID = t11r2)))
Realizado correctamente (40 mseg)
Una vez creada la entrada del chero tnsnames y
probada, se pueden crear DB
links públicos o privados, y es posible, además, usar un usuario especíco para la
conexión en la base de datos a referenciar. Para crear un DB Link desde el usuario
local al usuario remoto, se ejecutaría el siguiente comando:
SQL> CREATEDATABASE LINKtj_11r2
2 CONNECT TD usuario IDENTIFIED BY password
3
USING t11r2_u;
Enlace con la base de datos creado.
Al ejecutar el comando anterior, se crea un objeto llamado tj_11r2 que usará la
entrada tnsnames t11r2_u para conectarse ala BBDD remota. Después, para probar
la conexión, se utiliza el nombre del enlace (tj_11r2) para ejecutar una consulta:
272
Capítulo 7. BBDD distribuidas
SQL> select *from dua1@tj_11r2;
También se pueden crear DB Links públicos que pueden serusados por cualquier
usuario, y además, seanusados por usuarios que también existan en la BBDD que
se referencia:
SQL> CREATEPUBLIC DATABASELINK tj_11r2 2
USING t11r2_u;
Enlace con la base de datos creado.
7.3.2. Ejecución de consultas distribuidas
Las consultas distribuidas son consultas que recuperan información de 2 o más
nodos en un entorno de bases de datos distribuido. No es lo mismo que hablar de
consultas remotas, las consultas remotas son consultas que se realizan a. unao más
tablas de una base de datos remota. Es importante diferenciar entre estos dos tipos
de consultas las distribuidas y remotas porque internamente son diferentes.
Un ejemplo de una consulta remota es el siguiente:
SQL> select count(8)
2 from pacientes0t11r2;
T11R2 es un DB LINK público creado a una BBDD 11gR2 en Linux, y la base
de datos cliente está en 10gR2 en Windows. La ejecución de la consulta anterior
prueba que existen conexión entre versiones diferentes. Esto se logra a través de
Oracle Net Services.
En una consulta distribuida puede darse el caso de que existan relaciones frag-
mentadas. Esto se ilustra en el ejemplo siguiente:
273
Bases de Datos
Primero se muestra la tabla PACIENTES, fragmentada en dos basesde datos en
distintos servidores y con la siguiente descripción:
SQL> desc pacientes
NOT NULL
NUMBER
VARCHAR2(100)
HABITACION
SQL) desc pacientes@t11r2
NOTNULL
NUMBER
VARCHAR2(100)
FECHA_ENTRADA DATE
Ahora, se consulta un paciente con ID 1, su habitación y fecha de ingreso:
SQL> select 1.id, 1.habitacion, r.fecha_entrada
2 from pacientes 1,
pacientesOt11r2 r
where 1.id=r.id
and 1.id=1
ID HABITACION FECHA_EN
10 26/04/11
Esta consulta extrae información de dos bases de datos ubicadas en servidores dis-
tintos, por tanto, es distribuida. Además, desde la base de datos servidor se puede
ver lo siguiente en la vista VSSESSION:
SQL> select sid, seria1#, username, program, event, machine ,server
2 from vSsession
3 where username=TJ;
SID SERIAL# USERNAME PROGRAM MACHINE
0RACLE.EXE SQL*Net message from client VILLEGUILLO DEDICATED
Esto demuestra que cada vez que se realice una consulta a una base de datos
remota, se abre una sesión conserver processdedicado si se dene en el tnsnamesora
que seadedicada. Dejar las conexionesabiertas puede llegar a ser un problema: si se
Va acrear un proceso que lanza cientos de consultas y
que va a muchos nodos en un
274
Capítulo 7. BBDD distribuidas
entorno de bases dedatos distribuido, y que además este proceso lo van a ejecutar
muchas sesiones,en diferentes nodos, es seguro que se generará una explosión de
conexiones abiertas, incrementando de forma radical el consumo de recursos.
Para evitar esta explosión de conexiones abiertas, se puede ejecutar el cierre de
los DB Links ejecutando:
SQL> alter session close database link t11r2;
Sesión modificada.
--Esto cierra la sesión en la base de datos servidor:
SQL) select sid, seria1#, username, program, event, machine, server
2 from vSsession
3* where username=TJ
no rows selected
7.4. Transacciones distribuidas
Una transacción distribuida es una transacción que contiene una o más sentencia
y que se realiza en 2 o más nodos dentro de un entorno de base dedatos distribuido.
También existen las transacciones remotas, y al igual que las consultas remotas,
son transacciones con una o más sentencias que se realizan en una base de datos
remota.
Los elementos que pueden intervenir a tener en cuenta en una transación distri-
buida se pueden ver en la siguiente gura:
oo:-ina-or o-a
COHHIT point sic:
Coordinador Local BD Cliente
.i
R
r
BD Servidor 1 no Servidor 2 BD
Servidor n

Figura 7.2: Transacción distribuida.
En esta gura se observan los siguientes elementos:
BD Cliente Es un nodo que actúa como cliente donde se referencia la transacción
distribuida. Esta BD tiene los DB links que conectan con el resto.
275
Bases de Datos
BD Servidor Son las bases de datos que contienen información que va a ser mo-
dicada por la transacción distribuida.
Coordinador Local Es un nodo que debe referenciar datos sobre otros nodos para
completar su parte de la transacción distribuida.
Coordinador Global El nodo donde se origina la transacción distribuida.
Commit Point Site Es el nodo que inicia las operaciones de COMMIT o ROLL-
BACK con las instrucciones dadas por el coordinador global. Este punto se
dene con el parámetro COMMITPOINTSTRENGTH, en un entorno ho-
mogéneo todas las BBDD tienen un parámetro como este. La base de datos
con el valor mayor en este parámetro se convierte en COMMIT POINT SITE.
7.4.1. TWO-PHASE COMMIT
Un SGBD debe garantizar la atomicidad en la información de sus basesde datos
y en los entornos con basesde datos distribuidas también. Para que esto seproduzca,
se usael mecanismo de TWO-PHASE COMMIT o proceso deCOIÑIMIT en entornos
distribuidos. Su ejecución es un poco más complicada. Se divide en 3 partes:
Fase de preparación Es la primera fase y consiste en que el coordinador global
informa a todos los nodos que van que se va a realizar CORIMIT o ROLL-
BACK. Esto se traduce en que cada nodo se prepara para una finalización de
la transacción distribuida. Para. ello realiza 2 tareas:
1. Almacena la información de Redologs.
2. Genera un bloqueo distribuido sobre la tabla para prevenir lecturas.
Cuando se realizan estas 2 operaciones el nodo dice que está comprometido
para la nalización de la transacción distribuida.
Fase de commit Después de que todos los nodos se comprometen a realizar la
transacción, se realizan los siguientes pasos:
1. El coordinador global avisa al COMMIT POINT SITE de que se va a
realizar el COMMIT.
2. El COMMIT POINT SITE realiza el COMMIT.
3. El COMMIT POINT SITE indica al coordinador global que hizo el COM-
MIT.
4. Los coordinadores globales y
locales envían mensajes a todos los nodos
para hacer COMMIT de la transacción.
276
Capítulo 7. BBDD distribuidas
5. Cada nodo realiza su parte local del COMMIT de la transacción distri-
buida y quitan el bloqueo distribuido generado.
6. Todos los nodos notican a al coordinador global que han realizado el
COMMIT.
Fase de olvido Cuando todos notican al COMMIT POINT SITE que se ha rea-
lizado el COMMIT, se realizan las siguientes tareas:
1. El COMMIT POINT SITE borra la información acerca del estado de la
transacción distribuida.
2. El COMMIT POINT SITE informa al coordinador global que ha borrado
ese estado.
3. El coordinador global borra la información de la transacción distribuida.
7.4.2. Ejemplo de transacción distribuida
Con la tabla pacientes ubicada de forma fragmentada en dos bases dedatos, se
realizan las siguientes operaciones:
select *
from pacientes;
ID NOMBRE HABITACION
1
Pacientel
select *
from pacientes@t11r2
ID NOMBRE
1 Pacientel 26/O4/11
update pacientes
set nombre=P1
where id=1;
1
fila actualizada.
SQL> update pacientes@t11r2
2 set nombre=P1
3* where id=1
1 fila actualizada.
SQL> update pacientes
2 set habitacion=10
3 where id=2;
1
fila actualizada.
277
Bases
de Datos
Antes de realizar commit, se puedeobservar qué está sucediendo,las transaccio-
nes creadasy los bloqueos generadosen la BD servidor que en este casoes t11r2:
SQL> select saddr, sid, serial#, username, program, machine
2 from vssession
3
where username =TJ;
SADDR SID SERIAL# USERNAME PROGRAM
37EFD738 28 sqlplusccaar (TNS V1-V3) caar
STEFACCC 29
0RACLE.EXE VILLEGUILLO
SQL> select SES_ADDR,START_TIME,STATUS,XID
2
from vstransaction;
SES_ADDR START_TIME
37EFACCC 05/O6/11 16:03:43 ACTIVE 0600000062010000
SQL> select 1
2 from vslock
3
vhere sid=29;
ADDR KADDR
LMDDE REQUEST CTIME BLOCK
37ACA524 37ACA55O 29 AE
00579434 00579464
29 TM 13704
36908094
369C8OD4 29 TX 393216
Se observa que la transacción existe, que la transacción es generada por la se-
sión de la conexión de la BD cliente y que tiene un bloqueo exclusivo sobre la
(LMODE=3 rowX) sobre latabla PACIENTES:
SQL> select object_id
2 from dba_objects
3 where object_name=PACIENTES;
DBJECT_ID
A continuación, también se muestran sesiones, transacciones y bloqueos en la
BD Cliente:
SQL> select saddr, sid, seria1#, username, program
2 from vssession
3* where username=TJ
278
Capítulo 7. BBDD distribuidas
SADDR
SID SERIAL# USERNAME PROGRAM
30F42BFC 1773 TJ sq1p1us.exe
SQL> select SES,ADDR,START_TIME,STATUS,XID
2* from vstransaction
SES_ADDR START_TIME
30F42BFC 05/06/11 16:02:46
ACTIVE 08002EO0F818000O
SQL> select t
2 from vslock
3 where sid=146;
ADDR KADDR LMODE REQUEST CTIME
2F5C67E4 2F5C67FC 146 TM 45926
2F616204 2F616228 146 TX 524334 6392
También se puede observar la información de los DB links abiertos en la sesión
con la vista VSDBLINK. Esta consulta se ejecuta en la propia sesión que tiene la
transacción:
SQL> desc vsdblink
DB_LINK vmcmazuzs)
OHNERJD NUMBER
LOGGED_0N VARCHAR2(3)
HETEROGENEOUS VARCHAR2 (3)
PROTÜCDL VARCHAR2(6)
opmLcunsons NUMBER
IN_TR.ANSACTION vacunas)
UPDATE_SENT VARCHAR2(3)
COMHIT_POINT_STRENGTH NUHBER
SQL> select #
2 from vsdblink;
DB_LINK OWNER_ID LOG HETPRDTOC ÜPEN_CURSORS
IN_ UPD CÜMIT_POINT_STRENGTH
38 YES N0
UNKN
Una vez realizado el COMMIT, desaparecen las transacciones y los bloqueos. Y
la vista de estado de DB links abiertos en la sesión muestra:
SQL) select t
2 from vSdb1ink;
DB_LINK 0HNER_ID LOG HETPROTOC 0PEN_CURSORS
IN_ UPD COMMIT_POINT_STRENGTH
38 YES ND UNKN
279
Bases
de Datos
Cuando una transacción falla en alguno de los puntos la transacción se convierte
en transacción dudosa. Puede pasar cuando algún nodo se cae, la conexión de red
en la comunicación de algún nodo falla o cualquier error de software no controlado.
El proceso RECO es el encargado de resolver las transacciones dudosas automáti-
camente y hasta que REC O no pueda resolver la transacción dudosa, el dato queda
bloqueado para lectura o escritura.
7.5. Optimización de consultas sobre bases de da-
tos distribuidas
Cuando serealiza una consulta distribuida, hay que tener en cuenta los siguientes
parámetros:
OPEN_LINKS Congura la cantidad de máxima de conexiones abiertas concu-
rrentemente para bases dedatos remotas por cada sesión.
COMMIT_POINT_STRENGTH Especica el valor de commit point site en
una transacción. El nodo con el valor n1ás alto se transforma en el commit
point site.
Lo primero a tener en cuenta de optimización de consultas distribuidas son las
estadísticas, tanto de las estadísticas de sistemas, como las de todos los segmen-
tos que puedan intervenir en la consulta. Se ha de recordar que es transmisión de
información por red, por lo que es importante que se la mínima cantidad.
Para optimizar consultas distribuidas en Oracle se suelen utilizar dos técnicas.
Usar consultas derivadas para disminuir la cantidad de información que se quie-
re recuperar a través de la red y la utilización de los hints N
QMERGE y
DRI-
VINGLSI TE.
7.5.1. Optimización mediante consultas derivadas
Las consultas derivadas o IN
LINE VIE WS
se convierten en una estructura en
memoria. Utilizando estas construcciones, se puede disminuir la cantidad de infor-
mación que se desearecuperar. Por ejemplo, la consulta:
select l.id, l.habitacion, r.fecha_entrada
from pacientes 1,
pacientes@t11r2 r
where 1.id=r.id
and 1.id=1
280
Capítulo 7. BBDD
distribuidas
se puede optimizar utilizando una tabla derivada de la siguiente manera:
select 1.id, l.habitacion, r.fecha_entrada
from pacientes 1,
(select id, fecha_entreda
from pacientes@t11r2
where id=1) r
where 1.id=r.id
and 1.id=1
De esta manera, serecupera tan solo la información concerniente a un único paciente
(el paciente con id=1), en lugar de todos los pacientes de la base de datos remota.
7.5.2. Optimización mediante hints
En entornos distribuidos es más común que el optimizador pueda no ser del todo
bueno con los planes de ejecución, así que el uso de Hints (y su constante control)
puede ser útil en mucho casos.
Con los Hints se pueden controlar cómo realizar una consulta. Por ejemplo,
NO_MERGE evita los posibles no usosde consultas derivadas porque el optimizador
puede determinar cambiar una tabla derivada por una join.
Con DRIVINGSITE se dene en qué nodo se va a desarrollar la consulta, de tal
manera que la BD donde se mezcle la información sea la que va a recibir menor
cantidad de información a través de la red. Ejemplos de los cambios que producen
estos Hints:
Ejecución sin hint:
SQL> select 1.id, 1.habitacion, r.fecha_entrada
2 from pacientes 1,
3
(select id, fecha_entrada from pacientes@t11r2 where id=1) r
4
where l.id=r.id and l.id=1
ID
HABITACION FECHA_EN
10 26/04/11
281
Bases de Datos
Ejecucióncon el
hint NOJIERGE:
SQL> select /*+ N0_MERGE(r) */ l.id, l.habitacion, r.fecha_entrada
2 from pacientes 1, pacientes@t11r2 r
3 where 1.id=r.id and 1.id=1;
ID HABITACION FECHA_EN
10 26/04/11
Ejecuciónconel hint DRIVINCLSITE:
SQL> select /*+ DRIVING_SITB(r) */
2 1.id, 1.habitacion, r.fecha_entrada
3 from pacientes 1, pacientes@t11r2
r
where 1.id=r.id and 1.id=1;
ID HABITACION FECHA_EN
10 26/O4/11
282
Capítulo 7. BBDD distribuidas
7.6. Prácticas Resueltas
Práctica 7.1: Configuración deBBDD distribuidas
Prepara dos máquinas virtuales con Oracle y congúralas dando a una má.quina la
dirección 192.168.1.101 y a la otra la dirección 192.168.1.102. A continuación:
1. Edita el chero tnsnamesora que está ubicado en el directorio SORACLE_
HOME/network/ admin de ambas máquinas para agregar dos entradas que per-
mitan enlazar las dos instancias.
Editar el chero tnsnames en cada una de las máquinas introduciendo el siguiente código:
JARDIN=
(DESCRIPTIDN
(ADDRESS
-(PROTOCOL
= TCP)(HOST
=
192.168.1.101)(PDRT
(CÜNNECT_DATA
=
(SERVER =
DEDICATED)
(SERVICE_NAME
=
jardin)
)
)
JARDIN2 =
(nsscnrprron =
(ADDRESS=
(PRDTOCOL =
TCP)(HOST =
192.168.1.102)(PDRT
(CONNECT_DATA
=
(SERVER =
DEDICATED)
(SERVICE_NAME
=
jardin)
)
)
2. Comprueba que haya conectividad tns entre las dos instancias.
En la máquina 192.168.] .101 y
con el usuario oracle, introducir el comando:
tnsping jardin2
y
en la máquina 192.168.]
.102 introducir el comando:
tnsping jardin
3. Crea enlaces entre cada máquina. necesarios parapoder hacer consultas desde
una máquina a la otra con el esquemajardineria. Desde la máquina 192. 168.1.101
a la 102 el enlace se llamará contabilidad, mientras que de la 102 a la 101 se
llamará facturacion.
Primero hay que dar al usuario jardineria permisos de CREATE LINK
en cada una de las máquinas:
sqlplus / as sysdba
Después, ejecutamos el comando SQL:
grant create database link to jardineria;
Finalmente, podemos ejecutar los comandos de creación de los enlaces. Desde la máquina 1921631.101:
283
Bases de Da tos
CREATE DATABASE
LINK contabilidad
CONNECT T0jardineria IDENTIFIED BY jardineria
USING jardin2;
Y
en la máquina 192.J68.1.102:
CREATE DATABASE
LINK facturacion
CONNECT T0jardineria IDENTIFIED BY jardineria
USING
jardin;
}
Práctica 7.2: Trabajando conBBDD distribuidas
Realiza los siguientes ejercicios para aprender cómo trabajar con DB Links:
1. Edita la tabla. empleados en la. máquina 192.168.1101 para añadir un campo
que indique qué porcentaje de comisión se lleva cada empleado de los pedidos
que gestiona y pon a todos los empleados un 5 C78 de
comisión.
Desde la máquina 1921631.101, ejecutar:
alter table empleados addPorcentajeComision number(5,2);
update empleados set PorcentajeComision. =
5;
2. Crea una tabla llamada Comisiones en la máquina 192.168.1102 con los cam-
pos CodigoEmpleado, CodigoPedido, TotalPedido y
Comision.
No es posible ejecutar comandos DDL a. través de DB Links, por tanto, desde la máquina 1921681.102,
ejecutamos el siguiente comando DDL:
create table Comisiones(
CodigoEmp1eado integer,
CodigoPedido integer,
TotalPedido number(15,2),
Comision number(7,2)
);
284
Capítulo 7. BBDD distribuidas
3. Rellena la tabla de comisiones con los datos de los pedidos mediante una
consulta distribuida a 1atabla de pedidos en la máquina 192.168.1.101.
Hay que ejecutar la siguiente sentencia de tipo insert-select:
INSERT into comisionesccontabilidad
SELECT CodigoEmp1eado, CodigoPedido, Tota1Pedido,
Tota1PedidotPorcentajeComision/100
FROM Empleados inner join Clientes on
Empleados.CodigoEmp1eado=C1ientes.CodigoEmp1eadoRepVentas natural join
(select Codigocliente,CodigoPedido,sum(Cantidad*PrecioUnidad) as
Tota1Pedido from Pedidos natural join Deta11ePedidos
group
by Codigocliente,CodigoPedido) Totales
4. Crea un trigger en la tabla Empleados que mantenga actualizada la tabla de
comisiones cuandose modica el porcentaje de comisión de la misma. Modica
la comisión de un empleado y comprueba que, efectivamente seha modicado.
En la máquina 192.168.1.101 se ejecuta el siguiente código:
create or replace trigger Tímpleadocomisiones
after update of PorcentajeComision on empleados for each row
begin
update
comisionescontabilidad
set comision = totalpedidotznev.Porcentajecomision/100
where CodigoEmp1eado=:o1d.CodigoEmp1eado;
end;
/
5. Modica el Empleado con código 31 estableciendo un porcentaje de comisión
del 10 70 y verica que efectivamente, se han modicado las comisiones:
update empleados set porcentajecomision=10 where codigoempleado=31;
select *fmm comisiones@contabilidad where
codigoempleado=31;
285
Bases de Datos
7.7. Prácticas propuestas
Práctica 7.3: Fragmentación horizontalde tablas
Una empresa de telefonía está implementando un sistema de recepción de inciden-
cias. Estas incidencias se recogerán desde un único número de asistencia telefónica
y se almacenarán en una base de datos distribuida. Esta tendrá 3 nodos Oracle. Se
va. a fragmentar una tabla llamada incidencias de forma horizontal, de tal manera
que las provincias cuyo nombre comience por las letras de la A a la C estén en el
nodo O, de la D a la M en el nodo 1 y de la O a la Z en el nodo 2. De esta manera
estarán equilibradas en número de registros por el número de población. Se pide:
1. Crear la estructura de las tablas en los tres nodos. La tabla incidencia tendrá los
campos IdIncidencia, Fecha, Código de Cliente, Texto de la incidencia, Pro-
vincia y Estado (abierta /cerrada).
2. Crear un enlace de base de datos entre cada uno de los servidores.
3. Ejecutar una consulta distribuida que devuelva todos los registros de la tabla
incidencia.
4. Crear un procedimiento en el nodo 1 que inserte una incidencia en el nodo que
le corresponda según la letra de la provincia.
5. Crear un procedimiento que borre una incidencia del nodo adecuado basándose
en el campo de provincia.
A continuación se desea fragmentar la tabla a través del campo IdIncídencia y
el operador Mod (Resto de la división entera). La. operaciónIdIncidencia Mod 3
indicará en qué nodo debe estar almacenado elregistro (0,12). Para asignar el
IdIncidencia sin duplicados se va a crear una secuencia (objeto sequence) para que
antes de insertar un registro se consulte y se inserte en el nodo adecuado. Se pide:
1. Crea la secuencia con el comando create sequence enel nodo 0.
2. Crea una función llamada SiguienteIncidencia que devuelvael siguiente número
de secuencia.
3. Ejecuta la consulta select siguienteIncidenciaO Qnodoü desdelos otros dos no-
dos.
286
Capítulo 7. BBDD
distribuidas
Práctica 7.4: Fragmentación vertical
Una aplicación comercial de marketing tiene una tabla de clientes muy grande con
los siguientes campos:
ICampos principales: Código de Cliente, Nombre, Apellidol, Apellido2, email,
identicador de facebook, dirección, código postal y país.
ICampos secundarios: película favorita 1, pelicula favorita 2, hobbie 1, hobbie
2, otros intereses y comentarios.
Se pretende fragmentar la tabla utilizando una base de datos distribuida de dos
nodos, para lo cual se pide:
1. Realizar la fragmentación de la tabla separando los campos principales y
creándolos enun nodo y los campos secundarios(gustos y aciones) creándolos
en otro nodo.
2. Crear un procedimiento que muestre por pantalla la información de un cliente
determinado. El procedimiento recibirá como parámetro el código de cliente y
consultará los dos nodos para mostrar toda la información.
3. Crear un prodecimiento que elimine un cliente de la base de datos.
287
Bases de Datos
Práctica 7.5: Consultas distribuidas
Sigue los siguientes pasos para ejecutar consultas distribuidas en Oracle:
1.
10.
288
Genera una copia de la máquina virtual con tu servidor Oracle, cámbiale la
dirección IP y asegúrate de que tienen conectividad entre ambas.
.Localiza el chero tnsnames detu servidor oracle original y agrega una entrada
para que se pueda crear un enlace a la máquina virtual copiada.
.Prueba con la utilidad tnsping que es posible conectar de la máquina virtual
original a la copiada.
Crea un usuario llamado Userl en la instacia oracle de la máquina virtual
original con los permisos CREATE DATABASE LINK y CREATE PUBLIC
DATABASE LINK y el rol RESOURCE.
.Crea un usuario llamado User2 en la instancia oracle de la máquina virtual
copiada con permiso CREATE SESSION y el rol RESOURCE.
.Crea una tabla llamada Cliente(Código, Nombre, Dirección) en la máquina
virtual original en el esquema Userl e inserta dos registros.
.Crea una tabla llamada lIascotas(Código, Tipo, Raza, Nombre) en la máquina
virtual copiada en el esquema User2e inserta dos mascotas para cada Cliente.
.Ejecuta una. consulta que devuelva un listado con las mascotas de cada cliente
incluyendo la dirección y el nombre del cliente.
.Crea ahora la misma consulta, pero utilizando una tabla derivada para traer
solamente las mascotas del primer cliente.
Ejecuta la consulta anterior utilizando los hints NO_MERGE y DRIVING_SITE
comparando su plan de ejecución con el comando explain plan.
7.8.
Capítulo 7. BBDD distribuidas
Resumen
Los conceptos clave de este capítulo son los siguientes:
Una base de datos está controlada por más de un servidor se dice que está dis-
tribuida.
Este tipo de organización proporciona más rapidez y exibilidad en el acceso
y más capacidad de almacenamiento. Proporciona también escalabilidad y
abilidad.
Un sistema de BBDD distribuidas requiere una red de comunicacionesy enlaces
entre bases de datos locales a cada servidor (DBLINKS).
Se clasican en:
o Homogéneas: todas las BBDD locales usan el mismo SGBD.
o Heterogéneas: las BBDD locales pueden tener distinto SGBD.
Se puede fragmentar una BBDD distribuida verticalmente, donde los frag-
mentos son conjuntos de campos de una tabla u horizontalmente donde los
fragmentos son conjuntos de registros.
Una consulta distribuida es aquella que consulta múltiples tablas ubicadas en
distintas ubicaciones.
Se puede
hacer uso
de nombre
Tabla@servidor para
hacer
referencia a una tabla en un servidor enlazado con un DBLINK.
El comando DML create database link se utiliza para crear enlaces através de
un enlace declarado en el chero tnsnamesora.
Con la utilidad tnsping se puedecomprobar si hay conectividad con una BBDD
remota.
Una transacción distribuida utiliza el método TWO PHASE COMMIT a
través de un coordinador local, un coordinador global y un Commit Point
Site.
En Oracle se puede consultar la vista vSsession para ver las sesionesabiertas
con servidores remotos.
Se puede eliminar una conexión abierta con el comando alter session close
database link.
Es posible utilizar hints en Oracle para parametrizar cómo se va a guiar la
ejecución de la consulta.
289
Bases
de Datos
7.9. Test de repaso
1. Un DBLink es
a) Una conexión unidireccional entre una
BBDD cliente y una servidora
b) Una conexión bidireccional entre dos
BBDD locales
c) Una conexión bidireccional entre dos
BBDD distribuidas
d) Ninguna de las anteriores
2. Es posible tener BBDD Distribuidas
heterogéneas
a) Si, a través de DB Links comunes
b) Si, a t.ravésde software que hace las BBDD
compatibles
c) No, es imposiblecomunicar dosBBDD con
distintos SGBD
d) Sí, a travésde agentes
llamados transpa-
rent gateways
3. Con muchos DBLinks puede ocurrir
que:
a) Mejora el rendimiento del servidor
b) No hay problemacon lasconexiones, pues-
to que se cierran solas
c) Es posible quese queden
demasiadas cone-
xiones abiertas
d) Hay problemas deseguridad
4. TWO PHASE COMMIT es
a) Un enlace doblea BBDD
b) Un mecanismo para realizar transacciones
locales
c) Un mecanismo pararealizar transacciones
distribuidas
d) Un mecanismo pararealizar transacciones
distribuidas y locales
290
5. Las fases de TWO PHASE COMMIT
a Son dos fases
b Son la fasede preparación, commit y olvido
c Son 4
fases
)
)
)
d) Son las fases de commit. y rollback
6. Un hint es un mecanismo para
a) Cambiar la forma en la que una consulta
funciona
b) Ejecutar una consulta distribuida
c) Ejecutar una consulta local
d) Ninguna de las anteriores
7. ¿Cuál de estas sentencias es la correc-
ta?
a) CREATE DATA BASE LINK;
b) CREATE DB LINK:
c) CREATE DATABASE LINK;
d) Ninguna de las anteriores
8. Para comprobar si hay conectividad
entre BBDD remotas
a) Se usa elcomando tnsnames
b) Se usa el comando using
c) Se usa el comando dblink
d) Ninguna de las anteriores
9. Open links congura:
a) El valor de commit en una transacción
b) Máximo número de conexiones abiertas
c) Tiempo máximo deejecución
d) Ninguna de las anteriores
7.10.
10.
.¿Qué es una base de datos distri-
buida?
.Enumera los tipos de BBDD distri-
buidas según el SGBD que se utili-
za.
. Enumera las características de una
BBDD distribuida.
.¿Qué es la escalabilidad?
. ¿Qué signica que una BBDD es
able?
. Enumera los 5
elementos que tiene
una BBDD distribuida.
. ¿Por qué se fragmenta una BBDD
distribuida?
.Dene los siguientes conceptos:
IFragmentación vertical
n Fragmentación horizontal
- Fragmentación mixta
.¿Qué reglas hay para que una frag-
mentación sea correcta?
¿Qué diferencia hay entre una con-
sulta distribuida y una remota?
11.
12.
13.
14.
1.5.
16.
17.
18.
19.
20.
21.
Capítulo 7. BBDD distribuidas
Comprueba tu aprendizaje
¿Cómo seejecuta una consulta dis-
tribuida?
¿En quéconsiste un transparent ga-
teway o pasarela transparente?
¿Qué esun DBLINK?
¿Qué requisitos debe tenerun usua-
rio para poder crear un DB Link?
¿Qué almacena el chero tnsna-
mes.ora?
¿Qué diferenciahay entre un dblink
público y uno privado?
Escribe el comando DDL para crear
DBLINKS.
¿Para qué
sirve la
utilidad tnsping?
¿Cómo secierra una conexión a una
base de datos remota?
Describe el funcionamiento de una
transacción distribuida a través del
mecanismo TWO PHASE COM-
MIT.
Enumera los hints que tiene Oracle
para optimizar las consultas distri-
buidas.
CAPÍTULO 8
BBDD Objeto-Relacionales
Contenidos Objetivos
W
Las bases de datos Ñ
Identicar las características de
Objeto -Relacionales las bases de datos objeto rela-
_ _
cionales
Los atr1butos multlvaluados
Crear tipos de datos ob jeto, sus
Las Colecciones atributos v métodos
Tablas anidadas Crear tablas
de objetos
v tablas
Tipos de
Objetos de columnas tipo
objeto
Los identicaciones
de Objeto Crear tlpos
de datos
co1ecc1on
Métodos en
BBDD_OR Realizar Consultas
.Modicar la información alma-
Herencxa en BBDD-OR _ _ _
cenada manteniendo la 1ntegr1-
DML con BBDD-OR_ dad y consistencia de los datos
En este capítulo se explica cómo se gestiona la información almacenada en
bases de datos objeto-relacionales, evaluando y
utilizando las posibilidades
que proporciona el sistema gestor.
293
Bases
de Datos
8.1. Las Bases de datos ob jetos-relacionales
A medida que el mundo de la informática va generando modelos del mundo real
para crear aplicaciones, van apareciendo nuevasnecesidades parapoder dar solución
a estosproblemas. A lo largo del libro se haestudia.do queun modelo de datos cuenta
con las siguientes características:
IEntidades
IAtributos en cada una de estas entidades
IRelaciones entre los atributos y entre las entidades
n Directrices 0 reglas entre las entidades y los atributos
Las BBDD pueden modelar todas estas características. En un modelo más complejo
incluso se puede incluir acciones, operaciones o procedimientos entre entidades y
atributos. Se puede decir que las Bases deDatos Objeto-Relacional (BBDDOR) son
una extensión del modelo relacional que además, rompe ciertas reglas, tanto en el
modelo relacional como en el paradigma de la orientación a objetos, pero seguro que
aporta otra solución al modelado de información.
A lo largo de este capítulo se podrá observar con ejemplos la diferencia de un
modelo entidad relación E-R convencional y un modelo de datos objeto relacional
O-R.
La principal diferencia radica en la existencia de tipos. Estos tipos se pueden
construir mediante sentencias DDL y serán la basedel desarrollo de BBDD O-R. Por
tanto, para denir el modelo objeto-relacional habría que añadir a las características
básicas deun modeloE/ R: entidades, atributos,relaciones yreglas ylos tipos.
8.2. Los atributos multivaluados
Los atributos multivaluados, según lo estudiado, rompen directamente la primera
formal normal. Con este tipo de atributo básicamente se expresa todo lo contrario
a la IFN. Se dice, que un atributo puede tener más de un valor, pero son del mismo
tipo. Existen autores, como Ted Codd, que hablan de la primera forma normal solo
como atomicidad para evitar que el valor no se pueda dividir conceptualmente, por
tanto se enfoca más no en que se pueda tener varios valores del mismo tipo, sino
que esevalor en sí seaindivisible conceptualmente.
En todo caso, estetipo de atributo amplia enormemente el modelo de cara a mo-
delar en mundo real. Con los gestores BBDDO-R se puedelograr obtener atributos
con múltiples valores.
294
Capítulo 8. BBDD Objeto-Relacionadas
8.2. 1.
Las colecciones
Al realizar el paso al modelo relacional, los atributos se convierten en columnas.
Podemos representar los atributos multivaluados en la BBDD a través de las colec-
ciones. Una colección es un grupo de elementos del mismo tipo. En Oracle se usan
los tipos para crear colecciones.
Supóngase quese deseaguardar los nombres de los hijos de los empleados. Para
esto sepuede usar una. colección.La relación puede tener las siguientes ocurrencias:
III Apellidos
m
(luis-Insular
(Jose Carlos»
pedro)
Lo primero sería crear la colección:
SQL> create type colec_hijos as varray(10) of varchar2(30);
2 /
Tipo creado.
En esta instrucción se ha denido un nuevo tipo de datos llamado coleahijos
que tendrán como máximo grupos de 10 valoresy además, que serán de máximo 30
caracteres. A continuación, se crea la tabla:
SQL> create table empleado
2 (id number,
3 nombre varchar2(30),
4
apellido varchar2(30),
5 hijos co1ec_hijos)
6 /
Tabla creada.
Con esto se expresaque la columna de hijos será una colección de tipo colecjnjos
ya denida. Es posible insertar datos tal y como sehace encualquier otra tabla con
el comando INSERT, lo único a tener en cuenta es que hay que decirle que el tipo
de la siguiente forma:
Bases de Datos
insert into empleado values
(2,Esperanza,Jiménez,co1ec_hijos(josé,carlos,pedro));
Obsérvese quees necesarioespecicar el tipo colecJzijos para que el SGBD realice
las comprobaciones necesarias.
Para consultar, también se puede utilizar SELECT:
SQL> select *
2
from empleado;
ID
NOMBRE APELLIDO HIJOS
1 Francisco Pérez COLEC_HIJOS(luis, ursu1a)
2 Esperanza Jiménez CULEC_HIJOS(josé,carlos,pedro)
De estamanera seha introducido una restricción al mundo real: que un empleado
no puede tener más de 10 hijos.
<> Actividad 8.1: Dene un tipo tabla llamadoAsignaturas. Después,
crea una
tabla llamada ciclosFownativos que pueda tener varias asignaturas, de tal manera
que asignaturas sea una tabla anida.da.
8.2.2. Tablas anidadas
50 o 60 añosatrás, existía la posibilidad de que 10 hijos fuese unparámetro corto
en algunas ocasionesy
fuese posible ampliarlo hasta 20 o incluso 50, pero siempre
tendría una restricción. Existe la posibilidad de no limitar la cantidad de Valores
dentro del atributo multivaluado, deniendo lo que se denomina un tipo tabla, en
la que solo se especica el tipo de datos que se deseapara ese atributo. Utilizando
el mismo ejemplo se redene el tipo hijos de la siguiente forma:
SQL> create type tab1a_hijos as table of varchar2(30);
2 /
Tipo creado.
296
Capítulo 8. BBDD
Objeto-Relacionadas
Y al igual que con el ejemplo anterior, se crea la tabla basándola en el tipo
tabla_hijos:
SQL> create table empleado
2 (id number,
nombre varchar2(30),
apellido varchar2(30),
hijos tabla_hijos)
nested table hijos store as t_hijos
/
Tabla creada.
Ahora, tablajzíjos, ya no es un tipo colección . es un tipo tabla. Los tipo tabla
utilizan para su almacenamiento una tabla anidada o nested table. Dicho de otro
modo, la columna hijos es deltipo tablmhijos almacenada sobreun tipo de segmento
especial llamado tabla anidada. A diferencia de la colección, seha denido esta tabla
especial que permitirá almacenar en el atributo multivaluado tantos valores como
sea necesario.
¿Sabías que .. . ?
En Oracle, se
puede consultar
la tabladba_objects para
examinar los objetos que se hancreado en el SGBD. También se puede consul-
tar mediante dba_segments laestructura de almacenamiento que utiliza Oracle
para almacenar el objeto:
SQL> select object_name, object_type, status
2 from dba_objects
3* where object_name like %HIJDZ
0BJECT_NAME OBJECT_TYPE
TABLA_HIJOS
T_HIJOS
SQL> select segment_name, segment_type
2 from dba_segments
3* where segment_name like ZHIJOS%
SEGMENT_NAME SEGMENT_TYPE
T_HIJDS NESTED TABLE
297
Bases de Datos
Para consultar, insertar, borrar o actualizar información en tablas anidadas, se
realiza igual que con las colecciones.
Con estos tipos se abren nuevas posibilidades al construir modelos de datos: es
posible denir tipos de datos personalizados y muy completos, con comportamientos
y características autónomas.
El modelo pasa detener dos dimensiones (las y columnas), a tres dimensiones
(las de tipos, las y columnas). La cantidad de colecciones tipo y tablas tipo,
dependerá únicamente de la destreza que se posea y de la habilidad para aplicar
estas ventajosascaracterísticas a cada uno de los modelos que representan el mundo
que se desea modelar.
8.2.3. Tipos de Objeto
Aunque no es objetivo del capítulo explicar la teoría de la programación orientada
a objetos (POO), serecordará queuna clasees comoel moldeo un patrón para la
fabricación de los objetos. Y
visto desde el otro sentido, un objeto es una instancia
de una clase.
En Oracle, se puedencrear clases a través de los tipos, más concretamente de los
tipos de objetos, usando la sentencia create type as object. Gracias a este tipo objeto
se puede agregar información a la base de datos anidando la. información en única
la en tantos niveles como se desee.
Para ilustrar el funcionamiento de esta estructura recurrimos a la siguiente rela-
ción:
CLIENTES
( Id,
Nombre, Apellido,
Dirección, Población,
Provincia, Teléfon
Móvil)
Se puede armar que todos sus atributos son atómicos y que cumple, al menos, la
primera forma normal. Una instancia de esa relación cliente (Modelo Relacional),
podría ser:
[EI Apellido
Mayor.20 Madrid Madrid 912823722 600000001
Suponiendo que este Cliente no cuenta con un móvil, sino que cuenta con 3
móviles, el móvil de su trabajo, su móvil particular de una compañía que le da una
buena tarifa. por la mañana, y otro móvil de una compañía que le da buenos des-
cuentos en SMS. Se podría pensar en conservar el mismo modelo de datos de forma
elegante, y no con una entidad cliente que contenga hasta 10 atributos llamados
298
Capítulo 8. BBDD
Objeto-Relacionales
movill, movi12,...movil10 (no es muy inusual encontrarse con BBDD que tienen
estas soluciones).
Ajustándose únicamente al modelo E-R la solución óptima sería crear una Re-
lación que sea cliente-móvil, y
que contenga el ID del chente y su número de móvil.
Por ej
emplo:
É
1
600000001
1 600000002
1 600000003
Las BBDD orientadas a objeto brindan la posibilidad de crear un tipo de objeto
de la siguiente forma:
SQL> create or replace type telefono as object
2 (tipo varchar2(30),
3 numero number)
4
/
Se puedeobservar que cada objeto telefono tendrá dos atributos, el tipo de teléfono
móvil y el número. A continuación, se crea una tabla tipo llamada listin basada en
el objeto tipo para añadir la funcionalidad de múltiples valores:
SQL> create or replace type listin as table of telefono
2 /
Tipo creado.
Finalmente se crea la tabla Clientes:
SQL> create table clientes
2 (id number,
3 nombre varchar2(10).
apellido varchar2(10),
direccion varchar2(30),
poblacion varchar2(30),
telefonos listin)
nested table telefonos store as te1_tab
10
/
4
5
Bases de Datos
A partir de aquí, se pueden ejecutar sentencias DML en la tabla clientes haciendo
valer la deseada ampliación con relación al modelo de datos tradicional:
SQL> insert into clientes
2 values
3
(1,Paco,Pérez,mayor 20,madrid,madrid,
4
1istin(te1efono(fijo,911234567).
5 te1efono(movi1 persona1,60000O001),
6 te1efono(movi1 empresa ,600000002)))
7 /
1
fila creada.
SQL> commit;
Confirmación terminada.
Si se consulta la tabla se obtiene:
SQL> select *from cliente;
ID
NOMRE APELLIDO DIRECCIONPOBLACION PROVINCIA
TELEFONOS(TIPO, NUMRO)
LISTIN(TELEFONO(fijo, 911234567),
TELEFON0(movi1 personal, 600000001),
TELEFON0(movi1 empresa, 60000O0O2))
Se puedeobservar cómo se anida la información dentro de la propia la. De esta
manera, 1 cliente puede tener múltiples teléfonos y cada teléfono, varios atributos.
Esto es la representación real de las relaciones anidadas.
8.3. Los identicadores de objeto
Oracle trabaja con OID (Object Identiers). Un OID es un identicador para
mejorar la búsqueda de la información. Cuando se crea una columna cuyo tipo es
un tipo de objeto, en lugar de almacenarse todos los datos del objeto en la propia
columna de la tabla, el SGBD solo almacena un identicador, que será la dirección
de una la en una tabla auxiliar que el SGBD para almacenar los datos del objeto.
Es decir, internamente, el SGBD solo almacena un número de 16-Bytes que le sirve
como referencia para ir a buscar la información de la tabla objeto si esnecesario. Es
posible ver estos OIDs con una pseudo-columna llamada objectJd. Para ver el valor
del objeto, se puede utilizar objectwalue. Se ilustra en el siguiente ejemplo:
300
Capítulo 8. BBDD Objeto-Relacíonales
SQL> create type coche as object
2 (marca varchar(20),
3 modelo varchar(20));
4 /
Tipo creado.
SQL> create table vehiculos of coche;
Tabla creada.
SQL> insert into vehiculos values (coche(seat,ibiza));
1 fila creada.
SQL> select object_id, object_va1ue from vehiculos;
DBJECT_ID 0BJECT_VALUE(MARCA, MODELO)
A5440089F85FFA3OE040007FOIOOOFDE COCHE(seat, ibiza)
La ventaja de usarOIDs esquela informacióndel objeto estáalmacenadaen otro
sitio distinto de la propia la, por tanto, en casode no usar esteobjeto, el SGBD
no tendrá que accedera toda esta informaciónreduciendoel tiempo de respuesta.
La desventajaesqueenel momentoderealizarconsultas
sobrelastablas,el SGBD
deberealizar accesos
a bloquesextras de información,consumiendo
más CPU.
8.4. Los métodos
Al igual que en la POO cada clasedene el comportamientode susobjetos a
travésde métodos,en lasBBDD-OR también esposiblecrearmétodospara lostipo
objeto.
Se pueden denir funciones o procedimientosmiembros,cuyas accionesmode-
lan el comportamientode un tipo de objeto. Estas funcioneso procedimientosque
pertenecena un tipo de objeto sedenominanmétodos.
Para ilustrar como usar funcionesmiembro en tipos de objetos, se expone el
siguienteejemplo:si se deseamodelar un objeto triángulo para almacenarsusca-
301
Bases de Datos
racterísticas (la base y la altura), y almacenar en la BBDD cientos de triángulos
pudiendo calcular el área de cada triángulo, se podría. crear el siguiente esquema:
SQL> create or replace type tipo_triangu1o as object
2 (base number,
3 altura number,
4
member function area return number)
5 /
Tipo creado
/
Se puede observar que dentro del tipo de objeto tipoiriangulo se ha denido la
cabecera de
una funciónllamada área(método omember functionarea).
A continuación se creará la denición del método área a través del cuerpo del
tipo create 01" replacetype body:
SQL> create or replace type body tipo_triangu1o as
2 member function area return number is
a number;
begin
a
:= (base*a1tura)/2;
return a;
end;
end;
Cuerpo del tipo creado.
Una vez creado el tipo triángulo, se puede crear una tabla para almacenar
triángulos:
SQL> create table triangulos
2 (id number,
3 triangulo tipo_triangulo);
Tabla creada.
SQL> desc triangulos
TRIANGULD TIPD_TRIANGULD
302
Capítulo 8. BBDD Objeto-Relacionales
Y después, se insertan datos dentro la tabla, tal y
como se haexpuesto previamente:
SQL> insert into triangulos values (1,tipo_triangu1o(5,5));
1 fila creada.
SQL> insert into triangulos values (2,tipo_triangulo(10,10));
1
fila creada.
SQL> commit;
Confirmación terminada.
SQL> select * from triangulos;
ID
TRIANGULÜ(BASE, ALTURA)
1
TIPÜ_TRIANGULÜ(5, 5)
2 TIPD_TRIANGULÜ(10, 10)
Finalmente. se puede declarar un pequeño bloque anónimo en PL-SQL para recorrer
la tabla e invocar a1 método area:
SQL> declare
t tipo_triangu1o;
begin
for
i in(select *
from triangulos)
loop
t:=i.triangu1o;
dbms_output.put_1ine(E1 triangulo con id:||i.id);
dbms_output.put_1ine(Con base: IIt.base);
dbms_output.put_1ine(Y altura: IIt.altura);
dbms_output.put_line(tiene un area de: ||t.area);
end loop;
end;
/
El triangulo con id:1
Con base: 5
Y
altura: 5
tiene un area de: 12,5
El
triangulo con id:2
Con base: 10
Y
altura: 10
tiene un area de: 50
Procedimiento PL/SQL terminado correctamente.
303
Bases de Datos
Por cada iteración del bucle, se hace una referencia a un objeto t. Obsérveseque
tbase y t. altura son los atributos del objeto t, mientras que t. areaes la invocación
al método.
<> Actividad 3.2: Al igual que
en POO,en BBDDes posible
crear constructores.
Consulta en la documentación de Oracle cómo crear constructores.
8.5. La herencia
Una de las grandes ventajas de la POO es la herencia, gracias a la cual se
pueden crear superclases abstractas para después, crear subclases más especicas
que hereden los atributos y métodos de las superclases.
En BBDDO-R es posible hacer algo parecido con los tipos de objetos: se pueden
crear subtipos de objetos a partir de otros supertipos de objetos creadospreviamente.
Un ejemplo sencillo en el que se aprecia con facilidad qué es la herencia es una
escuela, donde hay estudiantes, profesores y empleados. Todos ellos tienen carac-
terísticas de una persona: un nombre, un número de identicación, un teléfono, etc.
Por tanto se puede construir un super tipo de objeto llamado tipo_persona que
aglutine los atributos característicos de una persona.
create or replace type tipo_persona as object
(id number,
nombre varchar2(10),
telefonos listin)
not final
/
creado.
La creación del tipo lleva includa la claúsula not nal que indica que se pueden
generar más tipos de objetos a partir de este. Dicho con nomenclatura POO, se
pueden crear subclases apartir de la superclase,o dicho con un lenguaje más natural
se pueden crear tipos de persona más especicos a partir del tipo genérico persona.
A continuación se crea un tipo de persona especíca, el estudiante:
304
Capítulo 8. BBDD Objeto-Relacionales
SQL> create or replace type tipo_estudiante under tipo_persona
2 (facultad varchar2(10),
3 nota_media number)
4 not final
5 /
Tipo creado.
En este
caso, la
cláusula under
especica a qué supertipo pertenece
el tipo estu-
diante. Nuevamente,
se dene
como notnal para
poder generarclasicacionesmás
amplias.
Obsérvese
queestetipo de construcciones
puedenusarsetambién para las
jerar-
quíasen
el modelo entidad relación.Ver sección2.4.1.
Al igual queconcualquierotro objeto, se
puede comprobar la estructura
del tipo
estudiante
utilizando el comando describe, abreviado
desc:
SQL> desc tipo_estudiante
tipo_estudiante extiende TJ.TIPD_PERSONA
tipo_estudiante N0 es FINAL
VARCHAR2(10)
TELEFONOS LISTIN
FACULTAD VARCHAR2(10)
NÜTA_MEDIA NUMBER
Incluso sería
posible crear un
tipo de
subobjeto que tenga losatributos
y méto-
dos
del tipmestudiante. Si además, se desearacrear un
tipo para representar
los
estudiantesde intercambio,sepodría denir:
SQL> create or replace type tipo_estudiante_intercambio
2 under tipo_estudiante
3 (pais varchar2(30),
4 universidad varchar2(30))
5 /
Tipo creado.
SQL> desc tipo_estudiante_intercambio
305
Bases de Datos
tipo_estudiante_intercambio extiende TJ.TIPÜ_ESTUDIANTE
VARCHAR2 (1
o)
TELEFONOS LISTIN
FACULTAD VARCHAR2(10)
NÜTA_MEDIA NUMBER
PAIS VARCHAR2(30)
UNIVERSIDAD VARCHAR2(30)
8.6. Operaciones DML
A lo largo del capítulo ya. se ha mostrado en los ejemplos cómo utilizar la sen-
tencia insert y select cuando se tratan tipos de objetos:
SQL> insert into empleado
2 values
(1,Fernando,Moreno,tab1a_hijos(E1ena,Pab1o));
1
fila creada.
SQL> insert into empleado
2 values
(2,David,Sanchez,tab1a_hijos(Carmen,Candela));
1
fila creada.
SQL> col hijos format a40
SQL> select *from empleado;
ID NOMBRE APELLIDO HIJOS
1
Fernando Moreno TABLA_HIJÜS(Elena, Pab1o)
2 David
Sanchez TABLA_HIJOS(Carmen, Candela)
La única restricción es que no es posible operar sobre la tabla anidada:
SQL> select * from t_hijos;
select *
from t_hijos
*
ORA-22812: no se puede hacer referencia a la tabla de
almacenamiento de una columna de tabla anidada
306
Capítulo 8. BBDD Objeto-Relacionadas
Para realizar actualizaciones se utiliza update:
SQL> update empleado
2 set hijos=TABLA_HIJOS(Carmen,Cande1a,Cayetana)
3 where id =1;
1
fila actualizada.
Y
para realizar borrados se utiliza delete. Obsérvese cómo se puede utilizar un
determinado método para la selección delos registros a borrar o eliminar:
SQL> select * from triangulos t where t.triangu1o.area()>20;
ID TRIANGULÜ(BASE, ALTURA)
2 TIPÜ_TRIANGULÜ(10, 10)
SQL> delete from triangulos t where t.triangu1o.area()>20;
1 fila suprimida.
8.7. Las referencias
Una referencia es un puntero a un objeto creado a partir de su OID. Se utiliza
principalmente para apuntar a un objeto que ya. existe y no tener que duplicar la
información. Por ejemplo, si se deseacrear una tabla de mascotas en la que ca.da
mascota tiene su veterinario, y
esos veterinarios ya están almacenados en una tabla
de objetos, se podría hacer uso de la palabra reservada REF para indicar que el
veterinario ya existe y por tanto. solo se almacena una referencia a ese veterinario
en la tabla de mascotas.
SQL> create type veterinario as object
2
( id integer,
3 nombre varchar(100),
4
direccion varchar(255));
5 /
Tipo creado.
SQL> create type mascota as object
2 (
307
Bases de Datos
3 id integer,
4 raza varchar(100),
5 nombre varchar(100),
6 vet REF veterinario
7 )
8
/
Tipo creado.
SQL> create table veterinarios of veterinario;
Tabla creada.
SQL> insert into veterinarios values (1,Jesús Sánchez,C/El mareo 29);
1 fila creada.
SQL> create table mascotas of mascota;
Tabla creada.
SQL> insert into mascotas
2 select 1,perro,sprocket, REF(v)
3 from veterinarios
v
4 where v.id=1;
1 fila creada.
Se puede ver cómo
REF se utiliza en dos situaciones:Al crear el tipo mascota,
para indicar que su veterinario seráuna referenciaal veterinarioreal,
y después,al
insertar la mascota,serealiza una sentenciade tipo ínsertselect para obtener una
referenciaal veterinario cuyoid = 1.
Si a continuación, se realiza una consulta se obtiene:
SQL> select
* from mascotas;
ID RAZA NOMBRE VET
1 perro sprocket 000O220208A59467OFAD9FO874E040007F01002AF3A594670FAD9E08
Para obtener losdatos realessepuedeutilizar la palabra DEREF:
SQL> select nombre,deref(vet) from mascotas;
NOMBRE DEREF(VET)(ID, NOMBRE, DIRECCION)
sprocket VETERINARIO(1, Jesús Sánchez, C/E1 mareo 29)
308
Capítulo 8. BBDD Objeto-Relacionales
8.8. Prácticas Resueltas
Práctica 8.1: Supermercado
Para la gestión de un supermercado, se deseaconstruir un modelo para la gestión
de las listas de la compra:
1. Crea un tipo para almacenar direcciones postales con dos campos, la dirección
y el código postal.
create or replace type tipo_direccion as object
( dir varchar2(100), CP number(5))
/
2. Crea un tipo contacto para almacenar un número de teléfono y un email.
create or replace type tipo_contacto as object
(telefono number, email varchar2(100))
/
3. Crea un tipo persona con los camposid, nombre, apellido, dirección y contacto.
Después, creaun Subtipo cliente con otro campo adicional llamado número de
pedidos.
create or replace type tipo_persona as object
(id varchar2(20),
nombre varchar2(30).
apellido varchar2(30).
direccion tipo_direccion,
contacto tipo_contacto)
not final
/
create or replace type tipo_cliente under tipo_persona
(n_pedidos number)
/
4. Crea un tipo artículos con los camposid, nombre, descripción, precio y porcen-
taje de IVA. Después crea un tipo tabla de objetos para registros de artículos.
create or replace type tipo_articulo as object
(id_art number,
309
Bases de Datos
nombre varchar2(30).
descripcion varchar2(100),
precio number,
porct_iva number)
/
create or replace type tab1a_articu1os as
table of tipo_articu1o;
/
5.
Crea un tipo para
la lista de
la compra
y otro para su
detalle. La
lista de
la
compra
contendrá un identicador, fecha,
cliente y una tabla de detalles de
lista de
la compra.
A su vez, un
detalle de
lista de compra
estará compuesto
por un artículo
y un campoque
denote la cantidad pedida de eseartículo. Se
deberá incluir en la denición una
función miembro para calcular el total de
la lista de
la compra.
create or replace type tipo_lista_deta11e as object
(
numero number,
articulo tipo_articu1o,
cantidad number
)
/
create or replace type tab_1ista_deta11e as table of tipo_1ista_deta11e;
/
create or replace type tipo_lista_compra es object
(id number,
fecha DATE,
cli REF tipo_c1iente,
Detalle tab_1ista_detal1e,
memberfunction total return number
)
/
6.
Crea ahora el cuerpodel tipo
lista de
la comprapara
denir el métodototal:
310
create or replace type body tipo_1ista_compra as
memberfunction total return number
is
i integer; tot number := O;
begin
for
i in1..Deta1le.count
loop
tot := tot
+ (Detal1e(i).cantidad * Deta11e(i).articu1o.precio
) t
(1+(Detal1e(i).articu1o.porct_iva/100)); end loop;
return tot;
end;
end;
/
10.
Capítulo 8. BBDD Objeto-Relacionadas
Crea una
tabla de clientes e inserta uno.
create table Clientes of tipo_c1iente;
insert into clientes values (1, Pedro,Suarez,
TIPO_DIRECCION(Paseo del Museo 15,28099),
TIPO_CONTACTO(917726S25,psuarez@ono.com),0);
Crea una tabla
para las listas de la compra e inserta una lista de la compra
con
un detalle de dosartículospara el clienteinsertadoanteriormente:
create table listas_de_compras of tipo_1ista_compra
nested table Detalle store as tDeta11e;
insert into 1istas_de_compras
select 1,current_date,ref(c), tab_1ista_deta11e(
tipo_lista_deta11e(1.tipo_articu1o(1,Barra de pan,Tipo baguette,1,7),4),
tipo_1ista_deta11e(2,tipo_articu1o(2,Lonchas de jamón,Iberico Be11ota,6,7),4)
) from Clientes c where c.id=1;
Muestra.con
una selectlosdatosde la lista de la compra:
col cliente formats40
col detalla formatn50
set linesize 132
select idjcchmdcrccli) u cliente. detallo fromliltagdhcompns;
l 13/06/11TIPILCLIENTEÜI,&#39;Padxo.
Suarez. TIPTAB_LISTA_DÉI&#39;ALLE(TIPO_LISTA_DÉI&#39;ALLE(1,
TIPÜ_ARTIC
O_DIR.ECCIDN(Puoo
del Husoo
15&#39;,
28099)
ULOU,Burn depu, Tipo bnguotto, 1, 7), d).
. TIPU_CONTACl&#39;0(917726525,
Tsuuezdono.
TIPO_LISTA_DÉTALLE(2.TIPCLARTICULCK?,
Wonchu
do
com). 0) jamón, Iberico BeuataHG.7). 4))
Construyeuna selectpara mostrarpor pantalla el id de una lista de
la compra
y su total.
SQL> select id, c.tota1() from 1istas_de_compras c;
ID C.TOTAL()
311
Bases de Datos
8.9. Prácticas Propuestas
Práctica 8.2: Tipos básicosy herencia
Realiza los siguientes ejercicios:
1. Crea. un tipo para las direcciones de empresas, contendrá el tipo de dirección
y la dirección (número, calle y piso).
2. Crea un tipo colección para almacenar hasta 3 direcciones (scal, postal y
administrativa).
3. Crea un supertipo empresa con los atributos CIF, Nombre y sus direcciones.
4. Crea un subtipo de empresa llamada Sociedad Anónima con los atributos
número de accionistas, capital social y
presupuesto.
5. Crea un subtipo de empresa llamada Sociedad Limitada que tenga una lista
de socios,donde seespecique el nombre del socio y un porcentaje de posesión
de la empresa.
6. Crea una tabla de empleados que tenga una referencia a una Empresa.
Práctica 8.3: Comandos DMLcon objetos
Con los tipos de la. práctica anterior realiza las siguientes operaciones:
1. Crea una tabla de empresasde tipo sociedades anonimas.
2. Inserta una sociedad anonima con dos direcciones.
3. Crea una tabla de empresasde tipo sociedades limitadas.
4. Inserta una sociedad limitada con dos direcciones y cuatro socios.
5. Inserta un empleado para cada una de las empresas insertadas.
6. Crea una consulta que muestre la empresa para la que trabajan los empleados
utilizando la función DEREF.
312
Capítulo 8. BBDD Objeto-Relacionales
Práctica 8.4: Números complejos
Un númerocomplejo a+bi está compuesto
por unaparte imaginaria(b) y una parte
real (a). Se deseacrear un tipo de objeto llamado tipo_complejo con una serie de
métodos para poder operar con ellos. Se pide:
1. Crea el tipo tipo_complejo que contenga los atributos imaginario y real, y que
dena la cabecera de los siguientes métodos:
IMódulo: Retorna un valor numérico resultado de operar los valores ima-
ginarios y reales con la fórmula x/ a2+
b?
- Valor: Retorna una cadena decaracteres conla representación del número
complejo (a+bi).
IConjugado: Retorna una cadena de caracteres con la representación del
conjugado del número complejo (a-bi).
- Multiplicar(Número Complejo): Actualizarálos atributosdel númerocom-
plejo resultado de multiplicar los propios atributos por otro número com-
plejo que será pasadocomo parámetro: (a+bi)(c+di) =
acbd+(ad+bc)i
2. Crea el cuerpo del tipo desarrollando los métodos denidos en la cabecera del
tipo.
3. Crea el tipo tipo_tabla_co1nplejos para almacenar una serie de números com-
plejos. Después, crea el tipo tipo_lista_complejos que almacene una tabla de
complejos.
4. Crea una tabla de listas de números complejos e inserta un registro con 5
números.
5. Crea un bloque anónimo para multiplicar el primer número insertado por el
segundo.
6. Crea un bloque anónimo que muestre el módulo, valor y conjugado de los
números complejos insertados.
7. Crea una función que reciba una tabla de números complejos y devuelva un
número complejo con la suma de todos ellos.
8. Crea un bloque anónimo que invoque a la función anterior y visualice la suma
de los números complejos insertados.
313
Bases de Datos
8.10.
314
Resumen
Los conceptos clave de este capítulo son los siguientes:
Muchos SGBD permiten la creación de tipos personalizados, que son la base
de las BBDD-OR.
Los atributosmultivaluados pueden
almacenarse en
colecciones (varray)
de un
número jo de elementos
o entablas anidadas(nested tables)para almacenar
un número variable de elementos .
Los objetos denidos en Oracle se puedenconsultar utilizando la tabla dba_objects.
Un tipo de objeto se crea con la sentencia DDL create type tipo as object.
Es posible crear tipos de tabla de objetos con la sentencia DDL create type
tipmtabla as table of objeto.
Se puede anidar la creación de tipos en tantos niveles como se desee.
Un OID es un número de 16 bytes para mejorar la búsqueda de la información.
Se puedeconsultar con la función object_id.
Un método es una función o un procedimiento miembro denido dentro de un
tipo.
Para invocar a un método se utiliza el operador punto objeto.metodo(
Se pueden crear jerarquías de clases (u objetos tipo) deniendo tipos NOT
FINAL .
Para crear un subtipo de objetos se utiliza la cláusula under supertipo.
Es posible compartir objetos mediante referenciasa objetos utilizando la cláusu-
la REF.
Para ver la información de un objeto referenciado mediante REF se utiliza la
función DEREF.
8.11.
1. En BBDD-OR un tipo
Test de repaso
a) Es la denición de unaestructura quesirve
para crear objetos
b) Se usa enla denición de unacolumna de
una tabla
c) Se puede utilizar como basepara otros ti-
pos
d) Todas de lasanteriores
2. Las colecciones se crean mediante
a) vArrays
b) nested tables
c) under
d) not nal
3. Una tabla anidada
a) Se usa como modo de almacenamiento pa-
ra un tipo tabla
b) Es un tipo de segmento
especial
c) Se crea conla cláusulastore as
d) Todas las anteriores
4. ¿Qué vista se utiliza en Oracle para
ver las tablas anidadas?
a) dba-objects
b) user_nested_tables
c) dbasegments
d) Ninguna de las anteriores
5. Un OID
a) Es un identicador que usa el SGBD para
localizar el objeto
b) Se puede vercon la función object_id
c) Es el equivalente al ROWID en objetos
d) Todas las anteriores
Capítulo 8. BBDD
Objeto-Relacionales
6. Para denir métodos en BBDD-OR
a) Se usan funciones o procedimientos miem-
bros de un tipo de datos
b) Se utilizan paquetescon cuerpoy cabecera
c) No es posible utilizar métodos
d) Ninguna de las anteriores
7. Para invocar a un método en BBDD-
OR
a) Se utiliza el operador ->
b) Se usa lafunción REF
c) Se usa la función 0bject_value()
d) Se usa eloperador punto
8. En BBDD-RO la herencia
a) Permite que un tipo herede de más de un
supertipo
b) No es posible crear un subtipo a partir de
un supertipo
c) Es posible crear un supertipo a partir de
un subtipo
d) Ninguna de las anteriores
9. Cuando se usan comandos DML en
BBDD-OR
a) Se pueden realizarinserts y updates
b) Se pueden usardeletes
c) No es posible hacer select en tablas anida-
das
d) Todas las anteriores
P6&#39;P&#39;8P&#39;¿&#39;9&#39;9P&#39;93&#39;rP¬9&#39;ZP&#3
315
Bases de Datos
8.12. Comprueba tu aprendizaje
1. ¿Qué es una base de datos OR? 12. Explica cómo sepuede invocar a un
_ , _ _ _ _
método denido en un tipo.
2. ¿Cual es la principal diferencia con
las bases
de daÉOS
TGÏaCÍOHHÏGS? 13.Comenta cómo
se aplica
la herencia
3. ¿Qué
es un
atributo multivaluado?
a las
BBDD-OR
4. ¿Cómo
encaja un
atributo multiva-
14&#39; ¿Cómo
Se puede
insert? u?
regis-
luado en
las bases
de datos
OR? tro en una
tabla de
Objetos
5_ Enumera
dos formas
distintas de15. Dene
para qué
sirven las
siguien-
almacenar atributosmultivaluados tes funclones
en una
tabla. IObject-id
6. Explica
las diferencias
entre usar _
Objechvalue
una tabla
anidada
y
unacoleccion. DEREF
I
7. Escribe
la sintaxis
para crear: _
REF
ITipos , _ , ,
_ _
16. Dene para que sirvenlas siguien-
- TlpOS colecciones tes Cláusulas
- Tipos
Tabla
tore as
ITablade objetos IS
Iunder
8. ¿Qué
es un
tipo tabla?
¿Cómo se 1
crean? &#39; na
n
not nal
9. ¿Cómo se puedenconsultar en Ora-
cle qué
tipos de
ob jetos
hay deni- &#39; ¡member
d Í , .
OS 17. ¿Que es una referenciaÍQPara
10. ¿Cómo
se puede
consultar en
Ora- qué 1153?
cle las tablas anidadas creadas? , _
18. ¿Como se puede insertar una refe-
11. ¿Cómo se creaun método en un ti- rencia a un objeto en un tabla de
316
po? objetos?
«.2
arceta
grupo editorial
Bases de Datos
ste libro está concebido
desde laexperiencia delos
autores, como administradores de bases de datos
en empresasmultinacionales, comoprofesores de
formación profesional(familia informática) y como pro-
fesores de Universidad.
Los profesionalesde la industria informática y
neótos
encontrarán unavaliosa fuente de infonnación para el
desempeño de
actividades relacionadas
con basesde da-
tos, detallandosu funcionamiento,composición, diseño
y aplicaciones.
El contenido del libro tiene una orientación puramente
práctica, conactividades, consejos
y ejercicios resueltos
en Access,MySQL, Oracle y DBZ que facilitan la com-
prensión yasimilación dela información.
El objetivo del libro no esser unaguía dereferencia de
un solo Sistema de Gestión de Bases de Datos, sino la
formación de administradores de bases de datos actuali-
zados, versátiles
y competentes.
Existe multitud de materialdisponible parala realización
de las
prácticas propuestas
en lapágina web
x
. a .gen-cota«.
y enel blog lvbtltl-gzirccta.blogsptlttnni
www.garceta.es

kupdf.net_bases-de-datos.pdf

  • 1.
  • 2.
    Iván LópezMontalbán M Jesús Castellano Pérez JohnOspino Rivas DAM y DAW Bases de Datos Técnico Supe en Desa de Ap M y Web arceta grupoeditorial
  • 3.
    Iván López Montalbán M3Jesús Castellano Pérez John Ospino Rivas ISBN: 978-84-9281-291-2 IBERGARCETA PUBLICACIONES, S.L., Madrid 2011 Edición: 1.° Impresión: 3. N.° de páginas: 328 Formato: 20 x 26 cm Reservados los derechos para todos los países de lengua española. De conformidad con lo dispuesto en el artículo 270 y siguientes del código penal vigente, podrán ser castigados con penas de multa y privación de libertad quienes reprodujeren o plagiaren, en todo o en parte, una obra literaria, artística o cientíca fijada en cualquier tipo de soporte sin la preceptiva autorización. Ninguna parte de esta publicación, incluido el diseño de la cubierta, puede ser reproducida, almacenada o trasmitida de ninguna forma, ni por ningún medio, sea éste electrónico, químico, mecánico, electro-óptico, grabación, fotocopia o cualquier otro, sin la previa autorización escrita por parte de la editorial. Diríjase a CEDRO (Centro Español de Derechos Reprográcos), www.cedro.org, si necesita fotocopiar o escanear algún fragmento de esta obra. COPYRIGHT © 2011 IBERGARCETA PUBLICACIONES, S.L. info@garceta.es Bases de Datos © Iván López Montalbán, Ma Jesús Castellano Pérez, John Ospino Rivas 1.° edición, 3.° impresión OI: 0078/2012 ISBN: 978-84-9281-291-2 Deposito Legal: M-33366-2011 Imagen de cubiertazpisotskii © fotoIia.com Impresión: PRINT HOUSE, marca registrada de Copiar, S. A. IMPRESO ENESPAÑA-PRINTED IN SPAIN Nota sobre enlaces a páginas web ajenas: Este libro puede incluir referencias a sitios web gestionados por terceros y ajenos a IBERGAR- CETA PUBLICACIONES,S.L., que se incluyen sólo con nalidad informativa. IBERGARCETA PUBLICACIONES,S.L., no asume ningún tipo de responsabilidad por los daños y perjuicios derivados del uso de los datos personales que pueda hacer un tercero encargado del man- tenimiento de las páginas web ajenas a IBERGARCETA PUBLICACIONES, S.L., y del funcionamiento, accesibilidad y mantenimiento de los sitios web no gestionados por IBERGARCETA PUBLICACIONES,S.L., directamente. Las referencias se proporcionan en el estado en que se encuentran en el momento de publicación sin garantías, expresas o implícitas, sobre la información que se proporcione en ellas.
  • 4.
    PRÓLOGO Este libro estáconcebido para formar estudiantes de los ciclos de grado su- perior DAM (Desarrollo deAplicaciones Multiplataforma) y DAW (Desarrollo de Aplicaciones Web). Más concrementamente, está pensado para cubrir la unidad de competencia UC0026_3, programar bases de datos relacionales mediante el módulo Base de datos común a ambos ciclos formativos. Desde nuestra experiencia como administradores de bases de datos en empre- sas multinacionales, como profesores de educaciónsecundaria (Informática)y como profesores asociadosde universidad, hemos compuestoesta herramienta complemen- taria a las clasesdel módulo de formación profesional e indispensable para lectores independientes que quieran convertirse en programadores de basesde datos. El contenido del libro tiene una orientación puramente práctica, con actividades, consejos y ejercicios resueltos en Access, MySQL, Oracle y DB2, que facilitan al profesor del módulo su completo seguimiento. El objetivo del libro no esser una guía de referencia de un solo SGBD, sino la for- mación de programadores de bases dedatos actualizados, versátiles y competentes. Existe multitud de material disponible para la realización de las prácticas pro- puestas en el blog bbdd-garceta.blogspot . com.
  • 5.
    Índice general 1. Lossistemas de almacenamiento de la información 1.1. Ficheros 1.1.1. Tipos de cheros y formatos .. . ........ ... ..... 1.1.2. Ficheros de texto 1.1.3. Ficheros binarios Bases de Datos 1.2.1. Conceptos . . . . . . . . . . . .. . .. . . . .. . . . . . . . . 1.2.2. Estructura de una base de datos . . . . .. .. . . .. . . . . . 1.2.3. Usos de las bases de datos 1.2.4. Evolución y tipos de base de datos Los Sistemas Gestores de Base de Datos 1.3.1. Concepto de Sistema Gestor de Base de Datos .. .. . .. . . 1.3.2. Funciones de un SGBD . . .. . .. . .. . .. .. . .. . . . . 1.3.3. El lenguaje SQL 1.3.4. Tipos de SGBD . . . . . . . . .. . . . . .. . . . . . . . .. . Prácticas Resueltas . . .. . . . . . .. . . . . . .. .. . .. . . . . . Prácticas Propuestas . . . . . .. . .. . . . . . .. . .. .. . . .. . Resumen . .. . . . . . . . .. . . . .. . . . .. . .. . . .. .. . . . Test de repaso . .. .. . .. . .. . . . .. . . . .. . . .. .. . . . . Comprueba tu aprendizaje . .. . . . .. .. . .. . . . .. . .. . . . 1.2. 1.3. 1.4. 1.5. 1.6.
  • 6.
    Bases de Datos 2.4.1.Generalización y Especialización . . . . . .. . . .. . . . . . .59 2.5. Construcción de un diagrama E/R . . .. . .. . .. . . . . . . . .. 62 2.6. El modelo relacional . . . .. . . . .. . .. . .. . . . . . . . . .. .64 2.6.1. Las relaciones en el modelo relacional . . . . . . . .. . . .. .65 2.6.2. Otros conceptos del modelo relacional . . .. . .. .. . . . .. 65 2.7. Transformación de un diagrama E/ R al modelorelacional . . . . . . .67 2.8. Normalización . . .. . . . .. . . . . . . .. . . .. . .. . . . . . . .73 2.9. Prácticas Resueltas . . . .. . . . . . . .. . . . . . .. . . . . .. .. 77 2.10. Prácticas Propuestas . .. . . .. . . . .. . . . .. . .. . .. . . . .81 2.11. Resumen . . . . .. . .. . .. . . .. . . .. . . .. . .. . . .. . . .88 2.12. Test de repaso . . . . . .. . . . . . . . . . . . . . . . .. . . .. . .. 89 2.13. Comprueba tu aprendizaje .. . . . . . . . . . . . . . . . . . . . . . .90 3. Diseño físico relacional 91 3.1. Notación para la sintaxis . . . .. . . .. . . . . .. . .. . . .. . . .92 3.2. Herramientas grácas proporcionadas por los SGBD . . .. . . .. . .93 3.2.1. PhpMyAdmin de MySQL .. . . .. . . . .. . . . .. . . . .93 3.2.2. Oracle Enterprise Manager y Grid Control . .. . . . . .. . .94 3.2.3. DB2 Data Studio . .. . . . . . . . . . . . . . . .. . . . . . .96 3.3. Intérpretes de comandos de los SGBD . .. . . . .. . . . . .. . .. .97 3.3.1. MySQL: El cliente de MySQL-Server .. . . . . . . .. .. . .98 3.3.2. Ejecución de consultas en MySQL .. . . . . . . . . . .. . . .99 3.3.3. SQL*Plus: El intérprete de comandos de Oracle . . . . . .. . 102 3.3.4. Ejecución de consultas en SQL*Plus .. .. . .. . . . . . . .103 3.4. El lenguaje de denición de datos . .. . .. . . . . . . . .. . . . . .104 3.5. Creación de bases de datos . . . . . .. . .. . . . . . . . . .. . . . .105 3.5.1. Creación de basesde datos en MySQL . .. . .. . . . . . . .105 3.5.2. Creación de bases de datos en Oracle . . .. . . .. . . . . .. 107 3.6. Modicación de una base de datos . . . . . . .. . . .. . .. .. . . .110 3.7. Borrado de bases de datos . .. . .. .. . . .. .. . . . . .. . . . .111 3.8. Creación de tablas . . .. . . .. . . . . . .. . .. . .. . . .. . . .111 3.8.1. Implementación de restricciones . . . . . .. . . . . . . . . . .113 3.8.2. Tipos de Datos . . . . . .. . . .. . . . . . . . .. . . . . .. 116 3.8.3. Características de la creación de tablas para MySQL . .. . .117 3.8.4. Características de la creación de tablas para Oracle . .. . . .118 3.8.5. Consulta de las tablas de una base de datos . . . . . . . . . .119 3.8.6. Consulta de la estructura de una tabla .. . . . .. . . . .. .119 3.9. Modicación de tablas . . . . .. . . . . . . . . . . . . .. .. . . .. 120 3.10. Borrado de tablas . . . . . .. . . . . . . . . .. . . . . . . . .. . . .122 3.11. Renombrado de tablas . . . . . . . . . . . . . .. . . .. .. . . . . .122 3.12. Prácticas Resueltas . . . . . .. . .. . . . . . . .. . .. . .. . .. .123 VIII
  • 7.
    Índice general 3.13. PrácticasPropuestas .. . . . .. . .. . .. . . . .. . .. . . .. . .128 3.14. Resumen . . . . . .. . .. . . . . . .. . . . . . . . . . .. .. . .. .130 3.15. Test de repaso .. . . . . . . . . . . . . . .. . . . .. . . . . . . . . .131 3.16. Comprueba tu aprendizaje . .. . . . . . . . .. . . . . . . . . .. . . 132 . Realización de Consultas 133 4.1. El lenguaje DML . .. . . . . . . .. . .. . . . . . .. . . .. . . .. 134 4.2. La sentencia SELECT . . . . . .. . .. . . .. . .. . . . .. . . . .134 4.3. Consultas básicas .. . .. . .. .. . . . . . .. . .. . . . . . . . . .135 4.4. Filtros . . . . . . . . . .. . . .. . . . . . . . .. . .. . . .. . . . .137 4.4.1. Expresiones para ltros . .. .. . . . .. . . . .. . . . .. . .138 4.4.2. Construcción de ltros . . . . . . . .. . . . . . . .. . . . . .140 4.4.3. Filtros con operador de pertenencia a conjuntos . . . . . .. .141 4.4.4. Filtros con operador de rango . .. . . . . . . .. . . . .. . .142 4.4.5. Filtros con test de valor nulo . .. . . . . . .. . . . .. . .. . 143 4.4.6. Filtros con test de patrón . . . .. . . . . . . . . . . . . . . .143 4.4.7. Filtros por límite de número de registros . . . . . . .. . . . .144 4.5. Ordenación . .. . . .. . . . . . . .. .. . .. . . .. .. . . . . . .145 4.6. Consultas de resumen . . . . .. . . .. . . . . . . . . . .. . . . . . .147 4.6.1. Filtros de Grupos . . . .. .. . . .. . . . . . . .. .. . . . .151 4.7. Subconsultas . . . . .. . . .. . . .. . .. . . .. . . . . .. . .. .152 4.7.1. Test de Comparación . . .. . . . .. .. . . . .. . . .. . . .153 4.7.2. Test de pertenencia a conjunto .. . .. . .. . . . .. . . . .154 4.7.3. Test de existencia .. .. . .. .. .. . . . . . .. . . . . . . .154 4.7.4. Test cuanticados ALL y ANY . . . . . . . . . . . . . . . . .156 4.7.5. Subconsultas anidadas . . . .. . . . . .. . . . . . . . . . . .157 4.8. Consultas multitabla . .. . . . . . . . . .. .. . . . . . . . . . . . .158 4.8.1. Consultas multitabla SQL 1 . . . . .. . . . . . .. . . . . . .159 4.8.2. Consultas multitabla SQL 2 . . .. . . . . .. .. . . . . .. .162 4.9. Consultas reexivas . . .. . .. . .. . .. . . . . . . . . . . . . .. .169 4.10. Consultas con tablas derivadas . .. . . . . . . .. . . . . .. .. . .. 170 4.11. Prácticas Resueltas . .. . . . . . . . . . .. .. . . . .. . . . . . . .172 4.12. Prácticas Propuestas . . . . .. .. . . .. . . . . . . . . . . . .. . .176 4.13. Resumen . . . . . . . . .. . . . . .. . .. . . . . .. . . . . . .. . .182 4.14. Test de repaso .. . .. .. . . . . . .. . . . . . . . . . .. .. . .. . 183 4.15. Comprueba tu aprendizaje . . . .. . .. . .. . . . .. . . . .. . . .184 .Tratamiento de los datos 185 5.1. Herramientas grácas para la edición de los datos . . . . .. . . . . .186 5.1.1. Edición con phpMyAdmin .. .. . . . .. . . . . .. . .. .. 186 5.1.2. Access como entorno gráco para otros gestores . . . .. . .. 187 IX
  • 8.
    Bases de Datos 5.2.La sentencia INSERT . . . . . . . .. . . . .. . .. . . . .. . . . . .189 5.3. La sentencia INSERT extendida . . . . .. . . . . . .. .. .. . .. . 191 5.4. INSERT y SELECT .. . . . .. . .. . . . .. . .. .. . .. .. . .191 5.5. La sentencia UPDATE . .. .. . . . .. . . . . . .. . .. . .. . . .192 5.6. La sentencia DELETE .. . . . .. . .. .. . .. . . . . . . . .. . . 193 5.7. La sentencias UPDATE y DELETE con subconsultas . . . .. .. . .193 5.8. Borrado y modicación de registros con relaciones . . .. .. . . .. .194 5.9. Transacciones . . . . . . . . . . .. . . . . . . . . .. . . . . . .. . .197 5.10. Acceso concurrente a los datos . . . . .. . .. . . . . .. . .. . . . .198 5.10.1. Ejemplo de problemas en el acceso concurrente . . . . . . . . .200 5.11. El acceso a la información . . . . . .. . .. . . . . .. . . . . . . . .203 5.12. Las vistas . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . .203 5.13. Los usuarios . . . . . .. .. . . . . . .. .. .. . . . . . . .. . . . .205 5.14. Los privilegios . . . . . . .. .. .. . . . . . . .. . . .. . . . . . . .207 5.14.1. El sistema de privilegios de l&#39;IySQL .. .. . .. . . . . . . . .208 5.14.2. El sistema de privilegios de Oracle .. . .. . . . .. . . . . .212 5.14.3. El sistema de privilegios de DB2 .. . .. . . . . .. .. . . .. 219 5.15. Prácticas Resueltas . . . . .. . . . . .. . . .. . . . . .. . . . .. .221 5.16. Prácticas Propuestas . .. .. . . . . . . . . . . .. . . . . . . . . . .223 5.17. Resumen . .. . .. .. . . . .. .. .. . .. . . . . . . .. . . .. .. 228 5.18. Test de repaso . . . . . .. . . . . . . . . . .. . . .. .. . .. . . .. 229 5.19. Comprueba tu aprendizaje . .. .. . . .. . . .. . .. . . . . . .. . 230 6. Programación de bases de datos 231 6.1. Introducción a la programación de bases dedatos .. .. . . . .. .. 232 6.2. Los lenguajes de programación de bases dedatos . . . . . .. . .. .235 6.3. Tipos de datos, identicadores y variables . . . . .. . . .. . . . . .240 6.4. Operadores y expresiones . .. . . . . . . . . . . . . . .. . .. .. . .243 6.5. Estructuras de control . . .. .. . . . . . . . . . . . .. . . . . . . .245 6.5.1. IF..THEN-ELSIF..THENELSE-END IF . . . . . . . . . . . .245 6.5.2. CASE-WHENTHEN-ELSE-END CASE . .. . . . . .. . . .246 6.5.3. LOOP-EXIT WHEN-END LOOP .. .. . .. . . .. . .. .. 247 6.5.4. WHILE..LOOP-END LOOP . . .. . .. . . .. . .. . . . . .248 6.5.5. FOR..IN..LOOP-END LOOP . . .. . . . .. . . . . . . . . .248 6.6. Gestión de errores . . . . . . .. . . . . . . . . . . .. .. . . .. . .. 251 6.7. Transacciones en scripts . . . . . . . . . . . . . . .. .. . .. . . . .253 6.8. Las secuencias . . . . . .. .. .. . . . .. . . . .. . . . . . . .. . .257 6.9. Prácticas Resueltas . . . .. . . .. . . .. . .. . .. . . . . . . . . .258 6.10. Prácticas Propuestas . . . . . . . .. .. . . . .. . .. . . . . .. . .262 6.11. Resumen . . .. .. . . . . . . .. .. .. . . .. . . . . . . .. . . . . 264 6.12. Test de repaso . . . .. . . . . .. . . . . . . . . . . . . . .. .. . . .265
  • 9.
    Índice general 6.13. Compruebatu aprendizaje .. .. . . . . . .. . .. .. . .. . .. .. 266 .BBDD distribuidas 267 7.1. BBDD y SGBD distribuidos . . . . .. . .. . . . . . . . . . . . .. .268 7.1.1. Componentes de una BBDD distribuida .. .. . .. . . . . .268 7.2. Técnicas de fragmentación .. . . . . .. . .. .. . . . . . .. . . . .270 7.3. Consultas distribuidas . .. . . . . . . . . .. . .. . . .. . . . .. .271 7.3.1. DB Links . . . .. . . . . . . .. . .. . . .. . . . . . .. . .271 7.3.2. Ejecución de consultas distribuidas . .. .. .. . . . . .. . .273 7.4. Transacciones distribuidas . . . . .. . . .. . .. . . . . .. . . . . .275 7.4.1. TWO-PHASE COMMIT . .. . . .. . . . . .. . . . . . . .. 276 7.4.2. Ejemplo de transacción distribuida . . . . . . . . . . . . . . .277 7.5. Optimización de consultas sobre basesde datos distribuidas . . . .. 280 7.5.1. Optimización mediante consultas derivadas .. . . . . . .. .. 280 7.5.2. Optimización mediante hints . . .. .. . . . . . . . . . .. . .281 7.6. Prácticas Resueltas . .. . . . . .. .. . .. . . . .. . . .. . .. . .283 7.7. Prácticas propuestas .. . . .. . . .. . . .. . . .. . . .. . . . . . 286 7.8. Resumen . . . . . . . . . . . . . . .. . . . . . .. . .. . . . . . . ..289 7.9. Test de repaso . . . . . . .. .. . . . . . . . . . . . . . . . . . . .. .290 7.10. Comprueba tu aprendizaje . . . . . . . .. . .. .. . . . . . . .. .. 291 .BBDD Objeto-Relacionales 293 8.1. Las Bases dedatos objetos-relacionales . . .. . .. . . . . . .. . . . 294 8.2. Los atributos multivaluados .. . .. . .. .. . .. . . . .. . . . . .294 8.2.1. Las colecciones . . . . . . . . . . . . . . . . . . . . . . . . . .295 8.2.2. Tablas anidadas .. . . . . .. . . . . . . . .. . . . . . . .. .296 8.2.3. Tipos de Objeto .. .. . . . . .. . . . . . .. . . . .. . . . .298 8.3. Los identicadores de objeto .. . . . .. . .. . . .. . . . .. . . . .300 8.4. Los métodos . . .. .. . . .. . . . . .. . .. . . . . . . . . . . . . .301 8.5. La herencia . .. . . .. .. .. . . . .. . . .. . . . . . . . . . .. .304 8.6. Operaciones DML .. .. .. . . . .. .. . .. . . . . . . .. . . . . .306 8.7. Las referencias . . . .. . . . . .. . . .. . . . . . . . . . . . . . . . .307 8.8. Prácticas Resueltas . . .. . . . . . . .. . .. .. . .. . . .. .. . . 309 8.9. Prácticas Propuestas .. .. . . .. . . . .. . . .. . . .. . .. .. . 312 8.10. Resumen . . .. .. . . . . .. . .. . . . .. . . .. . . . . .. .. . . 314 8.11. Test de repaso . . . . . . . .. . . . . . . . . .. . . . . . . .. . . . .315 8.12. Comprueba tu aprendizaje .. . . . .. . . .. . . . . . . . . . . .. . 316 XI
  • 10.
    CAPÍTULO 1 Los sistemasde almacenamiento de la información Objetivos W Analizar los sistemaslógicos de almacenamiento V sus carac- .terísticas Contenidos Identicar los distintos tipos de Ñ Ficheros.Tipos y formatos bases de datos n? Bases de datos. Conceptos. . Reconocer la utilidad de un sis- usos y tipos tema gestor de base de datos n? Sistemas gestores de bases de Describir la función de los ele- datos mentos de un sistema gestor de base de datos Clasicar los sistemas gestores de bases de datos Este capítulo introduce conceptos sencillos e intuitivos para establecer una cultura básica de bases de datos, y poder, de este modo, avanzar a objeti- vos más avanzados. E1estudiante, a modo introductorio, manejará, de forma muy visual, conceptos tales como tablas y relaciones. De esta manera, afron- tará capítulos próximos con más experiencia, y entenderá y asimilará mejor el diseño lógico y sico de las bases dedatos.
  • 11.
    Bases de Datos 1.1. Ficheros Un ordenador almacena muchos tipos de información, desde datos administrati- vos, contables o bancarios hasta música, películas, partidas de videojuegos, páginas webs, etc. Toda esta información está almacenada en los dispositivos de almace- namiento del ordenador, esto es, discos duros, dvds, pen drives, etc. Para poder organizar la información en estos dispositivos, se utilizan los cheros o archivos. Los cheros son estructuras de información que crean los sistemas operativos de los ordenadores para poder almacenar datos. Suelen tener un nombre y una extensión, que determina el formato de la información que contiene. 1.1.1. Tipos de cheros y formatos El formato y tipo de chero determina la forma de interpretar la información que contiene, ya que, en denitiva, lo único que se almacena en un chero es una ristra de bits (ceros y unos), de forma que esnecesaria suinterpretación para dar sentido a la información que almacena.Así, por ejemplo, para almacenar una imagen en un ordenador, se puede usar un chero binario bmp, que almacena un vector de datos con los colores que tiene cada pixel que forma la imagen. Además, la imagen posee una paleta de colores y unas dimensiones, información que también hay que almacenar en el chero. Todos estosdatos seordenan según un formato, y el sistema operativo, o la utilidad que trate los grácos, debe conocer este formato para poder extraer los píxeles y mostrarlos por pantalla en la forma y dimensiones correctas. Si se abre el graco con una utilidad como el bloc de notas, que solo sabe interpretar texto, el resultado será ilegible e incomprensible. <> Actividad 1.1: Buscaen tu ordenador un chero con extensión doc (del pro- cesador detextos Microsoft Word), y ábrelo conel bloc de notas,pulsando conel ratón derecho sobre el y seleccionando la opción Abrir con. Observa que el bloc de notas no conoce el formato del chero tipo doc, y por tanto, no sabe interpretar el contenido del chero, cosa que sí hace la aplicación de Microsoft. Tradicionalmente, los cheros se han clasicado de muchasformas, segúnsu conte- nido (texto o binario), según suorganización (secuencial, directa, indexada)o según su utilidad (maestros, históricos, movimientos). El contenido de un chero puede ser tratado como texto, o como datos binarios, es decir, los bits almacenados en un chero pueden ser traducidos por el sistema operativo a caracteres alfabéticos y números que entiende el ser humano, o pueden
  • 12.
    Capítulo 1. Lossistemas de almacenamiento de Ia información ser tratados como componentesde estructuras de datos más complejas,como cheros que almacenan sonido, vídeo, imágenes, etc. La organización de un chero dicta la forma en quese hande accedera losdatos, así, los datos de un chero con organización secuencial, están dispuestos siguiendo una secuencia ordenada, es decir, unos detrás de otros. Se caracterizan por tener que recorrer todos los datos anteriores para llegar a uno en concreto. Los cheros de organización directa, permiten acceder a un dato en concreto sin necesidad de acceder a todos los anteriores. Finalmente, los de organización indexada acceden a los datos consultando un índice, es decir, una estructura de datos que permite acceder a la información rápidamente, simulando la forma en que el índice de un libro facilita el acceso a sus contenidos. Existen también variantes de las anteriores que mezclan las mejores características de cada una de ellas. Por otro lado, la utilidad de un chero indica qué uso se va a hacer de él, por ejemplo, puede contener datos fundamentales para una organización, como los datos de los clientes, que se almacenan en un chero principal llamada maestro. Si hay variaciones (altas,modicaciones o bajas de clientes) en los cheros maestros, se almacenan en los llamados cheros de movimientos que posteriormente se enfrentan con los maestros para incorporar las modicaciones. Finalmente, cuando existen datos que ya no son necesariospara su proceso diario pasan a formar parte de los cheros históricos. Hoy en día, estas dos últimas clasicaciones han quedado en desuso. Por ejemplo, desde la aparición de las bases de datos modernas, ya no se clasican según su utilidad u organización. Actualmente un sistema opera.tivo trata. un chero desde dos puntos de vista: 1. Segúnsu contenido(texto o datos binarios) 2. Según su tipo (imágenes, ejecutables, clips de videos, etc.) 1.1.2. Ficheros de texto Los cheros de texto suelen llamarse también cheros planos o cheros ascii. El vocablo ascii es un acrónimo de American Standard Code for Information Inter- change. Es un estándar que asigna un valor numérico a cada carácter, con lo que se pueden representar los documentos llamados de Texto Plano, es decir, los que son directamente legibles por seres humanos.
  • 13.
    Bases de Datos Laasignación de valores numéricos a caracteres viene dada por la famosa tabla de códigos ascii, que es la más extendida, aunque existen otras. Se caracteriza por utilizar 1 byte para la representación de cada carácter. Con x bits se puedengenerar 2 combinacionesdistintas de caracteres, ycomo 1byte = 8 bits, existen 28= 256 caracteres en la tabla de códigos ascii, numerados del 0 al 255. <> Actividad 1.22 Conéctate a Internet,y buscauna tablade códigos ascii de8 bits. Observa las siguientes características: - Los 32 primeros caracteres, sellaman caracteres no imprimibles y se utilizaban tradicionalmente para el control de transmisiones. ILa distancia entre mayúsculas y minúsculas es exactamente 32 caracteres. n Hay caracteres queson numéricos, y cuyo valor ascii es elresultado de sumarle 48. Por ejemplo, 6+48=54. 54 es el código ascii del carácter 6. Algunos alfabetos, como el katakana japonés utilizan más de 256 caracteres. En estos casos,se requierenlas tablas de caracteres unicode, quereservan dosbytes para cada carácter. o Actividad 1.32 Conéctate a http://mm.unicode.org/charts/ y descárgate las tablasde códigosLatin (alfabeto latino) y K atakana (alfabeto japonés).Observa las siguientes curiosidades: n La tabla de códigos Latin ,es exactamente idéntica a la tabla de códigos ascii de 8 bits, solo que los bits del primer byte unicode, están todos a 0. ILa tablas de códigos Latin y Katakana tienen múltiples extensiones, como Katakana Phonetic Extensions o Latin Extended Additional. Los cheros de texto, aunque no necesitan un formato para. ser interpretado, suelen tener extensiones para conocer qué tipo de texto se halla dentro del chero, por ejemplo: - Ficheros de conguración: Son cheros cuyo contenido es texto sobre con- guraciones del sistema operativo o de alguna aplicación. Estos pueden tener extensión .ini, .inf ,.conf
  • 14.
    Capítulo 1. Lossistemas de almacenamiento de la información IFicheros de código fuente: Su contenido es texto con programas informáticos. Ejemplos: sql, .c, .java n Ficherosde páginas web: Laspáginas webs son cherosde textocon hipertexto que interpreta el navegador. html, php, .css, .xml n Formatos enriquecidos: Son textos que contienen códigos de control para ofre- cer una visión del texto más elegante: .rtf, .ps ,.tex ¿Sabías que .. . 7 XML es unlenguaje estándar para elintercambio de datos entre aplicaciones informáticas. Se están desarrollando actualmente las llamadas basesde datos nativas XML. cuyo foco principal es el aI1nacenamien- to de documentos de texto con código en XML. y no las relaciones entre la información, como sucede conlas basesde datos relacionales quese estudianen el presentelibro. Por ejemplo, DB2 incorpora dentro de sumotor una nueva ca- racterística que potencia el XML: XQuery, esto es,un lenguaje innovador para hacer consultas directamente sobre documentos XML guardados directamente en la base de datos. 1.1.3. Ficheros binarios Los cheros binarios son todos los que no son de texto, y requieren un formato para ser interpretado. A continuación se muestran algunos tipos de formatos de cheros binarios: IDe imagen: jpg, gif, .tiff, .bmp, .wmf, .png, .pcx; entre muchos otros n De vídeo: .mpg, .mov, .avi, .qt IComprimidos o empaquetados: .zip. .Z, .gz, tar, .lhz IEjecutables o compilados: exe. .com, .cgi, .0, .a IProcesadores de textos: .doc, .odt lEl hipertexto es unaforma de escritura no secuencial, conbifurcaciones, quepermite que el lector elija qué secuencia seguir y que es presentado en una pantalla interactiva para facilitar la navegación.
  • 15.
    Bases de Datos Generalmentelos cheros que componen una base de datos son de tipo binario, puesto que la información que hay almacenada en ellos debe tener una estructura lógica y organizada para que lasaplicaciones puedan acceder aella de manera univer- sal, estoes, siguiendoun estándar. Esta estructura. lógica y organizada, generalmente es muy difícil de expresar mediante cheros de texto, por tanto, la información de una base de datos se sueleguardar en uno o varios cheros: u El software de gestión de base dedatos Oracle guarda la información en múlti- ples tipos de cheros, llamados datales, temples, logles, etc. IUn tipo de tablas del gestor liI;vSQL guarda su información en 3 cheros de datos binarios, con extensión frm, myd y myi. n Access guarda toda la información de una base de datos con extensión mdb. <> Actividad 1.4: La siguiente imagen es una captura de una carpeta en elsistema operativo Windows 7. Indica qué tipo de chero es cadauno de ellos y qué contiene. HcmL-re Fecha de nmzhwïcecicn Tnpc Tamahc u112i l E Battlestar Galactica -lxLavi Úí 3-322v]? "LJ Íhp de ¿dee 6&#39; -4 11 a Í u r J "n 1 . o _. __ (omojnstalantxt i- DSCN0776JPG 5&#39; eclipseexe l 1 v. q . t n1 a ¡If L __ eclipseini c: t. a V IJ - .-- img_xp_sp3.iso _ lícencia_windows.bct ,4 (¡r
  • 16.
    Capítulo 1. Lossistemas de almacenamiento de la información de forma ordenada y coherente (sincontradicciones). Cadauna de estas tablases una estructura que se parece a las hojas de cálculo, pues está dispuesta mediante las y columnas. De este modo, cada la almacena un registro con tantos campos como columnas tenga la tabla. Por ejemplo, sepodría tener una tabla de Empleados, donde cada la o registro es un empleado de la empresa y cada columna o campo representa un trozo discreto de información sobre cada empleado, por ejemplo el nombre o el número de teléfono. jímpliidïvï - - Y CodngoEmple v Nombre v Apellidol v Apellndoz v Extension v Email v codugoo : 1 Marcos Magaña Perez 3897 marcos@jardnneria.es TAL-ES 4 2 Ruben López Martinez 2899 rlopez@jardmeria.es TAL-ES 3 Alberto Soria Carrasco 2837 asoria@}ardineria.es TAL-ES _ 4 Maria Solís Jerez 2847 msolis@jardineria.es TAL-ES E 5 Felipe Rosas Marquez 2844 frosas@jardineria.es TAL-ES l 6 JuanCarlos 0m: Serrano 2845 cortiz@jardnnerua.es TAL-ES l 7 Carlos Soria Jimenez 2444 csorxa@jardmeria.es MAD-ES x 8 Mariano López Murcia 2442 mlopezcenardmenaes rvlAD-ES 9 Lucio Campoamor Manín 2442 lcampoamorczïjardineriaes MAD-ES 10 Hilario Rodriguez Huertas 2444 hrodrlguez@jardineria.es MAD-ES 11 Emmanuel Magaña Perez 2518 manu@¡ardinena.es BCN-ES 12 José Manuel Martinez De laOsa 2519 ¡mmanéïhotmarles BCN-ES 13 David Dalma Aceituno 2519 dpalma@jard¡neria.es BCN-ES 14 Oscar Palma Aceituno 7519 opalma@jardineria.es BCN-ES 15 Francois Fugnon 9981 ffignonQgardeningxom PAR-FR 16 Lionel Narvaez 9982 lnarvaez@gardening.com PAR-FR 17 Laurent Serra 9982 lserra@gardening.com PAR-FR 18 Michael Bolton 7454 mboltoncaïgardeningmom SFC-USA ___ ___19 W_a|_ïe_r_ Santuag Sanchez Lopez 7454 wssanchez@gardenlng.com SFC-USA v Registro: H 4 46231 P N P -Buscar 4 m l I Figura 1.1: Ejemplo de tabla en Microsoft Access. 1.2.1. Conceptos Uno de los grandesproblemas al que seenfrentan los informáticos cuando comien- zan su aprendizaje, es el gran número de términos desconocidos que debe asimilar, incluyendo el enorme número de sinónimos y siglas que se utilizan para nombrar la misma cosa. Tratando, a modo de resumen, de aclarar algunos de lo componentes que sepueden encontrar en una base dedatos, y que severán en próximos capítulos, se denen los siguientes conceptos: Dato: El dato es un trozo de información concreta sobre algún concepto o suceso. Por ejemplo, 1996 esun número que representa un año de nacimiento de una persona. Los datos se caracterizan por pertenecer a un tipo. Tipo de Dato: El tipo de dato indica la naturaleza del campo. Así, se puede te- ner datos numéricos, que son aquellos con los que se pueden realizar cálculos aritméticos (sumas,restas, multiplicaciones. . .) y los datos alfanuméricos, que 7
  • 17.
    Bases de Datos sonlosque contienen caracteres alfabéticos y dígitos numéricos. Estos datos al- fanuméricos y numéricos se puedencombinar para obtener tipos de datos más elaborados. Por ejemplo, el tipo de dato Fecha contiene tres datos numéricos, representando el día, el mes y el año de esafecha. Campo: Un campo esun identicador para toda una familia de datos. Cada campo pertenece a un tipo de datos. Por ejemplo, el campo F echaNacimiento repre- senta las fechas denacimiento de las personasque hay en la tabla. Este campo pertenece al tipo de dato Fecha. Al campo también se le llama columna. Registro: Es una recolección de datos referentes a un mismo concepto o suceso. Por ejemplo, los datos de una persona pueden ser su NIF, año de nacimiento, su nombre, su dirección, etc. A los registros también se les llama tuplas o las. Campo Clave: Es un campo especial que identica de forma única a cada registro. Así, el NIF es único para cada persona, por tanto es campo clave. Hay varios tipos de campos clave como se explicará en la. sección 2.6.2. Tabla: Es un conjunto de registros bajo un mismo nombre que representa el con- junto de todos ellos. Por ejemplo, todos los clientes de una base de datos se almacenan en una tabla cuyo nombre es Clientes. Consulta: Es una instrucción para hacer peticiones a una base de datos. Puede ser una búsqueda simple de un registro especico o una solicitud para seleccionar todos los registros que satisfagan un conjunto de criterios. Aunque en cas- tellano, consulta tiene un signicado de extracción de información, en inglés query, una consulta es una petición, por tanto, además de las consultas de búsqueda de información, que devuelven los campos y registros solicitados, hay consultas(peticiones) deeliminación o inserción deregistros, deactuali- zación de registros, cuya ejecución altera los valores de los mismos. Índice: Es una estructura que almacena los campos clave de una tabla,orga- nizándolos para hacer más fácil encontrar y ordenar los registros de esatabla. El índice tiene un funcionamiento similar al índice de un libro, guardando pa- rejas de elementos: el elemento que se deseaindexar y su posición en la base de datos. Para buscar un elemento que esté indexado, solo hay que buscar en el índice de dicho elemento para, una vez encontrado, devolver el registro que se encuentre en la posición marcada por el índice. Vista: Es una transformación que se hace a una o más tablas para obtener una nueva tabla. Esta nueva tabla es una tabla virtual, es decir, no está almacenada en los dispositivos de almacenamiento del ordenador, aunque sí se almacena su denición.
  • 18.
    Capítulo 1. Los sistemasde almacenamiento de la información Informe: Es un listado ordenado de los campos y registros seleccionados en un formato fácil de leer. Generalmente se usan como peticiones expresas de un tipo de información por parte de un usuario. Por ejemplo, un informe de las facturas impagadas del mes de enero ordenado por nombre de cliente. Guiones: o scripts. Son un conjunto de instrucciones, que ejecutadas de forma ordenada, realizan operaciones avanzadas de mantenimiento de los datos al- macenados en la base de datos. Procedimientos: Son un tipo especial de script que está almacenado en la base de datos y que forma parte de su esquema. 1.2.2. Estructura de una base de datos Una base de datos almacena los datos a través de un esquema. El esquema es la denición de la estructura donde se almacenan los datos, contiene todo lo necesario para organizar la información mediante tablas, registros (las) y campos (columnas). Tambiéncontiene otrosobjetos necesarios para el tratamiento de los datos (procedimientos, vistas, índices, etc.) y que se estudiarán en este libro. Al esquema también se le suele llamar metainformación, es decir, información sobre la información o metadatos. mysq1> select table_schema, tab1e_name, tab1e_rows -> from information_schema.tables -> where tab1e_schema=jardineria; + ------------ --+ -------------- --+ ---------- --+ I tab1e_schema I tab1e_name I tab1e_rows jardineria Clientes jardineria Deta11ePedidos jardineria Empleados jardineria GamasProductos jardineria Oficinas jardineria Pagos jardineria Pedidos jardineria Productos 9 rows in set (0,01 sec) Figura 1.2: Consulta de un esquema de una base de datos en MySQL. Los gestores de bases de datos modernos Oracle, MySQL y DB2, entre otros, almacenan el esquema de la base de datos en tablas, de tal manera que el propio 9
  • 19.
    Bases de Datos esquemade la base de datos se puede tratar como si fueran datos comunes de le. base de datos. Véase gura 1.2. 1.2.3. Usos de las bases de datos Las bases de datos son ubícuas, están en Cualquier tipo de sistema informático. a continuación se exponen solo algunos ejemplos de sus usosmás frecuentes: IBases de datos Administrativas: Cualquier empresa necesita registrar y rela- cionar sus clientes, pedidos, facturas, productos, etc. IBases de datos Contables: También es necesariogestionar los pagos, balances de pérdidas y ganancias, patrimonio, declaraciones de hacienda. . . IBases de datos para motores de búsquedas: Por ejemplo Google o Altavista. tienen una base deda.tos gigantescadonde almacenan información sobre todos los documentos de Internet. Posteriormente millones de usuarios buscan en la base de datos de estos motores. - Cientícas: Recolección de datos climáticos y medioambientales, químicos. genómicos, geológicos.. . IConguraciones: Almacenan datos de conguración de un sistema informático. como por ejemplo, el registro de windows. n Bibliotecas: Almacenan información bibliográca, por ejemplo, la famosa tien- da virtual amazon o la. biblioteca de un instituto. ICensos: Guardan información demográca de pueblos, ciudades y paises. IVirus: Los antivirus guardan información sobre todos los potenciales software maliciosos. IOtros muchos usos: Militares, videojuegos, deportes, etc. ¿Sabías que . . . 7 La &#39;WDCC (World Data ClimateCenter), centro mun- dial para datos del clima, es la base de datos más grande del mundo. Almacena alrededor de 6 petabytes de información, esto es 6144 Terabytes de informa- ción sobre clima, predicciones y simulaciones. La base de datos de Google está situada como la 4a más grande del mundo (Abril-QOIO). 10
  • 20.
    Capitulo 1. Los sistemasde almacenamiento de la información <> Actividad 1.5: Buscaen Internet las 10bases de datos más grandes del mundo. Anota su nombre y su tamaño, y, en una hoja de cálculo, genera un gráco que muestre la comparativa del tamaño de estas basesde datos. El consejo del buen administrador. . . Siempre hay que hacer copias de seguridad regularmente y a ser posible, de varios tipos. Cuando una base de datos tiene un tamaño brutalmente grande como las del WDCC o Google, hacer copias de seguridad se convierte en al- go prácticamente imposible, puesto que se tardarian semanas en realizarlas, y, además, es complicado encontrar dispositivos capaces de almacenar estas copias, por lo que en lugar de hacer copias de seguridad, se recurre a sistemas tolerantes a fallos, que logran que la probabilidad de perder un solo dato, sea prácticamente nula. 1.2.4. Evolución y tipos de base de datos La clasicación de lasbases dedatos en tipos, está.ligada a su evolución histórica. Según ha ido avanzando la tecnología, las basesde datos han mejorado cambiando la forma de representar y extraer la información. De esta manera, se presenta la evolución sufrida por las bases dedatos desde las épocas prehistóricas de la informática hasta la actualidad: En la década de 1950 se inventan las cintas magnéticas, que solo podían ser leídas de forma secuencial y ordenadamente. Estas cintas, almacenaban cheros con registros que se procesabansecuencialmente junto con cheros de movimientos para generar nuevos cheros actualizados. Estos sistemasse conocencomo aplicaciones basadas en sistemas de cheros y constituyen la generación cero de las bases de datos, pues ni siquiera entonces existía el concepto de basesde datos. En la década de1960 segeneraliza el uso dediscos magnéticos,cuya característica principal es que se podía acceder de forma directa a cualquier parte de los cheros, sin tener que acceder a todos los datos anteriores. Con esta tecnología aparecen las bases dedatos jerárquicas y en red, queaprovechan la capacidad de acceso directo a la información de los discos magnéticos para estructurar la información en forma de 11
  • 21.
    Bases de Datos listasenlazadas y árboles de información. La losofía de las bases dedatos en red es que un concepto principal o padre puede tener numerosas relaciones con conceptos secundarios o hijos. Las bases dedatos jerárquicas, evolucionan para admitir varios padres para un concepto hijo. ¿Sabías que . . . 7 En octubre de1969 se concibe elprimer modelode base dedatos en red. conocido como CODASYL (Conference on Data Systems Language), que posteriormente IBM rena. y mejora mediante el modelo IMS (Information Management System) para el programa Apollo de la NASA. Edgar Frank Codd, cientíco informático inglés de IBM, publica en 1970 en un artículo Un modelo relacional de datos para grandes bancos de datos compartidos (A Relational Model ofData forLarge Shared Data Banks), donde denió el modelo relacional, basado en la lógica de predicados y la teoría de conjuntos. Nacieron, de esta forma, las basesde datos relacionales, o segunda generación de basesde datos. Larry Ellison, fundador de Oracle. se inspiró en este artículo para desarrollar el famoso motor de basede datos, que comenzócomo un proyecto para la CIA (Central Intelligence Agency) americana. La potente base matemática de este modelo, es el gran secreto de su éxito. Hoy en día, el modelo relacional de Codd, pese a tener muchas alternativas, sigue siendo el más utilizado a todos los niveles. ¿Sabías que . . . 7 Las leyes de Codd son un conjuntode 13reglas (de la regla O a la regla 12) cuya nalidad es establecer las características que debe tener una base de datos relacional. Actualmente. todos los gestores de bases de datos implementan estas reglas. Puedes buscar en Internet estas reglas y leerlas con detenimiento. <> Actividad 1.6: Busca en Internetla biografíade lossiguientes personajes, y comenta su principal contribución a la evolución de las basesde datos: J Edgar Frank Codd J Bill Gates J Larry Ellison J Michael Monty Widenius J Roger Kent Summit 12
  • 22.
    Capítulo 1. Lossistemas de almacenamiento de la información En la década de 1980 IBM lanza su motor de bases de datos DB2, para la pla- taforma MVS. Unos añosdespués, IBMcrea elSQL (Structured Query Language), un potente lenguage de consultas para manipular información de bases de datos relacionales. A medidados de 1990, IBM lanza una versión de DB2 que escapaz de dividir una base dedatos enorme en varios servidores comunicadospor líneas de gran velocidad, creándose deeste modo las basesde datos paralelas. A esta versión se le llamó DB2 Parallel Edition, que ahora, ha evolucionado hasta el DBZ Data Partition Feature, único SGBD de este tipo en sistemas distribuidos. A nales de 1990 IBM y Oracle incorporan a sus bases dedatos la capacidad de manipular objetos, creando así, las basesde datos orientadas a objetos. Estas bases de datos orientadas a objetos se basan en la existencia de objetos persistentes que se almacenan para su procesamiento mediante programas orientados a objetos. En lugar de la losofía de almacenar relaciones y tablas, se almacenan colecciones de objetos que, además de información, tienen comportamientos (instrucciones sobre cómo procesar los datos). La aparición de Internet y el comienzo de la era de la información, crean nuevos requirimientos para bases dedatos. La cantidad de información comienza a creceren proporciones desconocidashasta el momento. De esta forma, se creanlas basesde da- tos distribuidas, que consistenen multiplicar el número de ordenadoresque controlan una basede datos (llamados nodos), intercambiándose información y actualizaciones a través de la red. Este increible aumento de datos a almacenar, organizados muchas veces en datos estadísticos recopilados con el trascurso de los años, hizo necesaria la aparición de un software llamado Software de ayuda a la decisión. Este software avanzado trata de dar respuestas concretasexaminando múltiples datos estadísticos que se han recopilado a lo largo del tiempo en bases dedatos multidimensionales, formando lo que se denominan cubos de información. Ventas del 2do 172010 España, Huelva Jamón de Bellota Q4 empo ¡z/broducto Provincia &#39; Figura 1.3: Ejemplo de cubo en una base de datos multidimensional. 13
  • 23.
    Bases de Datos También,a lo largo de la corta historia de la informática, han surgido otros tipos de basesde datos que se enumeran a continuación: - Bases de datos espaciales o geográcas: Son bases de datos que almacenan mapas v símbolos que representan supercies geográcas. Google Earth es u una aplicación que lanza consultas a bases dedatos de este tipo. n Bases de datos documentales: Permiten la indexación de texto para poder realizar búsquedas complejas en textos de gran longitud. IBases de datos deductivas: Es un sistema de bases de datos que almacena hechos y que permite, a través de procedimientos de inferencia, extraer nuevos hechos. Sebasan en la lógica, por ello también se suelen llamar bases dedatos lógicas. Base de datos Datos almacenados Sistemas de cheros Datos en cheros Jerárquicas Estructuras de datos (listas y árboles) varios cheros En red Estructuras de datos (árbolesy grafos) Relacionales Teoría de conjuntos y relaciones Orientadas a objetos Objetos complejos con comportamiento Geográcas Puntos, Líneas y Polígonos una o varias BBDD Deductivas Hechos y Reglas Documentales Documentos Distribuidas Múltiples varias BBDD en Multidimensionales Cubos varios ordenadores Cuadro 1.1: Resumen de los tipos de basesde datos. 1.3. Los Sistemas Gestores de Base de Datos 1.3.1. Concepto de Sistema Gestor de Base de Datos Se dene un Sistema Gestor de Base de Datos, en adelante SGBD, como el conjunto de herramientas que facilitan la. consulta, uso y actualización de una base de datos. Un ejemplo de software Gestor de Base de Datos es Oracle 11g, que incorpora un conjunto de herramientas software que son capaces deestructurar en múltiples discos duros los cheros de una base de datos, permitiendo el acceso asus datos tanto a partir de herramientas grácas como a partir de potentes lenguajes de programación (PL-SQL, php, c++. . .). 14
  • 24.
    Capítulo 1. Los sistemasde almacenamiento de 1a información 1.3.2. Funciones de un SGBD Los SGBD del mercado cumplen con casi todas funciones que a continuación se enumeran: 1. Permiten a los usuarios almacenar datos, acceder a ellos y actualizarlos de forma sencilla y con un gran rendimiento, ocultando la complejidad y las ca- racterísticas físicas de los dispositivos de almacenamiento. 2. Garantizan la integridad de los datos, respetando las reglas y restricciones que dicte el programador de la base de datos. Es decir, no permiten operaciones que dejen cierto conjunto de datos incompletos o incorrectos. 3. Integran, junto con el sistema operativo, un sistema deseguridad quegarantiza el acceso a la información exclusivamente a aquellos usuarios que dispongan de autorización. 4. Proporcionan un diccionario de metadatos, que contiene el esquemade la base de datos, es decir, cómo están estructurados los datos en tablas, registros y campos, las relaciones entre los datos, usuarios, permisos, etc. Este diccionario de datos debe ser también accesible de la misma forma sencilla que es posible acceder al resto de datos. 5. Permiten el uso de transacciones, garantizan que todas las operaciones de la transacción serealicen correctamente, y en caso dealguna incidencia, deshacen los cambios sin ningún tipo de complicación adicional. 6. Ofrecen, mediante completas herramientas, estadísticas sobre eluso del gestor, registrando operaciones efectuadas, consultas solicitas, operaciones fallidas y cualquier tipo de incidencia. Es posible de este modo, monitorizar el uso de la base de datos, y permiten analizar hipotéticos malfuncionamientos. 7. Permiten la concurrencia, es decir, varios usuarios trabajando sobre un mismo conjunto de datos. Además, proporcionan mecanismos que permiten arbitrar operaciones conflictivas en el acceso omodicación de un dato al mismo tiempo por parte de varios usuarios. 8. Independizan los datos de la aplicación o usuario que esté utilizándolos, ha- ciendo más fácil su migración a otras plataformas. 9. Ofrecen conectividad con el exterior. De esta manera, se puede replicar y distribuir bases de datos. Además, todos los SGBD incorporan herramientas 15
  • 25.
    Bases de Datos estándarde conectividad. Elprotocolo ODBC4está muyextendido como forma de comunicación entre bases de datos y aplicaciones externas. 10. Incorporan herramientas para la salvaguarda y restauración de la información en caso de desastre. Algunos gestores, tienen sosticados mecanismos para poder establecer el estado de una base dedatos en cualquier punto anterior en el tiempo. Además, deben ofrecer sencillas herramientas para la importación y exporta.ción automática de la información. <> Actividad 1.72 Busca en Internetlas leyes de Coddpara elfuncionamiento de sistemas gestores de bases de datos relaciones y establece una relación entre cada una de las leyes de Codd y las funciones que proporcionan los SGBD actuales. 1.3.3. El lenguaje SQL La principal herramienta de un gestor de base de datos es la interfaz de progra- mación con el usuario. Este interfaz consiste en un lenguaje muy sencillo mediante el cuál el usuario realiza preguntas al servidor, contestando este a las demandas del usuario. Este lenguaje comúnmente se denomina SQL, Structured Query Language, está estandarizado por la 1805, esdecir, todaslas bases de datosque soportenSQL deben tener la misma sintaxis a la hora de aplicar el lenguaje. Se divide en 4 su- blenguajes, el total de todos ellos permite al SGBD cumplir con las funcionalidades requeridas por CODD: - Lenguaje DML: o lenguaje demanipulación dedatos (Data Manipulation Language). Estelenguaje permitecon 4sentencias sencillas seleccionar deter- minados datos (SELECT), insertar datos (INSERT), modicarlos (UPDATE) o inclusoborrarlos (DELETE). En capítulosposteriores se desarrollará lasin- taxis de cada una de estas sentencias. ILenguaje DDL: o lenguaje de denición de datos (Data Denition Langua- ge). Estelenguaje permitecrear todala estructurade unabase de datos (desde tablas hasta usuarios). Sus cláusulas son del tipo DROP (Eliminar objetos) y CREATE (Crear objetos). En capítulos posteriores se detallarála sintaxis de cada una de estas sentencias. ODBC signica Open DatabaseConnectivity, y es unestándar deacceso a datos desarrollado por Microsoft 5180 esel acrónimode International Organization for Standardarization 16
  • 26.
    Capítulo 1. Lossistemas de almacenamiento de la información - Lenguaje DCL: o lenguaje decontrol de datos (Data Control Language). Incluye comandos (GRANT y REVOKE) que permiten al administrador ges- tionar el acceso a los datos contenidos en la base de datos. - Lenguaje TCL: o lenguaje de control de transacciones. El propósito de este lengua.je es permitir ejecutar varios comandosde forma simultánea como si fue- ra un comando atómico o indivisible. Si esposible ejecutar todos los comandos, se aplica la transacción (COMMIT), y si, en algún paso de la ejecución, sucede algo inesperado, se pueden deshacer todos los pasosdados (ROLLBACK). <> Actividad 1.82 Buscaen laWikipedia eltérmino SQLe indicalas revisiones que ha sufrido el lenguaje a lo largo del tiempo. A continuación, busca el signicado del término SQL Injection e indica por qué un administrador debe protegersefrente a él. 1.3.4. Tipos de SGBD Se puedenclasicar los SGBD de muchas formas, por ejemplo, según lasbases de datos que gestionan, clasicando los SGBD según traten bases dedatos relacionales, bases dedatos orientadas a objetos, etc. Puesto que en la actualidad, la mayoría de los SGBD integran múltiples losóas y tipos de funcionamiento, en este libro se clasican los de gestoresde basesde datos según sucapacidad y potencia del propio gestor: Los Gestores de Bases de Datos omáticas son aquellos que manipulan bases dedatos pequeñas (omáticas) orientadas a almacenar datos domésticos o de pequeñas empresas.Incluso estos gestores permiten construir pequeñas aplicaciones para ayudar a un usuario inexperto a manipular los datos de una base de datos de forma sencilla e intuitiva. Un ejemplo de un SGBD omático es Microsoft Access, que poseetanto una interfaz de usuario muy sencilla como un potente lenguaje de programación (VBA=VisualBasic forAplications) paraofrecer ausuarios avanzados otras posibilidades de gestión mucho más especícas. Los Gestores de bases de datos Corporativas son aquellas que tienen la capacidad de gestionar bases de datos enormes, de grandes o medianas empresas con una carga de datos y transacciones que requieren un servidor de grandes di- mensiones (generalmente un Servidor Unix, o un Windows 2OOX Servercon altas prestaciones). Estos gestores soncapaces demanipular grandes cantidades de datos 17
  • 27.
    Bases de Datos deformamuy rápiday eciente para poderresolver lademanda de muchos (cientos) de usuarios. Un ejemplo típico de servidor de base dedatos Corporativas es el antes comentado Oracle, actualmente, junto con DB2, el servidor de base de datos más potente del mercado (tambiénel más caro). Precisamente,ese costetan alto es el que ha desencadenado quese haya recurrido a una solución intermedia entre gesto- res de base dedatos omáticas y corporativas. Entre estas soluciones intermedias se encuentra MySQL, un gestor de base de datos que, además de ser gratuito y senci- llo, es capaz de manipular gran cantidad de datos cumpliendo prácticamente todos los estándares de la arquitectura ANSI SPARC. Aunque implementa SQL, no tiene un lenguaje de programaciónpropio como SQL Server u Oracle (aunque estáen desarrollo), pero a cambio se integra fácilmente en las típicas soluciones XAMPP, que son paquetes que incluyen, además de MySQL, una versión del servidor Web Apache yvarios lenguajes de script (php, perl. ..) que dotana MySQL de potentes herramientas para acceso y publicación de los datos. Contabilidad Administración Usuario 1 Figura 1.4: Esquema típico de organización de un SGBD corporativo. 18
  • 28.
    Capítulo 1. Lossistemas de almacenamiento de 1ainformación 1.4. Prácticas Resueltas Práctica 1.1: Introducción a Microsoft Access. En esta práctica, se aprenderá a manipular de forma básica el gestor de basesde da- tos Access de Microsoft.Abre la base de datos Neptunoaccdb que puedes descargar de www.garcetaes, y realiza las siguientes acciones. Será necesariomodicar algún objeto de la basede datos, por tanto guarda una copia con el nombre practicalaccdb 7 y conserva laoriginal para repetir 1apráctica cuantasveces desees. f í I J&#39;/_ Organizar v Nueva carpen lEscritorio «i: rw- Fama es núüiue. Tip: ,4 Sitios recientes ¡a Neptuncuccdb " Z LC .5" Hicrcscft ¿Fi-ze .. E] Vehiculosaccdb 3 I JLC . ":r;;:v: d, Biblioteeas _ 1 Documentos s_ h Imagenes ¡v Musica «A! _ ¡Administrar B deos n; Grupoen el hogar 1&#39;- Equipc - 4 Hombre de archivo: Neptuncmccdb v i Microsoft Office Access (mccd v] rm _ Herramientas v ICancelar | Abre Microsoft Access y pulsa el botón de Office. Selecciona la opción abrir, y en el cuadro de diálogo, busca la base de datos neptuno. 1. ¿Qué tipo de información almacena la base de datos? Neptuno es una basede datosque incorporanlas versiones antiguas deMicrosoft Access (hasta Access 2003) 7accdb es la extensión de las bases de datos de Access 2007 19
  • 29.
    Bases de Datos Observandolas tablas de la base de datos Neptuno, se puede ver que hay tablas de Clientes, Emplea- dos, Pedidos, Productos, Proveedores, etc. Al abrir las tablas haciendo doble clic sobre ellas, se muestra la infonnación que contiene, por ejemplo, la tabla de productos almacena información sobre alimentación y de- rivados, por tanto, Neptuno es el sistema de información de una empresa que importa y eazportacomestibles especialesde todo el mundo. 2. ¿Qué objetostiene la basede datos? ÏrSBíaTM---wl < Id.d Todos los ObJQÍOS deAccess Dplazarse l lacategoría 13m - 6 De leyar C°""&#39;* s formularios Iipode objeto . m; Catalogo i Si Personalizado e 7) K (( (4 Iablas yvistas relacionadas Fecha de ¡reacion Etiquetas decliente fecha de modicacion nm". Desplegando la lista del pa- nel lateral izquierdo de Ac- cess, se puede obtener un listado detodos losobjetos 5°"" de la base de datos clasi- E°""&#39;-"¡°5 cados por tipos, es decir, Worms tablas, consultas, formula- Eaginas rios, informes, etc. Macro; Módulos Todos los objetos de Access Filtrar por grupo Lista alfabética deproductos ¿EE Twin Productos por categoría Resumen de ventas por año Resumen de ventas por trimestre Subintorme Catalogo Subiriíorme ventas por año 440040 Subiriionrie ventas por categoria 4 4 TOÍMQS d!VGHÍIS D0! Cllidld o ventas de empleado por país ventas por año 3. Explora todos los objetos de la base de datos, poniendoespecialénfasisen el diseñode cada objeto, esdecir, en la forma en la que estánconstruidos. Todos los obietos de Access < r j pjd - --r-- --- -- r >EtE|l¿: e e c: Consultas Consuita de pedidos J pu, A Para explorar el conte- nido de un objeto, bas- ta con hacer un do- ble clic con el botón izquierdo del ratón y examinar el panel fron- tal. Para ver el diseño se pulsa con el botón derecho del ratón y se selecciona la opción Diseño. Por ejemplo, la consulta Subtotales por pedido consiste en un listado de los pedi- dos con su coste total. Detalle de pedidos con descuento 7&#39;°P&#39;°°"° iÏ Precioumdad L_ Facturas Filtro íacturas Lista ambetica de producto: Lista de productos actual Los die: productos mas caros C-mpo: iapeaiao Subtotal: SumaICMonedaIMetE Tabla: ¿Detalles de pedidos Productos por categoria l Total: ihqrupnr por Expresion Orden: Productos sobre elprecio medio Mostrar: T} Pedidos trimestrales Resumen d! VEMM D0! IÑO cmem: i Resumen de ventas por trimestre E Zoom Subtotalesporpedido &#39; &#39; y. " l ÍSTototaI: scanamdonedaweooLx-udadlcmhda Totales de ventas por cantidad r mnuwvloo léiliíéi
  • 30.
    Capítulo 1. Lossistemas de almacenamiento de Ia información 4. Añade el campo Destinatario a la consulta Subtotales por pedido. Entra en modo diseño y pulsando con el botón derecho en el panel superior, selecciona la opción Mostrar Tabla. Después, añade la tabla pedido. Verás cómo aparecen las dos tablas relacionadas, en una, los campos genéricos del pedido (FechaPedido,FechaEntrega,etc.) y en la otra, el detalle de cada uno de los pedidos. A continuación, arrastra el campoDestinatario de la tabla Pedido al panel inferior (en la tercera columna). Deïaïle: de[ELÏIZJC a ïeaidr: FecnaEntiega FechaEnvio FoimaEnvío ¡- Cnigo 1 : Destinatario - DirecdonDe stin riunannminn &#39; i Ianeaiao 9 ldPiodueto PreeioUnidId Cantidad Descuento Subtotal. SumnCMonednIPvecioUmdad]cnntidldlu-[Descueiito]i100r100) Destinatario i; Pedidos ¡impresion Agiupnr por 3. 5. Añade el campo Email a la tabla Clientes, es un campo de tipo Texto y de longitud 75. Examina las distintas propiedades del campo y consulta la ayuda de Accessen cada uno de ellos pulsando la tecla F1. Entra en modo diseño y aparecerá la lista de campos de la tabla. Añade una nueva la y completa el nombre de campo, el tipo y la descripción. A continuación, rellena las propiedades del campo. Puedes, por ejemplo, poner una regla de validación para quelos emails tengan el formato nombre@dominio, esdecir, que tengan una @ en el terio del email. Para poner la regla de validación, pon Como *@* en el campo Regla de validación Nombre de! campo Tipo de datos Descripción i Idcliente Texto Código únicobasado enel nombre delcliente. Nombrecompañía Texto Nombrecontacto Texto Cargocoritacio Texto Dirección Texto Ca|le oapartado de correos. Ciudad Texto Región Texto Estado oprovincia. códPostal Texto País Texto Telefono Texto incluye código de país o de área. Fax Texto Incluye codigo de país o de área. Email Texto Nuevo Campo añadido Propiedaues delcampo General aúsqueu Tamaño del campo 75 Formato Mascara deentrada Título
  • 31.
    Bases de Datos 6.Examina las relacionesde las tablas que contienela.basede datos Neptuno. &#39;.,¿¿u¿-¡¿ (¿te 12.1»; re:;1c.=:¿_1¡¡¿ ¡l ÏW-Vï nIaProuucto Í WIWGO uldPeaido " ¿Mm rlombrePvodu l l ÏÚPWÜ-W ¡atinente N°mh"c°"p&#39;ñ¡&#39; ldProveedor P&#39;&#39;°U"&#39;°3° ldEmpIeIdo N°mb"c°m&#39;d° ldcategovíu ("5" FechaPedndo C"°°(°""° CanhdaaPovU °°"° FecmEntrega D_"""°" Preuounuaao FecnaEnvío (Wa UnndadesEnb ,_._¿_4__ FonnaEnvio Sa?" unidadesEnPi &#39; r _ &#39; u Cargo °° al d . * &#39; Empleada Duhnltlno p - A ua _ . p. &#39; o L DvremonDest a Nombre CIudadDemn. Ho» aeDFODICUBUQS Cargo I Tratamiento Rlolonmmn" J * &#39; . Depenaenuas del Objlïí (ogpoggmpg; ldc°m9"&#39;¡¡""&#39;°5 Fechannrnlent- . ¡qompucomnñ &#39;¡ 53&#39; 5""J" Fecnacontratna Pmoemrm" 1,¡¿¡¿,na I l &#39;l"rvr :c."-- Dirección v 4 Íz-ncehx seamic; Las relaciones dictan cómo se puede enlazar la información de diferentes tablas para obtener información más elaborada. Para ver las relaciones de la base de datos, se pulsa en Herramientas de Bases de Datos y a continuación en el botón Relaciones 7. Un formulariova siempreasociadoa las operaciones quesehacenconuna tabla, a las que comúnmentesellama mantenimiento de tabla,observael funcionamiento del formulario Clientes y comentaqué operaciones sonestas.Realiza al menosuna vez cada una de las operaciones que permite el formulario. Las 4 operaciones queforman el mantenimiento de una tabla son la insertión o alta, eliminación o baja, modicación o actualización y búsqueda o consulta de un registro. Todas estas opemciones se pueden realizar de forma muy sencilla y visual a través del formulario. 8. Inserta un nuevo cliente en la base de datos. Y lo.declientev Nombre decompañia v Nombre delcontact - Insertar un cliente es muy sencillo, WANDK Diewandemde Kuh Rita Muller se puede hace-ra través del forfnularío VJÁRTH Wála Herkku Dnrkxo KOSKIXBÍO &#39;C[ien¿¿3 o abñendo [a tabla (jaen- WELLI Wellington Importadora Paula Parents tes! y desplazarseal último mgistm_ WHKTC white Cloverrvlarkets Karllablonsku WRLMK wllman Kala MaruKamunen WOLZA wclska Zaiazd Zbyszek DIestrzenIev_ ILMSR La Cantina deSan Roman Antonio Lopez b Registro. K 492 de 92D o . Busur 1Lv En una la vacía, se agregan los va- lonescorrespondientes a cada campo. 9. Elimina el registrocorrespondiente al cliente Rancho Grande. ¿Es posible?Si no esposible.¿Quéhabría que hacerpara poder eliminarlo? 22
  • 32.
    Capítulo 1. Lossistemas de almacenamiento de la información Para eliminar el cliente, hay que buscar el cliente Rancho Grande . A continuación, se señala. la la con el botón derecho del ratón y se escoge la opción Eliminar Registro. Access mostrará una advertencia indicando que no es posible eliminar el registro puesto que hay pedidos de ese cliente. Para poder eliminar denitivamente el cliente, habría que eliminar previamente todos sus datos asociados. j Clientes -- Y Nombre decompañia v Nombre delcontact- Cargo delcontacto - e ¡ Jensen «re-IMM» L Sergio Gutiérrez Representante deventas Av.da Nummgism nGrocery Paula wilson Representante agente ventas 2817i ¡"""" "WW i Maurizio Moroni Asistente deventas Strad. CMI! Janete Limeira Asistente deagente deventaAv.Cr: 5gp." Michael Holz Gerente deventas Greni Ale¡andra Camino Gerente decontabilidad Gran" Rancho Gun I l D ¿no de fila... i l 10. Modica el valor del campo Nombre de Contacto del registro correspondiente al cliente Romero y Tomillo. A continuación, modica el campo Id. de Cliente cambiándolo su valor a ROMMY. ¿Es posible modicar el Id. de Cliente? Si es posible, ¿conservael cliente aún sus pedidos? Pana modicar el cliente, se localiza su la y se sitúa el cursor del ratón en el campo que se desea modicar. Después, cambiar el valor del campo. En este caso, es posible modicar ambos campos, el primero, el Nombre de Contacto no tiene conicto alguno puesto que no está implicado en ninguna relación. Modicar el campo Id. de Cliente podría suponer la.pérdida de pedidos si no se actualizara a su vez todos los pedidos del cliente. Access efectúa esta modicación automáticamente al cambiar el identicador del cliente, por tanto, no hay pérdida de pedidos. 3 [lie-ita - Y ld.decliente Nombre decompañia - Nombre delcontact- Cargo delcontacto DirA QUEEN Queen Cozlnha Lúcia Carvalho Asistente demarketing Alameda d( QUlCK QUICK-Stop Horst ¡(loss Gerente decontabilidad Taucnerstre RANCH Rancho grande Sergio Gutierrez Representante deventas Av.delLibe RATTC Rartlesnake Canyon Grocery Paula Wilson Representante agente ventas 2817 Miltor REGGC Reggiani Caseifici Maurizio Moroni Asistente deventas Strada prev: RICAR Ricardo Adocicados Janete Limeira Asistente deagente deventaAv,Copacai: Richter Supermarkt Michael Holz Gerente deventas Grenzacher I t Romero vtomillo Jose Modificado Gerente decontabilidad Gran Vía,1 .__*-SANTG__ __janteourmet_,_.__.__-, __._._ _.Jonas Beraulisen Drooietario Erlinzskaki&#39; Registro: I< 4 69de 92 D N i. eroyTomillo 1 . l D 11. Abre la tabla de proveedores y consulta qué productos proveeel proveedor Leka Trading Primero, se localiza el proveedor en la tabla de Proveedores mediante el cuadro Buscar. A continuación, se pulsa el icono + del campo Id de Proveedor para desplegarlas relaciones que tiene con Productos. 18AuxJOyEUX ecclesiastiques Guylene Nodier Gerente devent 19NewEngland Seafood Cannery Robo Merchant Agente decuent 20Leka Trading Chandra Leka Propietario ld.deproducto- Nombre deproducto Categoria - Cantidad porUnidav Tallarines deSingapur Granos/Cereales 32- 1kgpaq. 43Cafe deMalasia Bebidas 16- latas500 g 44Azucar negra Malacca Condimentos 20 - bolsas 2kg (Nuevo) ,_..__¡_,_ ,-.s.... ».___.__i- __. egistro: I< l de3 D H 0 - LeknTnding4 l 23
  • 33.
    Bases de Datos 12.Consulta la ayuda de Accessy comenta los diferentes tipos de datos que puede almacenar un campo en Access (Texto, Memo, Numérico). En Access existen 10 tipos de datos básicos: Datos adjuntosComo fotos digitales. En cada registro es posible adjuntar varios archivos. Este tipo de datos no estaba disponible en versiones anteriores de Access. AutonumérícoNúmeros que se generan automáticamente para cada registro. Moneda Valores monetarios. Fecha/HoraFechas y Horas HípervínculoComo direcciones de páginas web. MemoBloques de tezto largos y tezto que emplean formato de texto. Una utilidad típica de un campo Memo sería una descripción de producto detallada. Objeto OLEObjetos OLE (objeto OLE: objeto que admite el protocolo OLE para la vinculación e in- crustación de objetos. Un objeto OLE de un servidor OLE (por ejemplo, una imagen de Paint de Windows o una hoja de cálculo de Álicrosoft Excel), se puede vincular o incrustar en un campo, formulario o informe. Texto Valores alfanuméricos cortos, como un apellido o una dirección. Número Valores numéricos, como distancias. Hay que tener en cuenta que existe un tipo de datos inde- pendiente para la moneda. Sí/No Valores Booleanos oLógicos. Admiten únicamente el valor Si y el valor No. 13. ¿Qué subtípos de datos tiene el campo numérico en Access? El tipo numérico se puede dividir en subtípos dependiendo del tamaño de campo que se eli- ja. Asi, los campos numéricos almacenarán un rango de valores muy distinto dependiendo del tamaño del campo que se seleccione. Por ejemplo, los tamaños byte (1 byte), entero (2 by- tes), entero lango (4 bytes), simple y doble precisión (coma otante de 4 y 8 bytes), etc. GEMFN Búsqueda Tamaño del campo Entero lar - Lugares decimales ¡"NFO Mascara de entrada Eme) ¿&#39;90 Titulo Valor predeterminado Regla devalidación i Textode validación Requerido No Indexado No Etiquetas inteligentes Alineación deltexto General Doble Id. dereplica Decimal 24
  • 34.
    Capítulo 1. Lossistemasdealmacenamientode 1ainformación 14. ¿Quévaloresadmitiría un camponuméricode 1 byte? Como 1 byte son 8 bits, se estima que los valores numéricos que se pueden almacenar en un campo de este tipo son del 0 al 28-1, es decir del 0 al 255. Si se insertan en el campode tipo Byte valorespor encima o por debajo del 0 y del 255, Microsoft Accesslos rechazará. Nótese que este cálculo se hace sin tener en cuenta el signo del valor, puesto que el valor byte, no admite signo. Para utilizar números con signo ha de escogerseel tipo Entero y pam utilizar númems reales, con.decimales, debe seleccionarse un campo en formato de comaotante (simpleo doble)o el campodecimal. 15. Crea una tabla llamada Test conun únicocamponuméricode 1 byte. ¿Quéva- loresmáximo y mínimo sepuedenalmacenar?Prueba a insertar registrospara ve- ricarlo. -/ Crear Datos externos ÍHICIO La . &#39;. l 3 _ Nombre delcampo Tupo dedaios Para crear una tabla!sepulsa Tabla Plantnllas Lnstasae DISEÑO Numem en la pestaña Crear y se selec- 0mm Shmpm"! &#39; d!" . . . v, . pn wca a czonael icono Tabla. A contz- 3m _ &#39; &#39; &#39; &#39; &#39; e e nuación se pulsa el botón Ver 5mm _,Bús9us9I__AA__ ___ y se seleccionala opciónDi- - Cree unanuevstablaracxa Puede a...nlos T""""° °""°° 5V - campcs uuenamente enuna nueva ¡abla o F°""¡° seno Se Pone7mm? a l ta con! launla envlsxa Duseño. Luoms netimnles Automnko bla, y se modica la línea que l _ Mnsaradunivldl a anece conelnombre Id ti L: m: mu P y po _J Valor predelermmado autonuméïico para poner los &#39; Huevo Aguggr campo; Regll aevaludauon datosdel campo.En Tamaño Ei, 3&#39;39 m ° "°"°&#39;° Requerido No delcampo hayque seleccionar 2 &#39; l indexado snsm GUDIICIGOS] Byte _ 4 Etiquetas inteligentes Ahnenaon del texto Genem Para insertar los valores de prueba, se abre la tabla y se insertan varios valores. Cuando se inserta un valor fuera del rango[0-255], seproduce el siguienteerror: El valor que ha especicado nacoincide (un eltipo dedatos Número de esta eolumm. Especique un valor nuevo. Ayuda con los tipos de datos yformatos. 25
  • 35.
    Bases de Datos Práctica1.2: Manipulación deinformación enAccess. Descarga dewww. garcetaes 1a basede datos de Vehículos (Vehiculosaccdb) y ábre- la. Será necesario modicar algún objeto de la base de datos, por tanto guarda una copia con el nombre practicalaccdb y conserva la original para repetir la práctica cuantas VECES CÏGSGGS. 1. ¿Cuántos modelos de vehículos hay? x r Modelo -censor-nro": Se abre la tabla en modo Vista 1 A|a Romeo 147 1.6 rs 16V 10s cv 3/5 8.1 de Hoja de Datos , y, se con- 2 Alfa Romeo 147 1.o rs 15v12o cv 3/5 3,2 sulta el contador de 3Alfa ROMEO 147 1.9 JTD IZÜ CV 3/5 que hayen ¡aparte ¿nm-o, ¿el 4 Alfa Romeo 147 1.9 no M-JET 15o cv 3/5 paneLEn este caso, 3654 mo_ 5 Alfa Romeo 147 2.0TS 16v 3/5 d l . Alfa Romeo 147 2.0 TS 16V Selespeed 3/5 eos. , , , , _ _ ,,_ , ,,_ _ _ Mkagmro. If @ Nv . Í _ V Desde el modo Vista de Hoja de Datos, hay que ordenar de mayor a menor (forma descendente) la. tabla por el campo Consumo. Los 5 primeros modelos que apanecen son los que más consumen. x Mocelo -Ïioosumo -1 yFmamnnac .v._ ,JU, . - 19 Ferran 612 agua. 20&#39;s Qrdenar de menor a mayor s20 Ferran raao/ =43osp 13.2 il Ovenvdc mmrnmenw 821 Ferran F599 GTB 17,5 -_¡gopm 1406 Maserati Coupé Granspor 17.5 3 ge, &#39; 3° Hummer H2 6,2 VS 13" 17.4 L1» 1262 Jeep gnerokee 3.7V 16,5 1657 Mercedes-Ben m. 63 AMG Autom. (1641 16,5 Agcno de tolumna, Qculuv columnas 3. Inserta un nuevo modelo de automóvil completando todos los campos. Se pulsa el icono insertar registro y, a continuación, se rellenan todos los datos menos el campo Id, que es autonumérico y por tanto se rellena automáticamente. El campo ñmagen se rellena haciendo doble clic sobre el dato adjunto y se selecciona una imagen de tipo bmp. juanma Id -I Marca - 7 7 ¡Mooeio y N - Consumo -1 Emnsrones - n t d 7A 3652 Volvo xcsc vsAWD AUT 7A 13.5 322 3653 volvo xcsc vsAWD Am EXECUTPJE/SDOR 13.3 317 3554 votvo xcso vsAWD AUT 133 317 " 3655 Ferrari Tesïarossa 22.27 Huevo,- Regístra N4 365? M3655 ¡ &#39;0- J, J. m; 26
  • 36.
    Capítulo 1. Lossistemas de almacenamiento de la información 4. Crea y ejecuta una consulta para ver los automóviles de la marca Seat, repite el procedimiento para los automóviles de la marca Toyota y Volkswagen. ¿miente nao ¿QmmrooS"d&#39;mumfmh ¿Desea ma wnsuudeoetaloeoremwm? (QHSUKBS Nededeádenúsdeuwmuhodia. Automóvnes Seal 1-: llmmaem 4, Ésta es toda la mfovmaoón que natura el ¡sustenta para crear la consutn. l Imagenoeïlags flmagmyneumg l Desea abnr la mnsulm o moáwcar ei dxseño de la COHSUÍG g ImagenFneTmeSmw <1 e enFueT _ . ilzagmeg y agravante consulta para ver nxmoco. .......... m g íiodca el dzseño oe A Se puede crear una consulta de varias formas: con el asistente para creación de consultas, con vista diseño o creando una consulta en modo SQL. En esta solu- ción se opta por la primera opción, se pulsa en la pes- taña Crear y se selecciona la opción Asistente pam Consumo consultas. Primero, se selecciona la opción Asistente E"""° para consultas sencillas y después se eligen los cam- pos que se mostrarán en la consulta, Marca, Modelo, Consumo y Emisiones. En segundo lugar se elige la :[Luna] {Consumo} opción Detalle y nalmente se da un nombre a la Automoviles Lutomovules áutomovules tabla. Para tenninar, se seleccionará la opción Mo- dicar diseño de la consulta. A continuación, se establece el criterio a ltm para la búsqueda de los automóviles de la marca Seat. ponien- do en el campo Criterios de la columna Marca, el valor =Seat". Puedes crear las consultas para To- : ALHAMBRA L8AUT.5 yota y Volkswagen siguiendo la vista Diseño, pues se ALHAMBRA 1.8 MAN.6 realiza de forma idéntica a cuando se modica el di- -»«HA&#39;4BRA1.9TD|AUT.5 seña de la consulta. . ÁLHAMBRÁ 1.9 ÏÜl MAÑ. 5 Sea. A_r-;ANBF.A 2.0 NAAN. 6 y Regnstvc N1 de 93 b DI p .Busca: 27
  • 37.
    Bases de Datos 5. Abreel formulario Catálogo Ferrari en modo Diseño y describe cómo seenlazan sus campos a la base de datos. Para abrir el formulario en modo diseño. se selecciona el objeto Catálogo Ferrari en el pa- nel lateral y pulsando con el botón derecho del ratón se elige la opción Diseño del For- mulario. A continuación, se selecciona cualquiera de los campos y se pulsa en. el botón Ho- ja de Propiedades que esta. situado en la pestaña de Diseño para mostrar las propiedades de los controles del formulario. En la hoja de propiedades aparece la opción Origen del control. j (alüogofarui &#39; -n-|-I&#39;2"I&#39;3"I-4 - -&#39; &#39; &#39; &#39; &#39; &#39; &#39; &#39; -- «n- HC]! d:prcpmoades Tipo deselecclcn Cuadro oe(eno Maru FormnoUNOSEventos01m ïoaus ¡ ngen delcontrol u . y Mascara deentrada ¡mov predeterminado Regla devahdaclon 6. Crea una tabla llamada Propietarios con los Campos DNI, Nombre, Apellidos, Fecha de Nacimiento, Dirección y Teléfono. DNI será el Campo clavede la tabla. De la pestaña Crear, se escoge la opción Diseño de tabla, y se rellenan las las con cada uno de los campos que va a tener la tabla. Se ha de poner atención en. el tamaño de cada uno de los campos. ¡DNI - Texto (10) nNombre - Texto (20) ¡Apellidos Texto (70) ¡Fecha de Nacimiento - Fecha/Hora nDirección - Texto (255) I Teléfono - Tezto(15) Se seleccionará la la correspondiente al DNI, y se pulsará el icono Clave principal para designarlo como campo clave. Para terminar. Access preguntará si se desea guardar los cambios y pedirá la asignación del nombre de la tabla. _ T; __: -¿.:; Nombre delcampo ¿t i V DNI exto Doc ama manana: una: aeDueño»Nombre Texto Nor detam: SharePoint &#39; de ¡abla Apemdos Texto Ap¿ l Fecha deNaccmuenio ¿erre/Hora Fec DITECCIÓH Texto Dire Telefono Texto Tele 28
  • 38.
    Capítulo 1. Lossistemasde almacenamientode la información 7. Creaunatabla llamadaPropietariosAutomoviles conloscampos DNI (del pro- pietario), Id (del automóvil) y Fecha de Compra. Establececomo clave principal de la tabla, los camposDNI e Id. Se repite el procedimiento de la cuestión anterior, esta vez, teniendo en cuenta que el tipo y tamaño de loscampos DNI e Id debe ser igualal de las tablasPropietariosy Automóviles,esdecir,DNI - Texto(10) e Id (Numérico, Entero Largo). El campoFecha de Compraserá de tipo Fecha/Hora. Para establecer la clave principal se seleccionan las doslas correspondientes a los camposId y DNI y se pulsa el botón Clave Principal. Finalmente, se asigna el nombre a la tabla. 8. Establece las relaciones entre las tres tablas de la. base de datos. Hay que pulsar en el icono relaciones del panel Herramientas de base de datos. A continuación, se- leccionar las tres tablas y agregarlas al panel de relaciones. Para enlazar el campo Id de las tablas de Au- tomóviles y PropietariosA-utomóviles se selecciona el campo Id de esta última y se arrastra hasta el campo Id Automóviles. En la pantalla modicar relaciones que aparece, se marca las opciones Ezigir Integridad Referencial y Actualizar en cascada los registros relaciones, para erigir que los propietarios que estén relacionados con Vehículos (Id) realmente existan en la base de datos, y, para actualizar el campo Id en la tabla PmpietariosAutomóviles de forma automática si se modica en la tabla Automóviles. Se repite este procesopara el DNI. Observa el mapa de relaciones como se ilustra a continuación. Henarmentas de base dedatos . __ r "-*&#39;-&#39; - 5- " ;:.x &#39;. : ¡ZCEEIILL . bld g Dm e4 . - Dependencias del crudo th". "WW" ¡ÏEÍHCIOHGS Idoaela ápelhdos C°"W"° Fecha de Nacnmierr Llamar u ccpha: Emisnones ¡mamon ¡""9" Telefono J Egg: nmgndad reference! yV &<sa.¿=2¿n_ rs¡.e99¿922á arma en cascada los regsros relacionados 29
  • 39.
    Bases de Datos 9.Crea un formulario con todos los campos de Propietarios mediante el asistente de creación de formularios. Usa la opción de diseño Justicado y un estilo a tu elección. Crear En lapestaña Crear hay Élghmmaazgsïm que desplegar el menúMás , ¿i fonulaoa y después se- i ¿snstente panformularuos leccionar la opción Asia- &#39; y tente para formularios. ¿apagones Se siguen los pasos indica- dos por el asistente, selec- cionando todos los campos &#39; y eligiendo la distribución I:4 I, mmm, Justicadoy cualquier es- Í L tilo, por ejemplo, el estilo Ï Técnico. a V Quadro de dialogo modal Asistentzponfomulum cQaédsvbuoándeseawlvcunlfotmalab Euuuela Datos 30
  • 40.
    Capítulo 1. Lossistemasdealmacenamientode 1ainformación 10. Inserta 5 registrosen la tabla de propietariosa través del formulario creado en el apartado anterior. y a Continuación.inserta registrosen la tabla Propieta- riosAutomóvilespara hacer dueño de dos modelosde vehículosa cada uno de los propietariosque has insertado. Se abre el fonnulario Propietarios creado en el apartado anterior y se completan, todos los campos. Se repite la operación para cada una de los 5 registros. Propietarios DNI Nombre Acelncos 52201928 José carlos Garcia Perez Fecha deNacimiento Dueccnón C/Los álamos, 15.Madnd, 28034 Telétono 912234732! LRegnstra I; Para el caso de PropietariosAutomóviles, se abre la tabla y se insertan los registros manualmente. Es fundamental que los valores insertados en el campo DNI de la tabla conesponda exactamente con alguno de los propietarios insertados. De igual modo, los valores del campo Id deben corresponder con la clave del Automóvil del que es propietario, por ejemplo, José Carlos García Pérez , con DNI .52201928, es propietario de los vehículos 89 y 98, es decir, del Audi A3 1.4 TFSI AUT. 7V y del Audi A3 1.9 TDIe v Fechacomup v Agregar nuevo (ya Zampas dnzpoynmles enpma: seI/agonacays 52201928 s9 0335552010 °&#39;"°"" 53" W , 52201928 98 02/04/2010: oPvopnetanos Eartaurama i? 31
  • 41.
    Bases de Datos 11.Realiza, con el asistente para la creación de informes, un informe con los propie- tarios de los vehículos que hay en la base de datos, mostrando qué vehículos posee cada propietario. En la pestaña Cnear hay que seleccionar la opción Asistente para informes. Se selecciona el campo Nombre de la tabla propietarios y la marca y el modelo de la tabla Automóviles. Crear 1r:: g Etcqueias J L] Intorme en blanco - - lnvorme Dueño de Tabla. metano: [1 Asmente para míormes ¡mmm Tabu: wwewmvhmbs _ . ¡LAS g L""!I1Ñ&#39;HÏH¡E3L;, ._*_ en 14:79 1 -&#39; Fecha de Neumann) Dnrecoón Teléfono Ilmagenenate &#39; lmogernFleïlags lntaoenieatne jlmapemñevrsesmm Canceluv ¿Cómo desea mr las datos? nor Aummóvnes Se siguen los pasas indi- cadas por el asistente, se- ¡gr m, N, mu leccionando cómo se desea ver los datos, si se pree- re el informe agrupado por algún nivel, la ordenación de los registros y nalmen- te, la distribución, orienta- ción y estilo. Para termi- nar, se abre el informe en vista previa. Propietarios Aud A3 19 7De MAN. S Aun: A5 14 FS AU. 7V muqrzolnx. :5 de n-Iv: 5|SCJ: 32
  • 42.
    Capítulo 1. Lossistemasde almacenamientode la información 12. Crea una consulta para ver el modelo y la marca de los vehículosdel primer propietarioque insertaste. En la pestaña Crear hay que seleccionar la opción Diseño de consulta. A continuación, se seleccio- i ¡a Nom nan las tres tablas de la ,_ ¡,,,,,¿,,,,,,, Apellidos base de datos, mostrándo- Consumo . """°&#39;"""" seasílasrelaciones entre ¡"mmm Ïgïggr" ellas. Para seleccionar _ los campos que salen . La en la consulta hay que (nuvo: umarn ¡Modelo rlombve DNI aTTa-ïtm? las ¿alumnas Tlbll: áAutomovxles Amomóvnles Pvopuetanos Propuetarios Marca,Modelo,Nombne y M°::"ï ¡ , , o m: ¡ y ,_; J y DNI delastablas al panel (mmm: ¡E1931 inferior. o:l Posteriormente se añade en la la Criterios y columna DNI el valor = 52201 928 . Para _ terminar, con el botón l &#39; Nombre v DN; derecho sobre el título un A31.4TFS|AUT.7V Josécarlos 52201923 de la consulta, se elige la A31.9TDIeMAN.5 Josecarlos 52201925 opción guardar y se escribe un nombre. Finalmente, se puede ejecutar para ver los resultados. 33
  • 43.
    Bases 1.5. de Datos Prácticas Propuestas Práctica1.3: Base de datos de un instituto Crea en Microsoft. Access2007 una base dedatos llamada lnstituto.accdb y realiza los siguientes ejercicios. 1. 10. 11. 12. Crea una tabla llamada Alumnos con los campos DNI, Nombre, Dirección, Fecha de nacimiento, foto, grupo y curso. Elige cuidadosamente el tipo de datos para cada campo. .Inserta 6 registros a través de un formulario creado al efecto, tres registros para el curso 1 y otros dos para el curso 2. .Crea una consulta que muestre el campo DNI, Nombre y Curso, ordenado por Curso y Nombre. Crea una consulta que muestre todos los campos de la tabla Alumnos, con el criterio Curso=2. . Crea un informe para visualizar los alumnos de cada grupo. .Crea la tabla Asignatura con los campos NombreAsignatura, Codigo, Ciclo. Crea la tabla Notas con los campos sucientes para insertar la nota de un alumno en una asignatura. .Establece las relaciones entre las tablas Notas, Asignaturas y Alumnos. Insertar mediante un formulario 4 asignaturas para dos ciclos distintos. Crea consultas distintas para ver qué asignaturas tiene cada ciclo. Inserta 2 notas para cada alumno anteriormente introducido. Intenta insertar notas para alumnos y asignaturas que no existan ¿Qué pro-
  • 44.
    Capítulo 1. Lossistemas de almacenamiento de 1ainformación Práctica 1.4: Base de datos de mascotas Crea una base de datos llamada Mascotasaccdb y realiza los siguientes ejercicios: 1. es» 10. 11. 12. 13. Crea una tabla llamada Animales con los campos Nombre, Tipo, Raza, Peso y Color. Añade a la tabla un campo clave. . Inserta 5 registros en la tabla Animales. Crea una consulta para ver los Animales de tipo Perro. . Añade una nueva columna a la tabla Animales llamada Dueño. .Completa el Dueño de cada uno de los Animales de la tabla. .Añade una nueva columna a la tabla Animales llamada PrecioDeCompra. Es- ta columna contendrá un valor nulo (sin información) cuando el Animal fue adquirido gratuitamente. . Crea una tabla llamada Vacunaciones con los campos FechaVacunacion, Des- cripcíónVacuna, Veterinario y un campo que relacione la vacunación con el animal vacunado. Crea las relaciones entre la tabla Animales y la tabla Vacunaciones. .Inserta, para uno de los animales, 3 vacunas puestas por tres diferentes vete- rinarios. Crea un informe para listar las vacunaciones de los animales. Crea un informe basado en la consulta del tercer ejercicio para ver las vacu- naciones de los perros. Crea un formulario en vista diseño para poder añadir vacunaciones de los animales. Mediante la pestaña Datos Externos de Access, exporta los datos de la tabla Animales a hlicrosoft Excel. Con la misma pestaña, crea una página web con los datos exportados del informe de vacunaciones.
  • 45.
    Bases de Datos 1.6. 36 Resumen Losconceptos clave de este capítulo son los siguientes: Un chero es una estructura de información que crea el sistema operativo para almacenar información. El tipo y formato del chero determina la forma de interpretar la información que contiene. Se clasican según su contenido, organización y utilidad. Los cheros de texto no requieren un formato para ser interpretado puesto que contienen únicamente texto, sin embargo, los cheros binarios, como al- macenan múltiplesformas dedatos (texto, imágenes, vídeo. .. ) requierenuna aplicación que sepa cómo está estructurada la información en ellos. Una base de datos está organizada mediante tablas. Las tablas contienen re- gistros de información o las. Cada registro está compuesto por múltiples campos o columnas. Las tablas se relacionan entre sí para dar cierto sentido a la información almacena.da en ellas. Una base de datos almacena multitud de objetos como tablas, consultas, índi- ces, vistas, informes, guiones y procedimientos. Las bases de datos tienen múltiples aplicaciones, contables, administrativas, motores de búsquedas, cientícas, bibliotecas, censos, virus, etc. Las bases de datos se crean siguiendo un modelo o losofía. Así, han evolu- cionado desde las basesde datos jerárquicas y en red hasta las más modernas bases dedatos distribuidas. Las más comunes y utilizadas son las basadas en el modelo relacional que propuso el ingeniero de IBM Edgar F. Codd. Un SGBD es elconjunto de herramientas software que manipulan bases deda- tos. Ofrecen a los usuarios funciones como almacenar y acceder datos, garanti- zan la integridad y seguridad de los mismos y ofrecen, además, otras funciones avanzadas comola concurrencia, conectividad, generación de estadísticas, etc. El lenguaje SQL es una interfaz de programación entre el usuario y la base de datos. Se compone de varios sublenguajes: DML, DDL, DCL y TCL. Los gestores de basesde datos que manipulan bases dedatos pequeñas se lla- man gestores de basesde datos omáticas, y los que manipulan bases de datos medianas o grandes se denominan gestores de basesde datos corporativos.
  • 46.
    Capítulo 1. Lossistemas de almacenamiento de la información 1.7. Test de repaso 1. El contenido de un chero binario a) Es legible y se puede abrir con un editor de textos b) Debe ser interpretadomediante unforma- to c) Son caracteres imprimibles del código AS- CII d) Es un conjunto de pixels con colores 2. Un chero de texto contiene a) Cualquier tipo de información b) Caracteres codicados en código ASCII o UNICODE c) Los datos de una base de datos d) Datos que han de ser accedidos secuencial- mente 3. Las tablas de códigos ascii a) Usan 2 bytes para representar cada carácter b) Distancian las mayúsculas de las minúscu- las en 64 unidades c) Tienen 256 caracteres distintos d) Todas las anteriores son correctas 4. Señala el chero que no es binario Un chero .avi Un chero .html a) b) c) Un chero .mp3 d) Un chero .doc 5. Un campo clave es a) Un campo numérico b) Un campo especial que puede repetir un mismo valor c) Un campo especial que no puede repetir ningún valor d) Un campo alfanumérico 6. Una query es a) Un comando o petición que se envíaa la base de datos b) Una. búsqueda de información c) Una operación de ordenación d) Una estructura deinformación 7. Un índice es útil para a Insertar información b Borrar información C d Buscar y ordenar información ) ) ) ) No repeti valores 8. Una vista es una tabla virtual que a Almacena los datos en la BBDD ) b) No se almacena en la BBDD
  • 47.
    Bases de Datos 1.8. 1. Compruebatu aprendizaje N ombralos distintos tipos de bases de datos que existen según el mo- delo que siguen. .Enumera 10 usos que puede tener una base de datos. .Explica para qué sirven las tablas UN ICODE. .Clasica los tipos de chero según su contenido. ¿Dónde almacenan las basesde da- tos la información? .Nombre 6 tipos de objetos que pue- de contener una base de datos. .¿Qué es un script o guión? . ¿Qué es una vista? ¿En qué se di- ferencia de una consulta? . Dene los siguientes conceptos: IDato n Tipo de Dato ICampo IRegistro -Tabla IRelación - Consulta IProcedimiento 10. ¿Qué tienen en común Larry Elli- 38 son y Bill Gates? 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. ¿Conoces algunabase dedatos que almacene conguraciones? ¿En qué consiste la función de se- guridad de una BBDD? ¿Cómo garantiza la integridad de los datos un SGBD? ¿Qué es el diccionario de metada- tos? ¿Qué quiere decir que una base de datos soporta transacciones? ¿Qué esODBC? ¿Qué quiere decir que una base de datos permita concurrencia? ¿Cuál es la función del lenguaje TCL? ¿ Y la del lenguaje DML? ¿Cuál es la extensión de un che- ro que contiene una base de datos Access? ¿Qué operacionesforman el mante- nimiento de una tabla? Describe dos formas de crear un formulario en Access. ¿Cuál es el tipo de datos que usa Access paralos valoresmonetarios? Nombre 5 tipos de datos que per- mite Access. Describe dos formas de crear una consulta en Access.
  • 48.
    CAPÍTULO 2 Diseño lógicorelacional Objetivos W Identicar el signicado de la simbología de los diagramas E/ R Contenidos Identicar las tablas del diseño Representación del problema lógico hïodelo de datos Identicar los campos que for- Diagranlas E/R man parte de las tablas .Identicar las relaciones entre l l E mode o E/R anïphado tablas del diseño lógico El modelo relacional Identicar los campos clave Transformación E /R al modelo relacional Aplicar reglas de integridad . . ,Identicar reglas de normaliza- Normahzaclon , , cion Identicar y documentar reglas que no se puedenplasmar en el diseño lógico En este tema se trata a fondo e] diseño de una. base de datos, desde 1a inter- pretación y análisis de un problema hasta el diseño y propuesta de un modelo que dé solución al problema planteado. 39
  • 49.
    Bases de Datos 2.1.Representación del problema Una base de datos representa la información contenida en algún dominio del mundo real. El diseño de base de datos consiste en extraer todos los datos relevantes de un problema, por ejemplo, saber qué datos están implicados en el proceso de facturación de una empresaque vendevehículos agrícolas,o, qué datos sonnecesarios para llevar el control veterinario de los animales de un zoológico. Para extraer estos datos, se debe realizar un análisis en profundidad del dominio del problema, y saber, de estaforma, qué datos son esenciales parala basede datos y descartar los que no son de utilidad. Una vez extraídos los datos esenciales comienza el proceso de modelización, esto es, construir, mediante una herramienta de diseño de base de datos, un esquema que exprese con total exactitud todos los datos que el problema requiere almacenar. Típicamente, los informáticos analizan un problema a través de diversasreuniones con los futuros usuarios del sistema. Nótese, que generalmente, el problema no solo se resuelve poniendo una base de datos a disposición de un usuario, sino también un conjunto de aplicaciones de software que automaticen el accesoa los datos y su gestión. De estas reuniones,se extraeel documento más importante del análisis de un sistema informatico, el documento de Especicación de Requisitos Software o E.R.S. A partir de esta E.R.S. se extrae toda la información necesaria para la modelización de los datos. <> Actividad 2.1: Busca en Internet la estructura del documento estándar IEEE 830 SRS o Software Requirements Specication. Descarga de internet algún ejem- plo de SRS y examina cómo los analistas de software organizan los requisitos de una aplicación extraídos de las conversaciones conusuarios. 2.2. El modelo de datos La modelización consiste en representar el problema realizando múltiples abs- tracciones 1para asimilar toda la información de un problema, y de esta manera, generar un mapa donde estén identicados todos los objetos de la base de datos. ¡Una de las acepcionesde la RAE para abstraer es: Separar por medio de una operación intelectual las cualidades de un objeto para considerarlas aisladamente o para considerar el mismo objeto en su pura esencia o noción 40
  • 50.
    Capítulo 2. Diseñológico relaciona] Para modelar un problema de base de datos es necesario tener en cuenta las siguientes consideraciones: - Casi con toda probabilidad, la persona querealiza la modelización es un analis- ta informático, por lo que puede no ser un experto en el dominio del problema que debe resolver (Contabilidad, Medicina, Economía,etc.). Se ha de con- tar con la experiencia de un futuro usuario de la base de datos que conozca a fondo todos los pormenores del negocio, y que, a su vez, puede no tener conocimientos de informática. - Hay que modelar siguiendo unas directrices o estándares, esdecir, usando una losofía estándar para que el resto de la comunidad informática pueda entender y comprender el modelo realizado. De esta manera, será posible aprovechar las herramientas informáticas software del mercado para realizar diseños. n La base dedatos estará gestionada por un SGBD que tendrá unas característi- cas técnicas, de esta manera, no se tratará igual la implantación de la base de datos en un sistema l&#39;I_ySQL que en uno DB2. Para satisfacer estas necesidades,se suelerecurrir a tres modelados: 1. El modelo conceptual. Es un modelo que tiene un gran poder expresivo para poder comunicarse con un usuario que no esexperto en informática. Tiene una gran potencia para representar el dominio del problema tal y como elusuario lo concibe. Elmodelo quese usará en estelibro seráel modeloEntidad/Relación. 2. El modelo lógico. Este modelo es más técnico que el anterior. Los conceptos expresados por este modelo, suelen serdifíciles de entender por los usuarios y generalmente tienen traducción directa al modelo físico que entiende el SGBD. El modelo lógico elegido dependerá de la implementación de la base de datos, así, no es lo mismo modelizar una base de da.tos orientada a objetos, que modelizar una base de datos relacional. El modelo que se usará en este libro será el Modelo Relacional. 3. El modelo físico. Es el resultado de aplicar el modelo lógico a un SGBD concre- to. Generalmente está expresado en un lenguaje de programación de BBDD tipo SQL. Este libro transformará el Modelo Relacional en modelo físico a través del sublenguaje DDL de SQL. La interacción entre estos tres modelos es fundamental para un diseño de calidad: 1. Primero, se negocia con el usuario el modelo conceptual. 41
  • 51.
    Bases de Datos USUARIO EXPERTO MODELOlN FORMÁTICÓ CONCEPTUAL DIS EÑADOR BBD D PROGRAMADOR BBDD DOMINIO DEL PROBLEMA Figura 2.1: Interacción entre modelos. 2. Segundo, se pasael modelo conceptual al modelo lógico, realizando una serie de transformaciones necesarias para adaptar el lenguaje del usuario al del gestor de base de datos. 3. Finalmente, se transforma el modelo lógico en físico, obteniendo de esta forma la base de datos nal. En ocasiones, los diseñadores experimentados, realizan el diseño de Ia base de datos directamente en el modelo relacional. Esto puede representar un ahorro de tiempo si el problema a resolver es relativamente sencillo. Pero, general- l mente, en problemas más complejos, saltarse el diseño conceptual y la opinión del usuario, da como resultado diseños incompletos e incoherentes. El consejo del buen administrador. .. 2.3. Diagramas E/R Para representar el modelo conceptual se usará el modelo Entidad/Relación. Este modelo consiste en plasmar el resultado del análisis del problema mediante diagramas entidad-relación. 2 ¡También llamados en otras fuentas diagramas Entidad-Interrelación, o en inglés Entity- relationship 42
  • 52.
    Capítulo 2. Diseñológico relacional Estos diagramas fueron propuestos por Peter P. Chen a mediados de los años 70 para la representación conceptual de los datos y establecer qué relaciones existían entre ellos. La notación es muy sencilla, y, precisamente, esta sencillez, permite representar el mundo real de forma que el usuario pueda validar si el modelo propuesto se ajusta perfectamente a la resolución del problema. A continuación, se presentan las deniciones necesarias para comprender el mo- delo entidad relación. 2.3.1. Entidad Cualquier tipo de objeto o concepto sobre el que se recoge información: cosa, persona, concepto abstracto o suceso. Se representan mediante un cuadrado. Por ejemplo: coche, casa, empleado, cliente, etc. Las entidades se representan gráca- mente mediante rectángulos y su nombre aparece en el interior (generalmente en singular). Un nombre deentidad solopuede aparecer una vezen el diagrama. Emple ados Figura 2.2: Ejemplos de entidades. Hay dostipos deentidades: fuertes (o regulares)y débiles.Las entidades débiles se representan mediante un cuadro doble. Una entidad débil es una entidad cuya existencia depende de la existencia de ot.ra entidad. Una entidad fuerte es una en- tidad que no es débil, es decir, existe por méritos propios. Un ejemplo típico es la existencia de dos entidades para la representación de un pedido. Por un lado, la entidad pedido representa información genérica sobre el pedido como la fecha del pedido, fecha de envío, el estado, etc. Por otro lado, la entidad Detalle de Pedido recopila las líneas de información especíca sobre los artículos y unidades pedidas. En este caso, Detalle de Pedido es unaentidad débil, puesto que la eliminación del pedido implica la eliminación de las líneas de detalle asociadas al pedido, es decir, no tiene sentido almacenar información especíca del pedido si se ha eliminado ese pedido. Entidad Fuerte Entidad Débil Figura 2.3: Entidad fuerte y débil. 43
  • 53.
    Bases de Datos 2.3.2. Ocurrenciade una entidad Es una instancia de una determinada entidad, esto es. una unidad del conjunto que representa la. entidad. Ejemplo: La entidad coche tiene varias instancias, una de ellas es el vehiculo seat ibiza con matrícula 1222FHD de color negro y con 5 puertas. 2.3.3. Relación Una relación (o interrelación), es una correspondencia o asociación entre dos o más entidades. Cada relación tiene un nombre que describe su función. Normalmente debe utili- zarse un nombre que exprese contotalidad la nalidad de la relación, evitando poner un nombre que pueda signicar muchas cosas, por ejemplo, tener, hacer, poseer. Las relacionesse representangrácamente mediante rombos y su nombre aparece en el interior. Generalmente este nombre de relación corresponde a un verbo, pues las relaciones suelen describir las acciones entre dos o más entidades. Las relaciones están clasicadas según su grado. El grado es el número de en- tidades que participan en la relación. Atendiendo a esta clasicación, existen los siguientes tipos de relaciones: IRelaciones binarias: (grado2), sonaquellas quese danentre dosentidades. Figura 2.4: Ejemplo de relación binaria. n Relacionesternarias: (grado3), sonaquellas quese danentre tresentidades. Figura 2.5: Ejemplo de relación ternaria. 44
  • 54.
    Capítulo 2. Diseñológico relacional n Relacionesunarias oreexivas: (grado 1), Esuna relacióndonde lamisma enti- dad participa más deuna vez en la relación con distintos papeles. El nombre de estos papeleses importante para determinar la función de cada participación. Figura 2.6: Ejemplo de relación reflexiva. IRelaciones n-arias: (grado >3) Son aquellas donde participan más de 3 enti- dades. Aparecen en muy raras ocasiones, puesto que generalmente se pueden descomponer en varias de grado 2 o de grado 3. El consejo del buen administrador. . . Si en tu diagrama entidad relación aparecen relacionesde grado >3, es posible que la interpretación del problema seaincorrecta. Incluso si aparecenrelaciones de grado 3, intenta descomponerlas en varias de grado 2 para simplicar tu modelo. Eso SÍ, asegúrate de que no es posible descomponerlas en varias de grado 2 sin perder semántica. 2.3.4. Participación La participación de una ocurrencia de una entidad, indica, mediante una pareja de números, el mínimo y máximo número de veces quepuede apareceren la relación asociada a otra ocurrencia de entidad. Las posibles participaciones son: Participación Signicado Mínimo cero, Ináximo uno Mínimo uno. máximo uno Mínimo cero, máximo n (Muchos) Mínimo uno, máximo n (lIuchos) Las reglas que denen la participación de una ocurrencia en una relación son las reglas de negocio, esdecir, se reconocen a través de los requisitos del problema. 45
  • 55.
    Bases de Datos Lanotación que seutiliza para expresar las participaciones en el diagrama entidad relación esponer al lado de la entidad correspondiente, la pareja de números máximo y mínimo de participaciones. Por ejemplo, los empleadospueden trabajar para varios proyectos, o pueden estar de vacaciones (sin proyecto).Por otro lado, enun proyecto trabajan de 1 a varios trabajadores. En este caso, la participación de proyecto es de (O,n), puesto que un empleado puede tener asignados de0 a n proyectos. La participación del empleado es de (1,11) puesto queen un proyecto puedehaber de 1 a n empleados. De esta manera,se indicaal ladode laentidad proyecto,el par (0,n) y al lado de la entidad empleado el par (Ln). Figura 2.7: Participaciones de ocurrencias en una relación. <> Actividad 2.2: En un supermercado hay productos organizados en categorías (frutas, ultramarinos, carnes, pescados,etc.). Cada producto pertenece a una única categoría, y puede haber categoríasque todavía no tengan ningún producto asignado, sin embargo, no puede haber productos sin categoría. Calcula las participaciones de cada entidad en la relación Producto Pertenece a Categoría Un producto puede y debe pertenecer a una única categoría (mínimo 1 y máximo 1 ), por tanto la partici- pación de categoría en la relación con el producto es de (1,1). A una categoría pueden pertenecer muchos productos (máximo n), y puede no tener productos (mínimo 0), por tanto, los productos participan en las categorías con cardinalidad (0.71). n--. ..-.-¡ 46
  • 56.
    Capítulo 2. Diseñológico relaciona] <> Actividad 2.32 Laspáginas web contienen controles de muchos tipos (campos de texto,listas desplegables, etc.). Sise quierealmacenar en una base de datos,cada página web, qué tipos de controles tiene. ¿qué participaciones habría que asignar? Justica tu respuesta respondiendo a preguntas del tipo ¿un control, (por ejemplo, un cuadro de texto), en cuántas páginas puede estar como máximo y mínimo? <> Actividad 2.4: Los clientes pueden realizar pedidos a travésde susrepresen- tantes de ventas. Indica las entidades que hay, relaciones y sus respectivas partici- paciones. 2.3.5. Cardinalidad La cardinalidad de una relación se calcula a través de las participaciones de sus ocurrencias en ella. Se toman el número máximo de participaciones de cada una de las entidades en la relación. Por ejemplo, la relación organiza de la actividad 2.2, tendría una cardinalidad de 1:N, puesto que por el lado de las categorías, el máximo de (1,1)es 1,y por el lado de losproductos, elmáximo de(O,n) esN. ¡y 1:N ¡un ¿Ars 30m5 Figura 2.8: Cálculo de la Cardinalidad de una relación. De esta manera, se clasican las siguientes cardinalidades: a Cardinalidad 1:1 Esta cardinalidad especica que una entidad A puede estar vinculada mediante una relación a una y solo una ocurrencia de otra entidad B. A su vez una ocurrencia de la entidad B solo puede estar vinculada a una ocurrencia de la entidad A. Por ejemplo, se puede limitar el número de directores de departamento mediante una relación 1:1. Así, un empleado solo puede ser jefe de un departamento, y un departamento solo puede tener un jefe. 47
  • 57.
    Bases de Datos contabilidad administración informática rrhh Figura2.9: Ejemplo de cardinalidad 1-1. ICardinalidad 1:N (o 1:Muchos) Esta relación especica que una entidad A puede estar vinculada mediante una relación a varias ocurrencias de otra entidad B. Sin embargo, una de las ocurrencias de la entidad B solo puede estar vinculada a una ocurrencia. de la entidad A. Por ejemplo, un represen- tante gestiona las carreras de varios actores, y un actor solo puede tener un representante . fernando Figura 2.10: Ejemplo de cardinalidad 1-N. ICardinalidad M:N (o Muchos:Muchos) O también NzM, estacardinali- dad especica que una entidad A puede estar vinculada mediante una relación a varias ocurrencias de la entidad B. y a su vez, una ocurrencia de la entidad B puede estar vinculada a varias de la entidad A. Por ejemplo. un empleado 48
  • 58.
    Capítulo 2. Diseñológico relacional puede trabajar para varios proyectos; al mismo tiempo, en un mismo proyecto, pueden trabajar varios empleados. Figura 2.11: Ejemplo de cardinalidad N-M. Como puede observarse enlas guras anteriores, la notación para representar el tipo de relación según su cardinalidad, consiste en escribir el tipo de cardinalidad justo encima del rombo. Existen numerosas alternativas a esta nomenclatura, siendo muy típicas las dos siguientes: u Puntas de echa: En esta notación. la línea de la relación que termina en echa, indica la rama N de la cardinalidad de la relación. Figura 2.12: Ejemplo de notación puntas de echa. n Notación classic de MySQL Workbench: En esta notación, las relaciones se expresan con un pequeño rombo, rellenando en negro la mitad de la gura, en 7 el lado de la entidad cuya cardinalidad es l Equlpm ¡asquoo INT l Name vuaonnus) Jugador icuuqanor INT Not-mn VARCHARQS) Dasal INT Eutincsjcmho INT (FK) Figura 2.13: Ejemplo de Iiotación classic de MySQL Workbench. 49
  • 59.
    Bases de Datos <>Actividad 2.5: Haymultitud denotaciones distintas para realizar los diagramas entidad relación. Todas ellas,tratan de expresar losconceptos expuestosen estelibro, pero de diferentes formas y con diferentes elementosgrácos. Busca en Internet otros tipos de notaciones para realizar diagramas entidad relación. Puedes buscar, entre otros, las notaciones de Alartin, [DEF 1X o Pies de cuervo (Crows foot). 2.3.6. Cardinalidad de relaciones no binarias Para calcular la Cardinalidad de una relación ternaria se tomará una de las tres entidades y se combinan las otras dos. A continuación, se calcula la participación de la entidad en la combinación de las otras dos. Posteriormente, se hará lo mismo con las otras dos entidades. Finalmente, tomando los máximos de las participaciones se generan las cardinalidades. CardinaIidad=max(0,1):max(1,1):max(0,n) = 1:1:N EMÉÉISA EIÉEÏZENTE Figura 2.14: Cardinalida.d de una relación ternaria. Por ejemplo, en la gura 2.14 se distinguen tres participaciones, la que se produce entre empresa y auditora-expediente, la que se distingue entre auditora y empresa- expediente, y por último la de expediente con auditora-empresa: - Una empresa ¿Cuántosexpedientes puedetener con una auditora? Puede tener un mínimo de 0 y un máximo de n. Participación de Empresa (Ü,n). IUna. auditora ¿Cuántos expedientes puedetener con una empresa?Puede tener un mínimo de Oy un máximo de 1. Participación de Auditora (0,1). u Un expediente ¿A cuántas empresasauditadas por la auditora puede pertene- cer? Un expediente solo puede pertenecer a una empresa auditada (1,1), por tanta Participación de Expediente (1.1). 50
  • 60.
    Capítulo 2. Diseño lógicorelaciona] <> Actividad2.5: Calcula la cardinalidad dela siguiente relación ternaria: Hay que contestar a las siguientes preguntas: ¿Cuántos autores puede tener un determinado libro publicado en una detenninada editorial? ¡Mínimo1, máximon, participaciónde Autor (1,n). ¿Cuántos libms puede tener un detenninado autor publicados en una determinada editorial? Mínimo 0, máximo n, participación de Libro (0,11). ¿En cuántas editoriales puede un detenninado autor publicar un mismo libm? Múzimo 1, máximo I. Participación de Editorial (1,1). Tomando los máximos de cada participación se obtiene que la cardinalidad de la relación de de 1:N:N o Actividad 2.72 Calcula la cardinalidad delas siguientes relaciones binarias: I Hombre está casadocon Mujer, en una sociedad1nonogámica. I Hombre está casadocon Mujer, en una sociedadmachistapoligámica. - Hombre está casadocon Mujer, en una sociedad poligámica liberal. - PescadorpescaPez. - Arquitecto diseña Casa. I Piezas forman Producto. I Turista viaja Hotel. I Jugador juega en Equipo. u Político gobiernaen País. 51
  • 61.
    Bases de Datos <> Actividad2.8: Calcula la Cardinalidad de lassiguientes relaciones ternarias: IMecánico arregla Vehículo en Taller. n Alumno cursa Ciclo en Instituto. IVeterinario administra [bledicación al Animal. 2.3.7. Cardinalidad de las relaciones reexivas En las relaciones reexivas, la misma entidad juega dos papeles distintos en la relación. Para calcular su Cardinalidad hay que extraer las participaciones según los dos roles existentes. Por ejemplo, en la relación reflexiva Es jefe, la entidad Empleado aparece con dos Roles. El primer rol es el empleado como jefe, y el se- gundo rol el empleado como subordinado. Así, se puede calcular las participaciones preguntando: I¿Cuántos subordinados puede tener un jefe? Un jefe puede tener un mínimo de 1 y un máximo de n: (Ln) I¿Cuántos jefes puede tener un subordinado? Un mínimo de O (un empleado sin jefes sería el responsable de la empresa) y un máximo de 1 (suponiendo una estructura,típicamente piramidal): (0,1). Por tanto, la relación sería de Cardinalidad 1:N 1:N (0,1) Figura 2.15: Cardinalidad de una relación reflexiva. 52
  • 62.
    Capítulo 2. Diseñológico relacional <> Actividad 2.9: Justica cuál serían las participaciones y la cardinalidad de la siguiente relación, teniendo en cuenta que: n Una gura puede contenerse a sí misma(como enel ca.so de losfractales). IUna gura puede estar formada por múltiples tipos distintos de guras. 2.3.8. Atributos y Dominios Los atributos de una entidad son las características o propiedades que la denen como entidad. Se representanmediante elipsesconectadas directamente a la entidad. Por ejemplo, para representar la entidad HOTEL. son necesarias suscaracterísti- cas, esto es, el número de plazas disponibles, su dirección, la ciudad donde se en- cuentra, etc. Figura 2.16: Ejemplo de atributos. Atributo Clave En la gura anterior, aparece el atributo código, subrayado. Este atributo se denomina clave, y designa un campo que no puede repetir ninguna ocurrencia de entidad. Se dice. que este campo identica unívocamente a una entidad, es decir, 53
  • 63.
    Bases de Datos quecon la sola referencia a un campo clave se tiene acceso al resto de atributos de forma directa. Ejemplo: El DNI es el campo clave de una persona, pues ninguna persona tiene el mismo DNI. Por tanto, si se especica el DNI de esa persona se sabe exactamente a qué ocurrencia de persona sereere. Todas las entidades fuertes deberían tener, al menos, un atributo clave. Nótese que una entidad puede formar la clave mediante varios atributos, en este caso, se dice que la clave de la entidad es la suma de esos atributos y que la entidad tiene una clave compuesta. Si la clave está formada por un único atributo se dice que es atómica. Por ejemplo, para identicar de forma única una oferta de trabajo se necesitaría el nombre del puesto y el nombre de la empresa que lo oferta. Atributo de relación Un atributo de relación es aquel que es propio de una relación y que no puede ser cedido a las entidades que intervienen en la relación. Por ejemplo, un mecánico repara un vehículo, la reparación se realiza en una determinada fecha. Figura 2.17: Ejemplo de atributo de relación. Dominios Cada una de las características que tiene una entidad pertenece a un dominio. El dominio representa la naturaleza del dato, es decir, si es un número entero, una cadena decaracteres oun número real. Incluso naturalezas más complejas, como una fecha o una hora (con minutos y segundos). Por ejemplo, los siguientes atributos de la entidad empleado pertenecen a los siguientes dominios: Atributo DNI Cadena de Caracteres de longitud 10 Nombre Cadena de Caracteres de longitud 50 Fecha_Nacin1iento Fecha Dirección Cadena de Caracteres de longitud 100 Sueldo Números reales Número de hijos Números enteros Departamento Departamentos 54
  • 64.
    Capítulo 2. Diseñológico relaciona] Si un dominio se especica mediante el tipo de datos, como en el caso de DNI, Nombre o Fecha_Nacimiento se dice que se dene por zïntensión. Si se especica mediante un conjunto de valores, como en el dominio Departamentos, que puede tener los valores (RRHH, Informática. Administración o Contabilidad), la definición del dominio es por extensión. 2.3.9. Tipos de atributos Se pueden clasicar los atributos según las siguientes restricciones: Atributos obligatorios: Un atributo debe tomar un valor obligatoriamente. Atributos opcionales: Un atributo puede no tomar un valor porque sea desco- nocido en un momento determinado. En este caso, el atributo tiene un valor nulo. Atributos compuestos: Un atributo compuesto esaquel que se puededescompo- ner en atributos más sencillos, por ejemplo, el atributo hora_de_salida se puede descomponer en dos (hora y minutos). Atributos univaluados: Un atributo que toma un único valor. Atributos multivaluados: Estos atributos pueden tomar varios valores,por ejem- plo el atributo teléfono puede tomar los valores de un teléfono móvil y un teléfono jo. Atributo derivado: Son aquellos cuyo valor se puede calcular a través de otros atributos. Por ejemplo, el atributo Edad, se puedecalcular a partir de la fecha de nacimiento de una persona. Al igual que con la mayoría de las notaciones, no existe unanimidad a la hora de dibujar en un diagrama los tipos de atributos. Una de las más extendidas entre los diseñadores debases dedatos es la siguiente: Figura 2.18: Notación para los distintos tipos de atributos. 55
  • 65.
    Bases de Datos 2.3.10. Otrasnotaciones para los atributos Al igual que para las entidades, los atributos tienen multitud de notaciones, y, aunque la original adoptada por Peter Chen es la más usada hasta ahora, por simplicar la construcción de mapas a través de herramientas software, se opta por usar otras notacíones que producen mapas más manejables. Por ejemplo, la herramienta MySQL Workbench utiliza una sintaxis muy similar a la que usa la notación UML para representar las características de un objeto: Nombre de la entidad Dominio Nombre del atributo Eqniposjcqubo INT (PK) Figura 2.19: Otras formas de representar atributos <> Actividad 2.1ÜZ Justica qué tipode atributosson los siguientes atributos de la entidad Persona: n Fecha de Nacimiento (p.ej. 24/11/1976) ILugar de Nacimiento (p.ej. Zaragoza) - Edad (p.ej. 36 años) IEsMayorDeEdad (p. ej: Sí) n DNI (p.ej. 55582739A) n Teléfonos (p.ej. 925884721, 657662531) - Apellidos 56
  • 66.
    Capítulo 2. Diseñológico relacional 2.3.11. Las entidades débiles Como se ha expuesto anteriormente, las entidades débiles dependen de una en- tidad fuerte mediante una relación. La relación que une ambas entidades también es débil, puesto que también desaparece si desaparece la entidad fuerte. En estos casos, la relación tiene una dependencia que puede ser de dos tipos: n Dependencia de existencia: Este tipo de dependencia.expresa que,las ocu- rrencias de una entidad débil, no tienen ningún sentido en la base de datos sin la presencia de las ocurrencias de la entidad fuerte con la que están relacio- nadas. Por ejemplo, las transacciones que se dan en una cuenta bancaria, no tienen sentido si no existe la cuenta bancaria a la que están asociadas. CÏBIIÏA EAN CAE. Figura 2.20: Ejemplo de entidad débil con dependencia de existencia. - Dependencia de identicación: Este tipo se produce cuando, además de la dependencia de existencia, la entidad débil necesita a la fuerte para poder crear una clave, de tal manera que pueda completar la identicación de sus ocurrencias. Por ejemplo, una empresa fabricante de software crea aplicaciones: 1. La compañía se identica por su nombre(por ejemplo,Microsoft). 2. Las aplicaciones se identican por su nombre comercial, por ejemplo (Office). 3. Cada compañía de software pone un nombre a ca.dauna de sus aplicacio- nes. c: M; ANIA :E : ïTwAiífz-Z Figura 2.21: Ejemplo de entidad débil con dependencia de identicación. De esta forma puede ocurrir que haya dos aplicaciones con el mismo nombre y que pertenezcan ados compañíasdistintas (Ofce de Microsoft y Office de Sun). En 57
  • 67.
    Bases de Datos este casopara identicar a cada aplicación de forma única, hace falta el nombre de la aplicación y además, el nombre de la compañía. Así, Aplicación depende en identicación de la Compañía y el nombre de la aplicación es una clave débil. Se expresa de la siguiente forma: Una vez más, para representar las dependencias, cadaherramienta usa su propia notación. Por ejemplo, en el caso de MySQL Workbench, no diferencia entre enti- dades fuerteso débiles (las llama a todas tablas). y crea las relaciones conlíneas discontinuas encaso deno tener dependencia de identicación (non identifying re- lationship), y con línea continuas en caso detener dependenciade identicación (identifying relationship). Rel-ciónn &#39;°=°"°°"&#39; --- "°"°°"°.&#39;°° Norma vmoweids) ¡kmlucmn i___-_&#39; Relación con dependencia de identicación ¡cuenta Banca: INT Codigosuursal VARCJ-MRu) 000m Entidad VARCHÁRM) Doüftoi VAÉ-MÑ?) Nuneroctiena VAÉHAHW) DN Jldar VARG-IARUO) idfrmsaodon INT Cüid DECNAL Debe-IBM VAHZHAHH Cuenta Buuajtnumta Bancaria ¡NT (PK) Figura 2.22: Ejemplo de notación. Dependencias en MySQL Workbench. <> Actividad 2.11: ¿Qué tipo de relación dedependencia tienen las siguientes entidades? IUn toro (entidad débil) pertenecea unaganadería (entidadfuerte). Al toro se le identica por el número de toro, y el nombre de su ganadería, puesto que puede haber varios toros con el mismo número, pero pertenecientes a distintas ganaderías. IEn el acceso al parking de unaempresa unempleado (entidad fuerte) tieneun vehículo (entidad débil). 58
  • 68.
    Capítulo 2. Diseñológico relacional El consejo del buen administrador. .. Muchos diseñadoresse abstraen del hecho de tener entidades fuertes y débiles y, tal y como hace A-IySQL Workbencli, no distinguen entre entidades fuertes y débiles. En general, es buena idea simplicar el diseño (losofía KISS - Keep it simple, sir), pero se ha de ser consciente de la pérdida de semántica que implica. <> Actividad 2.12: Descarga el software DIA parala creación dediagramas de diversos tipos. Puedes encontrarlo de forma gratuita en la página web http: //sourceforge .net/projects/dia-installer/. "5DiagramILdiI (causeiswinwigng) -dua Arthivo Editar1er Lupi: QbjetosSelecciona! ü Ü Q C Crea un diagrama nuevo y con los símbolos iii] °°9&#39;°&#39;"°1-°° " c.-. delosdiagramas entidad relación delanota- ° ciónChen (ER)modela la relación Cliente- adquiere-Producto con los atributos que sete ocurran. Identica el icono de cada gura con los símbolos Entidad, Entidad Débil, Atribu- to (con susmúltiples tipos) y Relación. 2.4. El modelo E / R ampliado La primera concepción del modelo entidad relación tuvo, por las limitaciones tecnológicas de la época, un alcance bastante limitado, que, con los años, se ha ido desarrollando hasta alcanzar un nivel satisfactorio para los diseñadores de basesde datos. El modelo Entidad-Relación Extendido, o Ampliado, incorpora todos los ele- mentos del modelo entidad relación incluyendo los conceptos de subclase,superclase junto a los conceptos de especialización y generalización. 2.4.1. Generalización y Especialización Una entidad E es una generalización de un grupo de entidades E1, E2, En, si cada ocurrencia de cada una de esas entidades es también una ocurrencia de E. 59
  • 69.
    Bases de Datos GENERALIZACIÓNESPECIALIZACIÓN Figura 2.23: Generalización y Especialización. Todas las propiedades de la entidad genérica E son heredadas por las subenti- dades. Además, cada subentidad tendrá sus propios atributos independientes de la generalización. Las subentidades son especializacionesde la entidad general, se puededecir que las subentidades o subclasestienen una relación del tipo ES UN con la entidad padre o superclase. La relación de generalización se representa mediante un triángulo ísósceles pe- gado por la base a la entidad superclase. En la gura siguiente Empleado es la superclase y los directivos, comerciales y técnicos son subclases. En la relación se adjunta un atributo que indica cómo debe interpretarse la relación de la superclase con la subclase. La generalización Empleado que puede ser un directivo, un técnico o un comercial. Cada subentidad tiene sus propios atributos y relaciones, pero todas heredan losatributos nombrey DNI de la entidad padre(Empleado). IIF JITZTC Figura 2.24: Ejemplo de generalización. 60
  • 70.
    Capítulo 2. Diseñológico relaciona] Tipos de especialización Se puedeagregar más semántica al diagrama entidad relación extendido co1nbi- nando los siguientes tipos de especialización: IEspecialización Exclusiva: En este caso,cada una de las ocurrencias de la su- perclase solopuede materializarse en una de las especializaciones. Porejemplo, si un empleado es un directivo, no puede ser un técnico o un comercial. Para representar esta especialización exclusiva, el triángulo de la jerarquía lleva un arco. Figura 2.25: Especialización exclusiva. IEspecialización Inclusiva: Se produce cuando las ocurrencias de la supercla- se pueden materializarse a la. vez en varias ocurrencias de las subclases. En este caso, el empleado directivo, podría ser también técnico y comercial. Se representa sin el arco, como en la gura 2.24. IEspecialización Total: Se produce cuando 1a entidad superclase tiene que ma- terializarse obligatoriamente en una de las especializaciones. Se representan añadiendo un pequeño círculo al triángulo de la generalización: Figura 2.26: Especialización Total. n Especialización Parcial: La entidad superclase no tiene por qué materializarse en una de las especializaciones (es opcional). Se representa sinel pequeño circulo, como en la gura 2.24. 61
  • 71.
    Bases de Datos <> Actividad2.13: Crea un E/R para almacenar datos de los distintos tipos de ordenadores quepuede tener una organización. Clasifícalos en Sobremesa, Portátiles y Servidores, y asigna correctamente los atributos: N°Serie, Procesador, Memoria, CapacidadDisco, TipoBatería, DuraciónBatería, N°Procesadores y TipoProxy. 2.5. Construcción de un diagrama E/ R A cont.inuación se presentauna guía metodológica. para crear un entidad relación a partir de un análisis de requisitos: 1. Leer varias vecesel problema hasta memorizarlo. 2. Obteneruna listainicial decandidatos a entidades, relaciones y atributos.Se realiza siguiendo los siguientes consejos: n Identicar las entidades. Suelen seraquellos nombrescomunes queson im- portantes para el desarrollo del problema. Por ejemplo, empleado, vehícu- lo, agencia, etc. En principio, todos los conceptos deberían estar perfec- tamente especicados en el documento de requisitos, pero, de no existir el documento ERS, quizá solo se disponga de extractos de conversacio- nes con usuarios en las que se hacen referencias vagas a ciertos objetos, teniendo que hacer un importante ejercicio de abstracción para poder dis- tinguir si son entidades, atributos, etc. Por ejemplo, un mecánico que tan solo habla de ciertos modelos de vehículos pertenecientes a determinadas personas, pero que nunca hace referencia a los vehículos Diesel que serán fundamentales identicar para el correcto diseño de la base de datos. - No hay que obsesionarse enlos primeros pasos pordistinguir las entidades fuertes de las débiles. Si estrivial, se toma nota de aquellas que parezcan claramente entidades débiles. De lo contrario, se apuntan como entidades sin especicar si son fuertes o débiles. n Extraer los atributos de cada entidad, identicando aquellos que pueden ser clave. Se suelen distinguir por ser adjetivos asociados a un nombre común seleccionadascomo entidades. Por ejemplo, color, que es un adje- tivo, puede ir asociado a la entidad vehículo. Además, se debe establecer el tipo de atributo, seleccionando sies opcional, obligatorio, multivaluado, compuesto o derivado. Si es compuesto se indica su composición, y si es derivado, cómo se calcula. Es bastante útil apuntar sinónimos utilizados para el atributo para eliminar redundancias. 62
  • 72.
    Capítulo 2. Diseñológico relacional IEs fácil identicar las generalizaciones si se obtiene un atributo que es aplicable a más de una entidad. En ese caso, se puede intentar aplicar una generalización /especialización,indicando cuáles lasuperclase y cuál las subclases. Además, se deben especicar los tipos de especialización (inclusiva, exclusiva, parcial, total). IIdenticar los atributos de cada relación. Se suelen distinguir, al igual que los de entidad, por ser adjetivos, teniendo en cuenta que para que sean de relación, solo deben ser aplicables a la relación y no a ninguna de las de las entidades relacionadas. ITambién es posible que los nombres comunes contengan muy poca in- formación y no sea posible incluirlas como entidades. En este caso, se pueden seleccionar como atributos de otra entidad, por ejemplo, el autor de un libro puede ser una entidad, pero si solo se dispone del nombre del autor, no tiene sentido incluirlo como una entidad con un único atributo. En este caso, sepuede incluir como atributo de la entidad Libro. n Extraer los dominios de los atributos. Siempre es buenapráctica, ir apun- tando, aunque en el diagrama entidad relación no se exprese explícita- mente, a qué dominio pertenece cada atributo. Por ejemplo, el Salario pertenece a los números reales (Salario: Reales), o el color de un objeto puede serverde, amarilloo rojo (Color: Verde,Amarillo, Rojo). - Identicar las relaciones.Se puedenver extrayendo los verbosdel texto del problema. Las entidades relacionadasserán elsujeto y el predicado unidos por el verbo que hace derelación. Por ejemplo, agente inmobiliario vende edicio. En este caso el agente inmobiliario representaría una entidad el edicio la otra entidad y vende sería la relación. IUna vez identicada las relaciones, hay que anar cómo afecta la relación a las entidades implicadas. Este esel momento de distinguir las fuertes de las débiles haciendo preguntas del tipo ¿tiene sentido esta ocurrencia de entidad si quito una ocurrencia de la otra entidad? ¿sepueden identicar por sí solas las ocurrencias de cada entidad? Si a la primera pregunta la respuesta es negativa, las dos entidades son fuertes, si no, alguna de ellas esdébil. Si la respuesta a la segunda espositiva, dependerán solo en existencia, si es negativa, alguna de las dos depende en identicación de la otra. 3. Averiguar las participaciones y cardinalidades. Generalmente se extraen del propio enunciado del problema. Si no vienen especicadas, se elegirá la que almacene mayor cantidad de información en la base de datos. 63
  • 73.
    Bases de Datos 4.Poner todos los elementos listadosen elpaso 2 en un mapa y volver a considerar la pertenencia de cada uno de los elementos listados a su categoría. Así, se replanteará de nuevo si cierto atributo es una entidad, o si cierta entidad puede ser una relación, etc. 5. Renar el diagrama hasta que se eliminen todas las incoherencias posibles, volviendo a los pasos anteriores en caso de encontrar algún atasco mental o conceptos dudosos que diculten la continuación del análisis. Es bueno, en estas circunstancias discutir con compañeros u otros expertos sobre el diseño realizado. 6. Si hay dudas sobre elenunciado o sobre losrequisitos, o se hanquedado algunas cosas enel tintero, será necesarioacudir al responsable del documento ERS o volver a concertar una entrevista con el usuario para aclarar conceptos. En este caso, seaclararán las dudas y se volverá al punto 2 para reiniciar el análisis. ¿Sabías que . . . 7 En muchas ocasiones, cuando no se sabe cómo continuar, o no se encuentra la solución de un problema, basta con explicarle el problema a otra persona, aunque esa personano tenga ni idea del tema o no sea experta en la materia. Automáticamente, la solución aparece. Se ha iniciado incons- cientemente un proceso mental para ordenar las ideas que ha desembocado en la resolución del problema. 2.6. El modelo relacional El objetivo principal del modelo relacional es proteger a.l usuariode la obligación de conocer las estructuras de datos físicas con las que se representa la información de una base dedatos. Desvincular estas estructuras de datos. que son complejas por naturaleza, del diseño lógico (Modelo Relacional), permite que la base de datos se pueda implementar en cualquier gestor de bases dedatos relacional (Oracle, MySQL, DB2, etc.) A continuación se enumeranlas características fundamentales del modelo relacional: n La relación es el elemento fundamental del modelo. Los usuarios ven la base de datos como una colección de relaciones. Estas relaciones se pueden operar mediante el Algebra Relacional. -El modelo relacional es independiente de la forma en que se almacenan los datos y de la forma de representarlos, por tanto, la base de datos se puede 64
  • 74.
    Capítulo 2. Diseñológico relacional implementar en cualquier SGBD y los datos se pueden gestionar utilizando Cualquier aplicación gráca. Por ejemplo. se pueden manejar las tablas de una base de datos MySQL u Oracle con Microsoft Access. Véase práctica 5.3. IAl estar fundamentado en una fuerte base nlatemática. se puede demostrar la ecacia del modelo a la hora de operar conjuntos de datos. 2.6.1. Las relaciones en el modelo relacional Se dene una relación como un conjunto de atributos. cada uno de los cualesper- tenece aun dominio, y que posee unnombre que identica la relación. Se representa grácamente por una tabla con columnas(atributos) y las (tuplas). El conjunto de tuplas de una relación representa el cuerpo de la relación y el conjunto de atributos y el nombre representan el esquema. Relación:lmpue5roVehículos Nombte jrE m Teléfonooueño maní Seat IbizaTDI1 9 einer-w &#39; . 1 Volskwaen Polo TDI 1.o 918773621 4231 mo Renault La ; una Coupé m 929883762 741mm Fiat Punto1.o 646553421 923mm: Figura 2.27: Denición de Relación. ¿Sabías que . . . 7 Actualmente,los modelos lógicos más extendidos con diferencia son el modelo relacional y los diagramas de clasesque utiliza UML para modelar las basesde datos orientadas a objetos. El modelo relacional de Codd se ajusta a la perfección al modelo entidad/relación de Chen creado en la fase de modelización conceptual. No así el modelo de UML, que requiere técnicas más complejas y especícas como los casosde uso o los diagramas de transición de estados. 2.6.2. Otros conceptos del modelo relacional A continuación se denen los conceptos necesarios para transformar el modelo conceptual (diagrama entidad-relación) en el modelo lógico (modelo relacional). u Atributo: Características que describen a una entidad o relación. IDominio: Conjunto de valores permitidos para un a.tributo. Por ejemplo, cadenas de caracteres. números enteros, los valores Sí o No, etc. 65
  • 75.
    Bases de Datos -Restricciones de semántica: Condiciones que deben cumplir los datos para su correcto almacenamiento. Hay varios tipos: o Restricciones de clave: Es el conjunto de atributos que identican de forma única a una entidad. o Restricciones de valor único (UNIQ UE): Es una restricción que impide que un atributo tenga un valor repetido. Todos los atributos clave cum- plen esta restricción. No obstante es posible que algún atributo no sea clave y requiera una restricción de valor único. Por ejemplo, el número de bastidorde unvehículo noes clave(lo esla matrícula) y sin embargo, no puede haber ningún número de bastidor repetido. o Restricciones de integridad referencial: Se da cuando una tabla tiene una referencia a algún valor de otra tabla. En este caso la restricción exige que exista el valor referenciado en 1a otra tabla. Por ejemplo, no se puede poner una nota a un alumno que no exista. o Restricciones de dominio: Esta restricción exige que el valor que puede tomar un campo esté dentro del dominio denido. Por ejemplo, si se establece que un campo DNI pertenece al dominio de los números de 9 dígitos + 1 letra , no es posible insertar un DNI sin letra, puesto que la restricción obliga a poner al menos 1 letra. o Restricciones de vericación (CHECK): Esta restricción permite compro- bar si un valor de un atributo es válido conforme a una expresión. o Restricción de valor NULO (NULL o NOT NULL): Un atributo puede ser obligatorio si no admite el valor NULO o NULL, es decir, el valor falta de información o desconocimiento. Si admite como valor el valor NULL, el atributo es opcional. o Disparadores o triggers: Son procedimientos que se ejecutan para hacer una tarea concreta en el momento de insertar, modicar o eliminar infor- mación de una tabla. o Restricciones genéricas adicionales o aserciones (ASSERT). Permite va- lidar cualquiera de los atributos de una o varias tablas. IClave: Una clave es un conjunto de atributos que identican de forma única una ocurrencia de entidad. En este caso, las claves pueden ser simples (atómi- cas) o compuestas. Además, hay varios tipos de clave: o Superclave:Identican a una entidad(pueden ser no mínimas).Por ejem- plo, para un empleado, las superclavesposibles sonel DNI, o elDNI+Nombre. o el DNI+Nombre+Numero de la Seguridad Social, etc. 66
  • 76.
    Capítulo 2. Diseñológico relacional o Clave Candidata: Es la mínima Superclave (en el caso anterior el DNI, O el Número de la seguridad social). o Clave Primaria: Es la clave candidata elegida por el diseñador como cla- ve denitiva (en el ejemplo anterior se elegiríael DNI por ser la. más representativa paraun empleado). o Clave foránea: Esun atributo de una entidad, que es claveen otra entidad. Por ejemplo. la nota en un módulo de una asignatura corresponde a un DNI, que es clavede Otraentidad. En este casoel DNI es unaclave foránea en la tabla notas. 2.7. Transformación de un diagrama E / R al mo- delo relacional MODELO CONCEPTUAL (CHEN) *MODELO RELACIONAL (CODD) Figura 2.28: Transformación del modelo E/ R en relacional. Para realizar esta transformación se siguen las siguientes reglas: Transformación de entidades fuertes Para cada entidad A, entidad fuerte. con atributos ((11,612, .. .,a,,) se crea una tabla A (con el nombre en plural) con n Columnas correspondientes a los atributos de A, donde cada la de la tabla A corresponde a una ocurrencia de la entidad A. La clave primaria de la tabla A la forman los atributos clave de la entidad A. Figura 2.29: Paso a tablas de entidades fuertes. En el diagrama E-R de la gura 2.29, las tablas generadas son: CATEGORIAS 67
  • 77.
    Bases de Datos Transformaciónde entidades débiles Para cada entidad débil D, con atributos Cd1,Cd2,. .. ,cd¿,d¿+1,dt+2,.. .,d,,, donde cdl, Cdg,.. .,cd, son los atributos clave de la entidad D, y una entidad fuerte F de la que depende D con atributos clave(c f1,c f2,. . .,cfm): se creauna tabla D con m+n columnas Cd1,Cd2,.. .,cd,,, d¿+1,d¿+2, .. .,d,,,cf1,cf2, .. ., cfm correspondientes a los atributos de D y a los atributos clave de F. Si solo tiene dependencia de existencia, la clave primaria de la tabla D será la unión de los atributos clave de la entidad D. Si la entidad débil D, además, tiene una dependencia de identicación, la clave primaria de la tabla D será. launión de los atributos cd¡, Cdg, . .. ,cdt, cfl, Cfg,.. .,cf,,,, es decir, la unión de los atributos clave de la entidad débil D y de la entidad fuerte F. Figura 2.30: Paso a tablas de una entidad débil. En eldiagrama E-R de lagura 2.30. las tablas generadas son3: CUENTAS_BANCARIAS(N°Cuenta, saldo) TRANSACCIONES(Código,Tipo,Cantidad) Transformación de relaciones Por cada relación R entre entidades E1, E2, . . ., E N. La clave de E,- es C,-= a,-1,a,2, . . .,a,-N. Regla general para las relaciones: se crea una tabla con todos los campos claves de las entidades relacionadas y los atributos de la relación. La clave primaria de la tabla generada es la suma de los atributos claves de las entidades relacionadas, y cada clave incorporada a la tabla. será una clave foránea que referencia a la tabla de la que se importa. Por ejemplo, en la gura 2.31 hay una relación ternaria con dos entidades con clave compuesta, aula y asignatura, y otra, estudiante. que tiene una clave simple. La transformación al modelo relacional exige la creación de una tabla para la relación. La tabla ESTUDIOS, tendrá como columnas los atributos clave del aula, los de asignatura y el atributo clave deestudiante, todos ellos formando la clave primaria y, 3Falta incorporar en la gura el atributo N°Cuenta a la tabla TRANSACCIONES, aquí se ha omitido para centrar la atención en los atributos de las entidades. Consultar la sección de excepciones en la transformación de relaciones. 68
  • 78.
    Capitulo 2. Diseñológico relacional al mismo tiempo, actuando como clavesforáneas desus respectivastablas. Además, se incorpora el atributo de relación hora. Figura 2.31: Paso a tablas de una relación. AULAS(Numero, Planta. Situación) ESTUDIANTES(N°1Iatricu1a,NombreDireccion) ASIGNATURAS(Nombre, Ciclobescripcion) ESTUDIOS(Numero, Planta.N°IIatricu1a, Nombre,Ciclo,Hora) El consejo del buen administrador. .. Aunque en teoría, 1a tabla ESTUDIOS tiene como clave primaria Ia suma de las claves primarias de las tablas que relaciona, tener en una base de datos tablas con claves tan complejas, hace que e] sistema pueda funcionar más lento de 1o esperado debido a 1a multitud de comprobaciones que el gestor debe realizar cuando se inserta o modica un dato. Si es un sistema cuyo funcionamiento se base en Ia inserción o modicación constante de datos, más que en1a consultadelos mismos, quizá, en estos casos,se puedasaltar la teoría y crear un campo sencillo adiciona], identicador de Ia la, y sustituirlo por Ia clave primaria compuesta origina]. De esta forma, se simplica enormemente Ia clave primaria en pos de un funcionamiento más eciente. Nótese, que en estos casos,se pierde mucha semántica que, o se ignora o habría que controlar de otros modos. No siempre se aplica la regla general para crear una tabla por cada relación. Generalmente, se pueden encontrar las siguientes excepciones ala regla general 69
  • 79.
    Bases de Datos 1. Relacionescon cardinalidad 1:N. En este caso.no secrea una tabla para la relación, sino que seañade a la tabla de la entidad que actúa con participación máxima N la clave de la entidad que actúa con participación máxima 1 (como clave foránea). Si además, la relacióntuviera atributos se importaríantambién a la entidad que actúa con participación máxima N: N REPRE SENTANTE S(N_L¡cenc¡aN°mb¡e) ÁCÏORE S(Código.NombreAnístico _Licencia_Representan Contrato) O Figura 2.32: Excepción I. Relaciones l-N. La transformación quedaría como se ilustra en la Figura 2.32. Se puedeobser- var que en este caso, no se ha creado una tabla para la relación, sino que se ha añadido a la tabla ACTORES la clave foránea N_Licencia_Representante que referencia al campo N_Licencia de la tabla REPRESENTANTES. También se ha añadido el campo Contrato, atributo de la relación, a la tabla ACTORES. ACTORES(Codigo, NombreArtísitico, NombreReal, N_Licencia_Represent ante,Contrato) REPRESENTANTES(N_Licencia.Nombre) 2. Relaciones reexivas con cardinalidad l-N. En este caso, tampoco se crea una tabla para la relación. Hay que crear una tabla con el nombre de la entidad, añadiendo otra vez la clave cambiada de nombre. Figura 2.33: Excepción II. Relaciones reexivas 1-N. 70
  • 80.
    Capítulo 2. Diseñológico relacional En el ejemplo de la Figura 2.33, el empleado solo puede tener un jefe, por tanto, se incorpora elDNI del jefe del empleado (DNISupervisor)como clave foránea. EMPLEADOS(DNLNombre,DNISupervisor) <> Actividad 2.14: En las relacionesreexivas con cardinalidad m-n, se aplica la regla general para la transformación de relaciones. Expresa cómo sería la regla para crear tablas con relaciones reexivas con cardinalidad m- n. Después, aplica esa regla para transformar la Figura 2.33 suponiendo que tuviera cardinalidad m-n. 3. Relaciones 1-1. Este tipo de relaciones tampoco generan tabla. El paso a tablas se realiza de forma muy parecida a las relaciones 1-N.En este caso, tampoco se genera tabla para la relación y se tiene la libertad de poder incor- porar la clave de una de las dos entidades a la otra. Figura 2.34: Excepción III. Relaciones 1-1. En este caso existen las siguientes opciones: IIncorporar la clave de Personajes como clave foránea en la tabla actores: ACTORES(Codigo, Nombre, CodigoPersonaje) PERSONAJES(CodigoNombrePelícula) IIncorporar la clave de Actores como clave foránea en la tabla Personajes: ACTORES(Codigo, Nombre) PERSONAJES(Codigo,Nombre.Película.CodigoActor) - Incorporar la clave de Actores como clave foránea en la tabla Persona- jes y la. clavede Personajesa la tabla de Actores comoclave foránea: ACTORES(Codigo. Nombre,CódigoPersonaje) PERSONAJES(Codigo.Nombre.PelículaCodigoActor) 4Téngase en cuenta, queen estecaso se está introduciendouna pequeñaredundancia, peroque puede ser de mucha utilidad para simplicar futuras consultas. 71
  • 81.
    Bases de Datos ParticipacionesO,x Normalmente las participaciones son importantes para calcular la cardinalidad de la relación, y transformar conforme a las reglas expuestashasta ahora. Incluso en muchas ocasiones, las participaciones se omiten en los diagramas entidadrelación. No obstante, es necesariotener en cuenta cuándo la participación tiene un mínimo de O,para adoptar un campo de una tabla como opcional NULL, u obligatorio NOT NULL. Generalizaciones y especializaciones Para transformar las generalizaciones se puede optar por 4 opciones. Cada op- ción se adaptará mejor o peor a los diferentes tipos de especialización (Exclusiva, Inclusiva, Total, Parcial). Figura 2.35: Paso a tablas de generalizaciones. 1. Se puede crear una tabla. para la superclase y otras tantas para cada subclase, incorporando el campo clave de la superclase a las tablas de las subclases. EMPLEADOS(DNI, NombrePuesto) DIRECTIVOS(DNI,Dpto) TECNICOS(DNI.lIáquinas) COMERCIALES(DNLComisión) 2. Se puede crear una tabla para cada subclase incorporando todos los atributos de la clase padre, y no crear una tabla. para la superclase. DIRECTIVOS(DNLNombrePuestoDpto) TECNICOS(DNI,Nombre,Puest.o,Máquinas) COMERCIALES(DNI,Nombre,Puesto.Comisión) 3. Se puede crear una sola tabla para la superclase, incorporando los atributos de todas las subclases yañadir, para distinguir el tipo de la superclase, un campo 72
  • 82.
    Capítulo 2. Diseñológico relacional llamado tipo, que contendrá el tipo de subclaseal que representa cadatupla. Este tipo de opción se adapta muy bien a las especializaciones exclusivas. EMPLEADOS(DNI, NombrePuesto. Dpto, Máquinas, Comisión, Tipo) 4. Se puede crear una sola tabla para la superclase como en la opción anterior, pero en lugar de añadir un solo campo tipo, se añaden varios campos que indiquen si cumple un perl, de este modo se soportan las especializaciones inclusivas. EMPLEADOS(DNI, Nombre,Puesto, Dpto, Máquinas, Comisión, EsDirectivo, EsTécnico, EsComercial) 2.8. Normalización Habitualmente, el diseño de una base de datos termina en el paso del modelo entidad-relación al modelo relacional. No obstante, siempre quese diseñaun sistema, no solo una base de datos, sino también cualquier tipo de solución informática, se ha de medir la calidad de la misma, y si no cumple determinados criterios de calidad, hay que realizar, de forma iterativa, sucesivos renamientos en el diseño, para alcanzar la calidad deseada. Uno de los parámetros que mide la calidad de una base de datos es la forma, normal en la que se encuentra su diseño. Esta forma normal puede alcanzarse cumpliendo ciertas restricciones que impone cada forma normal al conjunto de atributos de un diseño. El proceso de obligar a los atributos de un diseño a cumplir ciertas formas normales se llama nomnalización. r°----/ ---&#39;7 °°¿;:"° cotzzsasl . L GICO PROBLEMA/ (Entldad/ (Relacional) v, :z A: W l ____ sí g , al BASE « . ¡NT L; ÉÍ DE MODELO Fisco ¿SUFIC ENTEME E J NORMALIZADO? » Figura 2.36: Renamiento de un diseño de base de datos. Las formas normales pretenden alcanzar dos objetivos: 73
  • 83.
    Bases de Datos 1.Almacenar en la base de datos cada hecho solo una vez, es decir, evitar la redundancia de datos. De esta manera se reduceel espaciode almacenamiento. 2. Que los hechos distintos se almacenen en sitios distintos. Esto evita ciertas anomalías a la hora de operar con los datos. En la medida que se alcanza una forma normal más avanzada, en mayor medida se cumplen estos objetivos. Hay denidas 6 formas normales, cada una agrupa a las anteriores, de forma que, por ejemplo, la forma normal 3 cumple la forma normal 2 y la forma normal 1. Antes de abordar las distintas formas normales, esnecesario denir los siguientes conceptos 5: Dependencia funcional: Se dice que un atributo Y depende funcionalmente de otro atributo X, o que X > Y, si cada valor de X tiene asociado en todo momento un único valor de Y. También se dice que X implica Y, y por tanto, que X es el implicante. Por ejemplo: PRODUCTOS (CódigoProducto, Nombre, Precio, Descripcion) CódigoProducto + Nombre, puesto que un código de producto solo puede tener asociado un único nombre, dicho de otro modo, a través del código de producto se localiza un único nombre. Dependencia funcional completa: Dado una combinación de atributosX (X 1, X2, .. se dice que Y tiene dependencia funcional completa de X, o que X=> Y, si depende funcionalmente de X, pero no depende de ningún subconjunto del mismo. Por ejemplo: COMPRAS (CódigoProducto, CódigoProveedor, Cantidad, FechaCompra) CódigoProducto,CódigoProveedor => FechaCompra, puesto que la FechaCom- pra es única para la combinación de CódigoProducto y CódigoProveedor (se puede hacer un pedido al día de ca.daproducto a cada proveedor), y sin em- bargo, se pueden hacer varios pedidos del mismo producto a diferentes provee- dores, es decir, CódigoProductvoweFecha. Dependencia funcional transitiva: Dada la tabla T, con atributos (X,Y,Z), don- de X > Y, Y + Z e Y 4+ X 6, se diceque X depende transitivamente de Z, o que, X > Z. 5No esobjetivo del libro entrar en los detalles matemáticosdel procesode normalización,y sí proporcional al lector una idea intuitiva del mismo. GY nodepende deX. 74
  • 84.
    Capítulo 2. Diseño lógicorelacional Ejemplo 1: PRODUCTOS (CódigoProducto,Nombre, Fabricante,País) CódigoProducto > Fabricante Fabricante > País CódigoProducto > País, esdecir, CódigoProducto depende transitivamente de País. Ejemplo 2: PRODUCTOS (CódigoProducto,Nombre, Fabricante,País) CódigoProducto > Nombre Nombre > CódigoProducto CódigoProducto -v» Nombre A continuación, se describe de forma intuitiva las siguientes formas normales: FN 1: En esta forma normal se prohíbe que enuna tabla haya atributos que puedan tomar más un valor. Esta forma normal es inherente al modelo relacional, puesto que las tablas gestionadas por un SGBD relacional, están construidas de esta forma. Por ejemplo, en la Figura 2.37 se puede ver la diferencia entre una tabla que cumple 1a fnl y otra que no: La amenaza Fantasma 1999 Ewan McGregor La amenaza Fantasma 1999 Ewan McGregor Liam Neeson Natalie Portman Blade Runner 1982 Harrison Ford Rutger Hauer Avatar 2009 Sam Worthington Zoe Saldana Sigourney Weaver Figura 2.37: Primera Forma Normal. 75
  • 85.
    Bases de Datos FN2: Un diseño se encuentra en FN 2 si está en F N1 y además, cada atributo que no forma parte de la clave tiene dependencia completa de la clave principal. Ejemplo: COMPRAS (CódigoProducto, CódigoProveedor, NombreProducto, Cantidad, FechaCompra). CódigoProducto > NombreProducto, por tanto, al no ser dependencia fun- cional completa, no está en FN2. FN 3: Un diseño se encuentra en FN3 si está en F N2 y además, no hay ningún atributo no clave que depende de forma transitiva de la clave. Ejemplo: PRODUCTOS (CódigoProducto,Nombre, Fabricante,País). CódigoProducto > Fabricante Fabricante > País CódigoProducto +> País País dependetransitivamente de CódigoProducto, por tanto, no está entercera forma normal. FNBC: Esta forma normal, llamada Forma Normal de Boyce-Codd, exige que el modelo esté en FN3, y que además, todo implicante de la tabla, sea una clave candidata. Ejemplo: NOTAS (DNIAlumno, DNIProfesor,NombreProfesor, Nota). DNIProfesor > NombreProfesor NombreProfesor > DN IProfesor DNIProfesonDNIAlumno > Nota En este caso, la tabla está en 3FN porque no hay dependencias funcionales transitivas, y sin embargo no está en FNBC porque NombreProfesor y DNI- Profesor son implicantes, y no son claves candidatas. Para obtener la tabla en F NBC habría que quitar de la tabla los atributos DNIProfesor y NombrePro- fesor. Otras formas normales: Existen más formas normales (FN4, F N5, FNDK, FN6 76 cuyo alcance excede el de este libro y cuya aplicación en el mundo real es únicamente teórica). Las formas normales 4 y 5, se ocupande las dependencias entre atributos multivaluados, la Forma Normal Dominio Clave (FNDK) trata las restricciones y los dominios de los atributos, y nalmente la FN6 trata ciertas consideraciones con las bases dedatos temporales.
  • 86.
    2.9. Capítulo 2. Diseñológico relaciona] Prácticas Resueltas Práctica 2.1: Startrekfanscom v.1.0 Un club de fans de la famosa película startrek, ha decidido crear una página web donde se pueda consultar información referente a todas las películas y capítulos de la saga. El dominio startrekfans.com se redirigirá a un servidor web que consulte una base de datos con la siguiente información: Actores: Es necesario conocerel Nombre completo del actor, el personaje que interpreta, la fecha de nacimiento y su nacionalidad. Personajes: De los personajes es necesariosaber el nombre, su raza y gradua- ción militar que desempeña (ca.pítán. teniente, almirante, etc.).Es importante conocer el actor que interpreta el personaje, teniendo en cuenta que, un perso- naje solo puede serinterpretado por un actor, y un actor solo puede interpretar un personaje. Además, será necesario conocerel personaje del que depende di- rectamente en graduación militar. Capítulos: Hay que almacenar todos los capítulos, indicando a qué temporada pertenece cada capítulo, el título, el orden en el que fue rodado, fecha de su primera emisión en televisión y los personajes que participaron en cada capítulo. Películas: Se debe almacenar también, todas las películas que se proyectaron en cines, cada una con su año de lanzamiento, título y director. También hay que guardar los personajes que aparecenen cada película y cuál de ellos fue el protagonista. Planetas: En cada capítulo, se visita 1 o varios planetas, hay que almacenar el código del planeta, su nombre, galaxia a la que pertenece,y el problema que se resolvió en esa visita y la nave conla que se viajó al planeta. Para la descripción del problema será suciente con un campo de texto de 255 caracteres. De la nave sealmacenará el nombre, código y número de tripulantes. 1. Realizar un diagrama entidad relación que modele el diseño de la base de da- tos. Puedes hacerlo en papel, con dia, con Visio. o con cualquier otro software de diagramas. 2. Realizar la conversión al modelo relacional del diagrama realizado en el primer Apartado, indicando qué claves primarias y foráneas sehan de crear. 77
  • 87.
    Bases de Datos 78 Pasoa tablas: A CTORES(Código,Nombre,Fecha, Nacionalidad) PERSONA JES(Código.Nombre,Raza, Grado, CádigoActor, CodigoSupeñor) PLANETAóYCódigo,GalazimNombne) CAPÍTULOS(Temporada, Orden, Título,Fecha) PELÍCULASYCódigo, Título,Director,A ño) PERSONA JESCAPITUL OS(CódigoPersonaje,Temporada. Orden) PERSONA JESPELICULA S(CódigoPersonaje, CódigoPelicula) VISITAS(CódigoNave, CódigoPlaneta, Temporada, Orden) NA VES(Código,N° Tripulantes,Nombre) Obsérvese que: En el enunciado no aparece explícitamente el campo Código para los personajes y actores, pero es necesario incluirlo para dotar de un atributo clave a estas entidades. La clave de la entidad Capítulo es compuesta, por tanto en las relaciones se importan los dos atributos que forman la clave. La relación ternaria tiene cardinalidad M:N:P, es decir, Aluchos-Aluchos-Aluchos. En la relación interpreta se podría haber incorporando los dos campos claves a las entidades opuestas. Aunque introduce redundancia de datos, es útil para agilizar consultas. Nótese que a las dos relaciones Apanece, se les ha cambiado el nombre por una combinación de las dos entidades que relaciona, para evitar la posible ambigüedad. El nombre de las tablas aparece en plural, mientras que el de las entidades aparece en singular. Esto es debido a que la entidad representa un concepto abstracto y la tabla un conjunto de datos.
  • 88.
    Capítulo 2. Diseñológico relaciona] Práctica 2.2: Startrekfanscom v.2.0 El club de fans de Startrek ha pensado ampliar los requisitos de la página web para hacer una segunda versión. Esta segunda versión consiste en incluir información ex- tra para los personajes. De esta manera, si el personaje es un humano, se indicará su fecha de nacimiento y ciudad terráquea donde nació. Si el personaje es de la raza Vulcano, se almacenará el nombre del mentor y la fecha de graduación, y si es de raza Klingon, se guardará su planeta natal y la fecha de su último combate. 1. Realizar una generalización de la entidad Personaje indicando las especializa- ciones necesarias. 2. Transforma al modelo relacional la generalización del apartado anterior. PERSONAJEóYCódigmNombre,Grado, CódigoActor.CodigoSuperior, Raza. Ciudad. F_Nacim, Planeta, F. UlLCombate, ltlentor, Fecha_Grado) Obsénrese que: k Se ha optado por una de las 4 opciones que hay. En este caso. se ha creado una única tabla con el campo Raza como discriminante de tipo. que indicará los campos a rellenar según su tipo. Por ejemplo, si la raza es Klingon, tan solo se rellenarán los campos Planeta y F_Ult_Combate. Esto generará 4 valores nulas por personaje, pero evitará complejidad en el modelo al no tener tablas extra. Al tratarse de una especialización total y exclusiva. cada personaje solo puede pertenecer a una de las razas, y además tiene que pertenecer a una de manera obligatoria. 79
  • 89.
    Bases de Datos Práctica2.3: Startrekfanscom v.3.0 El club de fans de Startrek quiere la tercera versión de la base de datos de la si- guiente forma: En cada capítulo, 1a nave que viaja a un planeta, puede disponer de una nave pe- queña llamada lanzadera con la que bajan a la supercie del planeta. La existencia de la lanzadera, solo tiene sentido si existe la nave a la que pertenece. Se identi- cará cada lanzadera mediante un número entero y el código de la nave. Es necesario conocer la capacidad en personas de la lanzadera. 1. Incorporar los cambios de la tercera versión al modelo conceptual y lógico de las prácticas anteriores. Paso a, tablas: LANZA DERA S(CódigoNave, Número, Personas) NAVES(Código, N 7Hpulantes,Nombre) Obsérvese que: i Al ser una relación 1-N se importa a LANZADERAS el atributo CódigoNave. k El campo Número es una clave débil. k Al tratarse de una dependencia de identicación, el CódigoNave forma parte de la clave primaria. de la tabla LANZADERAS. 80
  • 90.
    2.10. Capítulo 2. Diseñológico relaciona] Prácticas Propuestas Práctica 2.4: Peluquería Una peluquería desea llevar el control de sus empleadas y de sus clientes así como de los servicios que se prestan. Se deseaalmacenar la siguiente información: Empleadas: DNI, Nombre, Especialidad (Masaje, Corte, Color, Brushing, Ma- nicuras, Rulos,etc.) Clientes: Datos personales (DNI, Nombre, Profesión, Teléfono y Dirección) y los tratamientos médicos a los que está sometido el cliente. Servicios prestados: Qué empleada atendió a qué cliente, y qué tipo de servicio le prestó en qué fecha y hora. Citas: Fecha y Hora en la que se cita al cliente y empleada que realizará el servicio. Cosméticos: Código, Nombre, Cantidad y Precio. Ventas de cosméticos: Una empleada vende un cosmético a un cliente, obte- niendo una comisión. .Realiza. una lista de candidatos a entidades, relaciones y atributos, indicando en cada entrada, si se admite o serechaza comotal razonando el porqué de tu decisión. Por cada relación, razona su tipo y cardinalidad. .Modeliza mediante un diagrama E/ R. .Realiza el paso a tablas del modelo E/ R. 81
  • 91.
    Bases de Datos Práctica2.5: Reyes Magos sin fronteras La ONG Reyes Magos sin fronteras desea hacer una base de datos para que esta Navidad todos los niños pobres de España puedan recibir sus regalos la noche de los Reyes Magos. La ONG contacta con vecinos de distintos barrios para disfrazarlos de Reyes Magos y organizarlos en grupos lúdicos que realicen eventos para que los niños los visiten y puedan formular sus peticiones. Cada niño es recibido por un Rey Mago y puede hacer una única petición, la cual queda anotada en la base de datos para posteriormente, el día 6 de enero, entregar esa petición. La ONG comprará los regalos con el dinero que distintas organizaciones benécas aportarán a la causa. Los datos que interesa almacenar son los siguientes: 82 De los vecinos: DNI, Nombre y apellidos, Rey Mago al que encarna y los vecinos a los que ha conseguido convencer para que se unan a la causa. De losniños: Nombre,Dirección yel Regaloque pideal ReyMago. (Losniños, no tienen DNI, y necesitarán un dato identicativo). De los grupos de vecinos senecesita saber a qué Barrio pertenecen, número de integrantes del grupo y los Eventos que han organizado. De los eventos interesa conocer la Ubicación física, la Fecha, la Hora y los niños asistentes. . Realiza una lista de candidatos a entidades, relaciones y atributos, indicando en cada entrada, si se admite o se rechaza como tal justicando el porqué de tu decisión. Por cada relación, razona su tipo y cardinalidad. .Realiza el diagrama entidad-relación y el paso al modelo relacional.
  • 92.
    Capítulo 2. Diseñológico relaciona] Práctica 2.6: Mundial de fútbol Diseñar una base de datos para organizar el campeonato mundial de fútbol. Consi- derar los siguientes aspectos: IJugadores: un jugador puede pertenece a un único equipo y puede actuar en varios puestos distintos, pero en un determinado partido solo puede jugar en un puesto. IÁrbitros: En un partido intervienen 3 árbitros titulares, linier derecho, izquier- do, principal y un árbitro secundario. Un árbitro puede realizar una función en un partido y otra distinta en otro partido. -Estadísticas: Se desea saber losgoles queha marcado un jugador en quépartido y en qué minuto, también se desea poder describir cómo sucedió el gol. IPorteros: Se desea almacenar cuántas paradas ha realizado, en qué minuto, y en qué situación se han producido: penalti, tiro libre, corner o jugada de ataque. IPartidos: Todos generan un acta arbitrar donde se pueden incluir todo los comentarios que el árbitro considere oportuno: lesiones, expulsiones,tarjetas, etc. 1. Realiza una lista de candidatos a entidades, relaciones y atributos, indicando en cada entrada, si se admite o se rechaza como tal, justicando el porqué de tu decisión. Por cada relación, razona su tipo y cardinalidad. 2. Realiza el diagrama entidad-re1a.ción yel paso al modelo relacional. 83
  • 93.
    Bases de Datos Práctica 2.7:Supermercado virtual Se va a desarrollar una aplicación informática para wwwxvirtualmarkeïïcom cuya interfaz de usuario estará basada enpáginas webpara que los clientes puedan realizar compras desde sus casas. La empresa dispone de una serie de repartidores que se encargan dedistribuir los pedidos a los clientes. A continuación se muestrael informe de un analista tras una entrevista con el cliente: La aplicación permitirá registrar nuevos clientes. Para usar la aplicación, un cliente deberá registrarse indicando sus datos personales (DNI, Nombre, Dirección, Código Postal,Teléfono de contacto, emaily password)a travésde unformulario de registro. Una vez registrado podrá acceder a la realización de pedidos con su email y su password. Los productos que oferta el supermercado están divididos en diversas categorías. Los datos necesarios para cada categoría son: nombre de la categoría, condiciones de almacenamiento (frío, congelado,seco) yobservaciones. Los datos delos produc- tos son: nombre, marca, origen, dimensiones (volumen y peso), una fotografía, la categoría yunidades disponibles 7. La aplicación permitirá visualizar un listado de productos ordenado por cate- goría, permitiendo seleccionar losproductos que desee comprarmediante una caja de texto donde se indicará el número de unidades seleccionadas. Laaplicación llevará la cuenta (cestade la compra) delos productosque elcliente haido seleccionando. La aplicación permitirá también efectuar un pedido con todos los productos que lleve almacenados en su cesta de la compra. Los datos del pedido son: código del pedido, fecha del pedido, cliente, dirección de entrega, productos pedidos, importe total delpedido ydatos de pago (número de tarjetay fechade caducidad)? Para poder generar un pedido se deberán dar dos situaciones: IEl cliente deberá pertenecer a una zona (Código Postal) donde existan repar- tidores. Un repartidor se ident.ica mediante un nombre, número de matrícula de la furgoneta y zona donde reparte. -Debe haber unidades sucientes por cada producto para satisfacer las deman- das de cada pedido. Una vez generado elpedido se mostrará al usuario una página con los datos de su pedido, se restarán del stock las unidades pedidas y se emitirá una nota de entrega 7El control del stock está supervisadopor otra aplicación subcontratada,y por tanto no es necesario preocuparse por él. SEI pagodel pedidoestá automatizadomediante otrosoftware queproporciona elbanco. 84
  • 94.
    Capítulo 2. Diseñológico relaciona} (albarán) a los responsablesde almacén para. quesirvan ese pedido. Se pide: 1. Diseño Conceptual. Realizar el diagrama entidad relación de la aplicación. Se ha de tener en cuenta que el entrevistado narra todo el proceso que necesita la lógica de su negocio. Se deberán separar los procedimientos de los datos. Diseño Lógico. Realizar el paso al modelo relacional. .¿En qué forma normal está la tabla Clientes? Práctica 2.8: Requisitos deuna aplicación Busca alguna persona que tenga un negocio. Puedes trabajar haciendo equipo con otros compañeros. Tenga informatizado el negocio o nó, pídele que sea tu cliente y realiza las siguientes tareas de análisis: Entrevístale, si es necesariograba la entrevista e intenta extraer una lista de requisitos. Extrae de esta lista de requisitos los que versen sobre almacenamiento de la información en bases de datos y realiza un diagrama entidad relación que satisfaga todos esos requisitos. Reúnete de nuevo con el cliente y pídele que verique tu modelo E-R. Repite este proceso hasta que el cliente de el visto bueno. Cuando el cliente haya validado tu modelo, realiza el diseño de basede datos, trans- formando el modelo E-R al modelo relacional y después, implementando ese modelo en Access. <> 85
  • 95.
    Bases de Datos Práctica2.9: MySQL Workbench El objetivo de esta práctica es conocer en profundidad un software de diseño de base dedatos de licencia GNU. Debes tener en cuenta que los diagramas de MySQL Workbench son una mezcla del modelo conceptual de Chen y del modelo relacional de Codd, incluso más orientado al modelo relacional. Por ejemplo, no existen las relaciones ternarias, y a las entidades las llama tablas, como en el modelo relacional. Toda su nomenclatura está orientada a comunicarse con un SGBD sin necesidad de transformaciones previas. Además, aunque tiene el apellido MySQL, este software está basado en DB Designer, programa genérico de diseño de base de datos, y por tanto se puede conectara cualquier SGBD (Oracle, DB2, Access.. y no solo a MySQL. 1. Conectarse a la página web de lrIySQL Workbench. http://wb.mysq1.com/ 2. Seleccionar 1a opción Download Workbench y mientras se descarga, selec- ciona el enlace About - Screenshots y comenta para qué sirve el software. 3. Buscar en google MySQL Workbench manual y descárgate el manual de instrucciones de MySQL Workbench. 4. Instalar el software. El proceso de instalación es muy sencillo. 5. Iniciar la aplicación y seleccionar la opción Add Dzïagram para comenzar a dibujar un diagrama entidad relación (EER (Extended Entity Relationship - Entidad Relación Extendido). En la opción de menú Model, seleccionar la notación para los objetos y para las relaciones. Seleccionarla opción Classic y compararlas con las otras notaciones. 6. Insertar los objetos necesarios para representar el siguiente diagrama E-R: Se puede usar el panel inferior para incorporar los atributos y así, del panel lateral izquierdo, poder seleccionar los objetos. Debe quedar así: 86
  • 96.
    10. Capítulo 2. Diseñológico relacional File Edit View Arrnnge Model Dnabne Plugins Tools Community Htip H H ° F7 I} MySQL Model V Dlagram <7 ¡J ¡m1 1 -.-, T 0:69am u Nanhrevmmmqs) _ A mydb u bles ¡g + :1 Ecume- _ .:1 Jugador. Selecciona aquí las tablas y relaciones _¿ Routme Groups Atributos i I i _* JI en! i 7 i Coum Dennis ¡ _ , <domuednd< to overwue mula n (OÚIQO Column i E _ 1 5 Dorsu ¿. ee _ in Nombre RCHARHS} cmmems, l Equmcjcdngo c w O » Tnble Columns Xndexes Foreign Keys TruggersPartmonan; Ovtxnns lns 4 y J Dcñpcn iwal i Relationship between Jugador ¡nd Equipo created. en la tabla jugador que representa el equipo en el que juega. .Observar que al generar la relación, automáticamente se creauna clave foránea . Experimentar con el diseño para crear la relación juega como n-m en lugar de 1 n. ¿Qué sucede?Observar que automáticamente crea una nueva tabla. . Descargar el chero sakila-db.zip de la página web de MySQL. Se encuentra muy fácil escribiendo sakila-dazip en google. Descomprimir y abrir el archi- vo sakilamwb. Observar cómo están organizadas en regiones las tablas y las relaciones del modelo. Realizar los diagramas de las prácticas anteriores con MySQL Workbench y mediante la opción de menú Database, Forward Engineer, generar automáti- camente los scripts de creación de base de datos.
  • 97.
    Bases de Datos 2.11. 88 Resumen Losconceptos clave de este capítulo son los siguientes: u Modelizar un problema consiste en realizar múltiples abstracciones. En bases de datos, se utilizan tres modelos: el modelo conceptual, o diagrama entidad- relación, que es más cercano al usuario, el modelo lógico, que es un modelo más técnico y que tiene traducción directa al modelo físico que soportan los SGBD. Los componentes que hay que detallar en un diagrama entidad relación son: Entidades, Atributos, Relaciones, Participaciones, Cardinalidades y Generali- zaciones. Los tipos de Entidades son fuertes cuando su existencia no depende deninguna otra, y débiles, cuando su existencia depende deotra. Esta dependencia puede ser ampliada si la entidad también depende enIdenticación, es decir, necesita el atributo clave dela entidad fuerte para poder identicar de forma única cada ocurrencia de entidad. Los atributos pueden ser clave o no clave, univaluados, multivaluados, com- uestos derivados obli atorios u o cionales. 7 7 Las relaciones pueden ser, según su grado, binarias, ternarias, reexivas o n-arias. La cardinalidad de una relación se calcula tomando las participaciones máxi- mas y mínimas de las ocurrencia de una entidad en la rela.ción. Estas pueden ser 1-1, l-N o M-N. Las generalizaciones pueden dar lugar a cuatro tipo de especializaciones, ex- clusivas, inclusivas, totales o parciales. El modelo relacional expresa, mediante relaciones, todos los conceptos deta- llados en el modelo conceptual. Se puede transformar el modelo entidad relación en un modelo relacional ge- nerando una tabla para las relaciones de tipo NzM y las n-arias. Para las relaciones de tipo l-N se importan los atributos clave de la entidad cuya car- dinalidad es 1 a la que tiene como cardinalidad N. Las relaciones 1:1 y las generalizaciones tienen varias opciones de transformación. La normalización es un proceso que sirve para medir la calidad de un diseño, la forma normal que cumple cada tabla es un indicador que seusa para evitar redundancia; de datos.
  • 98.
    2.12. Test derepaso 1. ¿Cuál es el modelo que más se apro- xima a la visión del usuario? a) El modelo conceptual b) El modelo lógico c) El modelo físico ) d El lenguaje SQL 2. Una relación reflexiva es una entidad de grado a)Ob)1c)2d)3 3. La participación de una entidad en la relación es: a) El máximo de ocurrencias que pueden apa- recer en la relación b) El mínimo de ocurrencias que pueden apa- recer en la relación c) El máximo y mínimo de ocurrencias que pueden aparecer en la relación d) El máximo y mínimo de ocurrencias de la entidad 4. A qué participaciones corresponde una cardinalidad 1:N a) (0a1)y(1»1) b) (1,11)y (0,11) C) (171)y (lan) d) (0,1) y (n,n) 5. Si un empleado puede trabajar en múltiples proyectos a) Trabajar es 1:1 b) Trabajar es N:N c) Trabajar es NzM l d Trabajar es 1:N Capítulo 2. Diseño lógico relaciona] 6. Un atributo de relación es a) Consecuencia de la relación b) Consecuencia de una de las entidades c) De las dos entidades d) Son atributos compuestos 7. La dependencia de identicación a b ) Incluye la dependenciade existencia ) No incluye la dependencia de existencia c) No se aplica a entidades débiles ) d Sólo es posible cuando hay dos entidades fuertes 8. Una especialización inclusiva es aque- lla que a) Puede materializarse en más de una sub- clase b) Puede materializarse en solo una clase c) Puede no materializarse en alguna clase d) Tiene que materializarseen unaclase 9. La transformación de una relación con cardinalidad 1-N al modelo relacional a) Genera una tabla para la relación b) Se incorpora unaclave ala entidad 1 c) Se incorpora una clave a la entidad N ) d No se incorpora clave 10. Con la normalización: a) Se rena el modelo conceptual b) Se rena el modelo lógico C) Se rena el modelo físico ) d No sirve para. nada qmr6?&#39;se&#39;¿v&#39;9o&#39;9o&#39;v&#39;9&#39;2&#39;qzv&#
  • 99.
    Bases de Datos 2.13. 10. 90 .Nombralos distintos tipos de rela- ciones que puede haber atendiendo a su grado. .Explica para qué sirve cada uno de los modelos expuestos en el tema para el diseño de una base de da- tos. .Pon un ejemplo de cada uno de los tipos de cardinalidades. .¿Qué son las relaciones reflexivas? .¿Qué diferencia hay entre ocurren- cia de entidad y entidad? . ¿Cuándo una entidad es débil? ¿Y cuándo lo es una relación? ¿Qué signica que una entidad fuerte tenga una relación depen- diente en existencia de otra entidad débil? Pon un ejemplo. .¿Cuándo dos entidades tienen de- pendencia de identicación? .¿Qué elementos incorpora el mode- lo entidad-relación extendido? Dene los siguientes conceptos: IAtributo Clave IAtributo Derivado ISuperclave IClave Candidata - Dependencia Funcional 11. 12. 13. 14. 15. 16. 17. 18. 19. Comprueba tu aprendizaje - Dependencia Funcional Com- pleta IDependencia Funcional Tran- sitiva ¿Qué diferencia hay entre una es- pecia.lización total y otra parcial? ¿Qué diferencia hay entre una espe- cialización exclusiva y otra inclusi- va? Crea una lista con los pasosque hay que dar para pasar un diagrama en- tidad relación al modelo relacional. ¿Qué esel Álgebra Relacional? ¿Para qué sirve? Comenta cual es la utilidad de las restricciones de integridad referen- cial en una base de datos. ¿Qué esel valor NULO? ¿Qué esuna clave foránea? Pon un ejemplo de especialización y comenta 4 formas distintas de ge- nerar las tablas. ¿Cómo representa MySQL Work- bench las relaciones? ¿Y las depen-
  • 100.
    CAPÍTULO 3 Diseño físicorelacional Objetivos Ñ Denir las estructuras físicas de almacenamiento Contenidos Crear tablas @ Herramientas grácas y de Seleccionar tipos de datos ade- texto proporcionadas por los cuados SGBD Denir campos Claves enlas ta- El lenguaje de denición de da- blas tos Implantar las restricciones es- Creación, modicación y elími- tablecidas en el diseño lógico nación de BBDD Vericación mediante conjun- Creación. modicación y elími- tos de pruebas nación de tablas _ _ Uso de asistentes y herramien- Implementación de restriccio- tas grácas nes . _ _ Uso del lenguaje de denición de datos (DDL) Denir y documentar el diccio- nario de datos En este tema se detalla e] proceso de implantación denitiva, o diseño físico, de la base dedatos en un sistema.informático. Se describe e] uso del lenguaje SQL distinguiendo las peculiaridades de los principales SGBD. 91
  • 101.
    Bases de Datos 3.1.Notación para la sintaxis En informática, cuando sequiere utilizar cualquier tipo de lenguaje de programa- ción, se necesita una sintaxis para. denir cómo construir sentencias en eselenguaje de programación. Para expresar la sintaxis se utiliza una notación. Esta notación está compuesta por componentes léxicos o tokens. Estos tokens pueden ser palabras clave del lenguaje, deniciones de otros elementos sintácticos más básicos,expresio- nes, variables, etc. La notación utilizada en este libro es la siguiente: 92 -Palabras en mayúsculas. Estas son las palabras reservadas del lenguaje. Por ejemplo SELECT, DROP, CREATE son palabras reservadas, estoquiere decir que no pueden utilizarse para nombrar objetos de la base de datos porque tienen una misión especíca. Palabras en minúscula. Se utiliza para realizar descripciones de sintaxis más en detalle. Por ejemplo, el token especicacion_de_ltro se puede desplegar en más deniciones para. realizar ltros en las consultas. Corchetes. Un elemento sintáctico entre corchetes indica opcionalidad. Es de- cir, lo que está encerrado entre corchetes se puede incorporar a la sentencia o no, dependiendo de lo que el programador quiera expresar. Por ejemplo, en la denición CREATE [TEMPORARY] TABLE, se puedeindicar de for- ma opcional el token TEMPORARY para crear una tabla temporal, que solo durará en memoria mientras el usuario permanezca conectado. Si varios ele- mentos vanseparados mediante el tokenpipe | , se puede elegiruno deellos. Llaves. Indica alternativa obligatoria. Se debe elegir entre los elementos se- parados mediante el token pipe | . Por ejemplo, en la denición de sintaxis para crearuna basede datos,CREA TE{DA TABASE |SCHEMA}nombre_bd, hay que escribir uno de los dos token entre llaves. Se puede optar bien por CREATE DATABASE nombre.bd o por CREATE SCHEMA nombre-bd. Puntos suspensivos. Signica repetición, es decir, el último elemento sintáctico puede repetirse varias veces. Por ejemplo, para codicar una consulta se usa la denición SELECT columna columna] ...FROM tabla. Los puntos sus- pensivos signican que sepuede repetirel token columna] tantas veces como se desee.Asi, es posible escribir SELECT Nombre, Direccion, Codigo FROM Clientes.
  • 102.
    3.2. SGBD Capítulo 3. Diseñosico relacional Herramientas grácas proporcionadas por los Es muy sencillo manipular una basede datos compleja si se disponede un interfaz gráca de usuario que ayude al DBA, Database Administrator, a enviar comandos de administración de forma automática y sin necesidad de conocer su sintaxis: 3.2.1. PhpMyAdmin de MySQL MySQL dispone de un interfaz basada en páginas web llamada PhpMyAdmin, que a través de un servidor Web, por ejemplo Apache, permite administrar las bases de datos de un servidor desde cualquier equipo de la red. íig/Ïgáffslï) LU Servidor: localhost D ¿gilBase de datos: ¡ardineria ¡EME o raciones &#39; Privilo ios XEliminar Base de datos 1.5 ¡un ¡«khl ¡ardmena (8) V ¡amimna (a) Client-s ¡ S 2"" TÍ >< 3° E ¿mas DculloPodldos Í¡ Ï-i ÏX 195 2351?? Empleados ÍES É Ei Ï7 31 g°""°° GamasPmductos E; Si ÏX 1 m? Ocinas É :¿ ÏX 9 Productos p¡g°¡ É Si X 26 Pedidos Í É ÏÍ l ÏX 115 Productos 73 ii ÍX 375 8 tablals) Número de filas 7" t Marcar todos/as IDesmarcartodos &#39;._ Vista de ÍmDFESlO 3, Dncoonano de datos Nombre: ¡g Crear nueva tabla en la base de datos jardineria ve lnnoD lnn lnnoD
  • 103.
    Bases de Datos 3.2.2.Oracle Enterprise Manager y Grid Control El SGBD Oracle dispone de dos herramientas grácas, ambas con interfaz web y montadas sobre un servidor web propietario de Oracle. Enterprise Manager. Esta herramienta está incorporada directamente en el soft- ware de Oracle, y es congurada por el asistente de creación de base dedatos. Es capazde manipulartodas lasfunciones básicas de unabase dedatos (crea- ción detablas, usuarios,exportación eimportación deinformación, etc.) Archivo Editar yet Hostnnal Marta Herramimxas nda ¿a v a ¿a ¡(till/aluníoesk(ooilïsaiem/Snsoleíciambase/i nstoncïeIs:Kcrnapïeveniéaouzadmargewnbaïá umricasryp A v ÏClv .; ORACLE Enlernnse Manager Hg >@A"&#39; &#39; &#39; -&#39;--°""""&#39; 5-4" ¡hïï-h &#39;" z - -. v- Base un Datos Cvweïiaoa ti: f»C Ji-J. Instancia de Base de Datos: nbaalumno Inido Rorrlodo Dasïnnhaaa Senasa Esouema Mov monto ne Dam; Soítwme ¡ Sie =a.. =c-rb;;:nu; -jurv-QOHJ ¡Mu cast 9,5,5", vovDatos Marais-Juanma ng; v General CPU del Host Sesiones Aciivas Tiempo de Respuesla SOL e - &#39; 10a: 4.o 1.o Estan Activo 75 l ultima Recgglacnon IEsaa I Activa msm ¡Han-EW 1G!!! CES? 5o Otros ¡o IE Cy USM" 0,5 sgyucs Namnmlo ¡maru nn Irma ¡ Recgglacrrr de ¡mm "¿min 25 í REWHGÜCAB segundos Ha! anumwcesnzg 0 °-° °-° u USFENER alumno Cvl 2; ¡unieron tg Romano Banco |tiempo oe Respuesta sol. mi ya) Ve, ¿mas mm ma: Emu. Pecopulacum ae Peruana: Resumen de Diagnostico: Resumen ue Espacio Alla Disponibilidad Log un Novus No m, m3.: evvov DRA Tamaño oe la Base de Onzas (GB) ïconsola Detalles ¡mans Mm, o g rn-spaces Pvuiofndtcu g _ namas ¡horacio nl pm. su cm. 9 Roca-mucosas no! Autor un segmentos g umma cop-a oo 509mm wo ¡W801i OI ¡d&#39;un 4 C Rogsno du numericun San on Dans Desaczwnca m. no vanesa: una en rs V Alertas Categoria Tono "n Cvmu oAmancio o 4 _ Tennmado &#39; &#39; &#39; " " &#39; &#39; alunm-deskmpzusa a Figura 3.2: Enterprise Manager de Oracle. <> Actividad 3.1: A través de una máquina virtual conun sistema operativo de tipo Linux, por ejemplo, Ubuntu, instala los paquetes de mysql server y los paquetes de phpmyadmin. Para ello, escribe en un terminal el comando sudo apt-get install mysql-server y después, el comando sudo apt-get ins- tall phpmyadmin. Es posible que antes de realizar esta operación necesites actualizar el repositorio de paquetes mediante el comando sudo apt-get up- date. Selecciona que la instalación congure phpMyAdmin automáticamente para apache y escribe una. contraseña de usuario. Cuando termine la instala- ción, ya puedes abrir un navegador en la máquina virtual y escribir la dirección 9-1
  • 104.
    Capítulo 3. Diseñofísico relacional http: 127 .O. O.1phpmyadminindex.php. Introduce el usuario phpmyad- min y la. contraseñaque hayasescrito en la conguración. Finalmente, explora las opciones que te da la interfaz de usuario. Si lo preeres, puedes descargar del blog del libro la máquina virtual de prácticas, donde ya está instalado mysql-server y phpmyadmin. Crea una base de datos que contenga dos tablas de la temática que elijas. <> Actividad 3.2: Arranca el Enterprise Manager de la máquina virtual de prácticas (Linux) y accedeal servidorweb paraconsultar cadauna delas pes- tañas de las que dispone y examinando la información de la base de datos que te proporciona. Abre un terminal y con el usuario oracle, utiliza el comando emctl start dbconsole para arrancar el enterprise manager. A continuación, escribe en un navegador de internet la dirección http:1oca1host:1158em o directamente pulsa dos veces en el enlace que hay en el escritorio. En el cuadro de usuario y password introduce SYSMAN y manager. Grid Control. Se ha de instalar aparte del software de Oracle. Permite gestionar múltiples bases de datosen diversosservidores, permitiendo consultar el estado y rendimiento de todas y cada una de ellas. ORACLE Enterprise Manager 10g - asume: mu i Flill!" Destinos Despliegues Alertas Politicas Trabaos Informes Busqueda deDestino V¡s¡°n Gener Buscar ÏWÉW ____s _,_ __ h, ____ _, _ _ o _ Total de Destinos Controlados 12 551m0 (¡e 10305105 Desunos Violaciones de Poimca de Seguridad Crítico x .i_6 Advenencia a informativo i 2 trueno en las Últimas 24 Horas 1 IAgiirg Asesores de Parches Criricos para Directorios Raiz de Oracle Asesores de Parches 0 Directorios Raiz de Oracle Afectados O credenciales de Oracle rAetaLink ugC gng ¿vagas Alertas de Todos los Desimcis Critico x 1 Advertencia á)1 RÉS"EEÉÉ"ÉÏ&#39;ÏÉEÏÏ_, ,__,__ ,%,,_W Errores En 0 Ver Instalaciones de Base de Datos v Jiolaciones de Poliiica rie Todos los Ziesrinas Cnïico X AÜIEWEWCÉ ¿IB L. Insialacioiies de Base de Daios ¡"fmmalm i Z Oracle Daiabase 10g 10 1 04 0 Trabajos de Todos los Destinos onde amaba 19g1o2 o 3 o Eiecuciones problemáticas [últimos 7 días) J 0 Ejecuciones suspendidas (últimos 7 días) «r 0 Figura 3.3: Grid Control de Oracle. 95
  • 105.
    Bases de Datos Ambasherramientas son extremadamente pesadas en términos de Consumo de recursos, por lo que en muchas ocasiones seha de administrar la base de datos sin su ayuda. 3.2.3. DB2 Data Studio Este software sustituirá en un futuro próximo a una herramienta más antigua llamada Control Center. Permite manipular los objetos de bases de datos DB2 e Informix y sus permisos. Soporta la administración avanzada de DB2 tanto en Win- dows comoen Linux, y simplica la construcción de consultas SQL. Su gran potencia es que facilita la creación de Servicios Web que distribuyen datos de consultas SQL a las aplicaciones cliente. Q Database Administration -.sqlxeditor_projectlscript1 .sql -|BM Data Studio Edu hawgete Serán Prayer. Szrot ama-a. web " &#39; a _= g Optrrsoluuorvs Vi&#39; &#39;_ &#39; &#39; &#39;,&#39; ;&#39; &#39; 5533:: SOJYCE E1301? u ÏL; Sanmsqi L3 j- L ¿i Í: ¿su &#39; 7 :e.e:: &#39; :::.-:. =.-r:_:;-.::: a-._-:-::a:es:CÏ:e::a"s p &#39;¡3; (v; -; ¿,4 .&#39;..- 71- - - . - Re se". -e r- a!54-95 ¿EMV xxx. La. en: &#39;.. -::r: s m7, L Sa! c? -5 ; @ Leste-te i -I, s&#39;-&#39;-&#39;=&#39;.s s-ac 2- ázosw-t. o l 0 _ Se? Does 9 =e:e&#39;a&#39;.e: 3855552 Dsgens v _ mas r b ¡este 95-2-59: l o _ 951m" 61.95 , : v __ ioes 1m- v | ,- __ Srras irse-e o ! n- -.. u ¡ &#39; " l-¿ï -Reaeze D i o _&#39; n ases _ Ír Q: mae-ces "ereñm"&#39; 593W??? Crzrt-ssss: (vr-Saez l &#39; * "ha" Caer-z: Cr -S&#39;=::»S:sa:e 5 * _ "T5 =o--a::-Q- c:- -sw=-.= | &#39; _&#39; em-nes ogeca-m-v: Caro: | o D SW 95-25-95 ._ . . .... ... . - x- -a a .e ¿esquema ¡SV .3: l o _, Se:.r:es ¡ ,5:, 5,01;, .62 ¿envase soñaste»... &#39; "m _ q .- :1 | -_ ¿ves " "V y , -¿C- _ Se:S:a2-"e":&#39;e-".-.e::&#39; E , ÏCrko; ¡C1 xaiceze eve ïlee&#39;e&#39;*:es Figura 3.4: Interfaz de Data Studio para DB2. <> Actividad 3.3: De la páginaweb httpJ/www-Ol. ibm.com/software/data/ db2/ descarga el DB2 express. Deberásregistrarte para poder descargar tres cheros: db2exc_971_WIN_x86.zip ibm_data_studio_standalone_win.zip db2exc_vsai_971_WIN_x86.exe 96
  • 106.
    Capitulo 3. Diseñofisico relacional Para arrancar el asistente de la instalación. haz doble clic sobre db2exc_971_WIN_ x86.zipEXPCimagesetup.exe, pulsa sobre Instalar un producto y sigue los pasos delasistente para realizar una instalación típica. Una vez nalizada la instala- ción, con el Editor de mandatos,ejecuta el comando list db directory para comprobar alguno de sus parámetros. É mznwruvaapamuaro b .3 -ra-e".esaeac-<wsrazóc eme-a b a r Bo l a -r&#39;*a*ie-:as se zcrFgxazóo D &#39; I i l- P l a ...,...,...a¡_......... . l Eawdemmdatos Seleccionado Eater ver HenmertasAwda , _ _ V i ¡ m1 Q V_ _ h j erre-zas se smc-uso- . a ¡"resaca-carmen ce virutas l n i i _ A w J ". ¡va , &#39; i 1- Ü 71- & E; J A ® H :3 hñvnuoe ¡[IQ ueezawecemrsatos l Maristas línia-m viaáémraeü y las: db dxzcczozï Minera decnctadAx en dxrcccorxe I1 lnzrad; J. dc han de datos: Íuna: dc bno de datos ISAMPLE Xíonbxc de base dedatos ISLIM! Dztoctorio dolanus duos Locuu - C: Plural {alonsodc basodl datos r(1.00 Figura 3.5: Editor de mandatos para DB2. El consejo del buen administrador. . . Muchos administradores solo conocen las herramientas grácas de gestión y administración de una basede datos, puesto que es máscómodo y más intuiti- vo, y además, aprenderlos lenguajes de programación de basesde datos es una tarea difícil y laboriosa. Sin embargo, conocerlos comandos y las instrucciones que proporciona un SGBD, otorga una visión extra que posibilita automatizar tareas rutinarias y permite solucionar problemas que no se pueden solucionar solo con las herramientas grácas. A un administrador que conoce ala perfec- ción todos estos comandos,le resulta muy sencillo actualizarse en los continuos cambios de versiones enestas herramientas grácas. 3.3. Intérpretes de comandos de los SGBD La utilidad principal de un SGBD es su intérprete de comandos. Es una aplica- ción cliente cuya única misión es enviar comandos al SGBD y mostrar los resultados devueltos por el SGBD en pantalla. El cliente del servidor lIySQL (mysql-server) se llama mysql, el de Oracle se llama sqlplus y el de DB2 se llama db2. Para invo- 97
  • 107.
    Bases de Datos carlosdesdeel sistema operativo (Windows o Unix), tan solo hay que escribir en un terminal su nombre con ciertas opciones. 3.3.1. MySQL: El cliente de MySQL-Server mysql [options] [database] options: --help Visualiza la ayuda {-p I --password}[=frase] Password con la que se conecta {-P I --port}[=numero] Puerto TCPIP remoto al que se conecta {-h I --host}[=numero] Nombre Host o IP al que se conecta {-u I --user}[=usuario] Usuario con el que se conecta {-s I --socket}[=nombre_fich] Fichero socket con el que se conecta #ejemplo típico: mysql -u root -p Enter password: ********* Welcome to the MySQL monitor. Commands end with ;or g. Your MySQL connection id is 37 Server version: 5.0.75-Oubuntu10.2 (Ubuntu) Type help; or h for help. Type c to clear the buffer. El comando puede ir acompañado de dos tokens opcionales, options, que permite especicar una serie deparámetros de conexión y database, queespecica en qué base de datos se ejecutarán los comandosintroducidos. Las opciones queaquí semuestran son soloalgunas delas disponibles, para más información consultarla documentación de MySQL: ILa opción help muestra un resumen de las opciones disponibles. - La opción -u o user permite especicar el usuario de conexión, por ejemplo -u paco. - La opción -p o password permite introducir un password para la conexión del usuario. Se puedeescribir -p frase_password osolo -p para que el gestor la solicite y la oculte con asteriscos para que nadie pueda espiar. ILa opción -h o host permite seleccionar el host donde está el gestor de basede datos. Puede ser localhost o 127.0.0.1 si la base de datos está en el ordenador 98
  • 108.
    Capítulo 3. Diseñosico relacional local y se deseaconectar vía tcp-ip u otra dirección IP. Si se omite, por defecto se conecta al servidor por named pipes (o tuberías con nombre) que no salen a la interfaz local de la tarjeta de red y son mecanismosde comunicación más rápidos, pues son internos al ordenador. n La opción -P o p permite especicar el número de puerto al que conectarse (si se conectavía TCP-IP al ordenadorremoto). Si no seindica esteparámetro, por defecto se conecta al puerto 3306. - Permite especicar el nombre del socket por defecto. esto será necesariocam- biarlo cuando exista más de una versión del gestor debase dedatos ejecutando- se en un ordenador. A continuación se muestran unos cuantos ejemplos de conexión: #conexión sin usuario y password (se conecta como anónimo y sin password) mysql #conexión con usuario y password (se conecta como root y su password ) mysql -u root -p Enter password: ********* #conexión con usuario y password en claro a la base de datos jardineria mysql -u root -pPasswordDe1Usuario jardineria #conexión con usuario y password en claro a la base de datos jardineria # del host 192.168.3.1OO mysql -u root -pPasswordDe1Usuario -h 192.168.3.1OO jardineria #conexión con usuario y password en claro a la base de datos jardineria # del host 192.168.3.1OO con puerto 15300 mysql -u root -pPasswordDe1Usuario -h 192.168.3.1OO jardineria -P 15300 3.3.2. Ejecución de consultas en MySQL Para ejecutar una consulta, tan solo es necesario arrancar el cliente mysql y conectarse a una base de datos del gestor. A continuación, escribir en la consola el comando SQL que se desea ejecutar y se obtienen los resultados. Cuando una línea es precedida. del carácter #, el resto de la línea se ignora. Estas líneas se llaman comentarios y son útiles para documentar las acciones realizadas. Por ejemplo: 99
  • 109.
    Bases de Datos itseleccionala version del gestor y la fecha actual mysql> select version() ,current_date(); + ------------------ --+ -------------- --+ I version() I current_date() l + ------------------ --+ -------------- --+ I 5.0.75-Oubuntu10.2 I 2009-8-20 I + ------------------ --+ -------------- --+ 1 row in set (0.00 sec) Este comando ilustra distintas cosas: IUn comando consiste en una sentencia SQL terminada en punto y coma. ICuando se escribeun comando, mysql lo manda al servidor para que lo ejecute, muestra los resultados y vuelve al prompt, indicando que está listo para recibir más consultas. IMuestra los resultados en forma de tabla (las y columnas). La primera fila contiene las etiquetas para las columnas y las las siguientes muestran los resultados de la consulta. n Muestra las las devueltas y cuánto tiempo tardó en ejecutarse, lo cual puede ofrecer una idea de la eciencia del servidor, aunque estos valores pueden ser imprecisos puesdependen demuchos factores,tales como la carga del servidor, velocidad de comunicación, etc. Las palabras claves pueden ser escritas en mayúsculas o minúsculas, y los identi- cadores detabla, campo, índice, etc son sensitivos a las mayúsculas y minúsculas en las versiones de unix (no asíen Windows).Por ejemplo,las siguientes consultas son equivalentes: mysql> SELECT VERSIÜNO ,CURRENT_DATE(); mysql> SELect version() ,current_Date(); mysql> select version() ,current_date(); Es posible escribir más de una consulta por línea, siempre y cuando estén sepa- radas por punto y coma: mysql> select userOzselect nowO; + -------------- --+ I user() I + -------------- --+ I rootmocalhost I + -------------- --+
  • 110.
    Capítulo 3. Diseñofísico relacional + ------------------- --+ I now() I + --+ I 2009-10-20 09:53:29 I + ------------------- --+ No es necesario escribir un comando en una sola línea, así que los comandos que requieran de varias líneas no son un problema. MySQL determinará donde naliza la sentencia cuando encuentre el punto y coma, no cuando encuentre el n de línea: mysq1> select user() , -> current_date(); + -------------- --+ -------------- --+ I user() I current_date() I + --+ -------------- --+ I root©1oca1host I 2009-10-20 I + -------------- --+ -------------- --+ Si no se deseaterminar de escribir la consulta, por ejemplo, por haber cometido un error en la sintaxis, se escribe para terminarla sin ejecutar: mysq1> select -> user(), -> c mysq1> El prompt se comunica con el usuario dándole información sobre qué ocurre, por ejemplo: -> Espera la siguiente línea del comando > Espera que se cierre una comilla sencilla "> Espera que se cierre una comilla doble mysq1> Listo para una nueva consulta Otra forma de ejecutar comandos SQL es almacenarlos en un chero de texto y mandarlo a ejecución mediante el comando source, que recibe como parámetro un chero de comandos y ejecuta uno por uno todos los comandos que tenga el chero: átejecución del script de creación crear_bbdd_startrek.sq1 mysq1> source /home/ivan/crear_bbdd_startrek .sql Por último, también es posible ejecutar los comandos de un chero de texto desde la shell, esto es, en modo batch. redirigiendo al cliente mysql un chero de entrada. Esto es útil para tareas administrativas donde se ejecutan varios cheros «le comandos, además de otras tareas de maxitenimiento del servidor a través de un shell script: 101
  • 111.
    Bases de Datos #ejecucion enmodo batch "S mysql -u root -pPassWdUsuario <crear_bbdd_startrek.sql #ejecucion en modo batch almacenando resultados "S mysql -u root -pPasswdUsuario <crear__bbdd_startrek.sq1 >resu1tado <> Actividad 3.4: Descarga de lapágina Web de lIySQLla últimaversión disponi- ble para Windows. A continuación. instala el software. Asegúrate de recordar la clave que eligespara el usuario root. Ejecuta la interfaz de comandos demysql. Podrás ha- cerlo desdeun terminal de MS-DOS (símbolo del sistema) o desde elmenú de inicio. Ejecuta una consulta para ver el usuario con el que te has conectado, la versión de base de datos y la hora actual. Realiza las mismas consultas en la máquina virtual Linux disponible en el blog del libro (http:bbdd-garceta.b1ogspot .com) 3.3.3. SQL*Plus: El intérprete de comandos de Oracle El intérprete de comando de Oracle es el programa sqlplus. Se puede invocar desde el sistema operativo con la siguiente sintaxis: sqlplus [{usuario[/password>] [©<identificador_conexión>] | /| /no1og }] [AS {SYSDBA I SYSOPERH En Oracle, cada instancia está referenciada por uno o más identicadores de conexión. ÍdGTZÉÍCGdOTLCOTLCIÍÓTZ es el nombre de esta referencia. #conexión a la instancia jardineria con el usuario paco sqlplus paco/password_paco©jardineria La opción /nolog arranca sqlplus sinconectarse a la basede datos. #arrancar sqlplus sin conexión sqlplus /nolog La opción/conecta a la instancia sinusuario. Suele usarse para tareas adminis- trativas: #conexión a la instancia SÜRACLE_SID como SYSDBA sqlplus /as SYSDBA Cada usuario se puedeconectar representando un rol: estos roles son el de adminis- trador de la base de datos (SYSDBA) y operador de base de datos (SYSOPER). SYSDBA y SYSOPER tienen privilegios para conectarse a la base de datos cuando no está abierta, pudiendo de este modo. realizar tareas de administración y mante- nimiento. 102
  • 112.
    Capítulo 3. Diseñosico relacional 3.3.4. Ejecución de consultas en SQL*Plus Al igual que en MySQL. una vez conectado sqlplus a una base de datos con un usuario, passwordy nombre de servicio, se procedea escribir las consultasterminadas en punto y coma, con las siguientes consideraciones: ISQL*PLUS no es sensible a mayúsculas y minúsculas ni en las palabras reser- Vadas, ni en los nombres de los objetos. ISe puede escribir una consulta en múltiples líneas: SQL> select * 2 from 3 nbajugadores; "comentario de línea - Los comentarios de línea se realizan precediendo una línea de dos caracteres - IExisten los comentarios de bloque. es decir, que afectan a más de una línea. Comienzan con los caracteres /* y terminan con los caracteres */ n Existe una tabla llamada Dual que está disponible para todos los usuarios, y sirve para seleccionar variables del sistema o para evaluar una expresión: SQL> select sysdate, user from dual; SYSDATE USER 27/06/10 SYS SQL> select 5+4 from dual; 5+4 ¿Sabías que . . . 7 Existe un intérprete de comandos gráco en Oracle lla- mado iSQL*Plus. con interfaz web. Se instala aparte del software de Oracle, descargando de la página Web de Oracle (wvvv.oracle.com) el paquete isql- plus.zip. <> Actividad 3.5: Arrancala máquina xirtual Ubuntuy abre un terminal. Conécta- te con el usuario oracle mediante el comando: 103
  • 113.
    Bases de Datos su oracle Contraseña:oracle A continuación, arranca sqlplus con el usuario nba y la passwordnba: sqlplus nba/nba Después, ejecuta las siguientes consultas: SQL> select tab1e_name from user_tab1es; SQL> select tab1e_name from dba_tables; Lee la sección 3.8.5 y comenta brevemente qué hacenlas sentencias anteriores y en qué se diferencian. 3.4. El lenguaje de denición de datos El sublenguaje de SQL que permite la denición de datos es el DDL (Data Denition Language). Las funciones de estesublenguaje son: - Crear tablas, índices y otros objetos de la base de datos (como vistas, sinóni- mos, etc.) n Denir lasestructuras físicas donde sealmacenarán los objetosde lasbases de datos (espacios de tablas(tablespaces), cheros de datos (datales), etc.) Por ejemplo, para crear el esquemade la práctica resuelta 2.1 se puede escribir el siguiente código: CREATE TABLE Actores( Codigo INTEGER PRIMARY KEY, Nombre VARCHAR(40), Fecha DATE, Nacionalidad VARCHAR(20), CodigoPersonaje INTEGERREFERENCES PERSONAJES(Codigo) ); CREATETABLEPersonajes( CodigoPersonaje INTEGER, Nombre VARCHAR(30), Raza DATE, Grado VARCHAR(20), CodigoActor INTEGERREFERENCES Actores(Codigo), Codigosuperior INTEGERREFERENCES Personajes(Codigo) J; 104
  • 114.
    Capítulo 3. Diseñosico relaciona] En el código anterior, las palabras reservadas del lenguaje se han escrito en mayúsculas (CREATE. DATE, VARCHAR). y los nombres deobjetos (Actores, Grado, Nombre) se han escrito en minúsculas para que el lector pueda identicar fácilmente qué parte de la sintaxis se debe respetar y cuál se puedevariar. DDL tiene 3 instrucciones básicas: CREATE tipo_objeto Nombre Denición. Crea un objeto de un determinado tipo (DATABASE, TABLE, INDEX, etc.) con un nombre (por ejemplo Actores o Personajes)y una denición (CodigoPersonaje, Nombre, etc.). DROP tipo_objeto Nombre. Elimina un tipo de objeto especicado mediante un nombre. Por ejemplo, la sentencia DROP TABLE Actores, borraría de la base de datos la tabla Actores junto con todos sus datos. ALTER tipo_objeto Nombre Modicación. Modica la denición de un obje- to. Por ejemplo, la sentencia ALTER TABLE Actores DROP COLUMN Fecha, eliminaría la columna Fecha de la tabla Actores. 3.5. Creación de bases de datos 3.5.1. Creación de bases de datos en MySQL En MySQL, para crear una base de datos se usa el comando CREATE DATA- BASE: CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] nombre_db [especificación_create [, especificación_create] ...] especificación_create: [DEFAULT] CHARACTER SET juego_caracteres I [DEFAULT] CDLLATE nombre_co1ación Por ejemplo, para crear la base de datos Startrek, en MySQL, habrá que teclear, en la consola de comandos, la instrucciónl: CREATE DATABASE Startrek CHARACTER SET Latinl CDLLATE 1atin1_spanish_ci; Nótese que el término a elegir puede ser o DATABASE o SCHEMA, en cualquier caso, el efecto es el mismo; MySQL usa algunos sinónimos para hacer más compa- tible su sistema de gestión con otros SGBD. Por otro lado, el parámetro opcional lTodas las sentencias mysql deben terminaren un carácter puntoy coma (2) 105
  • 115.
    Bases de Datos (especicación_create)permite elegir el juego de caracteres que va a usar la base de datos (utf8, latinl, latin2, etc.), y la colación, que especica cómo tratar el alfabeto del juego de caracteres, es decir, cómo seordena (por ejemplo, la ñ después de la m y n y noconforme a la tablade códigos ascii), ycómo se comparan los caracteres (por ejemplo,si A es iguala á) Para poder utilizar una base de datos, primero hay que establecer que las opera- ciones que se realicen a continuación se realicen sobre esta, es decir, hay que usarla. Para usarla se utiliza el comando USE dbmame Por ejemplo, para empezar a manipular la base de datos Startrek, habrá que ejecutar el comando USE Startrek; Otro comando muy útil para ver cuántas basesde datos está controlando el gestor es el comando SHOW DATABASES, que obtiene un listado de las bases de datos activas en el servidor. mysql> snow DATABASES; + ------------------ --+ I Database I + ------------------ --+ I information_schema I I Startrek I mysql + ------------------ --+ Tras la ejecución de este comando se puede ver que, además de NBA y Star- trek, hay otras dos que están siempre presentes, "information_schema y mysql que almacenan metadatos (datos sobre los datos) e información de usuarios y permisos. <> Actividad 3.6: Ejecuta los siguientes comandos en la máquina virtual Ubuntu para crear una base de datos y una tabla: mysq1> CREATE DATABASE Veterinario; mysq1> USE Veterinario; mysq1> CREATETABLE Mascotas ( Nombre VARCHAR(10), 106
  • 116.
    Capítulo 3. Diseñofísico relacional FechaNacim DATE, Amo VARCHAR(40) ); A continuación, prueba a crear una tabla llamada Vacunas, con una fecha y una ilüfa para cada mascota. Si es necesario, leela Sección 3.8 3.5.2. Creación de bases de datos en Oracle El proceso de creación de una base dedatos en Oracle esbastante más elaborado. En MySQL, una sola instancia controla todas las bases de datos, pero en Oracle, ¡ada base de datos está asociada a una. instancia. Una instancia es el conjunto de procesos de Oracle que están en ejecución en el sistema operativo y cuya misión es controlar todo lo referente a la gestión de la base de datos. Para crear una base de datos,primero hay que crearuna instanciapara procedera invocar el comando «reate databasepertinente. Oracle dispone de la utilidad gráca dbca (database con- guration assistant )que facilita este proceso. No obstante, a continuación se detalla el procedimiento para crear una base de datos Oracle en un sistema operativo Unix de forma manual: #desde el sistema operativo su oracle #conecta con el usuario oracle cp SORACLE_HOME/dbs/init.ora SÜRACLE_HDME/dbs/initjardineria.ora export 0RACLE_SID=jardineria #se conectará a la instancia jardineria #editar los parámetros del fichero init que contiene los parámetros de #inicio de la base de datos. #Debe llamarse con el nombre initNombreInstancia.ora gedit SORACLE_HUME/dbs/initjardineria.ora #cambiar los siguientes parámetros db_name=jardin memory_target=100M processes = 40 audit_file_dest=/var/oracle/product/11.2.0/ audit_trail =db db_b1ock_size=8192 db_domain=
  • 117.
    Bases de Datos --dentrode SQL PLUS, conectarse sin montar la base de datos SQL> Startup nomount ORACLE instance started. Total System Global Area 104611840 bytes Fixed Size 1334828 bytes Variable Size 83886548 bytes Database Buffers 16777216 bytes Redo Buffers 2613248 bytes --a continuación, se invoca el comando CREATE DATABASE SQL> CREATEDATABASE jardin MAXINSTANCES 1 MAXLÜGFILES 16 MAXLÜGMEMBERS 3 MAXDATAFILES 100 CHARACTER SET WE8ISO8859P15 DATAFILE /var/oracle/datos/jardineria/system01.dbf SIZE 300M EXTENT MANAGEMENT LOCAL UNDO TABLESPACE UNDOTBSI DATAFILE /var/oracle/datos/jardineria/undotbsol.dbf SIZE 550M SYSAUX DATAFILE /var/oracle/datos/jardineria/sysauxol.dbf SIZE 300M DEFAULT TEMPORARY TABLESPACE TEMP TEMPFILE /var/oracle/datos/jardineria/tempO1.dbf SIZE 100M LDGFILE GROUP1 (/var/oracle/datos/jardineria/redoO1.1og) SIZE 512OOK, GROUP 2 (/var/oracle/datos/jardineria/redo02.log) SIZE 51200K, GROUP 3 (/var/oracle/datos/jardineria/redo03.log) SIZE 5120OK; >Database created. --Finalmente, se crea el catalogo de metadatos SQL> Q/rdbms/admin/Catalog.sql SQL> G/rdbms/admin/catproc.sq1 SQL> G/rdbms/admin/ut1rp.sq1 Las opcionesde CREATE DATABASE para Oracle sonlas siguientes I MAXINSTAN CES indica el número máximo de instanciasque puedenestar usandoa la vez la basede datos objeto de la creación.Un valor distinto de 1 implicaría que la.basede datos puedeser usadaen RAC, Real Application Cluster, lo cual signica que la basede datos puedeestar montada, abierta y en uso desde más de un servidor. - MAXLOGFILES esel númeromáximode gruposde cheros de logquepueden crearse.Un chero log registratodaslasoperaciones querealizan losusuarios. I INIAXDATAFILES indica el númeromáximo de cheros de datos que pueden usarse. - DATAFILE esel chero para el tablespaceSYSTEM. 108
  • 118.
    Capítulo 3. Diseñofísico relacional MAXLOGMEMBERS es el número máximo de cheros de los miembros de un grupo. Los cheros log se combinan en grupos. UNDO TABLESPACE es el tablespace que almacenará los datos originales presentes encualquier tabla o índice antes de hacer cualquier transacción que suponga una modicación sobre aquéllos. SYSAUX TABLESPACE es unnuevo tablespaceaparecido enla versión 10g de Oracle que permite independizar de SYSTEM objetos de aplicaciones, como el Enterprise Manager, que antiguamente se alojaban en el tablespace SYSTEM. DEFAULT TEMPORARY TABLESPACE es el tablespace temporal que uti- lizarán los usuarios que no tengan explícitamente asignado otro tablespace temporal. LOGFILE GROUP es la denición de los grupos de cheros log. CHARACTER SET especica el juego de caracteres que la base de datos. utilizará para almacenar los datos (por ejemplo el WE8ISO8859P15 es el juego que incluye todos los caracteres presentesen los idiomas de Europa Occidental, incluyendo el signo del euro, ¬, acentos y la Todo este farragoso proceso se puede simplicar utilizando el asistente de crea- ción de base de datos de Oracle (dbca, database conguration assistant). Este asis- tente conduce al administrador automáticamente por el proceso de creación de una instancia con su base de datos. Además, congura automáticamente un repositorio para poder ejecutar Enterprise Manager. Para invocar este asistente tan solo hay que escribir en un terminal de un sistema operativo el comando dbca. <> Actividad 3.72 Abre la máquina virtual Ubuntuy conun terminal,haz login con el usuario oracle(su oracle).A continuación, ejecuta elcomando dbcay sigue los pasospara Crear una nueva instancia y su base de datos asociada. 109
  • 119.
    Bases de Datos ---&#39;.&#39;...L.:u.a v-dagu" 2&#39; LIaLgJL" ¿ÏJJUJLI3""1&#39;J" Seleccione laoperación quedesea realizar i crear Base deDatos l ::n:&#39;: :: >_- z tul&#39; I&#39;m-n" :1 ;;=&#39;» r Gestionar Plantillas Í Las operaciones de conguración de ASM se pueden realizar mediante el Asistente . &#39; deConguración deGestión deNmacenamiento Automático (ASMCA) desde el directorio raízde9nddeOracle. Cancelar 44 AWÜG Figura 3.6: Database Conguration Assistant. 3.6. Modicación de una base de datos El comando ALTER DATABASE permite cambiarlas característicasde funcio- namientode una basede datos.Por ejemplo,en MySQL. tan solosepuedecambiar el juego de caracteres y su colación: #cambia la colación de una base de datos ALTER DATABASEStartrek COLLATE latin1_spanish_ci; En Oracle, se puede cambiar cualquiera de sus múltiples parámetros, aquí se muestranalgunosejemplos: --Cambia el tamaño del fichero de datos del sistema SQL> ALTER DATABASE DATAFILE /var/oracle/datos/jardineria/systemoi.dbf&#39; SIZE 1G; --Cambia el modo de acceso a la base de datos a solo lectura SQL> ALTER DATABASEopen read only; -Desactiva la opción de recuperación rápida ALTER DATABASE flashback off; 110
  • 120.
    Capítulo 3. Diseñosico relacional 3.7. Borrado de bases de datos El comando DROP DATABASE es el utilizado para eliminar bases de datos. En INIySQL, el comando se acompaña del nombre de la base de datos a eliminar: >mysq1 -u root -p drop database Proveedores; En Oracle, no hay que especicarlo, tan solo es necesarioconectarse ala instancia y escribir: >sq1p1us /as sysdba shutdown abort; --parada de la instancia Startup mount exclusive restrict; --reinicio en modo exclusivo drop database; --borrado exit; --salir Otra forma menos elegante de borrar una base de datos consiste en borrar físi- camente todos los cheros binarios de la base de datos. 3.8. Creación de tablas Para crear tablas se usa el comando CREATE TABLE: CREATE [TEMPDRARY] TABLE [esquema.]nombre_tab1a [(definición_create, . ..)] [opciones_tab1a] def inición_create : definición_columna I [CÜNSTRAINT [símbolo]] PRIMARY KEY (nombre_co1umna,...) I [CÜNSTRAINT [símbo1o]] FDREIGN KEY (nombre_co1umna,...) [def inición_referencia] definición_co1umna: nombre_columna tipo_datos [NOT NULL l NULL] [DEFAULT valor] [UNIQUE [KEY] Í [PRIMARY] KEY] [def inición_referencia] definición_referencia: REFERENCES nombre_tab1a [(nombre_columna, ...)] [ON DELETE {CASCADE I SET NULL I NO ACTION} ] [ON UPDATE {CASCADE | SET NULL I ND ACTION} ] 111
  • 121.
    Bases de Datos El formatoque aquí se presentaes unformato reducido, compatible con la mayoría de los gestores debases dedatos, para más información sobre un comando CREATE TABLE para un gestor en particular, se debe recurrir al manual de referencia del gestor. La porciónde sentencia (denicióïncreate, .. .)especicará. ladenición de los cam- pos que va a contener la tabla y sus restricciones. Los puntos suspensivos sugieren que denicióïucreate se puederepetir tantas veces comosea necesario,por ejemplo si hay una tabla con 5 columnas, habrá que especicar 5 veces denición_create. El token opcional TEMPORARY se utiliza para crear tablas temporales(esto es, una tabla invisible al resto de usuarios y que se borrará en el momento de la desconexión del usuario que la creó). La primera cláusula que lleva la denición es denicióïncolumna, donde se especicará la denición de un campo o columna de la tabla: definición_co1umna: nombre_columna tipo_datos [NOT NULL I NULL] [DEFAULT valor] [UNIQUE [KEY] I [PRIMARY] KEY] [definicióngreferencia] Se indica el nombre de columna y el tipo de datos, por ejemplo, el Codigo Postal podría ser un tipo NUMERIC(5,0) de MySQL, puesto que los códigos postales tienen 5 dígitos enteros y O decimales. NOT NULL y NULL especican que la columna admite o no admite valores nulos, es decir si un campo puede quedar sin valor, o con valor desconocido. DEFAULT indica el valor por defecto que toma el campo si no es especicado de forma explícita. Por ejemplo, si se declara la. siguiente columna: CodigoPostal Numeric(5,0) NÜT NULLDEFAULT 28941 Se indica que el campo Código Postal es un número de 5 dígitos enteros, que no admite valores nulos, y que encaso deno especificarlo, por ejemplo, en una inserción, el valor que tomará es 28941. UNIQUE KEY especica la creación de un índice, esto es,una estructura de datos que permite un accesorápido a la información de una tabla y además, controla que no haya ningún valor repetido en el campo. Se producirá un error si se intenta insertar un elemento que ya coincida con un valor anterior. A efectos prácticos, la diferencia con una clave primaria es básicamente que un campo UNIQUE puede admitir valores NULL, mientras que un campo que se dene como clave primaria no puede admitir nulos (debe ser NOT NULL). 112
  • 122.
    Capítulo 3. Diseñosico relacional PRIMARY KEY indica que la columna denida es la clave primaria. Una tabla tan solo puede tener una clave primaria. Si se especica. a nivel de colummdenition, la clave solo puede tener un campo, si la clave se dene a nivel de tabla, la clave puede ser multicolumna. 3.8.1. Implementación de restricciones En la sintaxis de CREATE TABLE, deniciónJeferencia sirve para crear una clave foránea. De esta manera, se enlaza el campo a su campo origen, es decir se crea una referencia: Si existe la siguiente tabla creada: create table c1ientes( dni varchar(9) PRIMARY KEY, nombre varchar(50), direccion varchar(60) ); Se puedecrear otra tabla mascotas que contenga el registro de las mascotas de una tienda veterinaria y con un campo que haga referencia al dueño de la mascota: create table mascotas( codigo integer PRIMARY KEY, nombre varchar(50), raza varchar(50), cliente varchar(9) REFERENCES c1ientes(dni) ); Las opciones ON DELETE y ON UPDATE establecen el comportamiento del gestor encaso deque laslas de la tabla padre (esdecir, la tabla referenciada)se borren o se actualicen. Los comportamientos pueden ser CASCADE, SET NULL y NO ACTION. ISi se usa NO ACTION y se intenta un borrado o actualización sobre la tabla padre, la operación se impide, rechazando el borrado o la actualización. ISi se especica CASCADE, la operación se propaga en cascada ala tabla hija, es decir, si se actualiza la tabla padre. se actualizan los registros relacionados de la tabla. hija, y si se borra un registro de la tabla padre, se borran aquellos registros de la tabla hija que estén referenciando al registro borrado. 113
  • 123.
    Bases de Datos ISise indica SET NULL, se establecea NULL la clave foránea afectada por un borrado o modicación de la tabla padre. create table mascotas( codigo integer PRIMARY KEY, nombre varchar(50), raza varchar(50), cliente varchar(9) REFERENCES c1ientes(dni) UN DELETE CASCADE ON UPDATE SET NULL Si no se especica ON DELETE u ON UPDATE por defecto se actúa como NO ACTION. Oracle no implementa la opción ON UPDATE por lo que hay que recurrir a otros métodos para realizar las acciones de actualización, como por ejemplo, mediante TRIGGERS (disparadores). La siguiente parte de la sintaxis de CREATE TABLE hace referencia a las de- claraciones globales sobre la tabla, esto es, restricciones, claves primarias y foráneas compuestas, etc. [CÜNSTRAINT [símbo1o]] PRIMARY KEY (nombre_co1umna,. ..) I [CONSTRAINT [simbo1o]] FOREIGN KEY (nombre_co1umna, . ..) [definiciómreferencia] En SQL, todas las restricciones pueden tener un nombre para facilitar su poste- rior referencia,por tanto cuando aparezca el opcionalCONSTRAINT [símbolo] se indica que la denición de una restricción tiene un nombre. PRIMARY KEY sirve para especicar la creación de una clave primaria a nivel de tabla. Existe la opción de crearla a nivel de columna, mediante denicióïncolumna o denirla aquí. Por ejemplo, es posible denir la siguiente tabla de dos formas: #primera forma -nivel de columna create table vehicu1o( matricula varchar(7) primary key, marca varchar(20), modelo varchar(20), precio numeric(7,2)
  • 124.
    Capítulo 3. Diseñosico relacional #segunda forma -nivel de tabla create table vehicu1o( matricula varchar(7), marca varchar(20), modelo varchar(20), precio numeric(7,2) primary key (matricula) ); Ambas formas son equivalentes. la diferencia es que mediante la segunda forma, es posible crear claves primarias compuestas por varios campos. Ejemplo: #Clave primaria = dni + n_ss create table emp1eado( dni varchar(9), n_ss varchar(15), nombre varchar(40), PRIMARY KEY(dni,n_ss) #compuesta De forma análoga, también se puede crear claves foráneas a.nivel de tabla, ha- ciendo uso de: [CONSTRAINT [symbo1]] FÜREIGN KEY(index_col_name, . ..) [referencejefinition] create table mascotas( codigo integer PRIMARY KEY, nombre varchar(50), raza varchar(50), cliente varchar(9), FOREIGN KEY (cliente) references clientes(dni) ); <> Actividad 3.8: Conéctatea MySQLy pruebaa ejecutar los comandos CREA- TE TABLE anteriores. Posteriormente, Conéctate a.Oracle mediante SQL*Plus y ejecútalos de nuevo. ¿Soncompatibles? 115
  • 125.
    Bases de Datos Paraterminar, cada gestor de base de datos efectúa sus propias modicaciones al formato de la sintaxis create table. La cláusula opcionesiabla permite especicar las peculiaridades de cada gestor con respecto al almacenamiento en soporte físico de sus tablas. Además, cada gestor incorpora diversas características, por ejemplo, Oracle y DB2 implementan tipos de datos distintos a MySQL o a SQL Server y Access. 3.8.2. Tipos de Datos Los tipos de datos que pueden usarse tanto para MySQL como para Oracle en la denición de una.columna son los siguientes: MySQL X TINYINT [UNSIGNED] Entero SMALLINT [UNSIGNED] Entero MEDIUMIN T [UNSIGNED] Entero INT [UNSIGNED] Entero BIGINT [UNSIGNED] Entero INTEGER [UNSIGNED] Entero DOUBLE [UNSIGNED] Real Aproximado 8 bytes FLOAT [UNSIGNED] 4 bytes DECIMAL(longituddecimales) Real Exacto Variable NUMERIC(longitud,decimales) Real Exacto Variable NUMBER(longitudLdecimales]) Real Exacto Variable DATE Fecha aaaa-mm-dd TIME Hora hhzmmzss TIMESTAMP Fecha y Hora aaaa-mm-dd hhzmmzss DATETIME Fecha y hora aaaa-mm-dd hh:mm:ss CHAR(longitud) caracteres Longitud Fija VARCHARUongitud) caracteres Longitud Variable VARCHAR2(longitud) caracteres Longitud Variable BLOB Objetos binarios Longitud Variable TEXT Campos Memo Longitud Variable CLOB Campos Memo Longitud Variable EN UM(valor1,valor2,valor3...) Enumeraciones Lista de valores SET(valor1, valor2, valor3. . . )Conjuntos Conjuntos de valores Cuadro 3.1:Tipos de datos enMySQL y Oracle/DBZ ü Puede verseque no todos los tipos de datos están en todos los gestores. Así por ejemplo, el tipo de datos ENUM no está disponible en Oracle y si en MySQL. Se utiliza para crear enumeraciones, esdecir, campos que admiten solo valores fijos, por ejemplo Color EN UM(rojo , hmaïvillo , verde ). En Oracle, en su lugar, se puede implementar utilizando la directiva CHECK. 116
  • 126.
    Capítulo 3. Diseñofisico relacional 3.8.3. Características de la creación de tablas para MySQL Las opciones de tabla para lvIySQL son las siguientes: opciones_tab1a: opción_tab1a [opción_tab1a] opción_tab1a: ENGINE = nombre_motor l AUTÜ_INCREMENT = valor I [DEFAULT] CHARACTER SET juego_caracteres [COLLATE colación] I CHECKSUM = {o I 1} | COMMENT = string l MAX_ROWS = valor I MIN_ROWS = Valor El almacenamiento fisico de una tabla en MySQL está controlada por un softwa- re especial denominado Motor de almacenamiento. Mediante la opción ENGINE= nombreJnotor se indica el motor de almacenamiento para la tabla. Puede ser, en- tre otros, innodb, que son tablas transaccionales con bloqueo de registro y claves foráneas, mylsam por defecto usado por MySQL y que genera tablas operadas a gran velocidad, pero sin control de integridad referencial y Memory, que genera tablas que están almacenadas en memoria en lugar de un archivo físico. La opción AUTOJNCREMENT permite indicar el valor inicial para campos de tipo AUTOJNCREMENT. AUTOJNCREMENT indica que ese campo es auto- incrementado después de cada.inserción. Un campo denido como autojncrement debe sernumérico; de esta manera, cuando en ese campose indica el valor NULL en una inserción, el campo toma automáticamente el último valor incrementado en una unidad. Este campo esmuy útil para los campos código donde seespecican valores clave autogenerados. En MySQL para denir un campo AUTOJNCREMENT se especica la palabra clave justo a continuación del tipo de datos. Para simular este comportamiento enOracle, seutiliza una secuencia (SEQUENCE). ÏDEFAULT] CHARACTER SET Especica el conjuntode caracteres para lata- bla y COLLATE dene la colación por defecto de la tabla. Si se especica CHECK- SUM, MySQL mantiene una suma de vericación para todos los registros. El co- mando CHECKSUM TABLE muestra esa sumade vericación (solo paramotores de almacenamiento 1ilyISAll). COMMENT es un comentario para la tabla, hasta 60 caracteres.También es posi- ble crear comentarios para cada una de lascolumnas. Mediante el token COMMENT 117
  • 127.
    Bases de Datos sepuede documentar el diccionario de datos. MySQL dispone de este token para comentar no solo tablas, sino también columnas. MAX_ROWS es el máximo número de registros que se quiere almacenar en la tabla. No es un límite absoluto, sino un indicador que la tabla debe ser capaz de almacenar al menos estos registros. MIN_ROWS es el mínimo número de registros que se planea almacenar en la tabla. Por último, al igual que en la creación de base de datos, MySQL dispone de la cláusula IF NOT EXISTS, para que solamente se cree la tabla si no está creada previamente. #Ejemp1o de creación de tabla en MySQL create table if not exists Pedido( codigo int auto_increment primary key, fecha datetime, estado enum(Pendiente,Entregado,Rechazado) ) comment = tab1a de pedidos a proveedores auto_increment = 10000 max_rows=100000O checksum=1 engine=innodb; 3.8.4. Características de la creación de tablas para Oracle En Oracle, la mayoría de las opciones tienen que ver con su almacenamiento físico. Por ejemplo, las tablas deben ser almacenadas en un contenedor llamado tablespace (Espacio de tablas). Por defecto,si no se indicanopciones dealmacena- miento, la tabla se ubica en el tablespace del usuario, pero si se quiereubicar en otro tablespace, se puede incluir la opción tablespace nombrepara designar otro tables- pace. Además, se puede denir cómo se reserva.el espacio en disco para controlar el crecimiento desmedido del tamaño de una tabla mediante la cláusula storage. Estas y muchas otras opciones. son propias de Oracle. Por último, cabe destacar la capacidad de Oracle de permitir la creación de restricciones de tipo CHECK, que permite validar el valor de un campo mediante una expresión. --Ejemplo de creación de tablas con opciones propias de Oracle create table Pedido( codigo integer primary key, fecha date, estado varchar(10). 118
  • 128.
    Capítulo 3. Diseñofísicorelaciona] constraintc_estado check (estado IN (Pendiente,Entregado,Rechazado)) ) tablespace Administracion storage (initial 100k next 100k minextents 1 maxextents unlimited pctincrease 0); 3.8.5. Consulta de las tablas de una base de datos Para consultarlas tablas disponiblesde una basede datosen MySQL, seutiliza el comando SHOW TABLES mysq1> show tables; +-------------------- --+ I Tab1es_in_jardineria I + -------------------- --+ | Clientes I Deta11ePedidos I I Productos + -------------------- --+ En Oracle, sepuedenconsultarlasvistasuser_tables, dbajcables y alLtables. En Oracle,lasvistasquecomienzanpor usen, aportaninformaciónsobrelosobjetosque poseeel usuarioconectado.Las vistas que comienzanpor dba- sonsoloaccesibles por los administradoresde basesde datos y muestraninformaciónsobretodos los objetos.Finalmente,lasvistasquecomienzanpor all- muestranla informaciónsobre losobjetosa losque el usuariotiene acceso,seansuyoso no. SQL> select table_name from user_tables; TABLE_NAME PARTIDOS ESTADISTICAS JUGADORES EQUIPOS 3.8.6. Consulta de la estructura de una tabla Para conocerla estructurade una tabla ya creadaesposibleutilizar el comando 119
  • 129.
    Bases de Datos DESCRIBE[esquema .] nombre_tab1a Este comando muestra un listado con las Columnasde la tabla. aportando informa- ción sobre los tipos de datos, restricciones, etc. SQL> describe nba.equipos; NOT NULL VARCHAR2 (20) VARCHARQ (20) CONFERENCIA VARCHARQ (4) DIVISION VARCHAR2(9) 3.9. Modicación de tablas El comando para modicar una tabla es ALTER TABLE y su sintaxis también es bastante compleja: ALTER TABLE nombre_tab1a especificación_a1ter [, especificación_a1ter] especificación_a1ter: ADD definición_co1umna [FIRST I AFTER nombre_co1umna ] I ADD (definición_columna,...) I ADD [CÜNSTRAINT [símboloïl] PRIMARY KEY (nombre_co1umna,...) I ADD [CONSTRAINT [símbo1o]] UNIQUE (nombre_co1umna,...) IADD [CONSTRAINT [simbo1o]] FOREIGN KEY (nombre_co1umna,...) [definición_referencia] I CHANGE [COLUMN] anterior_nombre_co1umna definición_co1umna [FIRSTIAFTER nombre_columna] RENAME COLUMN anterior_nombre_co1umna TD nuevo_nombre_co1umna MDDIFY definición_columna [FIRST I AFTER nombre_columna] DRÜP COLUMN nombre_co1umna DROP PRIMARY KEY DROP FOREIGN KEY fk_símbo1o opciones_tabla 120
  • 130.
    Capítulo 3. Diseñofísico relacional Al ver esta sintaxis se puedecaer en la tentación de pensar que es mejor borrar una tabla y volver a crearla haciendo las modicaciones oportunas. Esto es posible si la tabla no tiene datos, pero. .. ¿qué ocurre si hay un centenar o un millar de registros? No queda otra opción que ejecutar una sentencia ALTER TABLE para evitar la pérdida de datos. ILa opción ADD permite añadir una columna, se puede especicar el lugar donde seva a insertar mediante las cláusulas AFTER (después de una colum- na) y FIRST (la primera columna).Oracle noadmite lascláusulas AFTERy FIRST. ICon la opción MODIFY se cambia el tipo de datos de una columna y seañaden restricciones. ICon la opción DROP se pueden eliminar las restricciones de clavesforáneas y primarias, dejando el tipo de dato y su contenido intacto. - Las opciones de tabla, al igual que en CREATE TABLE varían con cada SGBD, y sirven principalmente para modicar las características del almace- namiento físico. - Para cambiar el nombre de una columna, Oracle usa la cláusula RENAME y MySQL la cláusula CHANGE. Por ejemplo, en MySQL, para añadir a la tabla mascotas el campo especie des- pués del campo Raza, habría que ejecutar la siguiente instrucción: ALTER TABLEMascotas ADD Especie VARCHAR(10) AFTER Raza; Para eliminar la columna con clave primaria CodigoCliente de la tabla Clientes en Oracle y establecer como clave primaria. el campo NIF , hay que ejecutar las siguientes sentencias: ALTER TABLE Clientes DRDP PRIMARY KEY; ALTER TABLE Clientes DROP CodigoC1iente; ALTER TABLE Clientes ADD CÜLUMN Nif VARCHAR(10) PRIMARY KEY FIRST ; 121
  • 131.
    Bases de Datos 3.10.Borrado de tablas El formato de instrucción en lIySQL para el borrado de una tabla es muysencillo: DRDP [TEMPORARY] TABLE tb1_name [, tbl_name] Ejemplo: DRDP TABLE Mascotas; DRDP TABLE Clientes, Empleados; En Oracle, cambia un poco pero es muy similar: DRDP [TEMPORARY] TABLE tbl_name [CASCADE CÜNSTRAINT] No sepermite el borrado de varias tablas en la misma sentencia, y, de forma opcional, CASCADE CONSTRAINT exige a Oracle que elimine las claves foráneas de las tablas relacionadas (en cascada). --Elimina la tabla Partidos DRDP TABLE Partidos; --Elimina la tabla Jugadores y --borra las claves foráneas de otras tablas DRDP TABLE Jugadores CASCADE CONSTRAINT; 3.11. Renombrado de tablas Para renombrar una tabla en MySQL se usa el comando RENAME TABLE: RENAME TABLE nombre_tabla TD nuevo_nombre_tab1a [, nombre_tabla TD nuevo_nombre_tab1a] Ejemplo: RENAME TABLE Mascotas TD Animales; En Oracle, no hay que indicar el token TABLE. basta con poner: RENAME Jugadores T0 Baloncestistas; 122
  • 132.
    Capítulo 3. Diseñosico relacional 3.12. Prácticas Resueltas Práctica 3.1: Modelo físicopara stratrekfanscomv.1.0 En un chero de texto con nombre startreklsql, escribe las sentencias SQL para crear el modelo físico de la práctica 2.1. Después, crea una base de datos llamada startrek en un servidor MySQL y ejecuta las sentencias con comando source. A continuación, Conéctate a Oraclecon elusuario administrador(sqlplus/as sysdba) y crea un usuario en una instancia de oracle con el comando: CREATE USERstartrek IDENTIFIED BY startrekpwd QUOTA UNLIMITED ON USERS; .Dale permisos al usuario startrek para iniciar sesion y crear tablas con: GRANT CREATE SESSION,CREATE TABLE TO startrek; Con ese usuario, Conéctate a sqlplus y ejecuta el chero que has creado. startrek1.sq1 CREATE TABLE Actores( Codigo integer PRIMARY KEY, Nombre varchar(50) NOT NULL, Fecha DATE NOT NULL, Nacionalidad varchar(20) DEFAULT EEUU ); CREATE TABLE Personajes( Codigo integer PRIMARY KEY, Nombre varchar(50) NOT NULL, Raza varchar(20) NOT NULL, Grado varchar(20) NOT NULL, CodigoActor integer NOT NULL, Codigosuperior integer NULL, FOREIGN KEY(CodigoActor) REFERENCES Actores(Codigo), FOREIGN KEY(Codigosuperior) REFERENCES Personajes(Codigo) ); CREATE TABLE P1anetas( Codigo integer PRIMARY KEY, Galaxia varchar(50) NULL, Nombre varchar(50) NOT NULL ); CREATE TABLECapitulos( ¡Temporada integer, N Orden integer, Titulo varchar(50) NOT NULL, 123
  • 133.
    Bases de Datos Fechadate NOT NULL, PRIMARYKEY (Temporada, Orden) ); CREATE TABLE Pe1iculas( Codigo integer PRIMARY KEY, Titulo varchar(50) NOT NULL, Director varchar(30) NOT NULL, Anyo Date NULL ); CREATETABLEPersonajesCapitu1os( CodigoPersonaje integer PRIMARY KEY, Temporada integer NOT NULL, Orden integer NOT NULL, FOREIGNKEY (Temporada,Orden) REFERENCES Capitulos(Temporada,Orden) ); CREATE TABLEPersonajesPe1icu1as( CodigoPersonaje integer REFERENCES Personajes(Codigo), CodigoPelicu1a integer REFERENCES Pe1icu1as(Codigo) ); CREATE TABLE Naves( Codigo integer PRIMARY KEY, NTripu1antes integer NULL, Nombre varchar(50) NOT NULL ); CREATE TABLE Visitas( CodigoNave integer REFERENCES Naves(Codigo), CodigoP1aneta integer REFERENCES P1anetas(Codigo), Temporada integer NOT NULL, Orden integer NOT NULL, FOREIGNKEY (Temporada,Orden) REFERENCES Capitulos(Temporada,Orden) Con el chero anterior llamado startreILsqI, en mysql: mysql> CREATE DATABASE Startrek; USE Stratrek; mysql>source stratrelczsql En Oracle: sqlplus / as sysdba SQL> CREA TE USER startrek IDENTIFIED BY startrekpwd; SQL> GRANT CREATE SESSIOMCREATE TABLE TO startrek; SQL>ezit sqlplus startrek/startrekpwd SQL> @startrek.sql 124
  • 134.
    Capítulo 3. Diseñofísico relacional Práctica 3.2: Restricciones para startrekfanscom v.1.0 Se deseaimponer las siguientes características al modelo físico, pero son dependien- tes del gestor de base de datos donde se van a codicar, así que se codican en cheros independientes. Para MySQL se desea: IQue todas las tablas tengan el motor de almacenamiento innodb para que las claves foráneasno sean ignoradas. -Que las claves primarias numéricas sean de tipo autojncrement. n Que el campo Galaxia de la tabla Planetas seauna enumeración de los valores (Via LácteaÚAndrómedafsombrero). Para Oracle se desea: -Que las tablas se encuentren ubicadas en el tablespace STARTREK. IQue el campo NTripulantes de la tabla Naves solo pueda tener un valor entre 1 y 500. IQue el campo Galaxia de la tabla Planetas solo pueda tener los valores (Via Láctea,Andrómeda,Sombrero). Las sentencias SQL para efectuar los cambios en MySQL son: Cambios en MySQL #Las tablas se pueden cambiar de dos formas: ALTER TABLE Actores ENGINE=innodb; ó, si están vacías se puede hacer: DRÜP TABLE Actores; CREATE TABLE Actores( ) ENGINE=innodb; #Para cambiar a auto_increment la clave primaria #se usa: ALTER TABLE Actores MODIFY Codigo integer auto_increment PRIMARY KEY; #Para cambiar el campo Galaxia a una enumeración: ALTER TABLE Planetas MODIFY Galaxia ENUM (Via Láctea,Andrómeda,Sombrero); Las sentencias SQL para efectuar los cambios en Oracle son: 125
  • 135.
    Bases de Datos Cambiosen Oracle -- Asignar el tablespace STARTREK a las tablas, solo se puede --hacer si están vacías, y recrearlasz drop table actores cascade constraints; CREATE TABLE Actores( Codigo integer PRIMARY KEY, Nombre varchar(50) NOT NULL, Fecha DATE NOT NULL, Nacionalidad varchar(20) DEFAULT EEUU ) TABLESPACE STARTREK; -- Para cambiar el campo NTripu1antes: ALTER TABLE Naves MDDIFY NTripu1antes integer check (NTripu1antes>=1 and NTripu1antes<=500); -- Para añadir la restricción a galaxia: ALTER TABLE Planetas MDDIFY Galaxia varchar(10) CHECK (Galaxia IN (Via Láctea,Andrómeda,Sombrero)); Práctica 3.3: Modelofísicoparastratrekfanscom v.2.0 Enun chero de texto connombrestartreklsql, escribelassentencias SQL para modicar el modelofísicode la práctica 2.2. Después,creauna basede datosllamada startrek en un servidorMySQL. Ejecuta lassentencias del chero en un servidorde MySQL con el comandosource.A continuación,Conéctatea Oracle con el usuariostartrek y ejecutael chero que hascreado. startrek2.sq1 ALTER TABLEPersonajes ADDCiudad varchar(50); ALTER TABLE Personajes ADD FNacim date; ALTER TABLEPersonajes ADDPlaneta integer REFERENCES P1anetas(Codigo); ALTER TABLEPersonajes ADDFU1tCombate date; ALTER TABLEPersonajes ADDMentor varchar(50); ALTER TABLE Personajes ADD FechaGrado date; Can el chero anterior llamado startrek2.sql, en mysql: mysql> USE Stratrek; mysql>source stratrekísql En Oracle: sqlplus startrek/startrekpwd SQL> @startrek2.sql 126
  • 136.
    Capítulo 3. Diseñofísico relacional Práctica 3.4: Modelo físico para stratrekfanscom v.3.0 Enun chero de texto con nombre startrek3.sql, escribe las sentencias SQL para modicar el modelo físico de la práctica 2.2. Después,crea una base dedatos llamada startrek en un servidor MySQL. Ejecuta las sentencias del chero en un servidor de MySQL con el comando source. A continuación, Conéctate a Oracle con el usuario startrek y ejecuta el chero que has creado. startrek3.sql CREATE TABLE Lanzaderas( CodigoNave integer, Numero integer, Personas integer, PRIMARY KEY(CodigoNave,Numero), FOREIGN KEY(CodigoNave) REFERENCES Naves(Codigo) Can el chero anterior llamado startrekísql, en mysql: mysql) USE Stratrek; mysql>source stratrekzsql En Oracle: sqlplus startrek/starirekpwd SQL> @startrek2. sql 127
  • 137.
    Bases de Datos 3.13.Prácticas Propuestas Práctica 3.5: Modelo físico para jerarquías Dado el diagrama E / R de la gura siguiente, genera el modelo físico, codicando en SQL todas las sentencias para crear las tablas de dos maneras posibles, generando una tabla para cada especialización. y generando una sola tabla para los empleados. Ejecuta los dos modelos tanto en Oracle como en lIySQL. Práctica 3.6: Más modelos físico Para los modelos lógicos creados en las prácticas 2.4. 2.5. 2.6 y 2.7, crea el modelo físico asociado mediante varios cheros con extensión sql. En l&#39;IySQL crea una base de datos para cada modelo y ejecuta el chero correspondiente, y en Oracle, crea un usuario distinto que contenga cada uno de los esquemas delas diferentes prácticas. <> 128
  • 138.
    Capítulo 3. Diseñosico relacional Práctica 3.7: Parque Ecológico Un parque ecológico quiere informatizar la gestión de su sistema de información para poder obtener datos más concluyentes sobre las especies migratorias que se establecen en su territorio. El parque desea clasicar todas las especies animales y contabilizar el número de individuos de cada especie que se establecen en el te- rritorio en cada época del año. Se desea que la base de datos almacene datos de nuevas especiesy nuevos individuos de cada especie animal. Para cada especie, se requiere el nombre de la especie,características generalesde un individuo tipo y sus periodos migratorios. Para cada individuo se tendrá en cuenta el peso, dimensiones, y un código que identique de forma única cada individuo dentro de su especie. Esta forma de identicación, irá almacenada en un pequeño dispositivo con una batería autónoma implantada en el animal, y que servirá para detectar cuando el individuo sale o entra en el territorio gracias a unas torretas de control instaladas en el perímetro del parque. Estas torretas informan vía inalámbrica al sistema de las idas y venidas de cada individuo. De esta manera, se pueden contabilizar sus migraciones y los posibles descontroles quesufran en el periodo migratorio. Toda la información sobre migraciones de individuos de determinadas especiesserá enviada cada tres meses aun grupo de expertos biólogos, encargadosde haceruna valoración sobre futuros periodos migratorios y posibles alteraciones del comportamiento de las especies. Delos biólogos, se quierealmacenar, el nombre, la dirección, provincia y su fecha de titulación. En principio, no se conocetodavía si se implementará en Oracle o MySQL por lo que el diseño debe ser compatible para ambos gestores debases de datos. <> Práctica 3.8: BuscoPareja.net Se va a crear una página Web decontactos en el dominio BuscoPareja.net. Cuando un usuario se registra en el sistema, se almacenan sus datos personales, concreta- mente su email, su nombre, dirección, ciudad, país, su sexo y orientación sexual, su foto y una password que utilizará junto con su email para acceder al sistema. El usuario a continuación rellena una lista de preferencias o gustos. De cada gusto o preferencia se almacenará el tipo (Deporte, Música, Evento Social), la fecha de la última. vez que hizo una actividad de ese estilo y si le gustaría o no que su pareja tuviera la misma preferencia. A partir de esta información se organizan citas entre los contactos en distintas ubicaciones. Sedesea registrar las citas entre los contactos almacenando quién se cita con quién. en qué lugar y a qué hora, y si la cita fracasó. Se desearealizar el diseño conceptual. lógico y físico de la base de datos, creando el modelo físico para Oracle y para MySQL. <> 129
  • 139.
    Bases de Datos 3.14. 130 Resumen Losconceptos clave de este capítulo son los siguientes: Las herramientas grácas ayudan al informático a gestionar los componen- tes de una base de datos, pero además, un buen administrador debe conocer los comandos necesarios para hacer las tareas administrativas. Entre las he- rramientas grácas que dispone el mercado, se encuentran PhpMyAdmin, de MySQL, Enterprise Manager y Grid Control, de Oracle y Data Studio de DB2. Un intérprete de comandosenvía comandosen modo texto al SGDB y muestra los resultados en una consola. Estos intérpretes de comandos suelen permitir la ejecución remota de comandos a través de protocolos TCP-IP. Entre otros están, mysqly SQL*Plus e iSQL*Plus(Oracle). El DDL o Data Denition Language de SQL dene la sintaxis de los comandos CREATE, DROP y ALTER, para crear, borrar y modicar objetos de una BBDD. El comando CREATE DATABASE permite crear bases dedatos en los SGBD. Algunos SGBD permiten manipular varias BBDD mediante una sola instan- cia, otros, como Oracle, permiten solo manipular una BBDD por instancia. Además, existen asistentes grácos (como dbca de Oracle), que permiten de forma sencilla crear bases de datos. El comando ALTER DATABASE permite modicar ciertos parámetros de funcionamiento de la BBDD. Estos parámetros dependen del funcionamiento y de la arquitectura del SGBD, por tanto, no son estándar. El comando DROP DATABASE borra una base de datos de un servidor. Los comandos CREATE TABLE, ALTER TABLE y DROP TABLE están denidos en el estándar SQL para poder crear, modicar y borrar tablas, y, salvo pequeñasdiferencias, sepueden escribir estos comandoscompatibles para la mayoría de los SGBD. Para implementar restricciones se usan las cláusulas PRIMARY KEY (cla- ves primarias) y REFERENCES (para claves Foráneas). Hay dos formas de crearlas, a nivel de tabla y a nivel de columna. A nivel de tabla es posible especicar claves compuestas. Es posible también, denir otras restricciones como las UNIQUE, CHECK, NULL o NOT NULL, etc. Los comandos DESCRIBE y RENAME sirven para mostrar la estructura de una tabla y cambiarle el nombre a un objeto.
  • 140.
    3.15. Test derepaso 1. ¿Qué función no permite realizar phpMyAdmin? a) Ejecución remota de comandos b ) Copias de seguridad c) Creación y borrado de tablas ) d Parar y arrancar el servidor 2. Oracle Grid Control no permite a Controlar el estado de múltiples BBDD Creación y borrado de tablas ) b) Controlar múltiples servidores c) ) d Parar y arrancar un SGBD 3. El comando CREATE DATABASE no a) Es una sentencia DDL b) Es compatible entre los distintos SGBD ) Permite especicar los tablespaces de una BBDD C d) Permite especicar el juego de caracteres 4. Una clave foránea a) Se dene con FOREIGN KEY b) Se dene con REF ERENCES c) Puede ser compuesta d) Todas las anteriores son correctas 5. Para arrancar el Enterprise Manager a) No hay que hacer nada, viene instalado por defecto b) Hay que arrancarlocon el comando ernctl start dbconsole c) Hay que arrancarlocon el comando emctl stop dbconsole d) Es un entorno gráco basado en ventanas Capítulo 3. Diseño sico relacional 6. La opción ON DELETE CASCADE del comando CREATE TABLE a) No funciona enOracle b) No funciona en MySQL c) Permite borrar registros relacionados en cascada d) Permite borrar claves foráneas en cascada 7. A una restricción a) No se le puede poner nombre b) Se le puede poner nombre mediante CONSTRAINT c) Se le puede poner nombre mediante RES- TRICTION d) Se le puede poner nombre mediante RE- FERENCES 8. autojncrement es una opción a) Sólo de MySQL b) Para incrementar valores numéricos de for- ma automática c) Se suele aplicar a las claves primarias d) Todas las anteriores son correctas 9. Con el comando ALTER, no se puede a Borrar una columna b Modicar el tipo de dato de una columna c Cambiarle el nombre a la tabla d Todas las opciones anteriores son posibles ) )
  • 141.
    Bases de Datos 3.16. 132 .Nombra los distintos tipos de ins- trucciones DDL que puede haber, distinguiendo el tipo de objeto que se puede crear, borrar o modicar. .Pon un ejemplo de un tipo de dato numérico, otro alfanumérico y otro de fecha/hora. . ¿Cómo se instala phpMyAdmin en Linux? ¿Necesitas algún otro soft- ware para poder instalarlo? Nombra tres herramientas grá- cas y sus correspondientesgestores. Añade alguno de los que no aparez- can enel tema (por ejemplo,MMC de SQL Server). .¿Por qué es fundamental para un administrador de bases de datos (DBA) conocer los comandosSQL además de saber usar las herra- mientas grácas? . Escribe, sin mirar la sintaxis, un comando CREATE TABLE para crear una tabla de alumnos con 5 campos a tu elección. . Escribe, sin mirar la sintaxis, un comando ALTER TABLE para añadir un campo a la tabla. ante- I&#39;lOI&#39;. . Escribe, sin mirar la sintaxis, un comando CREATE TABLE pa- ra crear la tabla Notas y luego. un comando ALTER TABLE para 11. .Comenta para qué Comprueba tu aprendizaje añadir una clave foránea a la tabla anterior. . ¿Qué tipos de columna dene Ora- cle que no son compatibles con MySQL? . Dene para qué sirven los siguien- tes tokens de la creación de tablas en lIySQL: a ENGINE n AUTOJNCREMENT ICOLLATION n CHARACTER SET ¿Qué diferencia hay entre VAR- CHAR y CHAR? .¿Qué diferencia hay entre un cam- po F LOAT y uno NUMBER? .Dene para qué sirven los tokens de crea.ción de bases de datos TA- BLESPACE y DATAFILE en Ora- cle. sirven las cláusulas ON DELETE y ON UP- DATE de REFERENCES. .Para las cláusulas anteriores exis- ten tres opciones SET NULL, CAS- CADE y NO ACTION. Comenta qué efecto tiene sobre los borrados y las modicaciones de registros en tablas relacionadas.
  • 142.
    CAPÍTULO 4 Realización deConsultas Objetivos W Identicar herramientas y sen- Contenidos . . tencias para reahzar consultas W La sentencia SELECT . Identicar y crear consultas B? Consultas básicas, ltros y or- Simples 50m9 una tabla» denación _ Identicar y crear consultas Consultas resufnen que gGHCÏHH valores resumen subconsmtas Identicar y crear consultas con composiciones internas y Consultas multitabla. Compo- externas siciones internas y externas Identicar y crear subconsultas Consultas reexivas Valorar las ventajas e inconve- COHSUÏWS COTI tablas deïiVadas nientes de las distintas opciones válidas para realizar una con- sulta Con este tema, se detalla Ia sintaxis completa de 1a sentencia SELECT en toda su extensión. Se proporciona a1 estudiante métodos para construir con- sultas simples y complejas de forma estructurada, con ltros, agrupaciones y ordenaciones. 133
  • 143.
    Bases de Datos 4.1.El lenguaje DML Las sentencias DML del lenguaje SQL son las siguientes: - La sentencia SELECT, que se utiliza para extraer información de la base de datos, ya sea de una tabla o de varias. ILa sentencia INSERT, cuyo cometido es insertar uno o varios registros en alguna tabla. ILa sentencia DELETE, que borra registros de una tabla. ILa sentencia UPDATE, que modica registros de una tabla. Cualquier ejecución de un comando en un SGBD se denomina.CONSULTA, término derivado del anglosajón QUERY. Este término debe ser entendido más que corno una consulta de información, como una orden, esdecir, las QUERYS o CONSULTAS no son solo SELECT, sino también cualquier sentencia de tipo UPDATE, INSERT, CREATE, DROP, etc, entendidas todas ellas como peticiones al SGBD para realizar una operación determinada. 4.2. La sentencia SELECT La sentencia SELECT es la sentencia más versátil de todo SQL, y por tanto la más compleja de todas. Como seha expuesto anteriormente, se utiliza para consultar información de determinadas tablas. Es posible ejecutar sentencias muy sencillas que muestran todos los registros de una tabla: #esta consulta selecciona todos los campos y muestra todos los #registros de la tabla empleados SELECT * FROM empleados; O incluso consultas que obtienen información ltrada de múltiples tablas, usando relaciones entre tablas e incluso tablas virtuales creadas a partir de una consulta. #esta consulta obtiene el total de los pedidos #de los clientes de una tienda SELECT NombreC1iente,tot.Cantidad FROM C1ientes,Pedidos, (SELECT sum(Cantidad*PrecioUnidad) as Cantidad,NumeroPedido FROM Deta11ePedidos GROUP BY NumeroPedido) tot WHERE Clientes.NumeroC1iente=Pedidos.NumeroC1iente AND Pedidos.numeroPedido=tot.NumeroPedido ORDER BY Cantidad; 134
  • 144.
    Capítulo 4. Realizaciónde Consultas 4.3. Consultas básicas El formato básico para hacer una consulta es el siguiente: SELECT [DISTINCT] se1ect_expr [,select_expr] [FROM tabla] select_expr: nombre_co1umna [AS alias] | 4: I expresión nombre_columna indica un nombre de columna, es decir, se puedeseleccionar de una tabla una serie de columnas, o todas si se usa *, o una expresión algebraica compuesta por operadores, operandos y funciones. El parámetro opcional DISTINCT fuerza que solo se muestren los registros con valores distintos, o, dicho de otro modo, que suprima las repeticiones. En la página siguiente, se muestran algunos ejemplos del uso de la sentencia SELECT. Hay que prestaratención aalgunas curiosidadesl: n En la consulta 4 se selecciona una columna calculada (1+5), con la selección de los registros de una tabla, incorporándose esa nueva columna creada al conjunto de las devueltas por el gestor. - En la consulta número 5 se hace uso de una expresión algebraica para crear una columna cuyo resultado será elde sumar 1 y 6. Para hacer esto, en MySQL no es necesario indicar la cláusula FROM, pero en Oracle, hay que poner la cláusula FROM con la tabla dual. Al no haber una tabla real seleccionada, el resultado será una única la con el resultado. - En la consulta 3 sehace usode la función concat cuyo cometido es concatenar dos columnas creando una única columna. En Oracle, la función concat solo admite dos parámetros, mientras que enMySQL se puede concatenarmúltiples parámetros. Para concatenar en oracle múltiples columnas se puede hacer uso del operador I I. Véase Sección6.4. IEn las consultas 6 y 7 se muestran las marcasde losvehículos. La diferencia en- tre ambas consultas estáen el uso del DISTINCT, que elimina las repeticiones. Hay dos vehículos seat en la consulta 6 y uno en la 7. ¡La ejecuciónde lasconsultas que se muestraa continuaciónestá realizada en MySQL,pero son perfectamente compatibles con Oracle, excepto la consulta 5, que hay que añadir FROM dual. 135
  • 145.
    Bases de Datos #consu1ta4 #consu1ta 1 SELECT matricula, mode1o,1+5 SELECT * FROM vehiculos; FROM vehiculos; +--------- + -+-----+ I matricula I modelo I 1+5 I + --+ --+----+ I 1129FGT ibiza gt I 1129FGT I ibiza gt I 6 I I 1132GHT leon tdi 105cv I 1132GHT I leon tdi 105cv I 6 I I M6836YX corolla g6 I M6836YX I corolla g6 I 6 I I 7423FZY coupe I 7423FZY I coupe I 6 I I 3447BYD a3 tdi 130cv I 3447BYD I a3 tdi 130cv I 6 I + + -------------- --+-----+ #consu1ta 5 SELECT 1+6; #consu1ta 2 +-----+ SELECT matricula, modelo I 1+6 I FROM vehiculos; +-----+ I 7 I +---+ 1129FGT ibiza gt #consu1ta 6 I 1132GHT leon tdi 105cv I SELECT marca FROM vehiculos; I M6836YX corolla g6 I +------- --+ | 7423FZY coupe | marca I I 3447BYD a3 tdi 130cv + ------- --+ I seat I I seat I l toyota I I hyundai I #consu1ta 3 I audi I SELECT matricula, + ------- --+ concat(marca,mode1o) as coche FROM vehiculos; + --------- --+ ------------------- + #consu1ta 7 SELECT DISTINCT marca I matricula I FROM vehiculos; 1129FGT seatibiza gt I 1132GHT seatleon tdi 105cv I M6836YX toyotacorolla g6 I 7423FZY hyundaicoupe I 3447BYD audia3 tdi 130CV 136
  • 146.
    Capítulo 4. Realizaciónde Consultas <> Actividad 4.1: Crea una tablaen MySQLcon lasiguiente estructura: MASCOTAS(Nombre, especie, raza, edad, sexo). Introduce 6 registros2 y,a continuación,codica las siguientes querys: IMuestra el nombre y la especie detodas las mascotas. n Muestra el nombre y el sexo de las mascotas poniendo un alias a los campos. IMuestra el nombre y la fecha de nacimiento aproximada de las mascotas (con- sulta la documentación deMySQL y usa lafunción date_sub y now). Realiza el mismo procedimiento creando 1atabla en Oracle. 4.4. Filtros Los ltros son condiciones que cualquier gestor de base dedatos interpreta para seleccionar registros y mostrarles como resultado de la consulta. En SQL la palabra clave para realizar ltros es la cláusula WHERE. A continuación se añade a la sintaxis de la cláusula SELECT la sintaxis de los ltros: SELECT [DISTINCT] select_expr [,select_expr] [FROM tabla] [WHERE filtro] ltro es una ¡expresión que indica la condición o condiciones que deben satisfacer los registros para ser seleccionados. Un ejemplo de funcionamiento sería el siguiente: itselecciona los vehículos de 1a marca seat SELECT *FROM vehiculos WHERE marca= seat ; + --------- --+ -------------- --+ ----- -+ | matricula l modelo + --------- --+ -------------- --+ ----- --+ I 1129FGT I ibiza gt | 1132GHT l leon tdi 105cv I seat + --------- --+ -------------- --+ ----- --+ 2 Véase Capítulo 5 si es necesario. 137
  • 147.
    Bases de Datos 4.4.1.Expresiones para ltros Los ltros se construyen mediante expresiones. Una expresión, es una combina- ción de operadores, operandos y funciones que producen un resultado. Por ejemplo, una expresión puede ser: #expresión 1 (oracle): (2+3)*7 SELECT (2+3)*7 from dual; ttexpresión 2 (mysql): (2+3)>(6*2) SELECT (24-3)>(6*2); #0 = falso, es falso que 5>12 itexpresión 3 (mysql): 1a fecha de hoy -31 años; SELECT date_sub(now(), interval 31 year); + --------------------------------- + I date_sub(now(), interval 31 year) | Se detalla a continuación los elementos que pueden formar parte de las expresio- nes: IOperandos: Los operandos pueden ser constantes. por ejemplo el número en- tero 3, el número real 2.3, la cadena de caracteres España o la fecha C2010- 01-02; también pueden ser variables, por ejemplo el campo edad o o el campo NombreMascota; ypueden sertambién otrasexpresiones 3. IOperadores aritméticos: +, -, *, /, 7c.El operador+ y el operador-se utilizan para sumaro restar dos operandos(binario) o para ponerel signo positivo o negativo a un operando (unario). El operador * es la multiplicación de dos operandosy el operador/es para dividir. El operador% o resto dela división entera a°7ob devuelve el resto de dividir a entre b. 3Todas los operandos numéricos ya seanreales oenteros vansin comillasimple,y cualquier otra cosa que no sea número, por ejemplo, cadenas de caracteres o fechas, van entre comillas simples. 138
  • 148.
    Capítulo 4. Realizaciónde Consultas - Operadores relacionales: >, <, <>, >=, <=, =. Los operadores relacionales sirven para comparar dos operandos. Así, es posible preguntar si un campo es mayor que un valor, o si un valor es distinto de otro. Estos operadores devuelven un número entero, de tal manera que si el resultado de la expresión es cierto el resultado será 1, y si el resultado es falso el resultado será O.Por ejemplo, la expresión a >b devuelve 1 si a es estrictamente mayor que b y O en casocontrario. La. expresión d<>e devuelve 1 si d y e son valores distintos. IOperadores lógicos: AND, OR, NOT. Los operadoreslógicos toman como ope- randos valores lógicos, esto es, cierto o falso, en caso de SQL, 1 o O. Los operadores lógicos se comportan según las siguientes tablas de verdad: Operando 1 Operando 2 Opl AND Op2 Opl OR Op2 NOT Opl falso falso falso falso cierto falso cierto falso cierto cierto cierto falso falso cierto falso cierto cierto cierto cierto falso Cuadro 4.1: Tabla de verdad de los operadores lógicos. Por otro lado, se necesita un tratamiento de los valores nulos; hay que incluir como un posible operando el valor nulo: Operando 1 Operando 2 Opl AND Op2 Opl OR Op2 NOT Opl falso falso falso falso cierto falso cierto falso cierto cierto cierto falso falso cierto falso cierto cierto cierto cierto falso nulo X nulo nulo nulo nulo nulo nulo Cuadro 4.2: Tabla de verdad de los operadores lógicos con valores nulos. -Paréntesis: Los operadores tienenuna prioridad, por ejemplo, en la ex- presión 3+4*2, la multiplicación se aplica antes que la suma, se dice que el operador * tiene ¡nas prioridad que el operador +. Para alterar esta prioridad, se puedeusar el operador paréntesis, cuyo cometido es precisamentedar máxi- ma prioridad a una parte deuna expresión.Así, (3+4)*2, no eslo mismoque 3+4*2. 139
  • 149.
    Bases de Datos uFunciones: date_add, concat, left, right. . .. Cada SGBD incorpora su propio repertorio de funciones que en pocas ocasiones coincidecon el de otros SGBD. En la tabla que se muestra a continuación aparecen los resultados que provoca la ejecución de algunos de los operadores descritos: í í (1o>=1o AND o<=1)+2 Cuadro 4.3: Tabla resumen de los operadores usadosen expresiones. 4.4.2. Construcción de ltros A continuación, se muestran ejemplos de construcción de ltros para una basede datos dejugadores de la liga americana debaloncesto (NBA), todos ellos compatibles para Oracle y MySQL: #1a tabla jugadores contiene todos los jugadores de la nba describe jugadores; + l l l l l l l l l l l l l l l + l l l l
  • 150.
    Capítulo 4. RealizacióndeConsultas I Kobe Bryant I | Í I Pau Gasol I +-------------------- --+ #Consu1ta que selecciona los jugadores españoles de los Lakers SELECT codigo,Nombre,Altura FROM jugadores WHERENombre_equipo=Lakers and Procedencia=Spain; +------ --+ --------- --+ ------ --+ I codigo I Nombre | Altura I +------ --+ --------- --+ ------ --+ I 66 I Pau Gasol I 7-0 I +------ --+ --------- --+ ------ --+ #Consulta que selecciona los jugadores españoles y eslovenos de los lakers SELECT Nombre, A1tura,Procedencia FROM jugadores WHERENombre_equipo=Lakers AND (Procedencia=Spain OR Procedencia=S1ovenia); + --+ ------ --+ --+ I Nombre I Altura I Procedencia | 4.4.3. Filtros con operador de pertenencia a conjuntos Ademásdelosoperadores presentados anteriormente (aritméticos, lógicos, etc.) sepuedehacer usodel operadorde pertenenciaa conjuntosIN, cuya sintaxisesla siguiente: nombre_co1umna IN (Valuel, Va1ue2, ...) Este operadorpermite comprobarsi una columnatiene un valor igual que cual- quier de los que están incluidosdentro del paréntesis,así por ejemplo, si se desea seleccionar losjugadoresespañoles, eslovenos o serbiosde los Lakers, secodicaría así # versión larga SELECT Nombre, Altura,Procedencia FROM jugadores WHERENombre_equipo=Lakers AND (Procedencia=Spain OR Procedencia=S1ovenia OR Procedencia=Serbia & Montenegro); 141
  • 151.
    Bases de Datos IPau Gasol I Vladimir Radmanovic I Serbia & Montenegro I I Sasha Vujacic I Slovenia #versión corta (con el operador IN) SELECTNombre, A1tura,Procedencia FROM jugadores WHERENombre_equipo=Lakers AND Procedencia IN (Spain,S1ovenia,Serbia & Montenegro); +------------------- -+ -+ ------------------- -+ I Nombre I Altura I Procedencia +------------------- -+ ------ -+ ------------------- -+ I Pau Gasol I I Vladimir Radmanovic I Serbia & Montenegro I I Sasha Vujacic I Slovenia I +------------------- -+ ------ -+ ------------------- -+ 4.4.4. Filtros con operador de rango El operador de rango BETWEEN permite seleccionarlos registrosque estén incluidosen un rango. Su sintaxises: nombre_co1umna BETWEEN Valuel AND Va1ue2 Por ejemplo,para seleccionar losjugadoresde la nba cuyopesoestéentre 270 y 300 libras secodicaría la siguientequery: SELECT Nombre,Nombre_equipo,Peso FROM jugadores WHERE Peso BETWEEN 270 AND 300; +-------------- -+ ------------- -+ ---- -+ I Nombre I Nombre_equipo I Peso l I Chris Richard I Timberwolves I Paul Davis | Clippers I | I David Harrison I Pacers #sería equivalente a SELECT Nombre,Nombre_equipo FROM jugadores WHEREPeso >= 970 AND Peso <=300; 142
  • 152.
    Capítulo 4. Realización deConsultas <> Actividad 4.2: Saca el pesoen kilogramos de losjugadores de la NBA que pesen entre 120 y 150 kilos. Una libra equivale a 0.4535 kilos. 4.4.5. Filtros con test de Valor nulo Los operadores IS e IS NOT permiten vericar si un campo es o no es nulo respectivamente. De esta manera, es posible comprobar, por ejemplo, los jugadores cuya procedencia es desconocida: SELECT nombre,Nombre_equipo FROM jugadores WHERE Procedencia IS null; I Nombre_equipo I + -------------- --+ ------------- --+ I Anthony Carter I Nuggets I + -------------- --+ ------------- --+ #1a query contraria saca el resto de jugadores SELECT nombre,Nombre_equipo FROM jugadores WHERE Procedencia IS NOT null; + -------------------- --+ ------------- --+ I nombre I Nombre_equipo I + -------------------- --+ ------------- --+ I Corey Brever I Timberwolves I I Greg Buckner I Timberwolves I IMichael Doleac I Timberwolves I | C.J. Watson | Warriors I Brandan Wright I Warriors + -------------------- --+ ------------- --+ 4.4.6. Filtros con test de patrón Los ltros con test patrón seleccionan los registros que cumplan una serie de ca- racterísticas. Se pueden usar los caracteres comodines 7o y _ para buscar unacadena de caracteres. Por ejemplo, seleccionar de la tabla de vehículos aquellos vehículos cuyo modelo sea t.di: SELECT * FROM vehiculos where modelo like %tdiZ; + --------- --+ -------------- --+ ----- --+ 143
  • 153.
    Bases de Datos Imatricula I modelo I marca I + --------- --+ --+ --+ I 1132GHT | leon tdi 105cv I seat I I 3447BYD I a3 tdi 130cv I audi I + --------- --+ -------------- --+ ----- --+ El carácter comodín % busca coincidencias de cualquier número de caracteres, incluso cero caracteres. El carácter comodín _ busca coincidencias de exactamente un carácter. Para ilustrar el funcionamiento del carácter _ ,se consultan aquellos equipos que empiecen por R, que terminen por S y que tengan 7 caracteres. SELECT Nombre,Conferencia FROM equipos WHERE Nombre like R_____s; + ------- --+ ----------- --+ I Nombre I Conferencia I + ------- --+ ----------- --+ I Raptors I East I I Rockets I West + ------- --+ ----------- --+ Ambos comodines se pueden usar en un mismo ltro, por ejemplo, para sacar aquellos equipos que en su nombre como segunda letra la o, se usaría el patrón: SELECT Nombre,Conferencia FROM equipos WHERE Nombre like _o%; + --+ ----------- --+ I Nombre I Conferencia I + --+ --+ I Bobcats I East I I Hornets I West I I Rockets I West I + ------- --+ ----------- --+ 4.4.7. Filtros por límite de número de registros Este tipo de ltros no es estándar y su funcionamiento varía con el SGBD. Consiste en limitar el número de registros devuelto por una consulta. En MySQL, la sintaxis es: 144
  • 154.
    Capítulo 4. Realizaciónde Consultas [LIMIT [desplazamiento ,] nf ilas] nlas especica. el número de las a devolver y desplazamiento especica. a partir de qué la. se empieza a contar (desplazamiento). #devuelve las 4 primeras filas SELECT nombre,Nombre_equipo FROM jugadores limit 4; + -------------- --+ ------------- --+ I nombre I Nombre_equipo I + -------------- --+ --+ I Corey Brever I Timberwolves I Greg Buckner I Timberwolves I Michael Doleac I Timberwolves I Randy Foye | Timberwolves + --+ ------------- --+ #devue1ve 3 filas a partir de la sexta SELECT nombre,Nombre_equipo FROM jugadores LIMIT 5,3; + ----------------- --+ ------------- --+ I nombre | Nombre_equipo I + ----------------- --+ ------------- --+ I Marko Jaric I Timberwolves I A1 Jefferson I Timberwolves I Mark Madsen I Timberwolves + ----------------- --+ ------------- --+ Oracle limita el número de las apoyándose enuna pseudo columna, de nombre rownum: --Saca los 25 primeros jugadores SELECT * FROM jugadores WHERE rownum <= 25; 4.5. Ordenación Para mostrar ordenados un conjunto de registros se utiliza la cláusula ORDER BY de la sentencia SELECT. 145
  • 155.
    Bases de Datos SELECT [DISTINCT]select_expr [,se1ect_expr] [FROM tabla] [WHERE filtro] [ORDER BY{nombre_co1umna I expr l posición} [ASC I DESC] ,...] Esta claúsula permite ordenar el conjunto de resultados de forma ascendente (ASC) o descendente (DESC)por una o varias columnas. Si no se indica ASC o DESC por defecto es ASC. La columna por la que se quiere ordenar se puede expresar por el nombre de la columna, una expresión o bien la posición numérica del campo que se quiere ordenar. Por ejemplo: #estructura de la tabla equipos DESCRIBE equipos; I Nombre varchar(20) ICiudad varchar(20) I Conferencia varchar(4) lDivision varchar(9) #obtener los equipos de la conferencia oeste de la nba ordenados por división SELECT Nombre,Division FROM equipos wHERE Conferencia=west ÜRDER BY Division ASC; + ------------- --+ --------- --+ I Nombre I Division I + ------------- --+ --------- --+ I Jazz I Northwest I I Nuggets I Northwest I I Trail Blazers I Northwest I I Timberwolves I Northwest I I Supersonics I Northwest I I Clippers I Pacific I I Kings I Pacific I I warriors I Pacific I I Suns I Pacific | Í Lakers I Pacific I | Hornets I Southwest I I Spurs I Southwest I I Rockets I Southwest I I Mavericks I Southwest I I Grizzlies I Southwest I + ------------- --+ --------- --+ 146
  • 156.
    Capítulo 4. RealizacióndeConsultas #se puede ordenar por varios campos, p.ej: además de que cada #división esté ordenada ascendentemente se ordene por nombre #de equipo SELECT Division,Nombre FROM equipos WHERE Conferencia=west ORDER BY Division ASC,Nombre DESC; +--------- --+ ------------- --+ I Division I Nombre I +--------- --+ ------------- --+ I Northwest I Trail Blazers I | Northwest I Timberwolves | I Northwest I Supersonics I I Northwest I Nuggets I I Northwest I Jazz I I Pacific I warriors I I Pacific I Suns I I Pacific I Lakers I I Pacific I Kings I I Pacific I Clippers I I Southwest I Spurs l I Southwest I Rockets I I Southwest I Mavericks I I Southwest I Hornets I I Southwest I Grizzlies I + 4.6. Consultas de resumen En SQL sepuedengenerarconsultasmáscomplejasqueresumencierta informa- ción,extrayendoinformacióncalculadade variosconjuntosde registros.Un ejemplo de consultaresumenseriala siguiente: SELECT count(*) FROM vehiculos; Esta consultadevuelveel númerode registrosde la tabla vehículos,esdecir, se generaun resumende la informacióncontenidaen la tabla vehículos.La expresión count(*)esunafunción quetomacomoentradalosregistros dela tablaconsultada 147
  • 157.
    Bases de Datos ycuenta cuántos registros hay. El resultado de la función count es un único valor (1 la, 1 columna) conel número5 (número de registrosde la tabla vehículos). Para poder generar información resumida hay que hacer uso de las funciones de columna. Estas funciones de columna convierten un conjunto de registros en una información simple cuyo resultado es un cálculo. A continuación, se expone una lista de las funciones de columna disponibles en SQL: SUM (Expresión) #Suma los valores indicados en el argumento AVG (Expresión) #Ca1cu1a la media de los valores MIN (Expresión) #Ca1cula el minimo MAX (Expresión) #Ca1cu1a el máximo COUNT (nbCo1umna) #Cuenta el número de valores de una columna #(excepto los nulos) COUNT (*) #Cuenta el número de valores de una fila #Inc1uyendo los nulos. A modo de ejemplo, se muestran algunas consultas resúmenes: #consu1ta 1 #¿Cuánto pesa el jugador más pesado de la nba? SELECT max(peso) FROM jugadores; #consu1ta 2 #¿Cuánto mide el jugador más bajito de la nba? SELECT min(a1tura) FROM jugadores; #consu1ta 3 #¿Cuántos jugadores tienen los Lakers? SELECT count(*) FROM jugadores WHERE Nombre_equipo=Lakers; #consu1ta 4 #¿Cuánto pesan de media los jugadores de los Blazers? SELECT avg(peso) FROM jugadores WHERE Nombre_equipo=B1azers; Con las consultas de resumen se pueden realizar agrupaciones de registros. Se denomina agrupación de registros a un conjunto de registros que cumplen que tienen una o varias columnas con el mismo valor. Por ejemplo, en 1atabla vehículos: SELECT * FROM vehiculos;
  • 158.
    Capítulo 4. Realización deConsultas I 1129FGT ibiza gt I 1132GHT leon tdi 105cv IM6836YX corolla g6 I 7423FZY coupe Í3447BYD a3 tdi 130CV En esta consulta hay dos registros cuya marca=seat. Se puede agrupar estos dos registros formando un único grupo, de tal manera que el grupo seat tiene los modelos ibiza gt (1129FGT) y leon tdi 105cv (1132GHT). A este grupo de registros se le puede aplicar una función de columna para realizar determinados cálculos, por ejemplo, contarlos: SELECT marca, count(*) FROM vehiculos GROUP BY marca; + ------- --+ -------- --+ I marca I count(*) I En este caso, si se agrupa (GROUP BY) por el campo marca, salen 4 grupos (audi, hyundai, seat y toyota). La función de columna, cuandose agrupapor un campo, actúa para cada grupo. En este caso, para cada. grupo se ha contado el número de registros que tiene. En el caso de seat, cuenta los 2 antes mencionados. La sintaxis para la sentencia SELECT con GROUP BY queda como sigue: SELECT [DISTINCT] select_expr [,select_expr] [FROM tabla] [WHERE filtro] [GROUP BYexpr [, expr] . ... ] [ORDER BY{nombre_columna I expr I posición} [ASC I DESC] , ...] Se observaque GROUP BY va justo antes de la cláusula ORDER BY. A conti- nuación, a modo de ejemplo, se muestran algunas consultas con grupos y funciones de columna. 149
  • 159.
    Bases de Datos #consu1ta1 #¿Cuánto pesa el jugador más pesado de cada equipo? SELECTNombre_equipo, max(peso) FROM jugadores GROUP BY Nombre_equipo; #consulta 2 #¿Cuántos equipos tiene cada conferencia en la nba? SELECTcount(*),conferencia FROM equipos GROUP BY conferencia; + -------- --+ ----------- --+ count(*) I conferencia I + -------- --+ ----------- --+ 15 I East I +-------- --+ ----------- --+ #¿Cuánto pesan de media los jugadores de españa, francia e italia? SELECTavg(peso),procedencia FROM jugadores WHERE procedencia IN (Spain,Ita1y,France) GROUP BY procedencia; +--------- --+ ----------- --+ I avg(peso) I procedencia I +--------- --+ ----------- --+ 218.4000 I France I I 221.0000 I Italy I 208.6000 I Spain + --------- --+ ----------- --+ IMPORTANTE: Seobservaquepara cadaagrupación.seha seleccionado tam- biénel nombredela columnapor la cualseagrupa.Esto noesposiblesinoseincluye el GROUP BY. Por ejemplo: 150
  • 160.
    Capítulo 4. Realizaciónde Consultas mysq1> SELECT count(*),conferencia FROM equipos; ERROR 1140 (42000): Mixing of GROUP Columns (MIN(),MAX(),COUNT()....) with no GROUP Columns is illegal if there is no GROUP BY clause Precisamente, el SGBD advierte de que para mezclar funciones de columna y columnas de una tabla hay que escribir una cláusula GROUP BY. 4.6.1. Filtros de Grupos Los ltros de grupos deben realizarse mediante el uso de la cláusula HAVING puesto que WHERE actúa antes de agrupar los registros. Es decir, si se desealtrar resultados calculados mediante agrupaciones se debeusar la siguiente sintaxis: SELECT [DISTINCT] se1ect_expr [,se1ect_expr] [FROM tabla] [WHERE filtro] [GROUP BYexpr [, expr].... ] [HAVING fi1tro_grupos] [ORDER BY {nombre_co1umna I expr I posición} [ASC | DESC] ,...] HAVING aplica los mismos ltros que la cláusula WHERE. A continuación se ilustran algunos ejemplos: #query 1: #Seleccionar los equipos de la nba cuyos jugadores #pesen de media más de 228 libras SELECT Nombre_equipo,avg(peso) FROM jugadores GROUP BY Nombre_equipo HAVING avg(peso)>228 ORDER BY avg(peso); + ------------- --+ --------- --+ I Nombre_equipo I avg(peso) l 228.8462 229.6923
  • 161.
    Bases de Datos #query2 #seleccionar qué equipos de la nba tienen más de 1 jugador español SELECT Nombre_equipo,count(*) FROM jugadores WHERE procedencia=Spain GROUP BY Nombre_equipo HAVING count(*)>1; + ------------- --+ -------- --+ I Nombre_equipo I count(*) I 4.7. Subconsultas Las subconsultas se utilizan para realizar ltrados con los datos de otra consulta. Estos ltros pueden ser aplicados tanto en la cláusula WHERE para ltrar registros como en la cláusula HAVING para ltrar grupos. Por ejemplo, con la base dedatos de la NBA, es posible codicar una consulta para pedir los nombres de los jugadores de la división SouthEast: SELECT nombre FROM jugadores WHERE Nombre_equipo IN (SELECT Nombre FROM equipos WHRE division=SouthWest); + ------------------- --+ I nombre | + ------------------- --+ I Andre Brown I | Kwame Brown I I Brian Cardinal I | Jason Collins I I + ------------------- --+ Se observa que la subconsulta es precisamente la sentencia SELECT encerrada entre paréntesis. De esta forma, se hace uso del operador in para tornar los equi- pos de la división SouthEast. Si se ejecuta la subconsulta por separado seobtiene: 152
  • 162.
    Capítulo 4. Realizaciónde Consultas SELECT Nombre FROM equipos WHERE division=SouthWest ; "&#39; """"" "+ La subconsulta se convierte en algo equiva- l Nmbre l lente a: + --------- --+ ¡Hornets SELECT nombre FROM jugadores I ¡ Spurs ¡WHERE Nombre_equipo IN | Rockets | (Hornets ,Spurs ,Rockets , I I ¡ Mavericks Mavericks ,Grizzlies) I Grizzlies + --------- --+ En las siguientes secciones se detallan los posibles operadores que se pueden usar con las subconsultas. 4.7.1. Test de Comparación Consiste en usar los operadores de comparación --, >=, <=, <>, >y <para comparar el valor producido con un valor único generado por una subconsulta. Por ejemplo, para consultar el nombre del jugador de mayor altura de la nba, es posible hacer algo como esto: SELECT nombre FROM jugadores WHERE altura = (SELECT max(a1tura) FROM jugadores); + -------- --+ | nombre + -------- --+ I Yao Ming | + -------- --+ Se puedecomprobar que la subconsulta produce un único resultado, utilizándolo para ltrar. Nótese que con este tipo de ltro la subconsulta solo debe producir un único valor (una la y una columna),por tanto, si secodica algo del tipo: SELECT nombre FROM jugadores WHERE altura = (SELECT max(altura),max(peso) FROM jugadores); ERROR 1241 (21000): Operand should contain 1 co1umn(s) También fallaría que la subconsulta devolviera más de una la: 153
  • 163.
    Bases de Datos SELECTnombre FROM jugadores WHERE altura = (SELECT max(a1tura) FROMjugadores GROUP BY Nombre_Equipo); ERROR1242 (21000): Subquery returns more than 1 row Una restricción importante es que la subconsulta debe estar siempre al lado derecho del operador de comparación. Es decir: Campo <= subconsulta siendo invalida la expresión: subconsulta >= Campo 4.7.2. Test de pertenencia a conjunto Este test consiste enuna variante del usado para consultas simples, y es elque se ha utilizado para ilustrar el primer ejemplo de la sección.Consiste enusar eloperador IN para ltrar los registros cuya expresión coincida con algún valor producido por la subconsulta. Por ejemplo, para extraer las divisiones de la nba donde juegan jugadores es- pañoles: SELECT division FROM equipos WHERE nombre in (SELECT Nombre_equipo FROM jugadores WHERE procedencia=Spain); + --------- --+ I division + --------- --+ I Atlantic I Northwest | I Pacific I I Southwest I + --------- --+ 4.7.3. Test de existencia El test de existencia permite ltrar los resultados de una consulta si existen las en la subconsulta asociada, esto es, si la subconsulta genera un número de las distinto de O. Para usar el test de existencia se utiliza el operador EXISTS: 154
  • 164.
    Capítulo 4. Realizaciónde Consultas SELECT columnas FROM tabla WHERE EXISTS (subconsulta) El operador EXISTS también puede ser precedido de la negación (NOT) para ltrar si no existen resultados en la subconsulta: SELECT columnas FROM tabla WHERE NOT EXISTS (subconsulta) Para seleccionar los equipos que no tengan jugadores españoles sepodría usar la siguiente consulta: SELECT Nombre FROM equipos WHERE NOT EXISTS (SELECT Nombre FROM jugadores WHERE equipos.Nombre = jugadores.Nombre_Equipo AND procedencia=Spain); + ------------ --+ I Nombre + ------------ -+ I Bobcats Para comprender la lógica de esta query, se puede asumir que cada registro de- vuelto por la consulta principal provoca la ejecución de la subconsulta, así, si la consulta principal (SELECT Nombre FROM Equipos) devuelve 30 registros, se en- tenderá que se ejecutan30 subconsultas, una por cada nombre de equipo que retorne la consulta principal. Esto en realidad no es así, puesto que el SGBD optimiza la consulta para hacer tan solo dosconsultas y una operación join que se estudiará más adelante, pero sirve de ejemplo ilustrativo del funcionamiento de esta consulta: SELECT Nombre from equipos; + ------------- -+ I Nombre + -+ subconsulta ejecutada #1 I Bobcats subconsulta ejecutada #2 | | l | I Raptors | l | + ------------- -+ subconsulta ejecutada #22 155
  • 165.
    Bases de Datos Cadasubconsulta ejecutada sería como sigue: #subconsulta ejecutada #1 SELECT Nombre FROM jugadores WHERE 76ers = jugadores.Nombre_Equipo AND procedencia=Spain; Esta subconsulta no retorna resultados, por tanto, el equipo 76ers es selecciona- do para ser devuelto en la consulta principal, puesto que no existen (NOT EXISTS) jugadores españoles. Sin embargo para el registro 22 de la consulta principal, aquel cuyo Nombre es Raptors, la consulta: #subconsu1ta ejecutada #22 SELECT Nombre FROM jugadores WHERE Raptors = jugadores.Nombre_Equipo AND procedencia=Spain; + --------------- --+ I Nombre I + --------------- --+ I Jose Calderon I Jorge Garbajosa I + --------------- --+ devuelve 2 jugadores, por tanto, existen (EXISTS) registros de la subconsulta y por tanto el equipo Raptors NO es seleccionadopor la consulta principal. En conclusión, se puede decir que la consulta principal enlaza los registros con los devueltos por las subconsultas. 4.7.4. Test cuanticados ALL y ANY Los test cuanticados sirven para calcular la relación entre una expresión y todos los registros de la subconsulta (ALL) o algunos de los registros de la subconsulta (ANY). De esta manera se podría saber los jugadores de la nba que pesan másque todos los jugadores españoles: 156
  • 166.
    Capítulo 4. RealizacióndeConsultas SELECT nombre,peso from jugadores WHEREpeso > ALL (SELECTpeso FROMjugadores WHERE procedencia=Spain); I Michael Doleac I A1 Jefferson I Chris Richard A1 igualqueen el casodel operadorexists,sepuedeasumirquepor cadaregistro de la consultaprincipal se ejecuta una subconsulta.En tal caso,para el jugador Michae1Doleac cuyopesoes262 libras,secomprobaríasi262esmayorquelospesos de todos losjugadoresespañoles,que son devueltospor la subconsulta(SELECT peso FROM jugadoresWHERE procedenciafspain). También sepodría consultarlosbases(en inglésGuard G) posicion=G, que pesanmásquecualquier(ANY) pívot (en inglésCenter "C) posicion: C de la nba: SELECT nombre,peso from jugadores WHEREposicion=G AND peso > ANY (SELECTpeso FROMjugadores where posicion=C); I Joe Johnson I +----------- --+ ---- --+ Secomprueba queenelcaso deJoe Johnson,supeso(235libras),esmayorque algún pesode algún pívot de la nba, dándoseasí el peculiar casode un basemás pesadoque algún pívot. 4.7.5. Subconsultas anidadas Se puede usar una subconsultapara ltrar los resultadosde otra subconsulta. De estamanerase anidan Subconsultas. Por ejemplo.si sedeseaobtenerel nombre de la ciudad dondejuega el jugador más alto de la nba, habría que pensarcómo hacerlo de forma estructurada: 157
  • 167.
    Bases de Datos 1.Obtener la altura del jugador más alto: X <- (SELECT max(a1tura) from jugadores) 2. Obtener el nombre del jugador, a través de la altura se localiza al jugador y por tanto, su equipo: Y < SELECT Nombre__equipo from jugadores WHERE Altura = X 3. Obtener la ciudad: SELECT ciudad FROM equipos WHERE nombre= Y Ordenando todo esto, se puede construir la consulta de abajo a. arriba: SELECT ciudad FROM equipos WHERE nombre = (SELECT Nombre_equipo FROM jugadores WHERE altura = (SELECT MAX(a1tura) FROM jugadores)); + ------- --+ | ciudad + ------- --+ I Houston I + --+ Esta manera de generar consultas es muy sencilla, y a la vez permite explorar la información de la base de datos de forma. estructurada. En opinión de muchos autores esta forma. estructurada de generar consultas es la que dio a SQL su S de Structured. 4.8. Consultas multitabla Una consulta multitabla es aquella en la que se puede Consultar información de más de una tabla. Se aprovechan los campos relacionados de las tablas para unirlas (join). Para poder realizar este tipo de consultashay que utilizar la siguiente sintaxis: SELECT [DISTINCT] se1ect_expr [,se1ect_expr] ... [FROM referencias_tab1as] [WHERE filtro] [GROUP BYexpr [, expr].... ] [HAVING fi1tro_grupos] [ORDER BY{nombre_co1umnas I expr I posición} [ASC I DESC] , . . 158
  • 168.
    Capítulo 4. Realizaciónde Consultas La diferencia con las consultas sencillas se halla en la cláusula FROM. Esta vez en lugar de una tabla se puede desarrollar el token referencias_tablas: referencias_tablas: referencia_tab1a[, referencia_tabla] ... I referencia_tabla [INNER I CROSS] JOIN referencia_tab1a [ON condición] I referencia_tab1a LEFT [OUTER] JOIN referencia_tab1a ON condición l referencia_tabla RIGHT [OUTER] JOIN referencia_tab1a ON condición referencia_tab1a: nombre_tab1a [[AS] alias] La primera opción, (referencia_tabla[. referenciajabla] es típica de SQL 1 (SQL-86) para las uniones, que consisten en un producto cartesiano más un ltro por las columnas relacionadas, y el resto de opciones sonpropias de SQL 2 (SQL-92 y SQL-2003). 4.8.1. Consultas multitabla SQL 1 El producto cartesiano de dos tablas son todas las combinaciones de las las de una tabla unidas a las las de la otra tabla. Por ejemplo, una base de datos de mascotas con dos tablas animales y propietarios: SELECT * FROM propietarios; | 51993482Y | José Pérez I I 28834177X I Matías Fernández I I 37276317Z I Francisco Martínez I + --------- --+ ------------------ --+ SELECT * FROM animales; + ------ --+ -------- --+ ----- --+ ----------- --+ I codigo I nombre I tipo I propietario I + ------ --+ -------- --+ ----- --+ ----------- --+ I 1 I Cloncho I gato I 51993482Y I | 2 I Yoda I gato I 51993482Y I I 3 I Sprocket I perro I 372763172 I + ------ --+ -------- --+ --+ ----------- --+ Un producto cartesiano de las dos tablas se realiza con la siguiente sentencia: 159
  • 169.
    Bases de Datos Cloncho Yoda Sprocket Cloncho Yoda Sprocket Cloncho Yoda Sprocket SELECT* FROM animales,propietarios; 51993482Y 51993482Y 372763172 51993482Y 51993482Y 372763172 51993482Y 5199348
  • 170.
    Capítulo 4. Realizaciónde Consultas Este mismo procedimiento se puede aplicar con N tablas, por ejemplo, con la base de datos jardineria, cuyo gráco de relaciones esel siguiente: cungc Nombrecliente Nombrecontacu: Apellidocontacu: Telefono Fax LheaD reccionl LineaD reccion2 Ciudad Region Pais Cod igoPostal CodigoEITpleadoRepVentas LimiwCreditD ,. .4; cuirrpbab Nombre Apellidol Apellido Extension Email Codigoofncina codigoJefe Cuidad Pais Region CodigoPostaI Telefono
  • 171.
    Bases de Datos Seobserva que en est.e casohay dos JOIN, el primer join entre la tabla Clien- tes y Pedidos, con la condición Clientes.CodigoCliente=Pedidos.CodigoCliente y la segunda join entre el resultado de la primera. join y la tabla Empleados (Emplea- dos.CodigoEmpleado = Clientes.CodigoEmpleadoRepVentas). Nótese que los dos ltros de la join están unidas por el operador AND. De esta forma se va extrayen- do de la base de datos toda la información relacionada, obteniendo así mucha más potencia en las consultas. También hay que jarse en que como hay dos camposCodigoCliente, para hacer- les referencia,hay que precederlos desu nombre de tabla (p.e. PedidosCodigoCliente) para evitar que el SGBD informe de que hay una columna con nombre ambiguo. Realizar una consulta multitabla no limita las características de ltrado y agru- pación que ofrece SQL, por ejemplo, si se desea realizar una consulta para obtener cuántos pedidos ha gestionado cada empleado, se modicaría la consulta anterior para agrupar por la columna Nombre de Empleado y contar la columna CodigoPe- dido: SELECT Emp1eados.Nombre, COUNT(Pedidos.CodigoPedido) as NumeroDePedidos FROM Clientes, Pedidos, Empleados WHERE Clientes.CodigoC1iente=Pedidos.CodigoC1iente AND Emp1eados.CodigoEmp1eado = Clientes.CodigoEmpleadoRepVentas GROUP BY Emp1eados.Nombre ORDER BY NumeroDePedidos; I Michael I Lorena 4.8.2. Consultas multitabla SQL 2 SQL 2 introduce otra sintaxis para los siguientes tipos de consultas multitablas: las joins (o composiciones) internas, externasy productos cartesianos (tambiénlla- madas composiciones cruzadas): 1. Join Interna: n De equivalencia (INNER JOIN) 162
  • 172.
    Capítulo 4. Realizaciónde Consultas u Natural (NATURAL JOIN) 2. Producto Cartesiano (CROSS JOIN) 3. Join Externa n De tabla derecha(RIGHT OUTER JOIN) IDe tabla izquierda (LEFT OUTER JOIN) ICompleta (FULL OUTER JOIN) Composiciones internas. INNER JOIN Hay dos formas diferentes para expresar las INNER JOIN o composiciones in- ternas. La primera, usa la palabra reservada JOIN, mientras que la segunda usa , para separar las tablas a combinar en la sentencia FROM, es decir, las de SQL 1. Con la operación INNER JOIN se calcula el producto cartesiano de todos los registros, después, cada registro en la primera tabla es combinado con cada registro de la segunda tabla, y solo se seleccionanaquellos registros que satisfacen las con- diciones que se especiquen. Hay que tener en cuenta que los valores Nulos no se combinan. Como ejemplo, la siguiente consulta toma todos los registros de la tabla animales y encuentra todas las combinaciones en la tabla propietarios. La JOIN compara los valores de las columnas dni y propiet.arío. Cuando no existe esta correspondencia entre algunas combinaciones, estas no se muestran; es decir, que si el dni de un propietario de una mascota no coincide con algún dni de la tabla de propietarios, no se mostrará el animal con su respectivo propietario en los resultados. SELECT *FROM animales INNER JOIN propietarios ON anima1es.propietario = propietarios.dni; + ------ --+ -------- --+ ----- --+ ----------- --+ --------- --+ ------------------ --+ I codigo I nombre I tipo Í propietario I dni I nombre + ------ --+ --+ ----- --+ ----------- --+ --------- --+ ------------------ --+ 1 I Cloncho I gato I 51993482Y Í 51993482Y I José Pérez I 2 I Yoda I gato I 51993482Y I 51993482Y I José Pérez I 3 I Sprocket I perro I 372763172 I 372763172 I Francisco Martinez I + ------ --+ -------- --+ ----- --+ ----------- --+ --+ --+ # Nótese que es una consulta equivalente a la vista en el apartado anterior # select *from anima1es,propietarios # where animales.propietario=propietarios.dni; 163
  • 173.
    Bases de Datos Además,debe tenerse encuenta que si hay un animal sin propietario no saldrá en el conjunto de resultados puesto que no tiene coincidencia en el ltro: INSERT INTO animales VALUES (nul1,Arco,perro,nu11); SELECT * FROM animales; + ------ --+ -------- --+ --+ --+ I codigo I nombre I tipo I propietario I + ------ --+ --+ ----- --+ --+ I 1 I Cloncho I gato I 51993482Y I I 2 I Yoda I gato I 51993482Y I Í 3 I Sprocket I perro I 372763172 I I 4 I Arco I perro I NULL I #nueva mascota sin propietario + ------ --+ -------- --+ ----- --+ ----------- --+ SELECT * FROM animales INNER JOIN propietarios ON anima1es.propietario = propietarios.dni; + ------ --+ -------- --+ ----- --+ ----------- --+ --------- --+ ------------------ --+ Icodigo I nombre Itipo I propietario I dni I nombre I + ------ --+ --+ ----- --+ ----------- --+ --------- --+ ------------------ --+ I 1 I Cloncho I gato I 51993482Y I 51993482Y I José Pérez I l 2 l Yoda l gato I 51993482Y l 51993482Y l José Pérez l I 3 I Sprocket I perro I 372763172 I 372763172 I Francisco Martinez I + ------ --+ -------- --+ ----- --+ ----------- --+ --------- --+ ------------------ --+ #LA NUEVA MASCOTA N0 APARECE! Puede hacerse variantes de la inner join cambiando el operador del ltro, por ejemplo: SELECT *FROM animales INNER JOIN propietarios DN propietarios.dni >= anima1es.propietario; + ------ --+ -------- --+ ----- --+ ----------- --+ --------- --+ ------------------ --+ I codigo I nombre I tipo I propietario I dni I nombre I + ------ --+ -------- --+ ----- --+ ----------- --+ --------- --+ ------------------ --+ 1 I Cloncho I gato I 51993482Y I 51993482Y I José Pérez 3 I Sprocket I perro I 372763172 I 51993482Y I José Pérez 3 I Sprocket I perro I 372763172 I372763172 I Francisco Martínez + ------ --+ -------- --+ --+ --+ --+ ------------------ --+ I 2 I Yoda I gato I 51993482Y I 51993482Y I José Pérez | I I Composiciones naturales. NATURAL JOIN Es una especialización de la INNER JOIN. En este caso se comparan todas las columnas que tengan el mismo nombre en ambastablas. La tabla. resultante contiene solo una columna por cada par de columnas con el mismo nombre.
  • 174.
    Capítulo 4. Realizaciónde Consultas DESCRIBE Empleados; + ---- --+--+ ------- --+ I I | I + ------------ --+ ---- --+--+ ------- --+ I CodigoEmpleado I I I I I I I Nombre I varchar(50) I N0 I I NULL I | I Apellidol | varchar(50) I N0 I I NULL I I I Ape1lido2 I varchar(50) I YES I I NULL I I IExtension I varchar(10) I N0 II NULL I | | Email I varchar(100) I N0 II NULL II I Codigoüficina I varchar(10) I N0 I I NULL I I #relación I CodigoJefe I int(11) I YES I | NULL I I I Puesto I varchar(50) I YES I I NULL I I + -------------- --+ ------------ --+ ---- --+--+ ------- --+ --+ DESCRIBE Oficinas; + --------------- --+ ----------- --+ ---- --+--+ ------- --+ ----- --+ I Field I Type I Null I Key I Default I Extra I + --------------- --+ --+ ---- --+--+ --+ --+ I Codigoüficina I varchar(10) I N0 I PRI I NULL I I #relación I Ciudad I varchar(30) I N0 I I NULL I I I Pais I varchar(50) I N0 I I NULL I I I Region I varchar(50) I YES I I NULL I I I CodigoPostal I varchar(10) I N0 I I NULL I I | Telefono I varchar(20) I N0 I I NULL I | I LineaDireccion1 I varchar(50) I N0 I I NULL I | I LineaDireccion2 I varchar(50) I YES I I NULL I | + --+ ----------- --+ ---- --+--+ ------- --+ ----- --+ #NATURAL JOIN coge los mismos nombres de campo, en este caso Codigoüficina SELECT CodigoEmpleado,Empleados.Nombre, Oficinas.Codigo0ficina,0ficinas.Ciudad FROM Empleados NATURAL JOIN Oficinas; + -------------- --+ --------------- --+ ------------- --+ -------------------- --+ I CodigoEmpleado I Nombre I Codigoüficina I Ciudad I + -------------- --+ --------------- --+ ------------- --+ -------------------- --+ I 1 I Marcos I TALES I Talavera de la Reina l 2 I Ruben I TAL-ES I Talavera de la Reina I I 31 I Mariko I SYD-AU I Sydney I Hay que jarse en que, aunque CodigoEmpleado es un campo que está en dos tablas, esta vez noes necesarioprecederlo delnombre detabla puesto que NATURAL JOIN devuelve un único campo por cada pareja de campos con el mismo nombre. 165
  • 175.
    Bases de Datos Productocartesiano.CROSS JOIN Este tipo de sintaxis devuelve el producto cartesiano de dos tablas: #equiva1ente a SELECT * FROM anima1es,propietarios; SELECT * FROM animales CROSS JOIN propietarios; I codigo I nombre + I l l l l I | I + l l l l | l | l l I Cloncho Cloncho Yoda Yoda
  • 176.
    Capítulo 4. Realizaciónde Consultas SELECT * FROM animales LEFT OUTER JOIN propietarios DN animales.propietario = propietarios.dni; +------ --+ -------- --+ ----- --+ ----------- --+ --------- --+ ------------------ --+ I codigo I nombre I tipo I propietario I dni I nombre I +------ --+ -------- --+ ----- --+ ----------- --+ --------- --+ ------------------ --+ I 1 I Cloncho I gato I 51993482Y I 51993482Y I José Pérez I | 2 I Yoda I gato I 51993482Y I 51993482Y I José Pérez I I 3 I Sprocket I perro I 372763172 I 372763172 I Francisco Martinez I I 4 I Arco I perro I NULL I NULL I NULL I +------ --+ -------- --+ ----- --+ ----------- --+ --------- --+ ------------------ --+ Se observa que se incluye el perro Arco que no tiene propietario, por tanto, sus campos relacionados aparecen con valor NULL. El sentido de esta.query podría ser, sacar todos los animales y si tienen relación, sacar sus propietarios, y si no tiene propietario, índicarlo conunvalorN ULO oconVACÍO. ¿Sabías que . . . 7 Oracleimplementaba las consultas externasantesde la aparición de las OUTER JOIN. utilizando el operador (+)= en lugar del operador = en la cláusula WHERE. Esta sintaxis aún está disponible en las nuevas versiones de este SGBD. Si los registros que admiten no tener correspondencia son los que aparecen en la tabla de la derecha, sellama composición de tabla derecha RIGHT JOIN (o RIGHT OUTER JOIN): #ejemp1o de RIGHT OUTER JOIN #anima1es RIGHT OUTER JOIN propietarios #anima1es está a la izquierda #propietarios está a la derecha SELECT * FROM animales RIGHT OUTER JOIN propietarios ON anima1es.propietario = propietarios.dni; +------ --+ -------- --+ ----- --+ --+ --+ ------------------ --+ I codigo I nombre I tipo I propietario I dni I nombre I +------ --+ -------- --+ ----- --+ ----------- --+ --------- --+ ------------------ --+ 1 I Cloncho I gato I 51993482Y I 51993482Y I José Pérez I 2 l Yoda Í gato I 51993482Y I 51993482Y l José Pérez l NULL I NULL INULL I NULL I 2883477X | Matías Fernández I | 3 I Sprocket I perro I 372763172 I 372763172 I Francisco Martinez +------ --+ -------- --+ ----- --+ ----------- --+ --+ --+ 167
  • 177.
    Bases de Datos Enestecaso, losque aparecenson todoslos propietarios, incluido Matías Fernández que no tiene una mascota. Seve que el perro Arco no aparece, puesesta vezlos regis- tros que se deseanmostrar son todos los de la tabla derecha (es decir, propietarios). La operación que admite registros sin correspondencia tanto para la tabla izquier- da como para la derecha, por ejemplo. animales sin propietario y propietarios sin animales, se llama composición externa completa o FULL JOIN (FULL OUTER JOIN). Esta operación presenta los resultados de tabla izquierda y tabla. derecha aunque no tengan correspondencia en la otra tabla. La tabla combinada contendrá, entonces, todoslos registros de ambastablas y presentará valoresnulos para registros sin pareja. #ejemp1o de FULL OUTER JOIN #anima1es FULL OUTER JOIN propietarios #anima1es está a la izquierda #propietarios está a la derecha SELECT * FROM animales FULL OUTER JOIN propietarios DN anima1es.propietario = propietarios.dni; + ------ -+ -+ -+ ----------- -+ --------- -+ ------------------ -+ I codigo I nombre I tipo I propietario I dni I nombre Cloncho I 51993482Y 51993482Y l José Pérez Yoda gato I 51993482Y 51993482Y I José Pérez Sprocket perro I 372763172 372763172 I Francisco Martinez I l NULL NULL NULL 2883477X Matias Fernández ¿Sabías que . . . 7 En SQL existe el operador UNION, que añade al conjun- to de resultados producidos por una SELECT, los resultados de otra SELECT. La sintaxis es: SELECT FROM UNION [ALL] SELECT FROM El parámetro ALL incluye todos los registros de las dos SELECT, incluyendo los que son iguales. Si no se indica ALL, se excluyen los duplicados. Aunque MySQL no implementa la característica FULL OUTER JOIN, sí que se puede simular haciendo una unión de los resultados de un LEFT OUTER JOIN y 168
  • 178.
    Capítulo 4. Realizaciónde Consultas los resultados de un RIGHT OUTER JOIN, puesto que UNION, sin la opción ALL, elimina los registros duplicados, por tanto, se podría codicar la FULL OUT ER JOIN anterior de la siguiente forma: mysq1> SELECT * FROM animales LEFT OUTER JOIN propietarios -> ON anima1es.propietario -propietarios.dni -> UNION -> SELECT * FROM animales RIGHT OUTER JOIN propietarios -> ON anima1es.propietario = propietarios.dni; + -+ -+ -+ ----------- -+ -+ -+ I codigo I nombre I tipo I propietario I dni I nombre I + -+ -------- -+ ----- -+ ----------- -+ --------- -+ ------------------ -+ I Cloncho I gato I 51993482Y I 51993482Y I José Pérez I I Yoda I gato I 51993482Y I 51993482Y I José Pérez I I Sprocket I perro I 372763172 I372763172 I Francisco Martinez I I Arco I perro I NULL I NULL I NULL I I I I + + + NULL NULL I NULL 2883477X Matias Fernández I 4.9. Consultas reexivas A veces, es necesario obtener información de relaciones reexivas, por ejemplo, un informe de empleadosdonde junto a su nombre y apellidos apareciera el nombre y apellidos de su jefe. Para ello, es necesario hacer una JOIN entre registros de la misma tabla: mysq1> desc Empleados; + -------------- -+ ------------ -+ ---- +--+ ------- -+ ----- -+ I F1e1d I Type I Null I Key I Default I Extra I + -------------- -+ ------------ -+ ---- --+-----+ ------- -+ ----- -+ I CodigoEmp1eado I int(11) I N0 I PRI I NULL I | I Nombre I varchar(50) I N0 I I NULL I I | Apellidol I varchar(50) I N0 I I NULL I I I Ape11ido2 I varchar(50) I YES I I NULL I | I Extension I varchar(10) I N0 I l NULL I I | Email I varchar(100) I ND I I NULL I | I Codigoüficina I varchar(10) I N0 I I NULL I I I CodigoJefe I int(11) I YES I I NULL I I #autore1ación I Puesto I varchar(50) I YES I I NULL I I + -------------- -+ ------------ -+ ---- -+----+ ------- -+ -+ SELECT concat(emp.Nombre, ,emp.Ape11ido1) as Empleado, concat(jefe.Nombre, ,jefe.Ape11ido1) as jefe 169
  • 179.
    Bases de Datos FROMEmpleados emp INNER JOIN Empleados jefe ON emp.CodigoEmp1eado=jeÍe.CodigoJefe; + -+ ----------------------- -+ I Empleado I Jefe I + ----------------- -+ ----------------------- -+ I Marcos Magaña I Ruben López I I Ruben López I Alberto Soria I I Alberto Soria I Kevin Fallmer I I Kevin Fallmer I Julian Bellinelli I l Kevin Fallmer I Mariko Kishi I + ----------------- -+ ----------------------- -+ Analizando la query anterior, primero se observa el uso de la tabla empleados dos veces,una con un alias emp que representa los empleados como subordinados y otra con alias jefe que representalos empleadoscomo jefes.Ambas tablas (aunque en realidad son la misma) se unenen una JOIN a través de la relación CodigoEmpleado y CodigoJefe. Por otro lado, el primer campo que se selecciona esla concatenación del nombre y apellido del empleado (concat(emp.Nombre,&#39; ,emp.Apellido1) al que a su vez le damos un alias (empleado) y el segundo campo que es la concatenación de los empleados jefes, al que le se le da el alias jefe. Se puede observar que en esta query no aparecen los empleados sin jefe, puesto que se ha utilizado un INNER JOIN. Para mostrarlos, habría. que usar un LEFT o RIGHT OUTER JOIN. 4.10. Consultas con tablas derivadas Las consultas con tablas derivadas, o inline views, son aquellas que utilizan sen- tencias SELECT en la cláusula FROM en lugar de nombres de tablas, por ejemplo: SELECT * FROM (SELECT CodigoEmpleado, Nombre FROMEmpleados WHERE CodigoOficina=TAL-ES) as tabla_derivada; En este caso se ha de distinguir, por un lado la tabla derivada, (SELECT Co- digoEmpleado, NombreFROM Empleados) que tiene un alias tabla_derivada, es decir, una especie de tabla temporal cuyo contenido es el resultado de ejecutar la consulta, su nombre es tabla_derivada y tiene dos columnas, una CodigoEmpleado y otra Nombre. Este tipo de consultas ayudará a obtener información relacionada de forma mucho más avanzada. 170
  • 180.
    Capítulo 4. Realizaciónde Consultas Por ejemplo, en la base dedatos jardineria, si sedesea sacarel importe del pedido de menor coste de todos los pedidos. hay que pensar primero como sacar el total de todos los pedidos y de ahí, el pedido con menor coste con la función de columna MIN: #1: Para calcular el total de cada pedido, hay que codificar esta query SELECT SUM(Cantidad*PrecioUnidad) as total,CodigoPedido FROM Deta11ePedidos GROUP BY CodigoPedido; #2: Para calcular el menor pedido, se puede hacer una tabla # derivada de la consulta anterior y con la función MIN # obtener el menor de ellos: SELECT MIN(total) FROM ( SELECT SUM(Cantidad*PrecioUnidad) as total,CodigoPedido FROM Deta11ePedidos GROUP BY CodigoPedido ) AS TotalPedidos; + ---------- --+ I MIN(tota1) l + --+ | 4 I + ---------- --+ #Tota1Pedidos es la tabla derivada formada #por el resultado de la consulta entre paréntesis Las tablas derivadas no tienen limitación, es decir, se puedenunir a otras tablas, ltrar, agrupar, etc. 171
  • 181.
    Bases de Datos 4.11.Prácticas Resueltas Práctica 4.1: Consultas simples en MS-Access Con la BBDD Automóviles, genera sentenciasSQL para obtener: 1. El nombre de las marcas y modelos de los vehículos. 2. El nombre de los modelos cuyas emisionesestén entre 150 y 165. 3. El nombre de los modelos cuyas emisiones estén entre 150 y 165 o que su consumo esté entre 5 y 6 ordenado por consumo descendentemente. 4. Un listado de todas las Marcas que hay (sin repeticiones). Para crear una consulta en modo SQL en Access, se pulsa en la pestaña. Crear, opción Diseño de Consulta, y a continuación, se pulsa en el botón SQL. Final- mente, se escribe la sentencia SELECT y, para ejecutarla, se pulsa en la admiración de la pestaña Diseño . #1 SELECT Marca,Mode1o FROM Automóviles; #2 SELECT modelo FROM Automóviles WHERE Emisiones >= 150 AND Emisiones <=165; #3 SELECT mode1o,consumo,emisiones FROM Automóviles WHERE (Emisiones >= 150 AND Emisiones <=165) OR (Consumo>=5 AND Consumo<=6) ORDER BY consumo DESC; #4 SELECT DISTINCT Marca FROM Automóviles; Práctica 4.2: Consultas simples con Ia BBDD jardinería Codica en MySQL y Oracle sentencias para obtener la siguiente información: 1. Sacar el código de ocina y la ciudad donde hay ocinas. Sacar cuántos empleados hay en la compañía. Sacar cuántos clientes tiene cada país. FP. Sacar cuálfue el pago medioen 2005(pista: Usarla función YEAR de mysql o la función to_char(fecha,yyyy) de Oracle).
  • 182.
    Capítulo 4. Realizaciónde Consultas 5. Sacar cuántos pedidos están encada estadoordenado descendentepor el núme- ro de pedidos. 6. Sacar el precio del producto más caro y del más barato. #1 SELECT CodigoOficina,ciudad FROM Oficinas; #2 SELECT Count(*) FROM Empleados; #3 SELECT Count(*),Pais FROM Clientes GROUP BY Pais; #4 SELECT AVG(Cantidad) FROM Pagos WHERE YEAR(FechaPago)=2005; #(mysql) ó #4 SELECT AVG(Cantidad) FROM Pagos WHERE TO_CHAR(FechaPago,YYYY)=2005; #5 SELECT Count(*),Estado FROM Pedidos GROUP BY Estado ORDER BY Count(*) DESC; #6 SELECT Max(PrecioVenta),Min(PrecioVenta) FROM Productos; Práctica 4.3: Subconsultas conIa BBDD jardinería Codica en SQL sentencias para obtener la siguiente información: 1. Obtener el nombre del cliente con mayor limite de crédito. 2. Obtener el nombre, apellidol y cargo de los empleados que no representen a ningún cliente. #1 SELECT Nombrecliente FROM ClientesWHERE LimiteCredito = (SELECT Max(LimiteCredito) FROM Clientes); #2 SELECT Nombre, Apellidol, Puesto FROM Empleados WHERE CodigoEmp1eado NOT IN (SELECT CodigoEmp1eadoRepVentas FROM Clientes ); 173
  • 183.
    Bases de Datos Práctica4.4: Consultas multitablacon la BBDD jardinería Codica en SQL consultas para obtener: 1. Sacar un listado con el nombre de cada cliente y el nombre y apellido de su representante de ventas. 2. Mostrar el nombre de los clientes que no hayan realizado pagos junto con el nombre de sus representantes de ventas. 3. Listar las ventas totales de los productos que hayan facturado más de 3000 euros. Se mostrará el nombre. unidades vendidas, total facturado y total fac- turado con impuestos (18 (7o IVA). 4. Listar la dirección de las ocinas que tengan clientes en Fuenlabrada. #1 SELECT NombreC1iente, Nombre as NombreEmp, Apellidol as ApeEmp FROM Clientes INNER JOIN Empleados ON Clientes.CodigoEmpleadoRepVentas=Empleados.CodigoEmp1eado; #2 SELECT NombreC1iente,Nombre as NombreEmp, Apellidol as ApeEmp FROM Clientes INNER JOIN Empleados ON Clientes.CodigoEmp1eadoRepVentas=Emp1ea where Codigocliente not in (SELECT CodigoC1iente FROM Pagos); #3 SELECT Nombre, SUM(Cantidad) As Tota1Unidades, SUM(Cantidad*PrecioUnidad) as Tota1Facturado, SUM(Cantidad*PrecioUnidad)*1.18 as Totalconïmpuestos FROM Deta11ePedidos NATURAL JOIN Productos GROUP BY Nombre HAVING Sum(Cantidad*PrecioUnidad)>3000; #4 SELECT CONCAT(0ficinas.LineaDireccion1,0ficinas.LineaDire Dficinas.Ciudad FROM Oficinas, Emp1eados,C1ientes WHERE Oficinas.CodigoÜficina=Emp1eados.Codigo0ficina AND Empleados.CodigoEmp1eado=C1ientes.CodigoEmp1eadoRepVentas AND Clientes.Ciudad=Fuenlabrada; 174
  • 184.
    Capítulo 4. RealizacióndeConsultas Práctica 4.5: Consulta con tablas derivadas Sacar el clienteque hizo el pedidode mayor cuantía: Esta. consulta es mejor codicarla en un. amhivo de texto para no tener que escribirla múltiples vecessi da errores. La estrategia para resolverlo es hacer pequeñas consultas (querys A,B y C) para luego unirlas y generar la denitiva: #query A: Sacar la cuantía de los pedidos: (select CodigoPedido, Codigocliente, sum(Cantidad*PrecioUnidad) as total from Pedidos natural join DetallePedidos group by CodigoPedido,CodigoC1iente) Tota1Pedidos; #query B: Sacar el pedido más caro: select max(tota1) from (select CodigoPedido, Codigocliente, sum(Cantidad*PrecioUnidad) as total from Pedidos natural join Deta1lePedidos group by CodigoPedido,CodigoC1iente) Tota1Pedidos; #query C: Sacar el código de cliente correspondiente al pedido más caro (querydefinitiva.sq1) querydefinitiva.sq1 Select Tota1Pedidos.Codigocliente,NombreCliente from (select CodigoPedido, Codigocliente, sum(Cantidad*PrecioUnidad) as total from Pedidos natural join Detal1ePedidos group by CodigoPedido,CodigoCliente) Tota1Pedidos inner join Clientes on Clientes.CodigoC1iente=Tota1Pedidos.CodigoC1iente where tota1= ( select max(tota1) from (select CodigoPedido, CodigoC1iente, sum(Cantidad*PrecioUnidad) as total from Pedidos natural join Deta11ePedidos group by CodigoPedido,CodigoCliente) TotalPedidos ); 175
  • 185.
    Bases de Datos 4.12.Prácticas Propuestas Práctica 4.6: Consultas simples en MS-Access Con la BBDD Automóviles, genera sentenciasSELECT para obtener esta informa- ción: 1. 2. 3. Modelos de vehículos TDlf Modelos de la marca Audi y de la marca "Seat ordenado por lllarca y Modelo. Alarcas de Vehículos que empiecen por T y terminen en a. .Vehículos que tengan foto. .El consumo de los vehículos está expresadoen litros / IOOkm.Listar el consumo de losvehículos Seat en MPG, lIillas por galón (10MPG=23.49 1/100km). O Práctica 4.7: Consultas simples con la BBDD jardinería Codica en SQL (Oracle y MySQL) sentencias paraobtener la siguiente información: 1. 2. OWNQF-l Sacar la ciudad y el teléfono de las ocinas de Estados Unidos. Sacar el nombre, los apellidos y el email de los empleados a cargo de Alberto Soria. Sacar el cargo, nombre, apellidos y email del jefe de la empresa. Sacar el nombre, apellidos y cargo de aquellos que no sean representantes de ventas. Sacar el número de clientes que tiene la empresa. Sacar el nombre de los clientes españoles. Sacar cuántos clientes tiene cada país. Sacar cuántos clientes tiene la ciudad de Madrid. .Sacar cuántos clientes tienen las ciudades que empiezan por M. 4Hay quetener encuenta queen Access, el comodín°7c es un *
  • 186.
  • 187.
    Bases de Datos 3.Obtener los clientes cuya línea de crédito sea mayor que los pagos que haya realizado. 4. Sacar el producto que más unidades tiene en stock y el que menos unidades tiene en stock. Práctica 4.9: Consultas multitabla con IaBBDD jardinería Codica en SQL las siguientes consultas: 1. Sacar el nombre de los clientes y el nombre de sus representantes junto con la ciudad de 1a ocina a la que pertenece el representante. 2. Sacar la misma información que en la pregunta anterior pero solo los clientes que no hayan echo pagos. 3. Obtener un listado con el nombre de los empleadosjunto con el nombre de sus jefes. 4. Obtener el nombre de los clientes a los que no se les ha entregado a tiempo un pedido (FechaEntrega>FechaEsperada). Práctica 4.10: Consultas variadas con la BBDD jardinería Codica en SQL las siguientes consultas: 1. Sacar un listado de clientes indicando el nombre del cliente y cuántos pedidos ha realizado. 2. Sacar un listado con los nombres de los clientes y el total pagado por cada uno de ellos. 3. Sacar el nombre de los clientes que hayan hecho pedidos en 2008. 4. Listar el nombre del cliente y el nombre y apellido de sus representantes de aquellos clientes que no hayan realizado pagos. 178
  • 188.
    10. 11. 12. 13. 14. 15. 16. 17. 18. Capítulo 4. Realizaciónde Consultas Sacar un listado de clientes donde aparezca el nombre de su comercial y la ciudad donde está su ocina. . Sacar el nombre, apellidos, ocina y cargo de aquellos que no sean represen- tantes de ventas. . Sacar cuántos empleadostiene cada ocina, mostrando el nombre de la ciudad donde está la ocina. . Sacar un listado con el nombre de los empleados,y el nombre de sus respectivos jefes. . Sacar el nombre, apellido, ocina (ciudad) y cargo del empleado que no repre- sente a ningún cliente. Sacar la media de unidades en stock de los productos agrupados por gama. Sacar los clientes que residan en la misma ciudad donde hay una ocina, indi- cando dónde está la ocina. Sacar los clientes que residan en ciudades donde no hay ocinas ordenado por la ciudad donde residen. Sacar el número de clientes que tiene asignado ca.da representantede ventas. Sacar cuál fue el cliente que hizo el pago con mayor cuantía y el que hizo el pago con menor cuantía. Sacar un listado con el precio total de cada pedido. Sacar losclientes que hayan hecho pedidos en el 2008 por una cuantía superior a 2000 euros. Sacar cuántos pedidos tiene cada cliente en cada estado. Sacar los clientes que han pedido más de 200 unidades de cualquier producto.
  • 189.
    Bases de Datos 2.Equipos que comiencen por H y terminen en S. 3. Puntos por partido de Pau Gasol en toda su carrera. 4. Equipos que hay en la conferencia oeste (w&#39;est). 5. Jugadoresde Arizona que pesenmás de 100 kilosy midan más de 1.82m (6 pies). Puntos por partido de los jugadores de los cavaliers. Jugadores cuya tercera letra de su nombre sea la v. Número de jugadores que tiene cada equipo de la conferencia oeste West. ©9051? .Número de jugadores Argentinos en la NBA. 10. Máxima media de puntos de Lebron James en su carrera. 11. Asistenciaspor partido de Jose Calderon en la temporada O7/O8. 12. Puntos por partido de Lebron James enlas temporadasdel 03/04 al 05/06. 13. Número de jugadores que tiene cada equipo de la conferencia este East. 14. Tapones por partido de los jugadores de los Blazers. 15. Media de rebotes de los jugadores de la conferencia Este East. 16. Rebotes por partido de los jugadores de los equipos de Los Angeles. 17. Número de jugadores que tiene cada equipo de la división N orthWest. 18. Número de jugadores de España y Francia en la NBA. 19. Número de pivots C que tiene cada equipo. 20. ¿Cuánto mide el pívot más alto de la nba? 21. ¿Cuánto pesa (en libras y en kilos) el pívot más alto de la NBA? 22. Número de jugadores que empiezan por "Y". 23. Jugadores que no metieron ningún punto en alguna temporada. 24. Número total de jugadores de cada división. 25. Peso medio en kilos y en libras de los jugadores de los Raptors. 180
  • 190.
    26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. Capítulo 4. Realizaciónde Consultas Mostrar un listado de jugadores con el formato Nombre(Equipo) en una sola columna. Puntuación más baja de un partido de la NBA. Primeros 10 jugadores por orden alfabético. Temporada con más puntos por partido de Kobe Bryant. Número de bases "G que tiene cada equipo de la conferencia este East. Número de equipos que tiene cada conferencia. Nombre de las divisiones de la Conferencia Este. Máximo reboteador de los Suns. Nláximo anotador de la toda base de datos en una temporada. Sacar cuántas letras tiene el nombre de cada jugador de los grizzlies (Usar función LENGTH). ¿Cuántas letras tiene el equipo con nombre más largo de la NBA (Ciudad y Nombre)? Práctica 4.12: Consultas con tablas derivadas Realizar las siguientes consultas con tablas derivadas con las BBDD NBA y jardi- neria: Sacar el importe medio de los pedidos de la BBDD jardineria. Sacar un listado con el número de partidos ganados por los equipos de la NBA. Sacar la media de partidos ganados por los equipos del oeste. ¿Cuál es el pedido más caro del empleado que más clientes tiene? 181
  • 191.
    Bases de Datos 4.13. 182 Resumen Los conceptosclave de este capítulo son los siguientes: La sentencia SELECT devuelve un conjunto de resultados en forma de tabla compuesto porlas (o registros) y columnas (ocampos). La cláusula FROM de la sentencia SELECT especica las tablas de las que se extrae la información, y permite. a través de operaciones como el producto cartesiano y las JOIN, construir conjuntos de datos de información relacionada. Cuando se especica más de una tabla en la cláusula FROM se denomina consulta multitabla. Pueden serescritas endos tipos de sintaxis, SQLI y SQL2. SQLl solo permite composiciones internas (INNER JOIN), mientras que SQL2 permite, además, composiciones externas (OUTER JOIN). Las NATURAL JOIN, son un tipo de INNER JOIN que hace coincidir la información de dos campos con el mismo nombre. Los registros de una SELECT se pueden F ILTRAR mediante el uso de la cláusula WHERE. Los ltros se pueden construir mediante expresiones, el operador depertenencia aconjuntos (IN), operador derango (BETWEEN), test de valor nulo (IS, IS NOT), test de patrón (LIKE), y limitación de registros (LIMIT y numrows). Para ordenar un conjunto de resultados se utiliza la palabra clave ORDER BY. Se puede ordenar ascendentemente (ASC) o descendentemente (DESC). Las consultas de resumense usanpara calcular información en base aconjuntos o grupos de datos. Los grupos se construyen mediante la cláusula GROUP BY. Los ltros sobre grupos se generan mediante la cláusula HAVING. Las subconsultas son SELECT usadas para ltrar información mediante test de comparación,Test de Existencia (EXISTS), Test cuanticados (ANY y ALL). Pueden ser anidadas. Las consultas reexivas son las que forman en su cláusula FROM la misma tabla dos o más veces. Las tablas derivadas son tablas virtuales generadas a través de consultas en tiempo de ejecución. Tienen un alias que las identica.
  • 192.
    4.14. Test de repaso 1.¿Para qué sirve DISTINCT en una SELECT? a) Para mostrar las las idénticas b) Para no mostrar las idénticas c) Para mostrar, aparte, las las distintas d) Ninguna de las anteriores 2. Un ltro WHERE puede incorporar expresiones con a) Operadores numéricos b) Operadores relacionales c) Llamadas a funciones d) Todas las anteriores 3. El operador IN no se puede usar para a) Escribir en un ltro una lista de valores b) Escribir en un ltro una subconsulta c) Una ordenación d) Encadenar varios condiciones de tipo AND 4. El test de valor nulo a) Sirve para comprobarsi un conjunto dere- sultados es vacío b) Sirve para comprobarsi elvalor deun cam- po es desconocido c) Sirve para comprobar si el valor de un cam- po es o no es desconocido d) Todas las anterioresson correctas 5. El patrón %AX_ _ seleccionaría el va- lor a) XXXAX11 b) AX1111 c) XXXXIF d) XXXAX1 Capítulo 4. Realización de Consultas 6. Filtrar por el número de resultados a) No se puede de ninguna manera en Oracle b) Se puede mediante la cláusula LIMIT en Oracle c) Se puede mediante la cláusulanumrows en Oracle d) No se puede hacer de ninguna manera en MySQL 7.En SQL se puede ordenar por a El número de columna (1,2,3. . c Una expresión d ) b) El nombre de la columna ) ) Todas las anteriores 8. Si junto a una función de columna, se selecciona un campo a) Se debe agrupar por el campo b No se debe agrupar por el campo ) c) No se puede seleccionar el campo d) No se puede seleccionar la función de co- lumna 9. Una subconsulta a) Es un tipo especial de tabla derivada b) Se puede anidar con otras subconsultas c) Sus resultados se pueden ordenar bajo de- terminadas circunstancias d) Todas las opciones anteriores son posibles "q&#39;6v&#39;e&#39;p&#39;¿&#39;a&#39;9&#39;e&#39;9ow-o-svaqI ¡ 183
  • 193.
    Bases de Datos 4.15. 184 .Realizauna lista con los operado- res que puedes escribir en un ltro, clasicándolos según su tipo. .La tabla alumno tiene un campo llamado Nacionalidad. Escribe una consulta para sacar los alumnos de España, Italia y Dinamarca de dos formas, una con el operador IN, y otra con operadores AND. .Escribe la sintaxis de la senten- cia SELECT con todas sus cláusu- las correspondientes (ORDER BY, HAVING, GROUP BY, etc.) y des- cribe para qué sirve cada una. . Haz un esquema clasicando los ti- pos deJOIN que existen. Incorpora un ejemplo de cada una de ellas. . ¿En qué se diferencia LEFT OU- TER JOIN de RIGHT OUTER JOIN? Pon un ejemplo de una con- sulta que afecte a dos tablas, indi- cando la diferencia. ¿En qué se diferencia FULL OU- TER JOIN de INNER JOIN? Pon un ejemplo de una consulta que afecte a dos tablas, indicando la di- ferencia. .¿Qué es una tabla derivada? ¿De- be llevar alias una tabla derivada? ¿Por qué? 8. 10. 11. 12. 13. 14. 15. .¿Para Comprueba tu aprendizaje Escribe un ejemplo de la ejecución de una subconsulta con el opera- dor EXISTS y otra con el operador NOT EXISTS. qué sirve el operador UNION? Pon un ejemplo de su uso. Dene para qué sirven los siguien- tes operadores de ltros, y pon un ejemplo de cada uno de ellos: u BETWEEN ...AND u ANY n ALL n IS u IS NOT u LIKE ¿Qué diferencia hay entre HAVING x>y y WHERE x>y? ¿Para qué sirve un CROSS JOIN? ¿Qué diferencia hay entre NATU- RAL JOIN e INNER JOIN? Pon un ejemplo usando ambas de dos consultas que hagan produzcan los mismos resultados. ¿Qué esuna consulta reexiva? Pon un ejemplo de una sentencia SQL con una consulta reflexiva. ¿Se podría utilizar una tabla deri- vada dentro de una subconsulta?
  • 194.
    CAPÍTULO 5 Tratamiento delos datos Objetivos C°ntenid°5 Identicar herramientas y sen- tencias para modicar el conte- e H &#39; t - , erramlen as gra caspTOpOÏ nldo de labase de datos cionadas por el SGBD Insertar, borrar y actualizar Sentencia INSERT datos en las tablas INSERT y SELECT Incluir en una tabla informa- sentencia UPDATE ción de una consulta Adoptar medidas para mante- ner la integridad y consistencia de la información Sentencia DELETE UPDATE y DELETE con sub- consultas Reconocer el funcionamiento Borrado y modicación de re- gistros con relaciones Transacciones de transacciones y anular par- cial o totalmente cambios pro- ducidos por una transacción Identicar efectos de las políti- Acceso concurrente a los datos . cas de bloqueo de registros Vistas. usuarios y privilegios . . . e " Crear vistas y usuarios y asig- nar privilegios En este capítulo se detalla la sintaxis de las sentencias INSERT, UPDATE y DELETE. Se expone el tratamiento de las transacciones y los problemas del acceso concurrente a los datos. Además, se introducen las principales herra- mientas grácas de edición de datos y se explica cómo crear Vistas, usuarios y otorgar y revocar permisos. 185
  • 195.
    Bases de Datos 5.1.Herramientas grácas para la edición de los datos Existen multitud de herramientas grácas para la edición de datos, algunas, incorporadas como parte del software del gestor de base de datos, por ejemplo, el entorno gráco de Access;otras herramientas se distribuyen como paquetes a añadir a.l SGBD, como phplyAdmin de MySQL: y el software de terceros, programas por los que hay que pagar una licencia aparte como TOAD o Aqua Data Studio. Otros gestores como Oracle, no incorporan expresamente una herramienta de edición de datos como tal (se pueden consultar, pero no se puedeeditar datos desde Enterprise Manager), perose aprovechan de herramientasde tercerospara estalabor. 5.1.1. Edición con phpMyAdmin Una de las muchas utilidades de phpMyAdmin es la inserción de datos a través de formularios web, donde, de forma muy sencilla, se escriben los valores para cada campo de la tabla deseada. Tan solo hay que seleccionar la pestaña Insertar y seleccionar la tabla donde se va a insertar los registros. Se rellenan los valores y se pulsa continuar. Ép;jÉ=}._;JJL,"-.¿ u! Sorvidor: localhost b ¡y late dodatos: startrok D ¡suTabla: Aduna _ ¡Examinar inruttura ÍJSOL , Buscar ENWWÜJ E nar Im nar o racimos Ïvaciav ¿Eliminar y Base de datos Campo Tipo Función nulo Valor stamek (9) v Codigo mll) v 1 L nmng Nombre varcharíso) y 597097,57 pimp!V i i: L Ikm5 Fecha date o J 1531_o3:v26 &#39; _ a Em Nacional-dad vmmñzm v EELÏLÏÏW &#39; ""4 ;T " IHnculas = wm mu COHUHUBI | Mwmekhculas E Ignorar Campo Tipo Función nulo Valor Codugo mui) y É z &#39; " N°m°&#39;° V3&#39;<"3&#39;(5° v wnnam Shazner ¡ha date v ¡sama-n 3 Nacionalidad varcharQO) v v/ VEEUU1 Continuar Figura 5.1: Inserción de datos a través de phpmyadmin (paso 1). De estaforma, segenera elcódigo SQL automáticamente para insertar los valores. ¿Sabías que . . . 7 En MySQL existe la sintaxis extended insert,que permite insertar varios registros con un solo INSERT. Véase Figura. 5.2 186
  • 196.
    Capítulo 5. Tratamientode 10s datos 2 lísi fueron insertadas. La Id de la la msertada es:3 Ï-sín {nÏ --- - 1 e! 9:,u" í&#39;l"v&#39; 2-1. ,3 L. Ez. " l: Editar]! (near código PHP] Ejecutar lau) consultan) SOL en labaso de datos sum-uk: m INSERT {VO suryet una; 4 (5129: .hast; . Fejhn .Ivmnaïgaax ¡ALUES Campos n1 . Leonard Puro; .l93lw83-26 . ECW I. 12,¡Hizo! Shun!.¡LH-II . coúgo _ EEUU M Nombre Fecha NBCIOHEÍIÜBÚ << Guardar esta consulta en fovontos: Penmhr que todo usuario puede ¡raider a este favorito Reempluar el favorito QXISÍBHIQ que tenga el mnsmo nombre Cent: nuar Figura 5.2:Inserción através dephpmyadmin.(paso 2). Para eliminar o modicar registros, se utiliza la pestaña Examinar: HEHWÜM Estructura ¿[SOL Buscar idmorhr E nar Im rnds-anos ¡Vaciar E Eliminar «v; noisrtrando-regcstvïais 0-1-(2total. La Consul-Álamo seg) i mm FW t":v LIIH 4 PorllPorlnmnentol Edntarll Explicar e! SOL] [Crear CÓÚIQO PHP I [ÁCUJBÍIZIÍ Mostrar: ¿30 mas empezando de o en modo nonzontal v ympelurlos encabezadoscaoauoo celdas Drgamzarsegúnla clave: nmgum y v Opcuones codigo nombro loan Nacionalidad , X 1 LeonardNimoy 1931-03-26 EEUU , >< 2 Williamshacner 1931-03-22 eeuu t Marcar todos/as IDesmarcar todos Para loselementos que estan marcados: f x I Mostrar: 3o mas empezando de o en modo horizontal v y repeorios encabezados cada 10o celdas (¡p-raciones sobra los nsuiudos dola zonsulu __ Vista deampresuon .&#39; Prevusualuzacron para ¡mpnmnrtdocumento completo) Exportar Q CREATE VIEW | Figura 5.3: Modicación y eliminación de datos a través de phpMyAdmin. 5.1.2. Access como entorno gráco para otros gestores Si se conoce el entorno Access es muy sencillo conectarlo con otros gestores, y de esta manera, aprovecharse del conocimiento de la interfaz de Microsoft para administrar otros gestores debases dedatos. Esto es posible gracias a la utilización de conectores ODBC. ODBC son las siglas de Open Database Connectivity. Es una 187
  • 197.
    Bases de Datos herramienta que,de forma estándar, permite conectar aplicaciones a cualquier gestor de bases de datos. Muchas aplicaciones omáticas, como Excel, Word y el propio Access permite el accesoremoto a datos de un SGBD. Para esto, tan solo es necesario instalar el driver ODBC para ese SGBD. De esta manera, se puede crear una DSN o Data Source Name, es decir, una referencia a cierta base de datos. MySQL Comedor/ODBC Dm Senna: Conguration Cannon Puameters Data Source Name: :192. 168. 224. 128 Figura 5.4: Creación de un origen de datos ODBC para MySQL. Esta referencia se crea en Windows a través del panel de Control, Herramientas Administrativas, y la opción Onyenes de Datos ODBC. Cada origen de datos requie- re, ademásde un nombre para el propio origen, el nombre del usuario, la contraseña, el nombre de la base dedatos y los datos de conexiónal servidor (Dirección IP y puerto TCP/ UDP por dondese conecta). A través de un origen de datos ODBC, se puedenenlazar a Access lastablas de un SGDB para el cual se ha congurado la DSN. Para ello, a través de la pestaña de Access Datos Externos, opción más, seelige la opción bases de datos de ODBC y a continuación se siguen los pasos delasistente. Después,se eligela opción de vincular al origen de datos creando una tabla vinculada, y nalmente, se seleccionala DSN creada anteriormente desde la pestaña Origen de datos de equipo. <> Actividad 5.1: Descargadesde la página web de mysql wwmmysql .org, apar- tado Downloads, connectors, el conector ODBC para MySQL. Instálalo en tu ordenador y Conéctate a la base de datos jardinería de la máquina virtual de prácticas disponible en wwwgarcetaes. Si lo preeres, Conéctate a algún otro ser- vidor que tengas disponible. (Asegúrate, en ese caso,de tener desactivada la opción 188
  • 198.
    Capítulo 5. Tratamientode los datos bind-address del servidor mysqlen elchero / etc/mysql/ my.cnfpara poderconectar desde fuerade la propia máquinavirtual). Creu 01:3:enema: HQVVÍÜHCÜÏ. ae nu ue ¡nox ,7; 7 n, n: a ** me o A.» umvolml v &#39; su onoenoenaooaowwo Mo-óeuovdenno m: ss Ene! una de v. w E-conwones Ene! Snavebmm Lgf}: _ quruncas 7 g Nowbvvedongeneowm Too Dowpaón Irporïay ¡ Wdegmkm ¿aseoecaosnnmenï Sue-n "3V lrlnernv n nncuinr n un: tuu de ¡nos th ,99m3 g, n, «m, no! ejemplo una nu ne emos de SQL Se t :1 panama-no HTML lmccrur a nnzum a un euumenw HTML Selecoone el origen y el destno de los datos. ïamemrvnmdmdeduenúvucerwbsdomsenhbasedeomxui ¡mpwhreiuboldehumninevlbhhdehbnc v sselememesoeeudamnsrmnmmbaeris-daopmewec -- nophonortndmwswhosveuzuosmmwxmaeaw - densidad. encsrghccensuvawiwvuwodrvnbrndd datosucllsühmserekyïrvenbbseae &#39;EéEEEEï¡h6En29-bïíí Accesscreráuwuveuuermtwüimvi-nxabsamue - mdommvvusvu. cnwbnurnhndosenbsnnmsenkznnsnreewü l Amt! 1 (mehr Figura 5.5: Vínculo de INIySQL a Access. 5.2. La sentencia INSERT La sentencia INSERT de SQL permite insertar una la en una tabla, es decir, añadir un registro de información a una tabla. El formato de uso es muy sencillo: INSERT [INTO] nombre_tab1a [(nombre_columna, . ..)] VALUES ({expr I DEFAULT},...) nombre_tabla es el nombre de la tabla donde se quiere insertar la la. Después del nombre de la tabla, de forma optativa, se pueden indicar las columnas donde se va a insertar la información. Si se especican las columnas, la lista de valores (VALUES) a insertar se asociará correlativamente con los valores a las columnas indicadas. Si no se especican las columnas, la lista de valores seescribirá conforme al orden de las columnas en la denición de la tabla. A continuación se muestran unos cuantos ejemplos: desc mascotas; + ------- --+ ----------- --+ ---- --+-----+ ------- --+ I Field I Type I Null I Key I Default I 189
  • 199.
    Bases de Datos varchar(50) varchar(50) varchar(9) #INSERTespecificando la lista de columnas INSERT INTO mascotas (Codigo, Nombre, Raza) VALUES (1,Pequitas,Gato Común Europeo) Este tipo de INSERT, hace corresponder a la columna Codigo el valor 1, a la columna Nombre el valor Pequitas y a la columna raza el valor Gato Común Eu- ropeo. La columna cliente, queda con un valor NULL, puesto que no se ha indicado un valor. #INSERT sin especificar la lista de columnas. INSERT INTO mascotas VALUES (2, Ca1cetines, Gato Común Europeo, 59932387L) En este caso, al no especicarse la lista de columnas, hay que indicar todos los valores para todas las columnas en el orden en que están denidas las columnas en la tabla. #INSERT con columnas con valores por defecto INSERT INTO vehiculos VALUES (1215 BCD,To1edo TDI, DEFAULT); Aquí, se ha usado el valor DEFAULT para asignar el valor por defecto a la tercera. columna de la tabla vehículos, es decir, la columna marca tiene denida la asignación por defecto del valor Seat. Si se construye una sentencia INSERT con más campos en la lista de valores que el número de columnas especicadas (o número de columnas de la tabla) el SGBD informará del error. #INSERT Erronea insert into vehiculos (Matricula,Mode1o,Marca) VALUES (4123 BFH,Ibiza);
  • 200.
    Capítulo 5. Tratamientode los datos 5.3. La sentencia INSERT extendida La sintaxis extendida de INSERT para gestores tipo MySQL es la siguiente: INSERT [INTO] nombre_tabla [(nombre_co1umna,...)] VALUES ({expr I DEFAULT},...),(...),... Los puntos suspensivos delnal indican que sepuede repetir varias vecesla lista de valores. Así, MySQL admítiría algo del estilo: insert into vehiculos (Matricula,Mode1o,Marca) VALUES (4123 BFH,Ibiza,Seat), (1314 FHD,To1edo,Seat), (3923 GJS,León,Seat); 5.4. INSERT y SELECT Una variante de la sentencia INSERT consiste en una utilizar la sentencia SE- LECT para obtener un conjunto de datos y, posteriormente, insertarlos en la tabla. INSERT [INTO] nombre_tabla [(nombre_co1umna,...)] SELECT ... FROM ... Se puedeejecutar la siguiente consulta: #Inserta en una tabla Backup todos los vehículos INSERT INTO Backupvehiculos SELECT * FROM vehiculos; La sentencia SELECT debe devolver tantas columnas como columnas tenga la tabla donde se introduce la información. En el ejemplo anterior, la tabla Backup- Vehiculos tiene una estructura idéntica a la tabla vehículos. Se puede ver, además, que la sentencia SELECT puede ser tan compleja como se desee,usando ltros, agrupaciones, ordenaciones,etc. 191
  • 201.
    Bases de Datos 5.5.La sentencia UPDATE La sentencia UPDATE de SQL permite modicar el contenido de cualquier co- lumna y de cualquier la de una tabla. Su sintaxis es la siguiente: UPDATE nombre_tab1a SET nombre_col1=expr1 [, nombre_co12=expr2 ] [WHERE filtro] La actualización se realiza dando a las columnas nombre_col1, nombre_col2... los valores exprl, expr2,... Se actualizan todas las las seleccionadas por el ltro indicado mediante la cláusula WHERE. Esta cláusula WHERE, es idéntica a la que se ha utilizado para el ltrado de registros en la sentencia SELECT. Por ejemplo, si se desea actualizar el equipo de Pau Gasol porque ha chado por otro equipo, por ejemplo, los Knicks, habría que ejecutar la siguiente sentencia: UPDATE jugadores SET Nombre_equipo=Knicks WHERE Nombre=Pau Gasol; Query DK, 1 row affected (0.02 sec) Rows matched: 1 Changed: 1 Warnings: O El gestor informa de que el ltro seleccionó una la, y que, por tanto, cambió 1 la, en este caso, la columna Nombre_equipo de esa la seleccionada. Es posible cambiar más de una Columna a la vez: UPDATE jugadores SET Nombre_equipo=Knicks, Peso=21O WHERE Nombre=Pau Gasol; Query OK, 1 row affected (0.02 sec) Rows matched: 1 Changed: 1 Warnings: 0 Si se omite el ltro, el resultado es la Inodicación de todos los registros de la tabla, por ejemplo, para cambiar el peso de los jugadores de la NBA de libras a kilos: UPDATE jugadores SET Peso=Peso*0.4535; 192
  • 202.
    Capítulo 5. Tratamientode los datos 5.6. La sentencia DELETE En SQL se utiliza la sentencia DELETE para eliminar las de una tabla. Su sintaxis es: DELETE FROM nombre_tab1a [WHERE filtro] El comando DELETE borra los registros seleccionados porel ltro WHERE, que es idéntico al de la sentencia SELECT. Si se desea borrar al jugador Jorge Garbajosa de la base de datos, habría que escribir la siguiente sentencia: DELETE FROM jugadores WHERE Nombre=Jorge Garbajosa; Query OK, 1 row affected (0.01 sec) Si se omite el ltro, el resultado es el borrado de todos los registros de la tabla: DELETE FROM jugadores; Query OK, 432 rows affected (2.42 sec) 5.7. La sentencias UPDATE y DELETE con sub- consultas Es posible actualizar o borrar registros de una tabla ltrando a través de una sub- consulta. La única limitación es que hay gestores que no permiten realizar cambios en la tabla que se está leyendo a través de la subconsulta. Por ejemplo. si se desea eliminar los empleados Representante Ventas que no tengan clientes se podría codicar: DELETE FROM Empleados WHERE CodigoEmp1eado Not in (SELECT CodigoEmp1eadoRepVentas FROM Clientes) AND Puesto=Representante Ventas; 193
  • 203.
    Bases de Datos Nosería posible. sin embargo, escribir una sentencia de este tipo para borrar los clientes con LimiteCreditozü, puesto que se leen datos de la misma tabla que se borran: DELETE FROM Clientes WHERE CodigoC1iente in (SELECT Codigocliente FROM Clientes WHERE LimiteCredito=0); ERROR 1093 (HY000): You cant specify target table Clientes for update in FROM clause 5.8. Borrado y modicación de registros con re- laciones Hay que tener en cuenta que no siempre se pueden borrar o modicar datos: Considérese por ejemplo, que un cliente llama a una. empresapidiendo darse de baja como cliente, pero el cliente tiene algunos pagos pendientes. Si el operador de la BBDD intenta eliminar el registro (DELETE), el SGBD debería informar de que no es posible eliminar ese registro puesto que hay registros relacionados. O por ejemplo, sedesea cambiar (UPDATE) el nombre deun equipo de la NBA (que es su clave primaria), ¿qué sucede conlos jugadores? También habrá que cam- biar el nombre del equipo de los jugadores, puesto que el campo Nombre_Equipo es una clave foránea. En este punto, hay que recordar las cláusulas REFERENCES de la sentencia CREATE TABLE para crear las relacionesde claveforánea-clave primaria de alguna columna de una tabla: definiciómreferencia: REFERENCES nombre_tab1a[(nombre_columna, ...)] [ON DELETEopción_referencia] [DN UPDATEopción_referencia] opción_referencia: CASCADE I SET NULL I ND ACTION Las cláusulas ON DELETEy ON UPDATE personalizan el comportamiento de estos dos casos. Si por ejemplo, se intenta eliminar un registro con otros registros 194
  • 204.
    Capítulo 5. Trataznientodelos datos relacionados, y se ha seleccionadola opción ON DELETE NO ACTION y ON UPDATE NO ACTION el comportamientoseríael siguiente: #dos tablas relacionadas en mysql #han de ser innodb para soportar FOREING KEYS CREATE TABLE clientes ( dni varchar(15) PRIMARY KEY, nombre varchar(50), direccion varchar(50) ) engine=innodb; CREATETABLEpagos_pendientes( dni varchar(15), importe double, FOREIGN KEY(dni) REFERENCES clientes(dni) on delete NO ACTION on update NO ACTION ) engine=innodb; #un cliente y dos pagos pendientes INSERT INTO clientes VALUES(5555672L,Pepe Cifuentes,C/Los almendros,23); INSERT INTO pagos_pendientes VALUES(5555672L,500); INSERT INTO pagos_pendientes VALUES(5555672L,234.5); #Se intenta borrar el cliente y no es posible DELETE FROM clientes WHERE dni=5555672L; ERROR1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (gestion/pagos_pendientes, CONSTRAINT pagos_pendientes_ibfk_1 FÜREIGN KEY (dni) REFERENCES &#39;clienteS (&#39;dni)) #Se intenta modificar el dni del cliente y no lo permite UPDATE clientes set dni=55555555L WHERE dni=5555672L; ERROR1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (gestion/pagos_pendientes, CONSTRAINT pagos_pendientes_ibfk_1 FOREIGN KEY (dni) REFERENCES clientes (dni)) #de igual modo si se intenta borrar la tabla clientes, #tampoco podemos DROP TABLE clientes; ERROR1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails Sin embargo,sila creaciónde la relaciónestuviese personalizadaconlasopciones ON UPDATE CASCADE y ON DELETE CASCADE, el comportamientosería: 195
  • 205.
    Bases de Datos #dostablas relacionadas en mysql create table clientes ( dni varchar(15) primary key, nombre varchar(50), direccion varchar(50) ) engine=innodb; create table pagos_pendientes( dni varchar(15), importe double, foreign key (dni) references c1ientes(dni) on delete CASCADE on update CASCADE ) engine=innodb; #un cliente y dos pagos pendientes INSERT INTO clientes values (5555672L,Pepe Cifuentes,C/Los a1mendros,23); INSERT INTO pagos_pendientes VALUES (5555672L,500); INSERT INTO pagos_pendientes VALUES (5555672L,234.5); #se borra el cliente... DELETE FROM clientes WHERE dni=5555672L; Query DK, 1 row affected (0.00 sec) #además, se verifica que ha borrado en cascada sus pagos pendientes. SELECT * FROM pagos_pendientes; Empty set (0.00 sec) #si en lugar de borrar el cliente, se hubiera cambiado el dni: UPDATE clientes set dni=55555555L WHERE dni=5555672L; Query OK, 1 row affected (0.02 sec) #ha cambiado el dni de los pagos en cascada. SELECT * FROM pagos_pendientes; + --------- --+ ------- --+ I importe I + --------- --+ ------- --+ I 55555555L I I 55555555L I 234.5 I + --------- --+ ------- --+ Recuerda. En Oracle. solo existe la cláusula ONDELETE. Para implemen- tar ON UPDATE. se debe generarun TRIGGER (Véase Capítulo6) 196
  • 206.
    Capítulo 5. Tratamientode los datos <> Actividad 5.2: Crea las tablasde mascotas y clientescon laopción ONUP- DATE y ON DELETE a SET NULL y comprueba el resultado de ejecutar las inserciones, actualizaciones y borrados de los ejemplos anteriores. 5.9. Transacciones Un SGBD actualiza múltiples datos a través de una transacción. Una transacción es un conjunto de sentencias SQLque setratan como una sola instrucción (atómica). Una transacción puede serconrmada (commit). si todas las operacionesindividua- les seejecutaron correctamente, o, abortada (rollback) a la mitad de suejecución si hubo algún problema (por ejemplo, el producto pedido no está en stock, por tanto no se puede generar el envío). Trabajar con transacciones puede ser esencial para mantener la integridad de los datos. Por ejemplo, se puede dar el caso de que se descuenta el stock de un producto antes de proceder a su envío, pero cuando se vaa generar la cabecera del pedido, la aplicación cliente sufre un corte en las comunica- ciones y no da tiempo a generarlo. Esto supone una pérdida de stock. La transacción garantiza la atomicidad de la operación: O se hacen todas las operaciones, o no se hace ninguna. Generalmente, cuando se conectacon un cliente a un SGBD, por defecto está ac- tivado el modo AU TOCOMMI T =ON, es decir, cada comando SQL que se ejecute, será consideradocomo una transacción independiente. Para activar las transacciones de múltiples sentencias hayque establecerel modo A UTOCOMMI T=OF F.A partir de esemomento, todos los comandosSQL enviados al SGBD tendrán que terminarse con una orden COMMIT o una orden ROLLBACK. De este modo, se asegura la integridad de los datos a un nivel más alto. Muchos SGBD requieren de una orden START TRANS/l CTI ON o START WORK para comenzar una transacción y otros lo hacen de forma implícita al establecer el modo autocommit=off. #MySQL, 3 formas para comenzar una transacción: SET AUTDCOMMIT=O; #6 START TRANSACTIDN; #6 BEGIN WORK; --Oracle: SET AUTOCOMIT OFF Para terminar una transacción, tanto en MySQL como en ORACLE, hay que acep- tar, o rechazar los cambios mediante: 197
  • 207.
    Bases de Datos #Lapalabra clave WORK es opcional COMMIT WORK; #Acepta los cambios. RÜLLBACK WORK; #Cancela los cambios Cualquier conjunto de sentencias SQL se considera cancelado si termina abrupta- mente la sesión de un usuario sin hacer COlIlIIT. Un ejemplo de transacción en MySQL sería la siguiente: SET AUTÜCDMMIT 0; #se actualiza el stock UPDATE Productos SET Stock=Stock-2 WHERE CodigoProducto=AAAF102; #se inserta la cabecera del pedido INSERT INTO Pedidos VALUES (25,now(),Francisco Garcia,Pendiente de Entrega); #se inserta el detalle del pedido INSERT INTO Deta11ePedidos (CodigoPedido,CodigoProducto,Unidades) VALUES (25,AAAF102,2); #aceptar transacción COMMIT WORK; 5.10. Acceso concurrente a los datos Cuando se utilizan transacciones, pueden suceder problemas de concurrencia en el acceso a los datos, es decir, problemas ocasionados por el acceso al mismo dato de dos transacciones distintas. Estos problemas están descritos por SQL estándar y son los siguientes: Dirty Read (Lectura Sucia). Una transacción lee datos escritos poruna transac- ción que no ha hecho COMMIT. Nonrepeateable Read (Lectura No Repetible). Una transacción vuelve aleer datos que leyó previamente y encuentra que han sido modicados por otra transacción. Phantom Read (Lectura Fantasma). Una transacción lee unos datos que no existían cuando se inició la transacción. Cuando setrabaja con transacciones, el SGBD puede bloquear conjuntos de datos para evitar o permitir que sucedan estos problemas. Según el nivel de concurrencia 198
  • 208.
    Capítulo 5. Tratamientode los datos que sedesee, esposible solicitar al SGBD cuatro niveles de aislamiento. Un nivel de aislamiento dene cómo los cambios hechospor una transacción son visibles a otras transacciones: Read Uncommited (Lectura no acometida). Permite que sucedan los trespro- blemas. Las sentencias SELECT son efectuadas sin realizar bloqueos, por tanto, todos los cambios hechos por una transacción pueden verlos las otras transacciones. Read Commited (Lectura acometida). Los datos leídos por una transacción pueden ser modicados por otras transacciones. Se pueden dar los problemas de Phantom Read y Non Repeteable Read. Repeateable Read (Lectura Repetible). Tan solo se permite el problema del Phantom Read. Consiste enque ningún registro leído con un SELECT se puede cambiar en otra transacción. Serializable. Las transacciones ocurren de forma totalmente aislada a otras transac- ciones. Sebloquean las transacciones detal manera que ocurren unas detrás de otras, sin capacidad de concurrencia. El SGBD las ejecuta concurrentemente si puede asegurar que no hay conflicto con el accesoa los datos. En MySQL, las tablas innodb tienen el nivel de aislamiento por defecto esta- blecido en REPETEABLE READ, y se puede alterar cambiándolo en el chero de conguración mycnf o ejecutando: SET TRANSACTION ISÜLATION LEVEL {READ UNCÜMMITTED I READ COMMITTED I REPEATABLE READ I SERIALIZABLE} En Oracle, el nivel por defecto es READ COMMI T ED y, además de este, solo permite SERIALIZABLE. Se puedecambiar ejecutando el comando: SET TRANSACTIDN ISÜLATIDN LEVEL {READ CÜMMITTEDISERIALIZABLE}; ¿Sabías que . .. 7 Algunas transacciones pueden quedar interbloqueadas dependiendo del nivel de aislamiento seleccionado. Esta situación de interblo- queo, odeadlock entredos transacciones.consiste enque ninguna de ellaspuede seguir ejecutándoseporque la primera intenta acceder aun bloque de datos que tiene bloqueada la segunda, y la segunda, intenta acceder aun bloque de datos que tiene bloqueada la primera. En esta situación de interbloqueo, el SGBD elimina a una de las dos transacciones. siendo la víctima del interbloqueo la que hace rollback de sus operaciones. 199
  • 209.
    Bases de Datos 5.10.1.Ejemplo de problemas en el acceso concurrente A continuación se muestran, mediante una serie de consultas en MySQL cómo reproducir los problemas típicos de la concurrencia en bases dedatos. Primero, para consultar el tipo de aislamiento y cambiarlo a read uncommited, que permite que se produzcan los tres problemas, se puedeejecutar los comandos: #consu1ta tipo de aislamiento mysql) select @@tx_isolation; + -+ I @@tx_iso1ation + --------------- -+ I REPEATABLE-READI + --------------- -+ 1 row in set (0.00 sec) #estab1ecer el tipo de aislamiento a read uncommitted mysq1> set session transaction isolation level read uncommitted; Query DK, 0 rous affected (0.00 sec) Para el siguiente ejemplo se utilizará la tabla coches creadacon el motor innodb: create table coches (nombre varchar(20)) engine=innodb; insert into coches values (toyota),(audi),(seat); La lectura no repetible A continuación, dos sesiones distintas, de dos usuarios distintos, consultan la base de datos en el siguiente orden para producir una lectura no repetible: Lectura no repetible-1 #sesión 1 mysq1> start transaction; Query DK, 0 rows affected (0.00 sec) mysq1> select t from coches; + ------ -+ Inombre I + ------ -+ I toyota I Iaudi I + ------ -+ 3 rows in set (0.00 sec) 200
  • 210.
    Capítulo 5. Tratamientode los datos La sesión 1 inició una transacción para hacer operaciones y segundos despuésuna segunda sesión realiza cambios en la tabla mientras la transacción continúa en la sesión 1: Lectura no repetible-2 #sesión 2 mysq1> update coches set nombre=vo1vo vhere nombre=audi; Query DK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 La sesión 2 ha realizado un cambio en los datos, por tanto, la transacción de la primera sesión no será capaz de reproducir la situación anterior puesto que se ha producido una lectura no repetible: Lectura no repetible-3 #sesi6n 1 mysq1> select *from coches; + ------ --+ I nombre I + ------ --+ I toyota I I volvo | + ------ --+ 3 rows in set (0.00 sec) La lectura fantasma Si a continuación, el cliente 2 inserta un nuevo registro en la tabla, la sesión 1 podrá inmediatamente ver los cambios. Esto es loque sellama una lectura fantasma: Lectura fantasma-1 #cliente 2 mysq1> insert into coches values (renault); Query OK, 1 row affected (0.00 sec) Lectura fantasma-2 #c1iente 1 mysq1> select *from coches; rovs in set (0.00 sec) 201
  • 211.
    Bases de Datos Lapotencial situación problemática tanto de la lectura no repetible como de la lectura fantasma es quedatos que participan en una transacción cambian o aparecen sin previo aviso, pudiendo provocar que la transacción genere información que no es del todo íntegra. La lectura sucia El último problema, y más grave, es el de la lectura sucia. A continuación, si- guiendo con las dos sesiones delos ejemplos anteriores, se reproduce esta situación. En este caso, la sesión 2 inicia una transacción y realiza operaciones DML sobre los datos: Lectura sucia-1 #sesión 2 mysq1> start transaction; Query OK, 0 rows affected (0.00 sec) mysq1> insert into coches values (alfa); Query DK, 1 row affected (0.00 sec) mysq1> update coches set nombre=honda where nombre=toyota; Query OK, 1 row affected (0.00 sec) Rovs matched: 1 Changed: 1 Harnings: 0 Después, la sesión 1 lee los datos que hay en la tabla: Lectura sucia-2 #sesión 1 mysq1> select t from coches; rows in set (0.00 sec) Se puedeobservar, que gracias a esa lectura la sesión 1 puedegenerar nueva informa- ción o realizar algún trabajo que implique trabajar con la información modicada por la sesión 2. Pero, supóngase que ahora, la sesión 2 realiza un rollback de sus operaciones: 202
  • 212.
    Capítulo 5. Tratamientode 10s datos Lectura sucia-3 #sesión 2 mysq1> rollback; Query OK, 0 rows affected (0.00 sec) Se puedeobservar que la sesión 1, aunque ya no puede accedera la información que fue insertada por la sesión 2, puesto que se ha efectuado un rollback, puede haber estado trabajando con datos, que, en realidad, nunca han estado en la base dedatos. Esto, es una lectura sucia: Lectura sucia-4 sesión 1 mysq1> select *from coches; rows in set (0.00 sec) 5.11. El acceso a la información Cuando se administra la. seguridad en el acceso a información de una base de datos, escomún utilizar dos tipos de seguridad, la integrada con el sistema operativo y la proporcionada por el SGBD (nativa). En la seguridad integrada, se suele contar con los usuarios de un sistema de dominio o un servicio de directorio (LDAP) para proporcionar el acceso a determinados recursos del gestor de base de datos. En la seguridad nativa del SGBD, es el propio software servidor el que proporciona los mecanismos mediante los cuales se autoriza a un usuario a utilizar distintos elementos de bases de datos. El alcance de este libro es tratar la seguridad nativa de un SGBD a través de SQL explicando el funcionamiento básico de la seguridad en MySQL, Oracle y DB2. 5.12. Las vistas Una vista es una tabla sin contenido, totalmente virtual, que devuelve las las resultado de ejecutar una consulta SQL. La diferencia con una consulta ejecutada directamente es que, mientras cada sentencia SQL enviada al SGBD tiene que pasar 203
  • 213.
    Bases de Datos porun proceso de compilación, la vista es una consulta cuya denición ha sido almacenada previamente y que ya ha sido compilada, siendo por tanto el tiempo de ejecución bastante menor. También tiene una implicación importante en el hecho de que un usuario podría no tener acceso a la información de varias tablas y, sin embargo, sí tener accesoa la Vista que consulta esas tablas, proporcionando de esta manera un acceso controlado solo a detern1inadas las y columnas de esastablas. ¿r Usuario de Madrid L a xústaii j CLIENTES DE Figura 5.6: Vistas. Por ejemplo, en una tabla de clientes, un usuario de una ocina de Madrid podría tener solo acceso a la información de los clientes de Madrid, y tan solo a ciertos campos. De esta manera, no tendría acceso a ningun campo de la tabla de clientes y, sin embargo, podría tener acceso auna vista que consulte aquellos clientes cuya provincia sea Madrid. La sintaxis para crear una vista es la siguiente: CREATE [ORREPLACE] VIEW [esquema.]nombre_vista [(1ista_co1umnas)] AS sentencia_se1ect La ejecución del CREATE VIEW provoca que secompile la sentencia selecty que se almacene con el nombre nombremista. Los nombres de las columnas de la vista se pueden especicar mediante lista_columnas. Si se especica la lista de columnas, cada columna tendrá el alias correspondiente, si no, se obtendrá el nombre devuelto por la consulta. Si la vista ya existe, se puede reemplazar con OR REPLA CE. 204
  • 214.
    Capítulo 5. Tratamientode los datos Un ejemplo de CREATE VIEW es el siguiente: CREATE VIEW nba.jugadoresMiami AS SELECT Nombre, Posicion FROM nba.jugadores WHERE Nombre_equipo=HEAT; SELECT * from nba.jugadoresMiami; Además, sepueden crear vistas para que los usuarios no expertos puedan acceder de forma fácil a la información, proporcionándoles, a través de una vista, información obtenida a través de una sentencia SQL compleja: CREATE VIEWVistaPedidos (CodigoPedido,C1iente,Tota1) AS SELECT CodigoPedido, NombreC1iente, SUM(Cantidad*PrecioUnidad) FROM Clientes NATURAL JOIN Pedidos NATURAL JOIN Deta11ePedidos GROUP BY CodigoPedido; Para eliminar una vista se hace uso del comando DROP VIEW: DROP VIEW[esquema.]nombre_vista; Hay pequeñas variaciones en la sintaxis de los comandos CREATE VIEW y DROP VIEW dependiendo del SGBD que se utilice. Además, se dispone también de un comando ALTER VIEW para hacer modicaciones a la denición de la vista. Para más información sobre estas variaciones,consultar los manuales decada gestor. 5. 13. Los usuarios Para crear cuentas de usuario que permitan a los usuarios acceder a ciertos objetos con un nivel determinado de privilegios hay que hacer uso del comando CREATE USER. CREATE USER nombre_usuario IDENTIFIED BY password [opciones]; Esta sencilla sentencia crea una cuenta usuario que permite la autenticación de un usuario en el SGBD a traves de la password identicada mediante la opción IDENTIFIED BY. Esta sintaxis de create user es válida tanto para MySQL como 205
  • 215.
    Bases de Datos para Oracle,aunque a Oracle se le pueden incluir multitud de opciones extras para dar características adicionales, como la asignación de cuota para añadir información a un tablespace o bloquear la cuenta temporalmente. En DB2 no se utiliza el co- mando CREATE USER puesto que la mayor parte de la gestión de usuarios sehace de forma integrada con el Sistema Operativo. A continua.ción semuestran ejemplos de creación de usuarios: #creación de usuario en MySQL CREATE USER paco IDENTIFIED BY o99238kjkA; --creación de usuario en Oracle CREATE USER paco IDENTIFIED BY o99238kjkA DEFAULT TABLESPACE Nominas QUÜTA UNLIMITED DN Nominas ACCÜUNT LOCK; <> Actividad 5.32 Crealos usuarios Pedro yJavier enlos SGBDmysql yOracle con passwords apropiadas. En Oracle, asigna quota de 1MB en algún tablespace. Para eliminar usuarios, se puede utilizar la sentencia DROP USER: DRÜP USER nombre_usuario [CASCADE]; En Oracle, se puede incluir el token CASCADE para indicar que junto con el usuario se borren todos los objetos de su esquema. En liIySQL, se pueden borrar la vez varios usuarios, separando los nombres de los usuarios mediante comas. Para modicar usuarios, Oracle utiliza el comando ALTER USER, que no estádis- ponible en MySQL. Este comando ALTER USER usa las mismas opciones que CREATE USER. --Modificación de usuario en Oracle ALTER USER Paco IDENTIFIED BY nueva_pass DEFAULT Tablespace Facturas; En MySQL hay que modicar los usuarios actualizando sus datos en la propia tabla mysq1.user del sistema. Por ejemplo, para cambiar el host desde el que el 206
  • 216.
    Capítulo 5. Tratamientode los datos usuario Javier se puedeconectar, habría que ejecutar la siguiente sentencia. Cuando en MySQL se modica algún permiso modicando el contenido de las tablas del sistema, hay que ejecutar además el comando FLUSH PRIVILEGES para forzar al gestor a volver leer las tablas de permisos y que los cambios en los permisos sean efectivos desde ese momento. #Modificación de usuario en mysql. UPDATE mysql.user SET host=192.168.3.1 where user=JAVIER; FLUSH PRIVILEGES; En MySQL también se puede renombrar un usuario conservando todos sus pri- vilegios utilizando el comando RENAME USER y cambiar la password mediante el comando SET PASSWORD: #Modificación de usuarios en MySQL. Cambiar nombre y password al usuario Paco RENAME USER Paco@1oca1host to PacoSanchez@1ocalhost; SET PASSWORD for Pacoclocalhost = PASSw0RD(nueva_pass); <> Actividad 5.4: Ejecuta el siguiente comando para cambiar lapassword de un usuario en mysql: UPDATE mysql.user SET Password = PASSWORD("nueva_pwd") WHERE user=paco AND host=loca1host; o Actividad 5.5: Cambia la passwordde losusuarios Pedroy Javier creados en Oracle y bloquea sus cuentas mediante la opción ACCOUNT UNLOCK. 5. 14. Los privilegios Un usuario puede obtener privilegios para manipular objetos de una base de datos con el comando GRANT. Asimismo, se le pueden denegar permisos con el 207
  • 217.
    Bases de Datos comando REVOKE.Estos comandos varian en su sintaxis dependiendo del SGBD que se está usuando puesto que el sistema de seguridad de cada uno es distinto. Además, inuye también la forma en que el subsistema de permisos del SGBD se integra con el sistema operativo. 5.14.1. El sistema de privilegios de MySQL La sintaxis del comando GRANT para MySQL es la siguiente: GRANT tipo_privi1egio [(co1umnas)] [, tipo_privi1egio [(co1umnas)]] ON {nombre_tab1a I * I *.* I base_datos.* I base_datos.nombre_tabla} T0 usuario [IDENTIFIED BY [PASSWORD] password] [, usuario [IDENTIFIED BY [PASSWORD] password]] [WITH opcion [opcion] opcion = GRANT DPTION | MAX_QUERIES_PER_HOUR count I MAX_UPDATES_PER_HOURcount I MAX_CDNNECTIÜNS_PER_HDURcount I MAX_USER_CONNECTIONS count En MySQL se puedeotorgar a un usuario permisos para hacer cualquier opera- ción a nivel de host, de base dedatos, de tabla o de columna. Así, es posible asignar. por ejemplo, permisos de SELECT sobre las columnas NombreCliente, Dirección y Telefono de la tabla clientes: GRANT SELECT (Nombrecliente,Telefono,Ciudad) ON Clientes TU paco@1oca1host; Con esta sentencia el usuario paco@localhost solo podrá seleccionar las colum- nas NombreCliente, Telefono y Ciudad de la tabla clientes, siéndole denegada una consulta del tipo select * from clientes. tipo_privi1egio es la clase de permiso que puede ser a otorgar, típicamente pueden ser select, insert, update. . . .Pueden ser de los más variados. En el Cuadro 5.3 de la página 210 hay algunos ejemplos de los permisos disponibles en MySQL. 208
  • 218.
    Capítulo 5. Ïiatamientode los datos Estos tipos de privilegio se pueden aplicar a las siguientes expresiones: Expresión Se aplica el permiso a nombre_tabla La tabla nombre_tab1a Todas las tablas de la base de datos que se está usando *.* Todas las tablas de todas las bases de datos base_datos.* Todas las tablas de la base de datos db_name base_datos.nombre_tabla Solo la tabla nombre_tabla de la base de datos db_name Cuadro 5.1: Tipos de objetos a los que se puedeotorgar permisos. Finalmente con TO usuario se indica el usuario al que se quiere otorgar el permiso. Si el usuario user noexiste, secrea, opcionalmente con la password indicada mediante la cláusula identied by. Adicionalmente, se puede indicar ciertas opcionesprecedidas dela cláusula WITH: Expresión GRANT OPTION Permite conceder a otros usuarios los permisos que tiene el usuario, por tanto, el administrador debe ser muy cauto a la hora de conceder esta opción a los usuarios de la base de datos. MAX_QUERIES_PER_HOUR count Permite restringir el número de consultas por hora que puede realizar un usuario. MAX_UPDATES_PER_HOUR count Permite restringir el número de modicaciones MAX-CONNECTIONS_PER_HOUR count Permite restringir las conexiones (logins) por hora que realiza un usuario. MAX_USER-CONNECTIONS count A Permite limitar el número deconexiones simultáneas que puede tener un usuario. En cualquiera de las opciones MAX- si a count se le da el valor O. signica ilimitado. Cuadro 5.2: Opciones adicionales a los permisos. 209
  • 219.
    Bases de Datos PrivilegioSignicado ALL [PRIVILEGES] Da todos los permisossimples exceptoGRANT OPTION ALTER Permite el uso de ALTER TABLE ALTER ROUTINE Modica o borra rutinas almacenadas CREATE Permite el uso de CREATE TABLE CREATE ROUTINE Crea rutinas almacenadas CREATE TEMPORARY TABLES Permite el uso de CREATE TEMPORARY TABLE CREATE USER Permite el uso de CREATE USER, DROP USER, RENAME USER, y REVOKE. Permite el uso de CREATE VIEW CREATE VIEW DELETE Permite el uso de DELETE DROP Permite el uso de DROP TABLE EXECUTE Permite al usuario ejecutar rutinas almacenadas FILE Permite el uso de SELECT INTO OUTFILE y LOAD DATA INFILE INDEX Permite el uso de CREATE INDEX y DROP INDEX INSERT Permite el uso de INSERT LOCK TABLES Permite el uso de LOCK TABLES en tablas para las que tenga el permiso SELECT PROCESS Permite el uso de SHOW FULL PROCESSLIST RELOAD Permite el uso de FLUSH REPLICATION CLIENT Permite al usuario preguntar dónde están los servidores maestro o esclavo Necesario para los esclavos de replicación Permite el uso de SELECT SHOW DATABASES muestra todas las bases de datos Permite el uso de SHOW CREATE VIEW Permite el uso de mysqladmin shutdown Permite el uso de UPDATE Sinónimo de no privileges, permite únicamente la conexión al gestor GRANT OPTION Cuadro 5.3: Tipos de privilegios en mjysql. REPLICATION SLAVE SELECT SHOW DATABASES SHOW VIEW SHUTDOWN UPDATE USAGE 10
  • 220.
    Capítulo 5. Tratamientode los datos Algunos ejemplos de consultas para asignación de permisos en MySQL son los siguientes: #0torga permisos de select e insert a todas las tablas de nba GRANT SELECT, INSERT on nba.* T0 paco@loca1host; #0torga todos los privilegios a la tabla Clientes de jardineria GRANT ALL PRIVILEGES on jardineria.C1ientes TD paco©localhost; #Ütorga permisos de select a todas las tablas de todas las bases de datos #permitiendo al usuario ceder esos permisos a otros usuarios GRANT SELECT on *.* to paco@1oca1host WITH GRANTDPTIÜN; #0torga permisos de SELECT, INSERT, UPDATE y DELETE con un límite de 10 #consu1tas a la hora en la tabla jugadores de la nba GRANTSELECT,INSERT,UPDATE,DELETE on nba.jugadores to paco@1oca1host WITH MAX_QUERIES_PER_HOUR 10 MAX_UPDATES_PER_HGUR 10 La sentencia revoke deniegapermisos aun usuario sobre un objeto. A continuación se describe la sintaxis: REVDKE tipo_privi1egio [(columnas)] [, tipo_privi1egio [(co1umnas)]] ON {nombre_tabla I *I *.* I base_datos.* I base_datos.nombre_tab1a} FROM usuario [, usuario] La sintaxis es muy parecida a la de la sentencia grant, a continuación se muestran unos cuantos ejemplos: #quita el permiso de select en la tabla jardineria.C1iente revoke select on jardineria.Clientes from paco@localhost; #e1imina el permiso ALL PRIVILEGES de todas las tablas revoke all privileges on *.* from paco@1oca1host; #quita los permisos de select e insert de todas las tablas de jardineria revoke se1ect,insert on jardineria.* from paco@1ocalhost; Otra forma de asignar y eliminar permisos en MySQL es utilizando las tablas del catálogo de metadatos, es decir, las tablas de la base de datos mysql creada en toda instalación del SGBD y que almacena toda la información sobre todos los 211
  • 221.
    Bases de Datos objetosmanejados por el gestor. En esta base dedatos existen 5 tablas relacionadas con el sistema de permisos de MySQL, user, db, host, tables-priv y columns_priv. Estas tablas se pueden manipular manualmente con inserts y deletes para otorgar y denegar permisos a nivel de usuario, base de datos, equipo, tablas y columnas respectivamente. A continuación se ilustra cómo MySQL procesa una consulta. Al recibir la ins- trucción SQL, se comprueba si el acceso alos diversos objetos están autorizados en cualquiera de estas tablas. Si ninguno de los niveles permite el acceso, la consulta es denegadapor falta de permisos. 5.14.2. El sistema de privilegios de Oracle clasica los permisos en dos tipos, privilegios del sistema y privilegios de objetos. Además dene los siguientes conceptos: u ROLES Conjunto de privilegios que se puedenasignar a un determinado usua- Grado "l: Consulta de permisos a Grado 2: Consulta de permisos a nivel db. y @host Grado 3; Consulta Grado 4: Consulta dbiablacolumna AUTORIZACIÓN DE EJECUCION DE CONSULTA CONSULTA DE PERMISOS EN ¡Va -&#39;- LA TABLAHSH PERMISOS EN LAS TABLAS ob h a PERMISOS EN LA TABLAS tables a riv de permisos a nivel dbiabla o -n PERMISOS EN LA TABLAS -,u .- de permisos a nivel N0 ACCESO /, DENEGADO Figura 5.7: Estructura de permisos en mysql. El sistema de privilegios de Oracle rio. Un usuario puede pertenecer a múltiples roles. 212 Devuelve resultados
  • 222.
    Capítulo 5. Tratamientode los datos IPERFILES Un perl es un conjunto de restricciones sobre el uso de recursos. Cada usuario puede pertenecer a un único perl. De esta manera, Oracle permite asignar a un usuario privilegios del sistema, de objetos, roles y perles, todo ello a través de la sentencia GRANT: GRANT privilegio [ON [esquema Jobjeto] T0 {usuario I rol I PUBLIC} [WITH {GRANT I ADMIN} OPTION] privilegio = tipo_privi1egio [(co1umnas)] [, tipo_privi1egio [(co1umnas)]] I privi1egio_sistema I rol El privilegio a otorgar puede ser de varios tipos: IUn privilegio sobre un objeto a un usuario o rol. Si el privilegio es INSERT o UPDATE se puede indicar sobre qué columnas se tiene el permiso. En este caso, se debe incluir la cláusula ON para indicar sobre qué objeto se va a aplicar el permiso. -- permiso de select y update en dos columnas de la tabla Clientes GRANT SELECT, UPDATE (NombreC1iente, Telefono) ON Jardineria.C1ientes To Javier; -- todos los permisos sobre Pedidos al rol ADMINISTRACION GRANT ALL PHIVILEGES UN Jardineria.Pedidos to ADMINISTRACION; IUn privilegio de sistema sobre un usuario o rol. --permiso para crear tablas GRANT CREATE TABLE to Javier; --permiso para crear tablas al rol ADMINISTRACION GRANT CREATE TABLE to ADMINISTRACION; IUn rol sobre un usuario u otro rol. El rol puede estar predenido (rol de sistema.) opuede ser denido por el usuario. --asignar Rol de acceso y consumo a otro Rol GRANT CONNECT, RESOURCE to ADMINISTRACION; 213
  • 223.
    Bases de Datos Privilegio ALTER DATABASE ALTERSYSTEM AUDIT SYSTEM CREATE [ANY] ALTER [ANY] objeto SYSDBA ANALYZE [ANY] objeto "asignar el rol ADMINISTRACION a Javier GRANT ADMINISTRACION to Javier; I Un privilegio deobjetoo sistema a todoel mundo (PUBLIC). --pemiso de acceso y consumo de recurso a todos GRANT CONNECT, RESOURCE to PUBLIC; --permiso de update sobre las columnas Nombre y email de empleados GRANT UPDATE (Nombre, email) UN Jardineria.Emp1eados to Public; Privilegio ALL [PRIVILEGES DELETE INSERT SELECT UPDATE REFERENCES EXECUTE ALTER INDEX Signicado Da todos los permisossimplesincluido GRANT OPTION Permite el uso de DELETE Permite el uso de INSERT Permite el uso de SELECT Permite el uso de UPDATE Permite crear claves foráneas Permite ejecutar un procedimiento,función, paquete.. . Permite cambiar la denición de un objeto Permite crear índices de una tabla l Cuadro 5.4: Tipos de privilegiosde objeto en Oracle. ¿Ï En É Permite ejecutar el comando ALTER DATABASE Permite el uso de ALTER SYSTEM Permite la auditoría mediante la sentencia AUDIT Permite el usode CREATE para un tipo de objeto (TABLE, VIEW, PROCEDURE, USER, PROFILE, etc...) Permite el usode ALTER para un tipo de objeto (TABLE, VIEW, PROCEDURE, USER, PROFILE, etc...) Permite ejecutar operacionesde parada y puesta en marcha de la BBDD objeto
  • 224.
    Capítulo 5. Tratamientode los datos REVOKE privilegio [ON [esqnema.]objeto] FROM {usuario I rol I PUBLIC} privilegio = tipo_privi1egio [(co1umnas)] [, tipo_privi1egio [(co1umnas)]] I privi1egio_sistema I rol Algunos ejemplos de esta sentencia son los siguientes: --Denegar permiso de select en Clientes al rol ADMINISTRACION REVOKE SELECT ON Jardineria.C1ientes FROM ADMINISTRACION; --Denegar rol CONNECT a todos REVOKE CONNECT FROM PUBLIC; --Denegar los roles ALMACEN Y CONTABILIDAD A Javier; REVOKE ALMACEN,CONTABILIDAD FROM Javier; --Denegar todos los privilegios a Javier en la tabla Pedidos REVOKE ALL PRIVILEGES ON Pedidos FROM Javier; Cuando se elimina. un privilegio de un usuario, el SGBD elimina el permiso de ese usuario de forma inmediata a él y a todos los usuarios a los que se les haya concedido el privilegio con la opción WITH GRANT o WITH ADMIN. Los roles Para simplicar la tarea de organizar los permisos, Oracle permite la creación de Roles con la sentencia CREATE ROLE: CREATE ROLE nombre_ro1 [opciones_identificacion]; opciones_identificacion: NOT IDENTIFIED I IDENTIFIED {BY password I EXTERNALLY I GLOBALLY I USING [esquema].pack Al crear un rol, se puede especicar el tipo de autenticación. Si se especica NOT IDENTIFIED, el rol está autorizado por la base de datos y no es necesaria ninguna contraseña para. activarlo, sin embargo si se especica IDENTIFIED, el 215
  • 225.
    Bases de Datos usuariodebe ser autorizado antes de activar el rol. Dentro de IDENTIFIED existen varias posibilidades: - BY password, donde el usuario debe indicar la contraseña antes de activar el papel. n EXTERNALLY,para ser autorizado mediante un servicio externo (como el sistema operativo). I GLÜBALLY, que cede la autorización al servicio Oracle Security Service. ISi se elige USING, se elige crear un rol de aplicación segura, es decir, un rol que solo puede ser activado por las aplicaciones que usen el paquete. Cuando un usuario se conecta al SGBD, este otorga al usuario los permisos que se le hayan concedido explícitamente mediante la orden GRANT y los permisos que tengan los roles por defecto del usuario. Para asignar un rol por defecto a un usuario se utiliza la sentencia ALTER USER de la siguiente forma: ALTER USERusuario DEFAULT RDLE [opciones_ro1]; opciones_ro1: rol [, rol]... I ALL [EXCEPT rol] I NÜNE Se puede anular el rol por defecto mediante la opción N ONE, o habilitar todos los roles mediante ALL, o todos menos uno mediante ALL EXCEPT rol, o conceder varios separadospor coma. Por ejemplo, para asignar los roles ADMINISTRACION y CONTABILIDAD al usuario Javier: GRANT Contabilidad,Administracion to Javier; ALTER USER Javier DEFAULT ROLE ADMINISTRACION,CONTABILIDAD; Finalmente, se puede utilizar también la sentencia SET ROLE para dotar mo- mentáneamente de ciertos privilegios a un usuario que tenga autorizado su uso. Por ejemplo, se puede crear el rol ALMACEN, con todos los privilegios sobre la tabla Productos y asignarselo al usuario Javier. Si el usuario Javier no activa el rol AL- MACEN mediante SET ROLE y su contraseña, no podrá disfrutar de susprivilegios 216
  • 226.
    Capítulo 5. Tratamientode los datos CREATE ROLE ALMACEN IDENTIFIED BY AlmacenPwd; GRANT ALL Privileges UN Jardineria.Productos TD ALMACEN; GRANT ALMACEN to Javier; --conexión con el usuario Javier SQL> select count(*) from Jardineria.productos; select count(*) from Jardineria.productos * ERROR en línea 1: ORA-00942: la tabla o vista no existe SQL> SET ROLE ALMACEN identified by A1macenPwd; Rol definido. SQL> select count(*) from Jardineria.productos; Creación de perles Los perles se usan para limitar la cantidad de recursos del sistema o de la base de datos disponibles para un usuario. Existe un perl llamado DEFAULT que concede recursos ilimitados a todos los usuarios. Para evitar esto, se puede hacer uso de la sentencia CREATE PROFILE para crear nuevos perles. CREATE PROFILE perfil LIMIT recursos ... recursos = recurso {cantidad I UNLIMITED I DEFAULT } I password recurso = SESSIONS_PER_USER I CPU_PER_SESSION I CPU_PER_CALL I CONNECT_TIME I IDLE_TIME I LOGICAL_READS_PER_SESSION Í LÜGICAL_READS_PER_CALL I COMPOSITE_LIMIT I PRIVATE_SGA password = parametro {cantidad I UNLIMITED I DEFAULT } I PASSw0RD_VERIFY_FUNCTIDN {función I NULL I DEFAULT } 217
  • 227.
    Bases de Datos parametro= FAILED_LÜGIN_ATTEMPTS I PASSWORD_LIFE_TIME I PASSWÜRD_REUSE_TIME l PASSWÜRD_REUSE_MAX | I PASSWORD_LOCK_TIME PASSWORD_GRACE_TIME Los diferentes límites que se puedenutilizar están denidos en la siguiente tabla: Límite SESSIONS_PER_USER CPU.PER_SESSION CPU_PER_CALL CONNECT_TIME IDLE_TIME LOGICALBEADS_PER_SESSION LOGICALBEADS-PER-CALL PRIVATELSGA COMPOSITELLIMIT Flmción Número máximo de sesiones abiertas a la vez por un usuario Tiempo límite para una sesión expresado en centésimas de segundos Tiempo límite de respuesta.para una. llamada (parse. fetch o ejecución) en centésimas de segundos Tiempo límite total de una sesión, expresado en minutos Tiempo máximo de inactividad de una sesión expresa.dos enminutos Número máximo de bloques de datos leidos en una sesión Número máximo de bloques de datos leidos en una llamada Tamaño de memoria que una sesión puede reservar del espacio privado de memoria del SGA Coste total en recursos de una sesión, expresado mediante el promedio de ciertos parámetros Cuadro 5.6: Tipos de recursos. Por ejemplo, se puede crear el perl OPERADOR con los siguientes límites: CREATE PROFILE OPERADOR LIMIT
  • 228.
    Capítulo 5. Tratamientode Ios datos CONNECT_TIME 120 -- 2 horas totales de conexion J También es posible alterar un perl mediante la sentencia ALTER PROFILE: --modificar el perfil DEFAULT para que la password no caduque alter profile DEFAULTLIMIT PASSWORD_LIFE_TIME Unlimited; --modificar el perfil OPERADOR para que su limite de sesión sea de 1 hora -- y un máximo de 10 sesiones concurrentes alter profile OPERADORLIMIT CONNECT_TIME 60 SESSIONS_PER_USER 10; Un perl se puede asignar en el momento de crear o modicar el usuario, por ejemplo: -- creación de un usuario con el perfil OPERADOR CREATE USER Francisco IDENTIFIED BY FrancisPwd QUOTA UNLIMITED ON Users PROFILE OPERADOR; 5.14.3. El sistema de privilegios de DB2 Desde el punto de vista de la seguridad, se puededecir que en DB2 existen tres grandes puntos de gestión de los privilegios de acceso: 1. Autenticación 2. Autorización 3. Privilegio La autenticación busca responder a las siguientes preguntas: ¿quién puede acce- der a la instancia o base de datosï, ¿dónde severicará la password de usuario? En DB2 los usuarios de autenticación deben estar dados de alta en el sistema operati- vo, es decir, que para resolver la primera pregunta, bastaría con decir que solo los usuarios del sistema pueden acceder a la instancia o base de datos, pero ¡ojo!, los usuarios pueden serlo del sistema local o de un sistema cliente remoto que esté in- tentando la conexión, esto sería así en función de cómo se dena la variada política de autenticación que dará respuesta a la segunda pregunta. La política de autenti- cación no solo permite o no la conexión desde clientes, sino que, entre otras cosas, indica si habrá encriptación o no del usuario y password, e incluso de los datos intercambiados durante la comunicación con el servidor. 219
  • 229.
    Bases de Datos Laautorización hace referenciaal nivel de permisoscon queun usuario materializa el acceso a la instancia o base de datos. También determina los comandos que el usuario puede ejecutar, los datos que puede leer o modicar, o los tipos de objetos de base dedatos que se lepermite crear, modicar o borrar. Todas estas consideraciones están preprogramadas en siete grupos de autorizaciones que pueden ser concedidos, en función del caso, a un grupo de usuarios o a un usuario determinado. ISYSADM: es el único al que se le permite modicar los parámetros de la instancia. Comparable a la autoridad del usuario root en Unix, puede ejecutar cualquier comando contra la instancia, contra todas las bases de datos de la instancia y contra todos los objetos de cualquier base de datos. ISYSCTRL: puede hacer todas las actividades de administración (crear y bo- rrar bases de datos y tablespaces) y mantenimiento (hacer backups, pasar estadísticas, actualizarparámetros de la base de datos), pero no podrá ac- ceder a ningún dato de las bases de datos a no ser que le sean concedidos explícitamente los privilegios adecuados. n SYSMAINT: solo puede ejecutar labores de mantenimiento (hacer backups, pasar estadísticas, actualizar parámetros de la base de datos). ISYSMON: pueden obtener fotos estáticas de monitorización (en inglés database system monitor snapshots) de la instancia o sus bases dedatos. IDBADM: solo existe en el contexto de una basede datos concreta. Le está per- mitido crear y borrar tablas, ejecutar estadísticas, y conceder o quitar privile- gios, pero en ningún caso podrá borrar la base de datos, ni crear tablespaces, ni hacer backups, o modicar parámetros de conguración. ILOAD: permite ejecutar cargas de datos sobre las tablas y pasar estadísticas. Es un permiso a nivel de usuario. ISECADM: es la autorización encargada de gestionar toda la implementación de las LBAC (del inglés label-basedaccess control=LBA C ), esto es el control de accesobasado en etiquetas. Los privilegios propiamente dichos pueden ser a nivel de toda la base de datos o solo estar referidos a un objeto concreto. En esencia son prá.cticamente iguales que los permisos de Oracle, se conceden con el comando GRAN T y se revocan con el REVOKE. Van desde elsimple CONNECT, pasando por los DML (SELECT, INSERT, DELETE, UPDATE), hasta los típicos ALTER, DROP. . . 220
  • 230.
    Capítulo 5. Tratamientode los datos 5.15. Prácticas Resueltas Práctica 5.1: Inserciones, Actualizaciones y Borrados Con la base dedatos Jardinería, crea y ejecuta un script "actualiza.sql que realice las siguientes acciones: 1. Inserta una ocina con sede en Fuenlabrada. 2. Inserta un empleado para la ocina de Fuenlabrada que sea representante de ventas. 3. Inserta un cliente del representante de ventas insertado en el punto 2. 4. Inserta.un pedidodel clienteanterior (consu detalle)de almenos 2productos con una transacción. 5. Actualiza el código del cliente insertado y averigua si hubo cambios en las tablas relacionadas. 6. Borra el cliente y verifica si hubo cambios. actua1iza.sq1 #1 INSERT INTO Oficinas VALUES (FUE-ES,Fuen1abrada,España,Madrid, 28941,918837627,C/Las suertes,27,Bajo A); #2 INSERT INTO Empleados (CodigoEmp1eado,Nombre, Apellidol,Email,Codigo0ficina,Puesto) VALUES (400,Ismae1,Sánchez,isanchezQjardineria.com,FUE-ES,Rep.Ventas); #3 INSERT INTO C1ientes(CodigoC1iente, Nombrecliente, Telefono, CodigoEmp1eadoRepVentas) VALUES (288,Riegos Pérez,918882763,400); #4 START TRANSACTION; INSERT INTO Pedidos (CodigoPedido, FechaPedido, Estado, CodigoC1iente) VALUES (1900,2010-O6-03,Pendiente,288); INSERT INTO DetallePedidos (CodigoPedido, CodigoProducto,Cantidad, PrecioUnidad,NumeroLinea) VALUES (1900,OR-99,1,15.99,1); INSERT INTO Detal1ePedidos (CodigoPedido, CodigoProducto ,Cantidad, PrecioUnidad,NumeroLinea) VALUES (1900,OR-251,3,168,2); COMIT WORK; #5 UPDATE Clientes SET CodigoC1iente=290 WHERE CodigoC1iente=288; #no permite la modificación, deberia tener la FK con ON UPDATE CASCADE 221
  • 231.
    Bases de Datos #6 DELETEFROM Clientes WHERE CodigoCliente=288; #tampoco permite el borrado, debería tener la FK con ON DELETE CASCADE Práctica 5.2: Actualizaciones yborrados consubconsultas Usa subconsultas en los ltros y realiza las siguientes actualizaciones y borrados: 1. Borra los clientes que no tengan pedidos. 2. Incrementa en un 20 (7o el preciode losproductos queno tengan pedidos. 3. Borra los pagos del cliente con menor límite de crédito. 4. Establece a Oel límite de crédito del cliente que menosunidades pedidas tenga del producto OR-179. #1 delete from Clientes where CodigoCliente not in (Select distinct Codigocliente from Pedidos); #2 update Productos set PrecioVenta=PrecioVenta*1.2 where not exists (Select distinct CodigoProducto from DetallePedidos where DetallePedidos.CodigoProducto=Productos.CodigoProducto); #3 delete from Pagos where CodigoCliente= (Select Codigocliente from Clientes where LimiteCredito = (Select min(LimiteCredito) from Clientes) ); #4 update Clientes set LimiteCredito=0 where CodigoCliente= (Select Codigocliente from Pedidos natural join Deta11ePedidos where Cantidad = (Select Min(Cantidad) From Deta11ePedidos where CodigoProducto=0R-179) AND CodigoProducto=ÜR-179 ); 222
  • 232.
    Capítulo 5. Tratamientode los datos 5.16. Prácticas Propuestas Práctica 5.3: Vincular tablasa través de Access/ODBC Mediante el driver ODBC para MySQL, enlaza a una BBDD Access las tablas de la NBA y las tablas de la BBDD jardineria. A continuación, realiza las siguientes acciones: 1. Exporta a Excel la tabla jugadores de la NBA. 2. Con Word, crea una carta modelo de felicitación de navidad a los clientes de la base de datos y combina la correspondencia para que, automáticamente, se genere una carta para cada cliente. 3. Inserta dos registros en la tabla Empleados de jardineria mediante un formu- lario creado en Access.y después, inserta dos jugadores de la NBA siguiendo el mismo procedimiento. Hay que asegurarsede que, efectivamente, están los registros insertados. Se puede repetir esta misma operación con el driver ODBC para Oracle, pero hay que tener en cuenta que junto al driver, se debeinstalar el software cliente de Oracle (sqlplus, tnsnames, etc.) para que funcione. <> Práctica 5.4: Actualizaciones yborrados variados 1. Modica la tabla DetallePedido para insertar un campo numérico llamado IVA. Mediante una transacción, establece el valor de esecampo al 18 para aquellos registros cuyo pedido tenga fecha a partir de Julio de 2010. A continuación actualiza el resto de Pedidos estableciendo al 16 el IVA. 2. Modica la tabla DetallePedido para incorporar un campo numérico llamado TotalLinea, y actualiza todos sus registros para calcular su valor con la fórmula TotalLineazPrecioUnidad*Cantidad*IVA/ 100. 3. Borra el cliente que menor límite de crédito tenga. ¿Es posible borrarlo solo con una consulta? ¿Por qué? 4. A través de phpMyAdmin o, mediante Access (vinculado vía ODBC), inserta dos clientes nuevos para un empleado a tu elección. A continuación, inserta un pedido con al menos 3 líneas de detalle. Después, ejecuta una consulta para rebajar en un 5 % el precio de los productos que sean Inás caros de 200 euros. <> 223
  • 233.
    Bases de Datos Práctica5.5: Inserciones, Actualizaciones y Borrados En Oracle, con la BBDD Jardinería, codica en SQL las siguientes acciones: 1. 2. 3. 6. 224 Inserta una ocina con sede en Leganés y dos empleados. Inserta un cliente de cada empleado insertado. Inserta dos pedidos de los clientes anteriores (con su detalle) de al menos 2 productos con una transacción. .Borra uno de los clientes y comprueba si hubo cambios en las tablas relaciona- das. Si no hubo cambios, modica las tablas necesarias estableciendola clave foránea con la cláusula ON DELETE CASCADE. .Ejecuta el siguiente código para simular el ON UPDATE CASCADE de la tabla Pedidos y modica el código de algún pedido. Comprueba que haya modicado los registros relacionados en la tabla DetallePedidoz CREATE OR REPLACE TRIGGER Actua1izaPedidos AFTER UPDATE UN Pedidos FUR EACHROW 3 BEGIN UPDATE Deta11ePedidos SET CodigoPedido = WHERE CodigoPedido= :o1d.CodigoPedido; END Actualizaclientes; :new.CodigoPedido Crea ahora el siguiente disparador y prueba a cambiarle el código a un Emplea- do. ¿Qué sucede? Buscael concepto de tabla mutante y estudia el problema. CREATE OR REPLACE TRIGGER Actualizaclientes AFTER UPDATE ON Empleados FOR EACH RDW BEGIN UPDATE Clientes SET CodigoEmp1eadoRepVentas = :new.CodígoEmp1ead WHERE CodigoEmp1eadoRepVentas = :o1d.CodigoEmp1eado; UPDATE Empleados SET CodigoJefe = :new.CodigoEmp1eado WHERE CodigoJefe = :old.CodigoEmp1eado; END Actualizaclientes; /
  • 234.
    Capítulo 5. Tratamientode los datos Práctica 5.6: MySQL: Crear usuarios y asignar permisosen local Realiza las siguientes operaciones y almacena los comandos y los resultados en un chero: 1. Crea un usuario llamado paco@localhost con la sintaxis create user con per- misos de solo conexión y comprueba que se pueda conectar. 2. Crea un usuario llamado juan@localhost con la sintaxis grant con permisos de solo conexión y comprueba que se pueda conectar. 3. Otorga al usuario paco@localhost permisosde selecten la tabla jardineria.Clientes y comprueba que se pueda consultar la tabla. 4. Otorga al usuario juan@localhost permisos de select, insert y update en las tablas de la base de datos jardineria con opcion GRANT. 5. Conéctate con el usuario juan y otorga permisos a paco deselección enla tabla jardineriaEmpleados. 6. Quítale ahora lospermisos apaco deselección sobrela tabla jardineria.Clientes. 7. Conéctate con root y elimina todos los permisos que has concedido a Paco y Juan. 8. Otorga a juan los permisos de SELECT sobre las columnas CodigoOcina y Ciudad de la tabla Ocinas de la base de datos jardineria. 9. Conéctate con juan y ejecuta la query SELECT * from jardineriaOcinas ¿Qué sucede?. 10. Borra el usuario paco@localhost. 225
  • 235.
    Bases de Datos Práctica5.7: MySQL: Crear usuarios y asignar permisosen remoto Realiza las siguientes operaciones y almacena los comandos y los resultados en un chero: 1. 226 Crea un nuevo usuario llamado usuarioíldireccionip donde direccion_ip es una máquina de un compañero tuyo y usuario su nombre. .Otórgale permisos de seleccion en todas las tablas de la base de datos jardi- neria. Ten cuidado, es posible que tu servidor solo permita conexiones desde el ordenador local, para permitir conexiones remotas debes comentar la linea bind-adress de tu chero mycnf que impide conexiones desde otros sitios que no seael especicado (127.0.0.1). Asegúrate de reiniciar el servidor. .Pide a tu compañero que se conectedesde sumáquina y que averigue qué per- misos le has otorgado. El a tí te pedirá lo mismo, es decir, que te conectes a su máquina, indica qué instrucción sql ejecutas para conocer los permisos que tienes. Revócale los permisos concedidos al usuario usuario@direccion_ip. .Concédele ahora permisos de creación de tablas en una nueva base de datos que has creado. .Solicítale que se conecte y que pruebe a crear una tabla. ¿Puede consular la informaciónï. . Borra ahora el usuario usuario@direccion_ip. .Con la bbdd mysql consulta qué privilegios tiene el usuario juan@localhost a nivel de servidor, a nivel de base de datos, a nivel de tablas y a nivel de columnas. Utiliza el comando show grants for usuario.
  • 236.
    Capítulo 5. Tratamientode los datos Práctica 5.8: Oracle: Creación de usuarios, roles yperfiles 1. Crea dos roles, uno llamado ADMINISTRACION con todos los privilegios sobre la tabla CLIENTES y PEDIDOS del esquema JARDINERIA y otro llamado CONTABILIDAD con todos los privilegios sobre la tabla PAGOS del mismo esquema. El rol CONTABILIDAD estará identicado por contraseña, .A continuación, crea un usuario Fernando en Oracle con las siguientes opcio- nes: DEFAULT TABLESPACE Users, TEMPORARY TABLESPACE Temp, QUOTA 100 Megabytes en Users y otorga el rol CONNECT y RESOURCE. . Otorga como Rol por defecto ADMINISTRACION al usuario Fernando. .Con el usuario Fernando, prueba a ejecutar una consulta sobre latabla Clientes y otra sobre la tabla PAGOS. .A continuación, activa el Rol CONTABILIDAD y repite la consulta sobre la tabla PAGOS con el usuario Fernando. .Desactiva todos los roles del usuario Fernando, incluyendo el rol por defecto. .Consulta la tabla Clientes. 227
  • 237.
    Bases de Datos 5.17. 228 Resumen Losconceptos clave de este capítulo son los siguientes: La sentencia INSERT se utiliza para insertar una la o registro en una ta- bla. Algunos SGBD, como MySQL, permiten la inserción de más de una la mediante la sintaxis extended-insert. Con INSERT se pueden insertar valores para todas las columnas o solo para algunas de ellas. La sentencia UPDATE se utiliza para actualizar uno o varios registros de una tabla. DELETE sirve para eliminar registros de una tabla. Se puede ltrar la información a modicar o borrar mediante un ltro WHERE. El ltro, puede tener todas las características del ltro de la SELECT. Si no seespecíca ltro, se actualizan o borran todas las las de la tabla. También se pueden actualizar o borrar las con UPDATE y DELETE ltrando a través de una subconsulta. En este caso, la limitación consiste en no poder modicar o borrar registros de una tabla a la que se accedeen la subconsulta. Se puederealizar la inserción de múltiples registros en una tabla con los resul- tados devueltos por una SELECT. La SELECT debe devolver tantas columnas como se especiquen en la sentencia INSERT. No siempre es posible actualizar o borrar información de tablas puesto que existen restricciones. Además, algunas restricciones provocan cambios en cas- cada en tablas relacionadas. Las transacciones son conjuntos de operaciones SQL que se ejecutan de for- ma atómica. Una vez iniciadas, se pueden acometer (COMMIT) o cancelar ROLLBACK. El tratamiento de transacciones, produce problemas de concurrencia, es decir. problemas que se presentan al haber varios usuarios actualizando, borrando y consultando un conjunto de datos. Estos problemas están clasicados por ANSI/ISO en 3 problemas típicos. Los SGBD permiten que ocurran o no. dependiendo del nivel de aislamiento que se seleccione. El comando CREATE VIEW sirve para crear vistas, personalizando la forma en la que el usuario obtiene la. información. Se puede crear usuarios mediante el comando CREATE USER al cual se le puede asignar un perl y varios roles. Mediante los comandos GRANT y RE- VOKE se otorgar y deniegan permisos.
  • 238.
    5.18. 1. En lasentencia INSERT Test de repaso a) No se puedenomitir valores de columnas b) Se pueden especicar un número distinto de valores y columnas c) Se pueden omitir los nombresde columnas d) Ninguna de las anteriores 2. Con GRANT y REVOKE a) Se pueden otorgar permisos de select a una o varias tablas b) Se pueden otorgar permisos para borrar una tabla c) Se puede otorgar permisos para ejecutar comandos DDL d) Todas las anteriores 3. Para poner una columna al valor por defecto a) Se tiene queponer NULL b) Se tiene queponer DEFAULT c) No es posiblehacerlo d) Ninguna de lasanteriores 4. En sentencias UPDATE y DELETE a) Se puede especicar el mismo tipo de ltro que para WHERE b) Se puede especicarel mismotipo de ltro que para HAVING c) Se puede ltrar mediante unasubconsulta d) Todas las anteriores 5. Si se especica ON DELETE CAS- CADE a) No se puede borrar el registro referenciado b) Se borra encascada el registro referenciado c) No se puedeborrar el registro quereferen- cia d) Se borra encascada el registro quereferen- cia Capítulo 5. Tratamiento de los datos 6. En una sola sentencia UPDATE a) Sólo se puedemodicar un campo de un registros b) Sólo se puedemodicar un campo de varios registros c) Sólo se pueden modicar varios campos de un registro d) Se pueden modicar varios camposde va- rios registros 7. Una transacción a) Puede tener sentencias SELECT b) No puede tener sentencias INSERT c) No puede tener sentencias SELECT d) Sólo puede tener sentencias UPDATE 8. Para comenzar una transacción se usa a) START WORK b) START TRANSACTION ) ) c SET AUTOCOMMIT=OFF d Todas las anteriores 9. Los perles en Oracle a) Al igual que los roles, sirven para limitar los recursos b) No se pueden limitar recursos mediante perles c) Sirven para agrupar conjunto de permisos d) Ninguna de lasanteriores &#39;P6P&#39;89&#39;¿&#39;P9&#39;q&#39;9P?&#39;q&#39;¬&#39;P
  • 239.
    Bases de Datos 5.19. 230 .Escribeel formato de la sentencia INSERT y, ejemplica su funcio- namiento mediante dos inserciones, una especicando la lista. de cam- pos y otra indicando todos los va- lores para todas las columnas. .Transforma las dos sentencias IN- SERT anteriores en un único IN- SERT con sintaxis extendida. . Escribe el formato de la sentencia UPDATE y, ejemplica su funcio- namiento mediante tres querys, una que actualice una columna de una la, una que actualice dos columnas de varias las, y otra que actualice todas las las de una tabla. .Escribe el formato de la sentencia DELETE y, ejemplica su funcio- namiento mediante dos querys, una que borre una sola la y otra que borre todos los registros de una ta- bla. . ¿En qué consiste un INSERT- SELECT? Pon un ejemplo de su funcionamiento. .¿Qué condiciones deben darse pa- ra que al hacer una modicación en una tabla, sus cambios se pro- paguen a la tabla. que la.referencia mediante una clave foránea? 10. 11. 12. 13. Comprueba tu aprendizaje . Imagina una situación, y pon un ejemplo de borrado en cascada de registros. .Imagina otra situación distinta, y pon un ejemplo de actualización en cascada tanto en Oracle, como en 1IySQL. .¿Qué quiere decir que una actuali- zación o borrado se ltra mediante una consulta? ¿Existe alguna res- tricción al respecto? Dene el concepto de transacción indicando en qué situaciones son útiles y qué problemas puede oca- sionar. Dene los tipos de problemas oca- sionados por la concurrencia en el acceso a los datos: a) Dirty Read o Lectura Sucia b) N onrepeateable Read o Lectu- ra No Repetible c) Phantom Read o Lectura Fan- tasma ¿Qué signica que un SGBD tenga una política de aislamiento? Enumera. los tipos de aislamiento estándar.
  • 240.
    CAPÍTULO 6 Programación debases de datos Objetivos Contenidos , Introducir el Concepto de pro- Introducción a loslenguajes de graïnacïón de 133595 de datos programación de bases dedatos Aprender los Inecanismos bási- Tipos dedatos, identicadores C05 de la P1 ogïalïïaCïólï de bases y variables de datos operadores y expresiones Diseñar y codicar scripts para tareas complejas Estructuras de control Incorporar el uso de las Gestión de BTTOTGS transacciones en tareas com- ._. plej as Transacciones enscripts Manejar cursores En este tema e] alumno aprenderá a programar una base de datos, desarro- Ilando programas y guiones utilizando las técnicas apropiadas. 231
  • 241.
    Bases de Datos 6.1.Introducción a la programación de bases de datos Programar una base de datos es la forma en la que el desarrollador o adminis- trador de la base de datos interactúa con ella. Hay muchas maneras de programar una base de datos, la elección del modo más adecuado depende de con qué tecnologíade basede datosse estátrabajando (por ejemplo, Oracle),de quécompiladores se tengan instaladosen la máquina objetode ejecución (por ejemplo, C++), de qué ventajas e inconvenientes sepersigan, o de la naturaleza de la aplicación de base de datos que se va a desarrollar. La aplicación de base de datos puede ser de tres tipos distintos: n Codicación en el lado del servidor: La lógica de la aplicación reside en- teramente en la base de datos. La aplicación está basadaen la implementación de disparadores que seejecutan automáticamente cuando ocurre algún cambio en los datos almacenados. y en el almacenamiento de procedimientos y funcio- nes que son llamados explícitamente. Una ventaja importante es que, de esta forma, se puede reutilizar el mismo código para muchos clientes. n Modelo cliente/servidor (también llamado modelo en dos niveles): El código de la aplicación corre en otra máquina distinta del servidor donde se encuentra la base de datos. Las llamadas a la base de datos son transmitidas desde lamáquina cliente al servidor. Los datos son transmitidos desde elcliente al servidor para las operaciones deinserción y actualización, y desde elservidor al cliente durante las consultas. Los datos sonprocesados enla máquina c1ient.e. Normalmente, estas aplicaciones se escriben usando precompiladores con las sentencias SQL embebidas en el código. IModelo en tres niveles: Al modelo en dos niveles se le añade un servidor de aplicación separado que procesa las peticiones. Este podría ser, por ejemplo. un servidor Web básico, o un servidor que realizara funciones de cacheo de datos y balanceo de carga. Aumentar la potencia de procesamiento de esta capa intermedia permite disminuir los recursos necesarios para los clientes. pudiendo estos llegar a ser simples navegadores Web. Para el desarrollo de aplicaciones. ademásde necesitarun interfaz de programación donde hacer el desarrollo. se precisa de un software de cliente que enlace el código desarrollado con la base de datos. Los interfaces más comunes son: - SQL incorporado: Las aplicaciones de bases de datos de SQL incorporado se conectan a. las bases de datos y ejecutan directamente sentencias de SQL 232
  • 242.
    Capítulo 6. Programaciónde bases de datos incorporado que se encuentran insertadas dentro de una aplicación escrita en un lenguaje principal (típicamente C, C++ o COBOL). Las sentencias SQL se pueden ejecutar estática o dinámicamente. IODBC: Microsoft desarrolló una interfaz SQL denominada Open Database Connectivity (ODBC) para los sistemas operativos de Microsoft. Los contro- ladores ODBC especícos de la BBDD se cargan dinámicamente en el tiempo de ejecución, mediante un gestor de controladores basado en la fuente de da- tos (nombre de la base dedatos) proporcionadaen la petición de conexión. La aplicación se enlaza directamente con una única biblioteca del gestor de controladores, en lugar de con la biblioteca de cada motor de basede datos. El gestor de controladores media entre las llamadas de función de la aplicación en el momento de la ejecución y asegura que estas se dirijan hasta el contro- lador ODBC adecuado que sea especíco para el motor. Dado que el gestor del controlador ODBC solo conoce las funciones especícas de ODBC, no se podrá acceder a las funciones especícas del motor de base de datos. ODBC no está limitado a los sistemas operativos de Microsoft; otras implementacio- nes están disponibles en varias plataformas. Para el desarrollo de aplicaciones ODBC, debeinstalarse unODBC SoftwareDevelopment Kitl. ICLI: Call Level Interface (intefaz a nivel de llamada). Es una interfaz de pro- gramación de aplicaciones C y C++ para el acceso a bases de datos relacio- nales, que utiliza llamadas de función para pasar sentencias deSQL dinámico como argumentos de función. Es una alternativa al SQL dinámico incorpora- do, pero a diferencia de SQL incorporado, CLI de DB2 no necesita variables del sistema principal o precompilador. Se basa enla especicación ODBC 3,51 y en la Norma Internacional para SQL /CLI. Estas especicaciones se escogie- ron como la base para proporcionar una curva de aprendizaje más corta para aquellos programadores de aplicaciones, ya familiarizados con cualquiera de estas interfaces de bases de datos. u JDBC: Java Database Connectivity es un API (Applications Programming Interface, interfaz de programación de aplicaciones) que permite enviar sen- tencias SQL a una base de datos relacional. ISQLJ: Es un estándar ANSI SQL-1999 para incorporar sentencias SQL en código fuente Java. Proporciona una alternativa al JDBC para el acceso a datos desde Java tanto en el lado cliente como en el lado servidor. Un código fuente SQLJ es más breve que su equivalente en código fuente JDBC. lPara la plataforma Windows, el SDK de ODBC es parte del SDK de Microsoft Data Access Components (MDAC),disponible paradescarga en httpz/ /mm.microsoft .com/data. 233
  • 243.
    Bases de Datos nOCI y OCCI: Oracle Call Interface (OCI) y Oracle C++ Call Interface (OCCI) son APIs que permiten crear aplicaciones que invocan procedimien- tos y funciones nativas para acceder y controlar todas las fases de ejecución de sentencias SQL en bases dedatos Oracle. Permite desarrollar aplicaciones combinando la potencia de acceso a los datos del SQL, con la capacidad de hacer bucles, crear estructuras de control. .. Interfaz de base de datos Perl: Combina la potencia del lenguaje inter- pretado Perl y el SQL dinámico. Estas propiedades convierten a Perl en un lenguaje perfecto para crear y revisar rápidamente aplicaciones de bases de datos (DB2). El Módulo DBI de Perl utiliza una interfaz que es muy parecida a las interfaces CLI y JDBC, lo cual facilita la traducción de las aplicaciones Perl a aplicaciones CLI y JDBC, y viceversa. Hypertext Preprocessor (PHP): Es un lenguaje de programacióninter- pretado. La primera versión de PHP fue creada por Rasmus Lerdorf y reci- bió contribuciones bajo una licencia de código abierto en 1995.Principalmente pensado para el desarrollo de aplicaciones Web, inicialmente era un motor de plantillas HTML muy sencillo, pero con el tiempo los desarrolladores de PHP han ido añadiendo funciones de acceso a bases de datos, han reescrito el intérprete, han incorporado soporte orientado a objetos y han mejorado el rendimiento. Actualmente, PHP se ha convertido en un lenguaje muy utilizado para el desarrollo de aplicaciones Web porque se centra en soluciones prácticas y da soporte alas funcionesmás utilizadasen aplicaciones Web? OLE DB: Microsoft OLE DB es un conjunto de interfacesOLE/ COM que proporciona a las aplicaciones un acceso uniforme a datos almacenados en distintas fuentes de información. La arquitectura OLE DB dene a los consu- midores de OLE DB y a los proveedoresde OLE DB. Un consumidor de OLE DB puede ser cualquier sistema o aplicación que utiliza interfaces OLE DB: un proveedor de OLE DB es un componente que expone las interfaces OLE DB. El consejo del buen administrador. . . Toda programación debe ir acompañada de su correspondiente depuración de errores. Hayestudios queconcluyen quese dedicaun 60-80% del tiempo in- vertido en fabricar un programa a 1a deteccióny corrección de errores. ¿Para Windows, se pueden encontrar versiones binarias precompiladas de PHPen http: //php. net. 234
  • 244.
    Capítulo 6. Programaciónde bases dedatos 6.2. Los lenguajes de programación de bases de datos Se puede programar una base de datos en multitud de lenguajes, desde el C, pasando por el Java, hasta el nuevo e innovador XQuery, pero todos, en mayor o menor medida, terminarán recurriendo a sentencias SQL para extraer o insertar datos de la base de datos, por lo que es imprescindible y fundamental conocer y desenvolverse adecuadamentecon SQL. Para añadir más potencia de ejecución a las sentencias SQL,Oracle desarrolló un lenguaje propio llamado PL/ SQL, con él, es posible denir variables, crear estruc- turas de control de ujo y toma de decisiones, crear funciones, procedimientos, pa- quetes. . . . Con el mismo objetivo, en DB2 viene incorporadoel lenguajeSQL/PL que, al contrario que el de Oracle, respeta la totalidad del estándar de SQL, pero además, DB2, desde su versión 9.7, ofrece la posibilidad de desarrollar directamente en PL/SQL, existiendo compatibilidadplena conOracle, locual haceque lasmigracio- nes de la lógica de la aplicación de una base de datos Oracle a DB2 9.7 sean prácti- camente transparentes para el desarrollador, facilitando además la reutilización del conocimiento y evitando la necesidad de tener que aprender las características del nuevo gestor (el equipo de trabajo sigue siendo productivo desde el mismo día de la migración). Los programas PL/SQL, pueden ejecutarse haciendo uso del SQL*Plus;los tipos básicos de un programaPL/SQL son: procedimientos, funciones ybloques anónimos. Todos ellos están compuestos de tres bloques bien diferenciados: Partes de un programa DECLARE --declaración de variables que se usarán en la sección de ejecución --es opcional, ya que no siempre la complejidad del programa a --realizar precisa del uso de variables y constantes BEGIN --sentencias a ejecutar, bloque de ejecución propiamente dicho. EXCEPTION --chequeo de errores de interés ocurridos durante todo la ejecución --y acciones a tomar en consecuencia --Bs opcional, pero si existe, está ubicado junto antes de END END;
  • 245.
    Bases de Datos Elconsejo del buen administrador. . . Cuantos más comentarios se pongan en un programa, más fácil será su man- tenimiento y posterior modicación, sobre todo si 1a persona encargada de retocarlo no esla misma que la persona que creó el programa originalmente. Los bloques anónimos solo se pueden utilizar en el momento de su creación. ya que al no tener nombre que los identique, no pueden ser referenciados. Si lo que se pretende es reutilizar el código, habrá que guardar el programa PL/ SQL en el catálogo de la base de datos, ya sea como procedimiento almacenado o función almacenada, de modo que quedeidenticado unívocamente con un nombre y un tipo. Tanto el procedimiento como la función podrán aceptar parámetros de entrada, pero solo la función devolverá a su vez un valor al término de su ejecución. En caso de querer crear un procedimiento, se sustituirá la palabra DECLARE por la sentencia CREATE PROCED URE. CREATE UR REPLACE PROCEDURE nombre_de1_procedimiento (lista_de_parámetros) AS Y si lo que sedeseaescrear una función, sesustituirá la palabra DECLARE por la sentencia CREATE F UN CTI ON. CREATE DR REPLACEFUNCTIÜNnombre_de_la_funcion(1ista_de_parámetros) RETURNtipo_de_dato_devuelto IS En ambos casos,la lista de parámetros esopcional, de modo que si no seprecisa pasarparámetro alguno,bastacon omitir la lista (incluyendolos paréntesis). Para hacer uso de un procedimiento basta con invocar la instrucción CALL. CALL nombre_de1_procedimiento(lista_de_va1ores); En el caso de las funciones, puesto que estastienen necesariamenteque devolver un valor, para hacer uso de ellas es obligatorio recoger dicho valor. Una forma fácil sería asignándoselo a una variable que fuese del mismo tipo que el valor devuelto por la función, o también. invocarla desdeuna sentencia SELECT. SELECT nombre_de_1a_función(1ista_de_va1ores) FROM DUAL; 236
  • 246.
    Capítulo 6. Programaciónde bases dedatos También se pueden agrupar procedimientos y funciones en objetos más grandes llamados paquetes, los cuales están compuestos por dos componentes: ILa cabecera: encargada de almacenar la denición de todos los subprogramas (procedimientos yfunciones) queincluye el paquete, asícomo la declaración de las variables y constantes globales al paquete (que podrán usarse en todos los subprogramas que lo componen). I El cuerpo: que contiene el código de todos los subprogramas. cabecera del paquete CREATE DR REPLACE PACKAGE nombre_de1_paquete AS PROCEDURE nombre_de1_procedimiento_1 (1ista_de_sus_parámetros); PROCEDURE nombre_de1_procedimiento_2 (lista_de_sus_parámetros); FUNCTION nombre_de_1a_función_1 (1ista_de_sus_parámetros) RETURN tipo_de_dato_devue1to; --declaración de variables y constantes globales al paquete END nombre_de_paquete; / Cuerpo del paquete CREATE OR REPLACE PACKAGE BODY nombre_del_paquete AS PRÜCEDURE nombre_del_procedimiento_1 (lista_de_sus_parámetros) IS --declaración de variables y constantes locales al procedimiento BEGIN --código del nombre_del_procedimiento_1 END nombre_de1_procedimiento_1; PRÜCEDURE nombre_del_procedimiento_2 (lista_de_sus_parámetros) IS --declaración de variables y constantes locales al procedimiento BEGIN --código del nombre_de1_procedimiento_2 END nombre_del_procedimiento_2; FUNCTION nombre_de_la_funcion_1 (lista_de_sus_parámetros) RETURN tipo_de_dato_devue1to IS --declaración de variables y constantes locales a la función BEGIN --código del nombre_de_1a_funcion_1 END nombre_de_la_funcion_1; END nombre_del_paquete; / 237
  • 247.
    Bases de Datos Recuerda. EnOracle, latabla DUAL es unatabla auxiliarmuy útil para ejecutar todo tipo de funciones. Concretamente las que proporciona el gestor para por ejemplo, extraer el DDL de un objeto de la base de datos, o para conocer qué fecha es: SELECT SYSDATE FROM DUAL; En DB2, la tabla auxiliar se llama S YSIBALS YSD UMMYl. El mismo ejemplo para obtener la fecha actual se haría con la sentencia: SELECT CURRENT. TIMESTAAÍP FROM SYSIBALSYSD UMMYI; Los procedimientos y funciones que están dentro de paquetes, también pueden ser invocados individualmente y, de la misma manera que los procedimientos y funciones independientes, basta con calicarlos por delante con el nombre del paquete al que pertenecen, ya que esta es la.única forma de identicarlos unívocamente respecto de la totalidad de objetos que tiene la base de datos. Llamada dentro de un paquete --llamada a procedimiento CALL nombre_de1_paquete.nombre_de1_procedimiento(1ista_de_va1ores); --llamada a función SELECT nombre_del_paquete.nombre_de_1a_función(1ista_de_va1ores) FROM dual; <> Actividad 6.1: Creados tablas que se llamen igual pero en distintos esquemas. Crear, en el mismo esquema. dos objetos que se llamen exactamente igual, por ejemplo, una tabla y un procedimiento. Aparte de los programas mencionados (procedimientos, funciones y paquetes). también se puede codicar lógica de negocio en los dispara.dores o TRIGGERS asociados a tablas, vistas o eventos. que podrán ejecutarse una.vez (por ejemplo al intentar un usuario conectarse a la base de datos). o tantas veces como las de una tabla se vayan a insertar, borrar o actualizar. El disparador podrá programarse para que se active inmediatamente antes o después del evento. Para dar de alta o recrear un disparador basta con sustituir la palabra DECLARE por la sentencia de denición del disparador. Un ejemplo para denir un disparador de tabla que se ejecute en cada la antes de ser insertada. es el siguiente: 238
  • 248.
    Capítulo 6. Programaciónde bases dedatos Creación o recreación de un disparador CREATE DR REPLACE TRIGGER nombre_de1_disparador BEFORE INSERT DN nombre_de_1a_tab1a FOR EACH RÜW En ese caso, elmomento enel quese ejecutael disparadoresBEFORE (antes), y el evento que lo dispara es la instrucción DML INSERT (inserción en la tabla destino del disparador). Otro momento de ejecución podría ser AFTER (después), y otros eventos, además de la inserción, podrían ser el borrado (DELE TE) y la actualización (UPDATE OF lista_de_columnas), o inclusovarios ala vez (INSERT OR DELETE OR UPDATE). Además. también se podría añadir una condición (WHEN Por ejemplo, sepodría crearun disparadorllamado actualizaSueldoMini- mo denido antes (BEFORE) de la actualización (UPDATE OF) del campo sueldo de la tabla nominas del esquema contratados. que se activara solo cuando se cum- pliese la condición de que el valor del campo que se quiere actualizar fuese menor de 1000 euros, de modo que impidiese que se pudieran asignar sueldos por debajo de los 1000 euros. CREATE OR REPLACE TRIGGER contratados.actua1izaSue1doMinimo BEFORE UPDATE OF sueldo ON contratados.nominas FOR EACH ROW WHEN (new.sue1do < 1000) BEGIN :new.sue1do := 1000; END; / ¿Sabías que .. . 7 Se puede denir más deun disparador para lamisma tabla y para la misma combinación de momento y evento, pero el orden en el que Oracle los ejecutará.será indeterminado. por ello es mejor opción agrupar la lógica de negocio en un solo disparador. DB2, en cambio, los ejecutaría según el orden en el que fueron creados. Dentro de la programación del disparador, :old.nombre_del_campo haráreferen- cia al valor antiguo del campo llamado nombre_del_campo.mientras que :new.nombre_del_campo seráel nuevo valor que pretende asignársele al campo lla- mado nombre_del_campo,pudiendo este valor new ser modicado en el bloque de ejecución del disparador. Nótese que en la cláusula WHEN. las variables :old y mew no deben ir precedidas de los dos puntos (z). 239
  • 249.
    Bases de Datos Recuerda.En una base de datos todos losobjetos son únicos, es decir, que estan perfectamente identicados por su nombre y por su tipo y no pueden re- petirse. Por ejemplo. un mismo usuario o esquemade basede datos no podría tener dos tablas que se llamen exactamente igual. pero sí podría existir una tabla llamada nominas en dos esquemas distintos (contratados y subcontra- tados), ya que la base de datos las conocería comocontratadosnominas y subcontmtadosmominas. En el caso delos procedimientos y funciones, existe ademásel nivel de paque- tes, esdecir, que podría existir un procedimiento independiente que se llamara calculaNominas que perteneciera al usuario pepito, pero además podría tam- bién haber otro procedimiento calculaNominas dentro de un paquete paque- teDeContabilidad del mismo esquema contratados. Se referenciarían por con- tratadoscalculaNominas, contratadospaqueteDeContabilidad.calculaNominas, respectivamente. Incluso podría existir una función que se llamara también contratados. calculaNominas, pues al ser objetos de distinto tipo, en una sen- tencia SQL determinada, la base de datos los distinguiría por el contexto. 6.3. Tipos de datos, identicadores y variables En Oracle existen varios juegos de datos soportados, unos especícos de Oracle. otros compatibles con el estándar ANSI y los tipos de datos del DB2 de IBM, otros denidos por el usuario a partir de los dos tipos anteriores mediante el uso de la instrucción CREA TE TYPE, y otros como los tipos de datos XML (para la consulta y tratamiento de documentosXML) o los tipos de datosespa.ciales (para tratar la información geográca). Aquí solo se tratarán los tipos básicos del primer juego: ICHAR(tamaño): cadena detamaño jo. El número máximo de caracteres es 2000. Los valores de tipo cadena deberán ir entrecomillados con comilla simple. IVARCHAR2(tamaño): cadena delongitud variable. El tamaño máximo es 4000 caracteres. Los valores de tipo cadena deberán ir entrecomillados con comilla simple. INUMBER(precisión,escala): número decimal.La precisión puede tomar valores entre 1 y 38. La escala puede estar entre 84 y 127. Un número de escala positivo indica cuántos dígitos signicativos de entre el total de la pre- cisión se guardarán a la derecha de la coma decimal. Un número de escala 240
  • 250.
    Capítulo 6. Programaciónde bases dedatos negativo indica el número de dígitos que se redondearán del número a la iz- quierda de la coma. Tanto la precisión como la escala son opcionales, pero si hubiera escala, necesariamente tendría que haberse indicado la precisión. Por ejemplo, para crear una Variable que pueda albergar valores del 999999 hasta el999999, basta con denir una detipo NUlIBERl(6). Una variablede tipo NUMBER(6,2) aceptará valores de hasta seis cifras, pero las unidades y las decenas seredondearán, por ejemplo, el número 123456,44 se almace- nará como 123500. En cambio, NUMBER(6,2) guardará cuatro dígitos a la izquierda de la. comay redondeará los dígitos a la derecha de la coma dejando solo dos. Los subtipos INTEGER, IN T, y SMALLIN T también pueden usarse para denir números enteros con un máximo de 38 dígitos de precisión. - BINARYILOAT: número de coma otante de 32 bits de precisión. Los valores positivosestán enel intervalo (1. 17549E-38,3, 40282E+38). IBINARYDOUBLE: número de coma otante de 64 bits de precisión. Los valores positivos están en el intervalo (2, 22507485850720E308, 1, 79769313486231E+308). - DATE: fecha y hora. La función TO_DATE es muy útil para insertar datos ti- po fechao comparar dos fechas:TO_DA TE (31-01-2010 , DD-MM- YYYY). - TIMESTAMP: es una extensión del tipo DA TE que guarda además fraccio- nes de segundo. IBLOB,CLOB,BFILE 3: datosmuy grandes y desestructurados, por ejemplo texto, imágenes, vídeos o datos espaciales. Pueden guardarse en tablespaces diferentes al resto de la tabla, o en el caso de los BFILE, en cheros externos a la base de datos. IROWID: es el tipo de la pseudocolumna ROWID, una. columna interna de la tabla que almacena la dirección física de cada la. Mediante esta dirección se puede localizar el número de objeto, chero de datos, tablespace donde se encuentra y la posición dentro del bloque de datos respecto del chero de datos, formando con todo ello un valor único en toda la base de datos. Los accesos a los datos a través de la localización de un valor en esta columna son rapidísimos. Además de estos tipos, existen otros no soportados por el estándar SQL, que no pueden usarse para denir columnas, perosí en la programaciónde PL/ SQL, por ejemplo el tipo BOOLEAN, que puede albergar los valores lógicos TR UE (verdade- ro), FALSE (falso) o NULL (nulo) muy útiles en comparaciones. 3Oracle recomienda sustituir los datos tipo LONG, LONG RAW y RAW por estos tipoLOB. 241
  • 251.
    Bases de Datos Basándoseen estos tipos de datos, se podrá proceder a la definición de variables y constantes en los bloques DECLARE. y en la denición de los procedimientos y funciones. Sintaxis para la definición de variables. nombre_de_la_variable tipo_de_dato ; o nombre_de_1a_variab1e tipo_de_dato := va1or_de_inicia1ización; Sintaxis para la definición de constantes nombre_de_la_constante CONSTANT tipo_de_dato := va1or_de_inicia1ización; ¿Sabías que . . . ? Los valores de tipo cadena van entrecomillados con comilla simple. En PL/SQL, la asignación del valor a una variable o constante siempreva precedida de los signos :=. En la asignación u operación con valores, PL /SQL puede convertir implícitamente el tipo de dato para adecuarlo al tipo de la variable al que se asigna el valor o al tipo necesario en la operación. En el siguiente ejemplo, se puede hacer la resta gracias a la conversión implícita de los meses.En casode quelos mesestuvieran alguna letra, la opera.ción arro j aria un error. DECLARE mesInicio CHAR(2) := 6; mesFin CHAR(2) := &#39;10; mesesTranscurridos NUMBER(2); BEGIN mesesTranscurridos := mesFin -meslnicio; END; / Cuando sedesee declararuna variable con el mismo tipo que otra variable conocida del mismo programa o el tipo de una columna de una tabla concreta. o incluso como una la. completa de una tabla, existen dos atributos que facilitan la denición y cor. ello el mantenimiento del programa PL /SQL. ya que la modicación del tipo original se extenderá. al resto de variables derivadas sin necesidad de tener que cambiar ninguna línea de código. Esos atributos son el % TYPE y el %ROWTYPE.
  • 252.
    Capítulo 6. Programaciónde bases dedatos Atributos%TYPE y%ROWTYPE nombre_de_1a_variab1e nombre_de_1a_otra_variableZTYPE; nombre_de_1a_variable esquema.tab1a.co1umna%TYPE; nombre_de_1a_variable_tipo_registro esquema.tab1a%TYPE; En el caso delos procedimientos y funciones, las variables de su lista de paráme- tros pueden ser de tres tipos: IN (parámetro de entrada), OUT (parámetro de salida) e IN OUT (parámetro deentrada y de salida). Si no se especica nada, el parámetro en cuestión sería IN. Hacer que un procedimiento tenga parámetros OUT es un truco muy bueno para conseguir que el procedimiento devuelva datos. Procedimiento con parámetro de salida CREATE OR REPLACE PROCEDURE contratados.dameSue1doMinimo (sueldoMinimo OUT contratados.nominas.sue1do%TYPE) AS BEGIN sue1doMinimo:=1000; END; / ¿Sabías que . .. 7 La función SUBSTR( cadenaxzrgumento, posi- cióminicial, longitud_de_la_subcadena) sirve para extraer trozos de la cade- nanrgumento, de modo que se devolveránun total de longitud_de_la_subcadena caracteres comenzando por los que van desde la posiciónjnicial. En caso de omitir el parámetro longitud_de_la-subcadena,la función devolverá la subcade- na desde la posiciónjnicial hasta el nal de la cadencuzrgumento. 6.4. Operadores y expresiones Para relacionar variables y constantes entre sí. seusan los operadores, que com- binándolas con aquéllas darán lugar a expresiones cuyosresultados serán el funda- mento de la lógica de programación de la base de datos. Las operaciones que se pueden realizar y el orden en el que se ejecutarían (en ausencia de paréntesis) son: 243
  • 253.
    Bases de Datos ÍHHHHHIÍÍÍÍIÑHÜHÍÍÍÍÍÍÍ""""III"lI&#39;||"&#39;I|| Í¡l"""&#39;HÑHMHIlÍl&#39;ll&#39;l&#39;l& Signopositivo o negativo *nmltiplicación / división + suma resta concatenación. Muy útil para juntar varias caden en una comparaciones: igual, menor, mayor, menor o igual .mayor o igual, distinto, distinto IS NULL, LIKE es nulo, como BETWEEN, IN entre, en negación lógica de un tipo boolean operador AND lógico entre tipos de dato boolean operador OR lógico entre tipos de dato boolean Teniendo en cuenta esto, se podría decir que las siguientes expresiones sontodas verdaderas (TRUE): (6+8)/2=7 6+8/2=1O 6a2=&#39;6"||a2 7 != 10 O <> NULL O IS NULL = FALSE 0 IS NOT NULL = TRUE 6 BETWEEN 2 AND 8 6a2 LIKE %24 6a2 LIKE 6% 6 IN (6,82) a IN (b ( 5 ) ,a) b NOT IN (b,a) (3 < 5) AND 5 >= ) (3 < 5 OR (5 <= 3) Además de los operadores, existen funciones tremendamente útiles para la toma de decisiones. Tal es el ejemplo de las funciones DECODE, NVL y REPLACE. -DECODE(argumento, patrónl, resultadol, patrón2, resultado2. .. , resultado_por_defecto): Compara el valor del argumentocon cadauno de los patrones y en cuando encuentra la coincidencia devuelve elresultado corres- pondiente, o el resultadmporxdefecto en casode que no encuentre coincidencia en ningún patrón proporcionado. Cualquiera de los patrones puede tornar el valor NULL. n NVL(valor1, valor2): Si el valorl es nulo,entonces se devuelve elvalor2, en
  • 254.
    Capítulo 6. Programaciónde bases dedatos 6.5. Estructuras de control Cuando se crea. un programa, todas las sentencias se ejecutan siguiendo una secuencia, esdecir, el ujo de ejecución del programa Consiste en ejecutar una ins- trucción detrás de otra. Las estructuras de control sirven para controlar ese ujo del programa, la toma de decisiones yprogramar las acciones enconsecuencia. Todaslas estructuras de control están basadas enla evaluación de una expresión lógica más o menos compleja que constituye en sí misma una condición. En caso de cumplirse la condición, es decir, en caso de que la evaluación de la condición dé como resultado el valor TR UE, se tomará una acción, en caso negativo otra o nada. Hay dos tipos de sentencias de control de ujo, condicionales e iterativas. En las condicionales, la decisión que se toma es alternativa, es decir, se ejecuta un bloque de sentencias u otro. En las iterativas o bucles, la decisión que se toma es si repetir la ejecución de un bloque de instrucciones o no repetirlo. 6.5.1. IF..THEN-ELSIF..THEN-ELSE-END IF Hay tres formas de usar la sentencia condicional IF: evaluando una única condi- ción (IF-THEN ), más deuna condición(ELSIF- THEN), y/o añadiendouna opción de acción por defecto en casode que no se cumpla ninguna condición de las exigidas (ELSE Las cláusulas ELSIF y ELSE son opcionales. Ejemplo de condicional CREATE OR REPLACE PROCEDURE Calificacion(Nota NUMBER) as BEGIN IF Nota >= 0 AND Nota <5 THEN DBMS_0UTPUT.PUT_LINE(Suspenso); ELSIF Nota >= 5 AND Nota < 6 THEN DBMS_0UTPUT.PUT_LINE(Suficiente); ELSIF Nota >= 6 AND Nota < 7 THEN DBMS_ÜUTPUT.PUT_LINE(Bien); ELSIF Nota >= 7 AND Nota < 9 THEN DBMS_0UTPUT.PUT_LINE(Notable); ELSIF Nota >= 9 AND Nota <= 10 THEN DBMS_0UTPUT.PUT_LINE(Sobresa1iente); ELSE DBMS_0UTPUT.PUT_LINE(Ca1ificación errónea); END IF; END; / En el ejemplo anterior se haceuso de la función DBMSLOU TP U T.P U T_LINE para escribir el resultado de la evaluación de cada condición. La misión de dicha función
  • 255.
    Bases de Datos es lade mostrar por pantalla un mensaje visible al usuario, pero para que este pueda verlo, ha de activarse la variable de entorno del SQL*Plus llamada SERVEROU T- PU T, que es local a la sesión actual en curso. 6.5.2. CASE-WHEN..THEN-ELSE-END CASE Es una estructura de control condicional que permite ejecutar distintas sentencias ante los distintos valores posibles de la misma condición. En los ejemplos siguientes se exponen dos formas de programar esta estructura, una escribiendo cada vez la condición candidata, y la otra, poniéndola solo una vez. Ejemplo 1 de CASE-WHEN..THEN-ELSE-END CASE SET SERVERÜUTPUT DN CREATE OR REPLACE PROCEDURE Ca1ificacion(Nota NUMBER) as BEGIN CASE WHEN Nota >= O DBMS_OUTPUT. WHEN Nota >= 5 DBMS_OUTPUT. WHEN Nota >= 6 DBMS_OUTPUT. WHEN Nota >= 7 DBMS_OUTPUT. WHEN Nota >= 9 DBMS_OUTPUT. END CASE; END; / AND Nota < 5 THEN PUT_LINE(Suspenso); AND Nota < 6 THEN PUT_LINE(Suficiente); AND Nota < 7 THEN PUT_LINE( Bien); j AND Nota < 9 THEN PUT_LINE(Notab1e);i AND Nota <= 10 THEN PUT_LINE(Sobresa1iente); ELSE DBMS_0UTPUT.PUT_LINE(Calificación errónea);
  • 256.
    Capítulo 6. Programaciónde bases dedatos Ejemplo 2 de CASE-WHEN..THEN-ELSE-END CASE SET SERVERDUTPUT ON CREATE DR REPLACE PRÜCEDURE Ca1ificacion(Nota VARCHAR) as BEGIN CASE Nota WHEN Suspenso THEN DBMS_0UTPUT.PUT_LINE(Calificación menor de 5.); WHEN Suficiente THEN DBMS_0UTPUT.PUT_LINE(Calificación entre 5 y 6.); WHEN Bien THEN DBMS_OUTPUT.PUT_LINE(Ca1ificación entre 6 y 7.); WHEN Notab1e THEN DBMS_0UTPUT.PUT_LINE(Ca1ificación entre 7 y 9.); WHEN Sobresaliente THEN DBMS_0UTPUT.PUT_LINE(Ca1ificación entre 9 y 10.); ELSE DBMS_DUTPUT.PUT_LINE(Ca1ificación errónea); END CASE; END; / 6.5.3. LOOP-EXIT WHEN-END LOOP Para construir sentencias iterativas o bucles existen varias opciones, la primera de ellas es esta, que garantiza que por lo menos una vez, la ejecución del programa entra en la codicación hecha dentro del bucle. Existen dosformas desalir del bucle, encualquier circunstancia(EXIT), o po- níendo unacondición (EXIT WHEN). Ejemplo de LOOP-EXIT WHEN-END LOOP SET SERVEROUTPUT ON DECLARE contador NUMBER(3); BEGIN contador := 1; LOOP EXIT WHEN contador > 99; contador := contador + 1; END LOOP; DBMS_OUTPUT.PUT_LINE (E1 valor de salida deberia ser 100: || contador); END; /
  • 257.
    Bases de Datos Ejemploequivalente de LOOP-EXIT WHEN-END LÜÜP SET SERVERÜUTPUT DN DECLARE contador NUMBERCS); BEGIN contador :=1; LOOP IFcontador > 99THEN EXIT; END IF; contador := contador + 1; END LOOP; DBMS_0UTPUT.PUT_LINE (E1 valor de salida deberia ser 100: II contador); END; / 6.5.4. WHILE..LOOP-END LOOP Esta sentenciaiterativa es otro tipo de bucle. Se diferencia del anterior en que la ejecución del programatiene que evaluar la condiciónantesde ejecutar el bloque de sentencias del bucle. Ejemplo de WHILE..LDDP-END LOOP SET SERVERDUTPUT ON DECLARE contador NUMBER(3); BEGIN contador :=1; WHILE contador < 100 LOOP contador := contador + 1; END LOOP; DBMS_OUTPUT.PUT_LINE (E1 valor de salida deberia ser 100: II contador); END; /
  • 258.
    Capítulo 6. Programaciónde bases de datos Usando en vez de IN, la opción IN RE VERSE, se conseguiríaque el bucle fuera contando de manera descendente,de mayor a menor. En el siguiente ejemplo, el contenido del bucle se ejecuta 100 veces,desde el 1 hasta el 100. Si el límite inferior del contador coincide con el superior (FOR z" IN 100..100 LOOP),el cuerpodel buclese ejecutaríauna solavez, otorgandoel valor 100 a la variable i. Ejemplo de FOR. .IN. .LDOP-END LODP SET SERVERÜUTPUT ON DECLARE contador NUMBER(3); BEGIN FOR contador IN 1..100 LOÜP DBMS_OUTPUT.PUT_LINE (El valor del contador es: II contador); END LODP; END; / Es posible interrumpir la ejecución del bucle y salir de él. Como en el caso delos bucles simples, pueden usarseen cualquier momento dentro de la programación del bucle FOR las cláusulas EXI T y EXI T WHEN. Los bucles FOR son ideales para recorrer los registros resultantes de una consulta (sentencia SELECT),ya seamediante eluso decursores5 o directamente incluyendo la sentencia en la cláusula IN. Véase los ejemplos. Ejemplo de FOR. .IN. ¿DOP-END LOÜP con consulta SET SERVEROUTPUT ON DECLARE BEGIN DBMS_0UTPUT.PUT_LINE (Los sueldos ordenados de menor a mayor son: ); FOR i IN (SELECT sueldo FROM contratadosmominas ORDER BY sueldo) LÜDP DBMS_0UTPUT.PUT_LINE (i.sue1do); END LDÜP; END; / 5Un cursor es una estructura de datos concebidapara recorrer el resultado de una consulta (sentencia SELECT). Mediante el uso de la instrucción FETCH nombre_del_cursorINTO lis- ta_de_var¿ables, el registro objeto de la consulta se extrae del cursor y se introduce dentro de una variable, listo para ser referenciado.
  • 259.
    Bases de Datos Ejemplode FDR..IN..LOOP-END LOOP con cursor SET SERVEROUTPUT DN DECLARE vSue1do contratados.nominas.sue1do%TYPE; CURSOR curSueldo IS SELECT sueldo FROM contratados.nominas ORDER BY sueldo DESC; BEGIN OPEN curSue1do; DBMS_OUTPUT.PUT_LINE (Los diez sueldos más altos (de mayor a menor):); FOR i IN 1..10 LOOP FETCH curSueldo INTO vSue1do; DBMS_OUTPUT.PUT_LINE (vSue1do); END LOOP; CLOSE cursueldo; END; / Pero, ¿qué pasaría si en el ejemplo del bucle FOR con cursor no hubiera más de 3 registros en la tabla contratadosnominas? Al intentar imprimir el dato del sueldo tras hacer el FE TCH cuando i fuese >= 4, aparecería repetido el valor del último sueldo recuperado, esto es debido a que, como la tabla no tiene más registros, el FE TCH no consigue volver a inicializar la variable vSueldo. Para evitar ese mal funcionamiento se podría optar por incluir una cláusula EXI T WHEN que obligara a abandonar el lazo al llegar al nal del cursor (atributo N OTF O UND del cursor). Ejemplo de FOR..IN..LOOP-END LOOP con cursor y EXIT WHEN ___________¡ SET SERVEROUTPUT ON DECLARE vSue1do contratados.nominas.sue1do%TYPE; CURSOR cursueldo IS SELECT sueldo FROM contratados.nominas ORDER BY sueldo DESC; BEGIN OPEN cursueldo; DBMS_OUTPUT.PUT_LINE (Los diez sueldos más altos (de mayor a menor):); FOR i IN 1..10 LOOP FETCH cursueldo INTD vsueldo; EXIT WHEN curSue1do%NOTFOUND; DBMS_OUTPUT.PUT_LINE (vsueldo);
  • 260.
    6.6. Capítulo 6. Programaciónde bases dedatos Gestión de errores Algo imprescindible en toda programación es la codicación de una sección para interceptar posibles errores que pudieran ocurrir durante la ejecución del programa (ya seanerrores conocidos o desconocidos, previstos oimprevistos), yen consecuen- cia, tomar las medidas oportunas o escribir un mensaje apropiado. Para ello se usa el bloque EX CEPTI ON con la cláusula WHEN THEN que sirve para ltrar el tipo de error deseado. Algunos de los errores predenidos que pueden interceptarse son: CASE_NOT.FOUND: ninguno de las condiciones de la sentencia WHEN en 1a estructura CASE se corresponde conel valor evaluado y no existe cláusula ELSE. CURSOR_ALREADY_OPEN: el cursor que intenta abrirse ya está abierto. INVALID_CURSOR: la opera- ción que está intentando realizar- se con el cursor no es válida, por ejemplo, porque quiera cerrarse un cursor que no se ha abierto previa- mente. INVALID_NUMBER o VA- LUE_ERROR: la conversión de una cadena a valor numérico no es posible porque la cadena no repre- senta un valor numérico válido. VALUEERROR: error ocurrido en alguna operación aritmética, de conversión otruncado, por ejemplo, cuando se intenta insertar en una variable un valor de más tamaño. LOGIN_DENIED: un programa está intentando acceder a la base de datos con un usuario o password incorrectos. NOT_LOGGED_ON: un progra- ma está intentando ejecutar algo en la base de datos sin haber formali- zado previamente la conexión. NO_DATA_FOUND: una sen- tencia SELECT IN T0 no devuelve ningún registro. TOO_MANY_ROWS: una sen- tencia SELECT INTO devuelve más de un registro. TIMEOUT_ON_RESOURCE: se ha acabado el tiempo que el SGBD puede esperar por algún re- curso. ZERODIVIDE: algún programa intenta hacer una división de un número entre cero. OTHERS: es la opción por defec- to. Interceptará todos los errores no tenidos en cuenta en las condicio- nes WHEN de la cláusula EXCEP- TI ON donde se encuentre. 251
  • 261.
    Bases de Datos Ejemplode gestión de errores SET SERVERDUTPUT ON DECLARE meslnicio CHAR(2) := 6a; mesFin CHAR(2) := 10; mesesTranscurridos NUMBER(2); BEGIN mesesTranscurridos := mesFin -meslnicio; EXCEPTIDN WHEN INVALID_NUMBER THEN DBMS_OUTPUT.PUT_LINE(Error INVALID_NUMBERinterceptado.); WHEN VALUE_ERRDR THEN DBMS_OUTPUT.PUT_LINE(Error VALUE_ERROR interceptado.); END; / Ejemplo de CASE-WHEN..THEN-END CASE sin ELSE y con gestión de errores SET SERVERÜUTPUT DN CREATE OR REPLACE PROCEDURE Nota(Calificacion VARCHAR) as BEGIN CASE Calificacion WHEN Suspenso THEN DBMS_0UTPUT.PUT_LINE(Nota >=0 y <5); WHEN Suficiente THEN DBMS_0UTPUT.PUT_LINE(Nota >=5 y <6); WHEN Bien THEN DBMS_ÜUTPUT.PUT_LINE(Nota>=6 y <7); WHEN Notab1e THEN DBMS_ÜUTPUT.PUT_LINE( Nota>=7y <9) ; WHEN Sobresa1iente THEN DBMS_UUTPUT.PUT_LINE(Nota>=9 y <=10); END CASE; EXCEPTION WHEN CASE_NÜT_FOUND THEN DBMS_0UTPUT.PUT_LINE(Calificación errónea);
  • 262.
    Capítulo 6. Programacióndebasesde datos Ejemplo de gestión de errores extrayendo los códigos de error SET SERVEROUTPUT UN DECLARE sue1doMaximo NUMBER(4); --saltará excepción sisueldo>9999 codigoError NUMBER; textoError VARCHAR2(64); BEGIN SELECT MAX(sue1do) INTO sue1doMaximo FROM contratados.nominas; DBMS_0UTPUT.PUT_LINE(E1 sueldo más alto es:|Isue1doMaximo); EXCEPTIDN WHEN ÜTHERS THEN codigoError := SQLCDDE; textoError := SUBSTR(SQLERRM, 1, 64); DBMS_ÜUTPUT.PUT_LINE(E1código del error interceptado es: II codigoError II y su texto: II textoError); La variable sueldoMazrimo estádenida comoNUMBER(4) y soloadmitirá valores entre -9999 y 9999. Si en la tabla de nóminashay algún empleadoque ganemás de 9999 euros,la sentencia SELECT Max(sueldo) retornará un valor que no puedeser almacenadadentro de la variable sueldoMazimogenerándose así una excepción: El código del error interceptado es: -6502 y su texto: ÜRA-O6502: PL/SQL: error: precision de numero demasiado grande 6.7. Transacciones en scripts Cuando en los programasademásde consultarlos objetosde la basede datos también sehacenmodicaciones en los mismos,resulta de vital importancia cono- cer qué es una transacción.Es la herramienta que tienen las basesde datos para garantizar la integridad de losdatos. Tal y como se introdujo en el capítulo 5, una transacciónes una seriede ins- truccionesde manipulaciónde datos (DML) queconstituyenuna unidad de trabajo completa.Si el programafallara en mitad de una transacción,deberíasercapazde deshacertodoslos cambioshechoshasta esemomentoen la transacciónpara dejar lastablas de la basede datostal y comoestabanoriginalmente. Por ejemplo,en cualquieroperaciónde transferenciabancaria,una unidad com- pleta de trabajo sería sumar el dinero a la cuenta destinoy restarlo de la cuenta origen.Si despuésde sumar el dinero a la cuenta destino,la transacciónfallara a1 restarlo de la cuenta origen,el programadebería deshacer1asuma del dinero a la
  • 263.
    Bases de Datos cuentadestino, de otro modo. el banco origen perdería el dinero de la transferencia. Recuerda. A la operación de deshacer se laconoce como hacer ROLLBA CK, mientras que la operación de validar el total de la transacción es hacer COJMMI T.Explícitamente. se pueden escribir esos comandos(ROLLBA CK y COMMI T) en el programa para terminar la transacción, no obstante, debe tenerse en cuenta que existen operaciones que implican un commit implícito. Tal es el caso de las sentencias de denición de datos (DDL), es decir, si en medio de una transacción se creara una nueva tabla. implícitamente se estaría haciendo un commit, con lo que quedarían validadas todos las operaciones anteriores y se pondría n a la transacción. Otras formas de hacer commit implícito es ejecutar un simple DISCONNECT para cerrar la conexión del usuario actual a la base de datos. o ejecutar EXIT o QUIT para salir de la sesión actual del SQL*Plus: en cambio, si en vez de sa.lir ordenadamente del SQL*Plus se abortara su sesión, la base de datos haría un rollback implícito. <> Actividad 5.2: Para comprobar el commit orollback implícito en Oracle, crea con SQL*Plus una tabla y haz pruebas con ella: insértale un registro, valídalo con COMMI T, inserta otro y aborta la sesión del SQL*Plus, vuelve a abrir una sesión de SQL*Plus, comprueba que el número de registros que hay en la tabla. essolo uno. inserta otro, crea otra tabla (se hará commit implícito de la sesión), aborta la sesión de SQL*Plus y comprueba que esta vez sí que hay dos registros en la tabla original. ¿Sabías que . . . 7 En muchos SGBD también es muy usado lo quese cono- ce como TWO_PHASE-COMIIIT. que es una forma de denir transacciones en dos partes. de modo que una parte pertenecería a una base de datos y otra a otra. Esto esmuy corriente en sistemasque están distribuidos en varias bases de datos, por ejemplo. los datos de banca tradicionalmente se han encontrado almacenados en bases dedatos residentes en máquinas HOST. a las que tiene que accedersedesde basesde datos localizadas en máquinas UNIX para hacer determinadas operaciones, las cuales solo podrán quedar validadas si las ope- raciones hechas en las bases de datos del HOST han tenido éxito, por lo que la transacción completa está dividida en dos partes, una en HOST y otra en UNIX, pero solo podrá ser validada si tuvo éxito en ambos entornos. 254
  • 264.
    Capitulo 6. Programaciónde bases dedatos A continuación se ofrece un ejemplo en el que se actualiza el sueldo a todos los empleados contratados. La actualización consiste en subirles el IPC, pero solo deberá validarse en el caso de que todas las actualizaciones hayan tenido éxito. Ejemplo de subida de sueldo SET SERVERÜUTPUT ON DECLARE ipc NUMBER(2,1) := 3.2; codigoError NUMBER; textoError VARCHAR2(64); BEGIN FOR i IN(SELECT sueldo, nif FROM contratados.nominas) LOOP UPDATE contratados.nominas SET sueldo = sueldo + sueldo *ipc /100 WHERE nif = i.nif; END LÜOP; CÜMMIT; EXCEPTIDN WHEN ÜTHERS THEN codigoError := SQLCDDE; textoError := SUBSTR(SQLERRM, 1, 64); DBMS_0UTPUT.PUT_LINE(E1 código del error interceptado es: II codigoError II y su texto: II textoError); ROLLBACK; Otro ejemplo servirá para ilustrar el mismo caso anterior de subida de sueldo masiva, pero en esta ocasión, en vez de validar la transacción solo si todas las actualizaciones han ido bien, se irá haciendo commit cada mil sueldos modicados, de modo que se minimice el espacio necesarioen el tablespace de UNDO de la base de datos. El consejo del buen administrador. . . En actualizaciones, inserciones o borrados masivos, hay que tener presente e] espacio para deshacer los cambios de que sedispone (espacio del tablespace de UNDO). 255
  • 265.
    13ases de [Datos SET SERVERDUTPUTON DECLARE ipc contador codigoError textoError contadorErrores BEGIN FOR i IN(SELECT BEGIN EXCEPTION WHEN DTHERS 1 J END; contador := IF contador >= CDMMIT; contador := END IF; END LODP; -- (que no hayan Ejemplo de subida de sueldo cada 1000 actualizaciones FROM contratados.nominas) LDOP UPDATE contratados.nominas SET sueldo " WHERE nif --Se pone un bloque de excepción aqui para evitar que en caso de error --en la sentencia de actualización el programa se acabe, de este modo, --el bucle continuaría actualizando el resto de sueldos codigoError textoError DBMS_DUTPUT.PUT_LINE(Error en el UPDATE: II codigoError II II textoError); contadorErrores := CÜNSTANT NUMBER(2,1) := NUMBER(4) := 0; NUMBER; VARCHAR2(64); NUMBER(38) := 3.2; 0: sueldo, nif sueldo + sueldo * ipc / 100
  • 266.
    Capítulo 6. Programaciónde bases dedatos 6.8. Las secuencias En Oracle, al contrario que en IIySQL no existe el tipo AUTOJNCREh/IENT. En su lugar, hay un objeto especial llamado secuencia quesirve para obtener valores secuenciales autoincrementados.Es másmanual que el campo AUTOJNCREMENT de MySQL, pero también es muchomás versátil, pudiendo ser utilizado en otros sitios aparte de la clave primaria de una t.ab1a. La sintaxis para la creación de estos objetos es: CREATE SEQUENCE secuencia INCREMENT BY n START WITH n {MAX VALUE n I NÜMAXVALUE} {MIN VALUE N I NÜMINVALUE} {CACHE N I NÜCACHE}; Por ejemplo: CREATE SEQUENCE NumFactura INCREMENT BY 1 START WITH 20 NÜMAXVALUE CACHE 40; Con este comando se obtiene un objeto secuencia llamado N umFactura que comen- zará en20 y se incrementará de uno en uno sin valor máximo. Además, en la memoria caché del SGBD se almacenarán los 40 números siguientes por lo que el accesoa la secuencia serámuy rápido. Se puedeutilizar este tipo de objetos mediante una SELECT de forma muy sen- cilla haciendo uso de las funciones CURRVAL (valor actual) y NEXTVAL (valor siguiente). -para incrementar la secuencia y devolver el número siguiente SELECT NumFactura.NEXTVAL from DUAL; --para devolver el número de factura actual SELECT NumFactura.CURRVAL from DUAL; 257
  • 267.
    Bases de Datos 6.9.Prácticas Resueltas Práctica 6.1: Bajada desueldo un5 % Con motivo de una crisis económica se tiene que proceder a bajar el sueldo a todos los funcionarios un 5%. Implementar un procedimiento en PL-SQL de Oracle que, basándose en una tabla inventada, simule cómo se haría esa disminución masiva del sueldo, para ello: 1. Crea el esquema funcionarios al que pertenecerán todos los objetos del pro- blema, otorgarle permiso de DBA y abrir una sesión con él. solución CREATE USER funcionarios IDENTIFIED BY passfun DEFAULT TABLESPACE users TEMPORARY TABLESPACE temp; ALTER USER funcionarios QUÜTA UNLIMITED ON users; GRANT DBA TU funcionarios; conn funcionarios/passfun 2. Crea la tabla nominas con un campo llamado sueldo tipo N UMBER(8,2) y otro llamado nif tipo VARCHAR2(9). solución --La tabla se creará en el tablespace por defecto CREATE TABLE nominas (nif VARCHAR2(9) NOT NULL, sueldo NUMBER(8,2) NOT NULL); 3. Crea una tabla donde seregistren los errores en la actualización del sueldo. La tabla se llamará erroresBajadaSue1do y tendrá tres campos: nif, codigoError y tezrtoError. solución --La tabla se creará en el tablespace por defecto CREATE TABLE erroresBajadaSue1do (nif VARCHAR2(9) NOT NULL, codigoError NUMBER, textoError VARCHAR2(64)); 4. Crea un paquete que sellame paq_bajada_sueldo que seráel que contenga todas las funciones y procedimientos para llevar a cabo el problema. Dene una 258
  • 268.
    Capítulo 6. Programaciónde bases dedatos constante para el porcentaje de bajada de sueldo. El paquete deberá tener además: a) Un procedimiento paq_bajada_sueldo. bajmsueldos queabrirá un cursor pa- ra recorrer todos los sueldos de los funcionarios y proceder a su dismi- nución. Además, el procedimiento será capaz de ir rellenando la tabla erroresBajadaSuveldo conlos errores encontrados en la actualización del sueldo. b) Una función llamada paq_bajada_sueldo.hubo-erroresjajandmsueldos que evalúe la tabla de errores y determine si ha habido algún error o no. La función tendrá como parámetro de salida un booleano que indicará si hubo algún error o no. solución CREATE OR REPLACE PACKAGE paq_bajada_sue1do AS PRDCEDURE baja_sue1dos; FUNCTIÜN hubo_errores_bajando_sue1dos RETURN BOOLEAN; --El porcentaje de bajada se define como --una constante global al paquete porcentaje CDNSTANT NUMBER := 5; END paq_bajada_sue1do; / CREATE OR REPLACE PACKAGE BODY paq_bajada_sue1do AS PROCEDURE baja_sue1dos IS codigoE NUMBER; textoE VARCHAR2(64); BEGIN FOR i IN (SELECT nif, sueldo FROM nominas) LOOP BEGIN UPDATE nominas SET sueldo -i.sueldo -i.sueldo *porcentaje / 100 WHERE nif = i.nif; --Se pone un bloque de excepción aqui para evitar que --en caso de error en la sentencia de actualización el --programa se acabe, de este modo, el bucle continuaría --actualizando el resto de sueldos EXCEPTION WHEN ÜTHERS THEN codigoE := SQLCODE; textoE := SUBSTR(SQLERRM, 1, 64); INSERT INTO erroresBajadaSue1do (nif, codigoError, textoError) VALUES (i.nif, codigoE, textoE); END; COMMIT; END LÜOP; END baja_sue1dos;
  • 269.
    Bases de Datos FUNCTIONhubo_errores_bajando_sue1dos RETURN BÜOLEAN IS res BDOLEAN := FALSE; numErrores NUMBER; BEGIN SELECT COUNT(*) into numErrores from erroresBajadaSue1do; IF numErrores > O THEN res := TRUE; END IF; RETURN res; END hubo_errores_bajando_sue1dos; END paq_bajada_sueldo; / 5. Escribecómoseinvocaríala operativa completa:borrado del contenidode la tabla de errores,llamada al procedimientobajmsueldos y llamada a la función hubo-erroreabajandmsueldos. solución SET SERVERDUTPUT DN --Se borra el contenido antiguo de la tabla de errores DELETE FROM erroresBajadaSue1do; --Se invoca el procedimiento de bajada de sueldos CALLpaq_bajada_sueldo.baja_sueldos(); --Se comprueba si hubo algún error BEGIN IF paq_bajada_sueldo.hubo_errores_bajando_sue1dos THEN --Hubo errores. Se presentan por pantalla. FOR iIN (SELECT * FROMerroresBajadaSue1do) LOÜP DBMS_0UTPUT PUT_LINE(Error al actualizar el sueldo del II funcionario con NIF II i.nif II. Código II i.codigoError Il y su texto: II i.textoError); END LOOP; END IF; END; / 0 Práctica 6.2: Procedimientos almacenados en MySQL Crea una tabla innodb en la BBDD jardineria llamada ActualizacionLímíteCredito con tres 260
  • 270.
    Capítulo 6. Programaciónde bases dedatos campos: Fecha, CodigoCliente, Incremento. Crea un procedimiento almacenado pa- ra actualizar los límites de crédito de los clientes en un°7o del total pedido entre 2008 y 2010 registrando el incremento en la tabla creada. Al terminar, invoca al procedimiento paraactualizar ellímite de Crédito enun 15 (7o. solución CREATE TABLE ActualizacionLimiteCredito( Fecha DATETIME, CodigoC1iente INTEGER, Incremento NUMERIC(15,2) ) engine=innodb; delimiter // CREATEPROCEDURE IncrementaLimCredito (IN porcentaje INTEGER) BEGIN DECLARE Tota1Pedidos,Credito,Incremento NUMERIC(15,2); DECLARE C1iente,Terminado INTEGER DEFAULT O; #cursor para recorrer clientes DECLARE curclientes CURSOR FOR SELECT Limitecredito,CodigoC1iente FROM Clientes; #A1 terminar de recorrerse, se activará la variable terminado DECLARE CONTINUE HANDLER FOR SQLSTATE O2000 SET Terminado = 1; #Si ocurre alguna excepción se producirá un rollback DECLARE EXIT HANDLER FOR NOT FOUND rollback; DECLARE EXIT HANDLER FOR SQLEXCEPTION rollback; OPEN curC1ientes; START TRANSACTION; FETCH curC1ientes INTO Credito,C1iente; #primer cliente WHILE NOT Terminado DO SELECT SUM(Cantidad*PrecioUnidad) INTO Tota1Pedidos #Tota1 de pedidos? FROM Deta11ePedidos NATURAL JOIN Pedidos WHERE YEAR(FechaPedido) BETWEEN 2008 AND 2010 AND Pedidos.CodigoCliente=Cliente; IF Tota1Pedidos IS NOT NULL THEN #Si hay pedidos SET Incremento=Tota1Pedidos*Porcentaje/100; UPDATE Clientes SET LimiteCredito=LimiteCredito+Incremento WHERE CodigoC1iente=C1iente; INSERT INTO ActualizacionLimiteCredito VALUES(now(),C1iente,Incremento); END IF; FETCH curC1ientes INTO Credito,C1iente; #siguiente cliente END WHILE; COMMIT; END; // delimiter ; call IncrementaLimCredito(15); #Invocar al procedimiento 261
  • 271.
    Bases de Datos 6.10.Prácticas Propuestas Práctica 6.3: Bajada desueldo v.2.0 Se vaa efectuar una segundaversión del procedimiento de bajada de sueldo. Consiste en bajar el sueldo a todos los funcionarios, esta vez en base a un determinado porcentaje en función de su escala salarial. Extrapolar los objetos de la actividad anterior para contemplar esta nueva situación, para ello: 1. Añade a la tabla funcionaosmominas un campo que represente la escala salarial. El campo se llamará grupo y será. de tipo CHAR 2. Crea una función llamada dame_porcentaje_segun_escaladentro del paquete paq_bajada_sueldo queacepte como parámetro la escala salarial y devuelva el porcentaje de disminución a aplicar. La equivalencia entre uno y otro se hará mediante constantes globales al paquete: grupo A-10 7o, grupo B-8 (7o, grupo C-5%, grupo D-3%. 3. Modica la función baja_sueldos dela práctica anterior para que llame a la nueva damaporcentajasegun-escala para extraer el porcentaje. 4. Escribe cómo se invocaría la operativa completa: borrado del contenido de la tabla de errores, llamada al procedimiento baja_sueldos yllamada a la función hubmerrores-bajandmsueldos. Práctica 6.4: Bajada desueldo v.3.0 Modica la función damaporcentajejegun_escala para que en vez de extraer la in- formación a través de constantes, la extraiga de una tabla creada a tal efecto. La tabla deberá tener dos campos, uno con la escala (A,B. ..) y otro campo con el porcentaje a descontar. Sustituye el último punto de la práctica anterior por un procedimiento que también esté almacenado en el paquete funcionarios. paq_bajada_sueldo. <> 262
  • 272.
    Capítulo 6. Programaciónde bases de datos Práctica Facturación Se desea codicar un programa en PL-SQL para poder lanzar el proceso de facturación de la BBDD jardineria. Para ello, se deberán crear tres tablas con los siguientes comandos DDL: solución CREATE TABLE Facturas ( Codigocliente integer, Baselmponible Numeric(15,2), IVA Numeric(15,2), Total Numeric(15,2), CodigoFactura INTEGER); CREATE TABLE Comisiones( CodigoEmp1eado integer, Comision Numeric(15,2), CodigoFactura integer); CREATE TABLE AsientoContab1e( Codigocliente integer, DEBE Numeric(15,2), HABER Numeric(15,2)); A continuación programar, en un paquete llamado Facturación: 1. Una función llamada UltimaFactura que devuelva el último código de factura generado. Si no hay ningún registro en la tabla Facturas, devolverá un 1. 2. Procedimiento Facturar: Este procedimiento grabará un registro en la tabla de facturas por cada uno de los pedidos de la BBDD. Al mismo tiempo guar- dará en la tabla de comisiones una comisión del 5 % del total del pedido para. el emplea.doque haya generado la factura. 3. Procedimiento GenerarContabilidad: Este procedimiento guardará en la tabla AsientoContable un registro por cada grupo de facturas, almacenando en el campo DEBE la suma de las facturas que han sido generadas. 263
  • 273.
    Bases de Datos 6.11. 264 Resumen Losconceptos clave de este capítulo son los siguientes: Las aplicaciones de basede datos pueden serde tres tipos distintos: codicada en el lado del servidor, modelocliente/ servidory modelo en tresniveles. Las sentencias SQL se pueden ejecutar de forma estática o dinámica. Una sentencia estática debe precompilarse, vincularse y compilarse antes de ser ejecutada en la aplicación. Una sentencia dinámica. es creada en el momento de la ejecución. El lenguaje PL/SQL fue desarrollado por Oracle para añadir más potencia de ejecución a las sentencias SQL, con él es posible denir variables, crear estructuras de control de ujo y toma de decisiones.. . Las partesde un programa PL/SQL sonel bloqueDECLARE, el bloque BE- GIN..END y el subbloque EX CEPTION. Los distintos programas quepueden crearse con el uso dellenguajePL / SQL son: procedimientos, funciones, bloques anónimos y triggers. Los procedimientos y funciones pueden estarcontenidos dentro de otros objetos más grandes llamados paquetes, los cuales están compuestos por la cabecera y el cuerpo. SQL*Plus es la herramienta que proporciona Oracle para conectarse a la base de datos por línea de comandos y ejecutar todo tipo de comandos de base de datos, incluidos programas PL /SQL. En PL/SQL hay datos de tipo carácter, numérico,fecha, booleanos, y datos grandes entre otros. Además existen muchas funciones para gestionarlos, aun- que aquí solo se ha tratado la S UBS TR. Existen también, operadores para hacer operaciones aritméticas, comparaciones y concatenaciones. Las estructuras de control sirven para controlar el ujo del programa, la toma de decisionesy programar las accionesen consecuencia.Aquí se han estudiado el IF, CASE, LOOP, WHILE y FOR. Los tres últimos son bucles, y son muy útiles para recorrer cursores. El control de excepciones es un bloque opcional dentro de la programación pero muy recomendable. Sirve para interceptar los errores de ejecución del programa y tomar las medidas oportunas en consecuencia, de otro modo el programa terminaría abrupta y descontroladamente.
  • 274.
    6.12. Capítulo 6. Programaciónde bases dedatos Test de repaso 1. ¿Qué tipo de variable tendría que de- nirse para albergar el dato 3.2? a) CHAR(3) b) NU1IBER(2,1) c) NUMBERU(3) d) a) y b) 2. ¿Qué es el ROWID? a) Es una la especial de la tabla b) Es una funciónideal paragenerar las au- tomáticamente c) Es una columna interna que almacena la dirección física de cada la d) Es un tipo de excepciónmuy utilizada 3. ¿Cómo se dene una constante? a) nombre_de_]a_constante CONSTANT ti- po_de_dato := valor; b) nombre-de.la-constante tipo_de_dato := valor CONSTANT c) CONSTANT nombre_de_la_const.ante ti- po_de_dato := valor: d) nombre_de_1a_constante CONSTANT ti- po_de_dato := valor 4. La expresión 5 = 5 es: a) FALSE b) TRUE 5. El extracto de denición dame_sueldo() RETURN NUMBER(6) IS corresponde a a) Un procedimiento b) Una función C) Un disparador ) d Un paquete 6. Si la variable suspenso es TR UE, qué valor tendrá la expresión NOT sus- penso a) NULL b) FALSE c) TRUE 7. Si la variable gallo es Wikir-ikí, qué valor resultará de la función REPLACE(gallo, i, o): a) o b) oooooooo c) kokoroko ) d kokorokí 8. ¿Qué función se usa para escribir mensajes por pantalla en los programas PL/SQL? a) PUT_LINE b) DBMS_OUTPUT.PUTLINE c) DB1ISOUTPUT.PUT_LINE d) PUTLINE 9. ¿Qué variable de entorno del SQL*Plus hay que activar para que la función de la pregunta 8 escriba por la salida estándard? a) La función escribe siempre b) SEVER_OUTPUT c) SERVEROUTPUT a&#39;s&#39;esp&#39;¿&#39;q&#39;9q&#39;9qr&#39;e&#39;sn&#39 265
  • 275.
    Bases de Datos .Explicaqué es la ¿Qué esuna transacción? ¿En qué consiste la validación transaccional implícita? ¿Para quése usael atributo %TYPE? ¿y %ROWTYPE? Pon ejemplos con todos los opera- dores de comparación. Ventajas del uso del R0 WID. ¿Dónde se puede usar la cláusula EX] T WHEN? ¿Para qué sirve la tabla de sistema ¿Cuál es el signo comodín en las comparaciones entre datos de tipo cadena?, ¿cómose usa? ¿Qué hace la instrucción FETCH en el contexto de los cursores? El atributo NOTFOUND, ¿de dónde es, para qué es y cómo se conversión implícita de tipos de datos. ¿Qué signica que en una base de datos todos los objetos tienen que estar identicados unívocamente? Expon las diferencias entre proce- dimientos y funciones. 6.13. Comprueba tu aprendizaje 1. Dene qué es un cursor, para 15. qué sirve y distintas formas de re- correrlo. 16&#39; 2. Dene los distintos bloques de que se compone un programa PL /SQL. 17&#39; 3. ¿Para qué se usan los paquetes? 18 4. Dene qué esun disparador y los ti- pos distintos que hay. Pon un ejem- plo. 19&#39; 5. Enuncia las diferencias entre el 20&#39; SQL dinámico y el estático. 6. ¿Qué son los datos tipo LOB? ¿Pa-21&#39; ra qué sirven? D UAL? 7. Enumera los tiposde datos tipo 22&#39; carácter. 8. Enumera los tipos y subtipos de da- tos tipo numérico. 23&#39; 9. Enumera los tipos de datos tipo fe- Cha_ 24. 10. Ventajas del CASE frente al usa? IF..ELSIF y al revés. 2_ o 11. Ventajas del LOOP frente al WHI- LE y al revés. 26. 12. ¿Qué error intercepta el evento NO_DATA_FOUND? 13. ¿Cuándo se producirá un 27. T00_MANY_RO WS? 14. Explica cómo se usan las funcio- 28. 266 nes especiales SQLCODE y SQ- LERRM. Explica los distintos tipos de apli- caciones debase de datos que exis- ten.
  • 276.
    CAPÍTULO 7 BBDD distribuidas ContenidosQbjet ¡VOS É BBDD Y SGBD distribuidos "S? Reconocer la utilidad de las ba- g Colnponentes de una BBDD ses de datos distribuidas distribuida Conocer cómo realizar consul- ,. ., tas Tecnicas de fragmentacion W Conocer el funcionamiento de Consultas distribuidas las transacciones distribuidas Transacciones distribuidas . . . . , . Describir las distintas politicas bre bases de datos distribuidas C101- En este capítulo se explican las peculiaridades de las consultas en bases de datos distribuidas, se realizan operaciones básicaspara que e] alumno aprecie Ia complejidad de este tipo de sistemas y a1 mismo tiempo su sencilla implan- tación, gracias a las propias herramientas proporcionadas por 10s SGBD. 267
  • 277.
    Bases de Datos 7.1.BBDD y SGBD distribuidos Cuando una base de datos está controlada por más de un servidor se dice que está distribuida. Estos servidores están interconectados mediante una red de te- lecomunicaciones y los SGBD proporcionan mecanismos para poder consultar la información independientemente del servidor y la ubicación de los datos. Así por ejemplo, una consulta con una join entre la tabla de pedidos y la de clientes puede estar accediendo a dos servidores con dos instancias de bases de datos distintas. Incluso, si las tablas están particionadas es posible que la misma consulta esté acce- diendo a más de dos servidores. Esto proporciona una especie de balanceo de carga para que la información pueda ser accedida lo más rápidamente posible. De esta manera se consiguen los siguientes benecios: 1. Más rapidez en el acceso a los datos y capacidad de almacenamiento. Al au- mentar el número de ordenadores donde se depositan los datos, aumenta la capacidad de computación, y por tanto, la capacidad de búsqueda de la infor- mación. 2. Acceso más exible. El número de usuarios conectados quepuede mantener el sistema se incrementa al haber más capacidad de cómputo y, gracias a la red de la BBDD distribuida, los usuarios pueden acceder desde más ubicaciones. 3. Escalabilidad. Distribuyendo una base de datos en distintas ubicaciones se permite incrementar de forma muy sencilla los recursosen cualquier momento para acomodar el sistema a las demandas de los usuarios y las aplicaciones. 4. Fiabilidad y cierta capacidad de tolerancia a fallos. Realizando una buena política de fragmentación de la base de datos es posible conseguir que aunque algún nodo de la base de datos distribuida sufra algún percance, el resto del sistema siga funcionando con normalidad. Por otro lado, no todo son benecios, no hay que perder de vista que estos sis- temas son muy costosos de implementar no solo por la duplicidad de recursos en términos de red y servidores, también por la dicultad de la administración de los datos ubicados en distintas localizaciones y porque se introduce un elemento caótico como la dependencia delas redesde comunicacionespara el correcto funcionamiento del intercambio de los datos. Ademas, la atomicidad de las operaciones esmás com- plicada de conseguir por lo que la gestión transaccional tiene dicultades añadidas como se comentará en la sección 7.3.2. 7.1.1. Componentes de una BBDD distribuida Para poder crear una base de datos distribuida hay que tener los siguientes componentes. 268
  • 278.
    Capítulo 7. BBDDdistribuidas 1. Sistemas gestores con capacidades distribuidas o un SGBD distribuido en sí mismo. 2. Un conjunto de bases dedatos locales a cada uno de los servidores que alber- garán la BBDD. 3. Una red de comunicaciones, generalmentebasada enel protocolo TCP-IP para poder aprovechar las infraestructuras existentes. 4. Enlaces entre las BBDD locales. Los SGBD deben ser capaces de establecer enlaces entre las diversas bases dedatos locales, de tal manera que cualquier consulta pueda ser redirigida al servidor donde está la BBDD local. 5. Un diccionario de datos global que indique en qué ubicación está cada uno de los datos que componen la BBDD distribuida. BASE DE DATOS DISTRIBUIDA BBDD Ventas A BBDD Marketing B Red de Comunicaciones 1_ select sun (Total) from Pedidoseventas: insert into Balances values. .. update Pronocionrï-llarketinq .. Cosmic: Enlace A-C Nace B-C BBDD Contabilidad C Figura 7.1: Componentes de una base de datos distribuida. Dependiendo del tipo de componentes elegidos en la formación de una base de datos distribuida se pueden tener: 1. BBDD distribuidas homogéneas: En estas el SGBD utilizado es el mismo para todas las BBDD locales. Generalmente, el SGBD proporciona. la tecnología para el enlace de las distintas BBDD locales. 2. BBDD distribuidas heterogéneas: Las bases de datos están distribuidas inde- pendientemente del SGBD utilizado como local. En este caso, las aplicaciones 269
  • 279.
    Bases de Datos queconsultan la base de datos distribuida juegan un papel fundamental como media.dor. 7.2. Técnicas de fragmentación El contenido de una tabla puede separarse envarios fragmentos que contendrán suciente información como para poder reconstruir la tabla original en caso de que sea necesario.Cada fragmento se encontrará en un nodo diferente, pero esta distri- bución a través de distintos nodos no duplica los registros, solo existirá una copia de cada elemento, por lo que, al no haber replicación. disminuye el coste de alma- cenamiento en detrimento de la disponibilidad y abilidad de los datos en caso de caída de algún nodo. La fragmentación puede ser horizontal o vertical y se puede aplicar sucesiva y alternativamente sobre la misma tabla: Horizontal: los fragmentos son subconjuntos de una tabla y se denen a través de una operación de selección. La tabla original se reconstruye en base a una operación de unión de los fragmentos componentes. Vertical: los fragmentos son subconjuntos de los atributos con susvalores. Para po- der recomponer la tabla original, cada fragmento debe incluir la clave primaria de la tabla. Mixta: se mezclan las dos técnicas anteriores. Para que una fragmentación sea correcta, esta debe cumplir con las siguientes reglas: IDebe ser completa, es decir, cada elemento de la tabla debe estar en algún fragmento. n Debe ser reconstruible, lo cual implica que debe serposible conseguir una tabla completa a partir de la combinación de todos los fragmentos. ILos fragmentos deben ser disjuntos, esto signica que si la fragmentación es horizontal, un elemento que esté en un fragmento concreto no puede estar en ningún otro fragmento más que en aquél. En el casode fragmentación vertical, puesto que es necesarioque serepitan las claves primarias, esta condición solo se tiene que cumplir para el conjunto de atributos que no son clave primaria. 270
  • 280.
    Capítulo 7. BBDD distribuidas 7.3.Consultas distribuidas Algunos SGBD manejan el concepto de sistemas de bases dedatos distribuidas de forma que cualquier aplicación que haga consultas al gestor pueda acceder a su base de datos de forma local y además, acceder a datos de bases dedatos remotas. Oracle basa su concepto de basesde datos distribuidas en un objeto llamado DA- TABASE LINK (Enlace abase de datos). LosDATABASE LINKs son unaconexión unidireccional entre una basede datos (cliente) y otra (servidor). Oracle puedesopor- tar bases de datos homogéneas yheterogéneas. Parasoportar sistemas heterogéneos es necesario que Oracle pueda acceder a los datos como si estuviese accediendo a otra base de datos Oracle, por lo que cuenta con agentes llamados Transparent Ga- teways (Pasarelas transparentes). Estos agentes son interfaces que proveen todo lo necesario para poder recuperar, insertar, actualizar o borrar información de forma transparente para las aplicaciones que se ejecutan desde Oracle. 7.3.1. DB Links Un database link es una conexión entre bases de datos. Es unidireccional por lo que se crea desde una base de datos que quiere referenciar a otra. Para que un usuario pueda crear estos DB Links son necesarioslos siguientes privilegios: n CREATE DATABASE LINK (En local). u CREATE PUBLIC DATABASE LINK (En local). ICREATE SESSION (En remoto). Es posibleconsultar los DB Links en lasvistas USER_DB_LIN KS, ALL_DB-LINKS y DBA_DB_LINKS dependiendo del usuario con el que se estéconectado al SGBD. Existen también los enlaces compartidos o SHARED DB LINKS. La diferencia es quemúltiples procesos clientes pueden usar el enlace compartido simultáneamen- te. Para crear un DB link es necesario que exista la conexión entre las bases de datos a través de Oracle Net Services, por lo que se debe crear una entrada en el tnsnames.ora de la base de datos a la que se quiere referenciar. Dentro de la de- nición se puede elegir si la conexión es dedicada o compartida, y no es lo mismo denir que la conexión que va a usar el DB link sea compartida a crear un DB link compartido. A continuación, se muestra un ejemplo de creación de un DB link para conectar una BBDD en versión 10gR2 con una BBDD 11gR2. La entrada en el chero tnsnames.ora es: 271
  • 281.
    Bases de Datos t11r2_u= (DESCRIPTION= (ADDRESS= (pnorocor = TCP)(HOST = 192.168.1.129)(PORT = 1521)) (CDNNECT_DATA = (SERVER= DEDICATED) (SID = t11r2) ) ) t11r2_u en este caso, es el nombre de la entrada para la conexión remota al servidor con dirección IP 192.168.1129. Una vez agregada la entrada al chero se puede utilizar la herramienta tnsping para comprobar que hay conectividad: C:Documents and Settingsusuario>tnsping t11r2_u TNS Ping Utility for 32-bit Windows: Version 10.2.0.4.0 -Production on 05-MAY-2011 23:23:47 Copyright (c) 1997, 2007, Oracle. A11 rights reserved. Archivos de parámetros utilizados: C:orac1eproduct10.2.0db_1networkadminsq1net.ora Adaptador TNSNAMBS utilizado para resolver el alias Attempting to contact (DESCRIPTIDN = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.129) (PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SID = t11r2))) Realizado correctamente (40 mseg) Una vez creada la entrada del chero tnsnames y probada, se pueden crear DB links públicos o privados, y es posible, además, usar un usuario especíco para la conexión en la base de datos a referenciar. Para crear un DB Link desde el usuario local al usuario remoto, se ejecutaría el siguiente comando: SQL> CREATEDATABASE LINKtj_11r2 2 CONNECT TD usuario IDENTIFIED BY password 3 USING t11r2_u; Enlace con la base de datos creado. Al ejecutar el comando anterior, se crea un objeto llamado tj_11r2 que usará la entrada tnsnames t11r2_u para conectarse ala BBDD remota. Después, para probar la conexión, se utiliza el nombre del enlace (tj_11r2) para ejecutar una consulta: 272
  • 282.
    Capítulo 7. BBDDdistribuidas SQL> select *from dua1@tj_11r2; También se pueden crear DB Links públicos que pueden serusados por cualquier usuario, y además, seanusados por usuarios que también existan en la BBDD que se referencia: SQL> CREATEPUBLIC DATABASELINK tj_11r2 2 USING t11r2_u; Enlace con la base de datos creado. 7.3.2. Ejecución de consultas distribuidas Las consultas distribuidas son consultas que recuperan información de 2 o más nodos en un entorno de bases de datos distribuido. No es lo mismo que hablar de consultas remotas, las consultas remotas son consultas que se realizan a. unao más tablas de una base de datos remota. Es importante diferenciar entre estos dos tipos de consultas las distribuidas y remotas porque internamente son diferentes. Un ejemplo de una consulta remota es el siguiente: SQL> select count(8) 2 from pacientes0t11r2; T11R2 es un DB LINK público creado a una BBDD 11gR2 en Linux, y la base de datos cliente está en 10gR2 en Windows. La ejecución de la consulta anterior prueba que existen conexión entre versiones diferentes. Esto se logra a través de Oracle Net Services. En una consulta distribuida puede darse el caso de que existan relaciones frag- mentadas. Esto se ilustra en el ejemplo siguiente: 273
  • 283.
    Bases de Datos Primerose muestra la tabla PACIENTES, fragmentada en dos basesde datos en distintos servidores y con la siguiente descripción: SQL> desc pacientes NOT NULL NUMBER VARCHAR2(100) HABITACION SQL) desc pacientes@t11r2 NOTNULL NUMBER VARCHAR2(100) FECHA_ENTRADA DATE Ahora, se consulta un paciente con ID 1, su habitación y fecha de ingreso: SQL> select 1.id, 1.habitacion, r.fecha_entrada 2 from pacientes 1, pacientesOt11r2 r where 1.id=r.id and 1.id=1 ID HABITACION FECHA_EN 10 26/04/11 Esta consulta extrae información de dos bases de datos ubicadas en servidores dis- tintos, por tanto, es distribuida. Además, desde la base de datos servidor se puede ver lo siguiente en la vista VSSESSION: SQL> select sid, seria1#, username, program, event, machine ,server 2 from vSsession 3 where username=TJ; SID SERIAL# USERNAME PROGRAM MACHINE 0RACLE.EXE SQL*Net message from client VILLEGUILLO DEDICATED Esto demuestra que cada vez que se realice una consulta a una base de datos remota, se abre una sesión conserver processdedicado si se dene en el tnsnamesora que seadedicada. Dejar las conexionesabiertas puede llegar a ser un problema: si se Va acrear un proceso que lanza cientos de consultas y que va a muchos nodos en un 274
  • 284.
    Capítulo 7. BBDDdistribuidas entorno de bases dedatos distribuido, y que además este proceso lo van a ejecutar muchas sesiones,en diferentes nodos, es seguro que se generará una explosión de conexiones abiertas, incrementando de forma radical el consumo de recursos. Para evitar esta explosión de conexiones abiertas, se puede ejecutar el cierre de los DB Links ejecutando: SQL> alter session close database link t11r2; Sesión modificada. --Esto cierra la sesión en la base de datos servidor: SQL) select sid, seria1#, username, program, event, machine, server 2 from vSsession 3* where username=TJ no rows selected 7.4. Transacciones distribuidas Una transacción distribuida es una transacción que contiene una o más sentencia y que se realiza en 2 o más nodos dentro de un entorno de base dedatos distribuido. También existen las transacciones remotas, y al igual que las consultas remotas, son transacciones con una o más sentencias que se realizan en una base de datos remota. Los elementos que pueden intervenir a tener en cuenta en una transación distri- buida se pueden ver en la siguiente gura: oo:-ina-or o-a COHHIT point sic: Coordinador Local BD Cliente .i R r BD Servidor 1 no Servidor 2 BD Servidor n Figura 7.2: Transacción distribuida. En esta gura se observan los siguientes elementos: BD Cliente Es un nodo que actúa como cliente donde se referencia la transacción distribuida. Esta BD tiene los DB links que conectan con el resto. 275
  • 285.
    Bases de Datos BDServidor Son las bases de datos que contienen información que va a ser mo- dicada por la transacción distribuida. Coordinador Local Es un nodo que debe referenciar datos sobre otros nodos para completar su parte de la transacción distribuida. Coordinador Global El nodo donde se origina la transacción distribuida. Commit Point Site Es el nodo que inicia las operaciones de COMMIT o ROLL- BACK con las instrucciones dadas por el coordinador global. Este punto se dene con el parámetro COMMITPOINTSTRENGTH, en un entorno ho- mogéneo todas las BBDD tienen un parámetro como este. La base de datos con el valor mayor en este parámetro se convierte en COMMIT POINT SITE. 7.4.1. TWO-PHASE COMMIT Un SGBD debe garantizar la atomicidad en la información de sus basesde datos y en los entornos con basesde datos distribuidas también. Para que esto seproduzca, se usael mecanismo de TWO-PHASE COMMIT o proceso deCOIÑIMIT en entornos distribuidos. Su ejecución es un poco más complicada. Se divide en 3 partes: Fase de preparación Es la primera fase y consiste en que el coordinador global informa a todos los nodos que van que se va a realizar CORIMIT o ROLL- BACK. Esto se traduce en que cada nodo se prepara para una finalización de la transacción distribuida. Para. ello realiza 2 tareas: 1. Almacena la información de Redologs. 2. Genera un bloqueo distribuido sobre la tabla para prevenir lecturas. Cuando se realizan estas 2 operaciones el nodo dice que está comprometido para la nalización de la transacción distribuida. Fase de commit Después de que todos los nodos se comprometen a realizar la transacción, se realizan los siguientes pasos: 1. El coordinador global avisa al COMMIT POINT SITE de que se va a realizar el COMMIT. 2. El COMMIT POINT SITE realiza el COMMIT. 3. El COMMIT POINT SITE indica al coordinador global que hizo el COM- MIT. 4. Los coordinadores globales y locales envían mensajes a todos los nodos para hacer COMMIT de la transacción. 276
  • 286.
    Capítulo 7. BBDDdistribuidas 5. Cada nodo realiza su parte local del COMMIT de la transacción distri- buida y quitan el bloqueo distribuido generado. 6. Todos los nodos notican a al coordinador global que han realizado el COMMIT. Fase de olvido Cuando todos notican al COMMIT POINT SITE que se ha rea- lizado el COMMIT, se realizan las siguientes tareas: 1. El COMMIT POINT SITE borra la información acerca del estado de la transacción distribuida. 2. El COMMIT POINT SITE informa al coordinador global que ha borrado ese estado. 3. El coordinador global borra la información de la transacción distribuida. 7.4.2. Ejemplo de transacción distribuida Con la tabla pacientes ubicada de forma fragmentada en dos bases dedatos, se realizan las siguientes operaciones: select * from pacientes; ID NOMBRE HABITACION 1 Pacientel select * from pacientes@t11r2 ID NOMBRE 1 Pacientel 26/O4/11 update pacientes set nombre=P1 where id=1; 1 fila actualizada. SQL> update pacientes@t11r2 2 set nombre=P1 3* where id=1 1 fila actualizada. SQL> update pacientes 2 set habitacion=10 3 where id=2; 1 fila actualizada. 277
  • 287.
    Bases de Datos Antes derealizar commit, se puedeobservar qué está sucediendo,las transaccio- nes creadasy los bloqueos generadosen la BD servidor que en este casoes t11r2: SQL> select saddr, sid, serial#, username, program, machine 2 from vssession 3 where username =TJ; SADDR SID SERIAL# USERNAME PROGRAM 37EFD738 28 sqlplusccaar (TNS V1-V3) caar STEFACCC 29 0RACLE.EXE VILLEGUILLO SQL> select SES_ADDR,START_TIME,STATUS,XID 2 from vstransaction; SES_ADDR START_TIME 37EFACCC 05/O6/11 16:03:43 ACTIVE 0600000062010000 SQL> select 1 2 from vslock 3 vhere sid=29; ADDR KADDR LMDDE REQUEST CTIME BLOCK 37ACA524 37ACA55O 29 AE 00579434 00579464 29 TM 13704 36908094 369C8OD4 29 TX 393216 Se observa que la transacción existe, que la transacción es generada por la se- sión de la conexión de la BD cliente y que tiene un bloqueo exclusivo sobre la (LMODE=3 rowX) sobre latabla PACIENTES: SQL> select object_id 2 from dba_objects 3 where object_name=PACIENTES; DBJECT_ID A continuación, también se muestran sesiones, transacciones y bloqueos en la BD Cliente: SQL> select saddr, sid, seria1#, username, program 2 from vssession 3* where username=TJ 278
  • 288.
    Capítulo 7. BBDDdistribuidas SADDR SID SERIAL# USERNAME PROGRAM 30F42BFC 1773 TJ sq1p1us.exe SQL> select SES,ADDR,START_TIME,STATUS,XID 2* from vstransaction SES_ADDR START_TIME 30F42BFC 05/06/11 16:02:46 ACTIVE 08002EO0F818000O SQL> select t 2 from vslock 3 where sid=146; ADDR KADDR LMODE REQUEST CTIME 2F5C67E4 2F5C67FC 146 TM 45926 2F616204 2F616228 146 TX 524334 6392 También se puede observar la información de los DB links abiertos en la sesión con la vista VSDBLINK. Esta consulta se ejecuta en la propia sesión que tiene la transacción: SQL> desc vsdblink DB_LINK vmcmazuzs) OHNERJD NUMBER LOGGED_0N VARCHAR2(3) HETEROGENEOUS VARCHAR2 (3) PROTÜCDL VARCHAR2(6) opmLcunsons NUMBER IN_TR.ANSACTION vacunas) UPDATE_SENT VARCHAR2(3) COMHIT_POINT_STRENGTH NUHBER SQL> select # 2 from vsdblink; DB_LINK OWNER_ID LOG HETPRDTOC ÜPEN_CURSORS IN_ UPD CÜMIT_POINT_STRENGTH 38 YES N0 UNKN Una vez realizado el COMMIT, desaparecen las transacciones y los bloqueos. Y la vista de estado de DB links abiertos en la sesión muestra: SQL) select t 2 from vSdb1ink; DB_LINK 0HNER_ID LOG HETPROTOC 0PEN_CURSORS IN_ UPD COMMIT_POINT_STRENGTH 38 YES ND UNKN 279
  • 289.
    Bases de Datos Cuando unatransacción falla en alguno de los puntos la transacción se convierte en transacción dudosa. Puede pasar cuando algún nodo se cae, la conexión de red en la comunicación de algún nodo falla o cualquier error de software no controlado. El proceso RECO es el encargado de resolver las transacciones dudosas automáti- camente y hasta que REC O no pueda resolver la transacción dudosa, el dato queda bloqueado para lectura o escritura. 7.5. Optimización de consultas sobre bases de da- tos distribuidas Cuando serealiza una consulta distribuida, hay que tener en cuenta los siguientes parámetros: OPEN_LINKS Congura la cantidad de máxima de conexiones abiertas concu- rrentemente para bases dedatos remotas por cada sesión. COMMIT_POINT_STRENGTH Especica el valor de commit point site en una transacción. El nodo con el valor n1ás alto se transforma en el commit point site. Lo primero a tener en cuenta de optimización de consultas distribuidas son las estadísticas, tanto de las estadísticas de sistemas, como las de todos los segmen- tos que puedan intervenir en la consulta. Se ha de recordar que es transmisión de información por red, por lo que es importante que se la mínima cantidad. Para optimizar consultas distribuidas en Oracle se suelen utilizar dos técnicas. Usar consultas derivadas para disminuir la cantidad de información que se quie- re recuperar a través de la red y la utilización de los hints N QMERGE y DRI- VINGLSI TE. 7.5.1. Optimización mediante consultas derivadas Las consultas derivadas o IN LINE VIE WS se convierten en una estructura en memoria. Utilizando estas construcciones, se puede disminuir la cantidad de infor- mación que se desearecuperar. Por ejemplo, la consulta: select l.id, l.habitacion, r.fecha_entrada from pacientes 1, pacientes@t11r2 r where 1.id=r.id and 1.id=1 280
  • 290.
    Capítulo 7. BBDD distribuidas sepuede optimizar utilizando una tabla derivada de la siguiente manera: select 1.id, l.habitacion, r.fecha_entrada from pacientes 1, (select id, fecha_entreda from pacientes@t11r2 where id=1) r where 1.id=r.id and 1.id=1 De esta manera, serecupera tan solo la información concerniente a un único paciente (el paciente con id=1), en lugar de todos los pacientes de la base de datos remota. 7.5.2. Optimización mediante hints En entornos distribuidos es más común que el optimizador pueda no ser del todo bueno con los planes de ejecución, así que el uso de Hints (y su constante control) puede ser útil en mucho casos. Con los Hints se pueden controlar cómo realizar una consulta. Por ejemplo, NO_MERGE evita los posibles no usosde consultas derivadas porque el optimizador puede determinar cambiar una tabla derivada por una join. Con DRIVINGSITE se dene en qué nodo se va a desarrollar la consulta, de tal manera que la BD donde se mezcle la información sea la que va a recibir menor cantidad de información a través de la red. Ejemplos de los cambios que producen estos Hints: Ejecución sin hint: SQL> select 1.id, 1.habitacion, r.fecha_entrada 2 from pacientes 1, 3 (select id, fecha_entrada from pacientes@t11r2 where id=1) r 4 where l.id=r.id and l.id=1 ID HABITACION FECHA_EN 10 26/04/11 281
  • 291.
    Bases de Datos Ejecuciónconel hint NOJIERGE: SQL> select /*+ N0_MERGE(r) */ l.id, l.habitacion, r.fecha_entrada 2 from pacientes 1, pacientes@t11r2 r 3 where 1.id=r.id and 1.id=1; ID HABITACION FECHA_EN 10 26/04/11 Ejecuciónconel hint DRIVINCLSITE: SQL> select /*+ DRIVING_SITB(r) */ 2 1.id, 1.habitacion, r.fecha_entrada 3 from pacientes 1, pacientes@t11r2 r where 1.id=r.id and 1.id=1; ID HABITACION FECHA_EN 10 26/O4/11 282
  • 292.
    Capítulo 7. BBDDdistribuidas 7.6. Prácticas Resueltas Práctica 7.1: Configuración deBBDD distribuidas Prepara dos máquinas virtuales con Oracle y congúralas dando a una má.quina la dirección 192.168.1.101 y a la otra la dirección 192.168.1.102. A continuación: 1. Edita el chero tnsnamesora que está ubicado en el directorio SORACLE_ HOME/network/ admin de ambas máquinas para agregar dos entradas que per- mitan enlazar las dos instancias. Editar el chero tnsnames en cada una de las máquinas introduciendo el siguiente código: JARDIN= (DESCRIPTIDN (ADDRESS -(PROTOCOL = TCP)(HOST = 192.168.1.101)(PDRT (CÜNNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = jardin) ) ) JARDIN2 = (nsscnrprron = (ADDRESS= (PRDTOCOL = TCP)(HOST = 192.168.1.102)(PDRT (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = jardin) ) ) 2. Comprueba que haya conectividad tns entre las dos instancias. En la máquina 192.168.] .101 y con el usuario oracle, introducir el comando: tnsping jardin2 y en la máquina 192.168.] .102 introducir el comando: tnsping jardin 3. Crea enlaces entre cada máquina. necesarios parapoder hacer consultas desde una máquina a la otra con el esquemajardineria. Desde la máquina 192. 168.1.101 a la 102 el enlace se llamará contabilidad, mientras que de la 102 a la 101 se llamará facturacion. Primero hay que dar al usuario jardineria permisos de CREATE LINK en cada una de las máquinas: sqlplus / as sysdba Después, ejecutamos el comando SQL: grant create database link to jardineria; Finalmente, podemos ejecutar los comandos de creación de los enlaces. Desde la máquina 1921631.101: 283
  • 293.
    Bases de Datos CREATE DATABASE LINK contabilidad CONNECT T0jardineria IDENTIFIED BY jardineria USING jardin2; Y en la máquina 192.J68.1.102: CREATE DATABASE LINK facturacion CONNECT T0jardineria IDENTIFIED BY jardineria USING jardin; } Práctica 7.2: Trabajando conBBDD distribuidas Realiza los siguientes ejercicios para aprender cómo trabajar con DB Links: 1. Edita la tabla. empleados en la. máquina 192.168.1101 para añadir un campo que indique qué porcentaje de comisión se lleva cada empleado de los pedidos que gestiona y pon a todos los empleados un 5 C78 de comisión. Desde la máquina 1921631.101, ejecutar: alter table empleados addPorcentajeComision number(5,2); update empleados set PorcentajeComision. = 5; 2. Crea una tabla llamada Comisiones en la máquina 192.168.1102 con los cam- pos CodigoEmpleado, CodigoPedido, TotalPedido y Comision. No es posible ejecutar comandos DDL a. través de DB Links, por tanto, desde la máquina 1921681.102, ejecutamos el siguiente comando DDL: create table Comisiones( CodigoEmp1eado integer, CodigoPedido integer, TotalPedido number(15,2), Comision number(7,2) ); 284
  • 294.
    Capítulo 7. BBDDdistribuidas 3. Rellena la tabla de comisiones con los datos de los pedidos mediante una consulta distribuida a 1atabla de pedidos en la máquina 192.168.1.101. Hay que ejecutar la siguiente sentencia de tipo insert-select: INSERT into comisionesccontabilidad SELECT CodigoEmp1eado, CodigoPedido, Tota1Pedido, Tota1PedidotPorcentajeComision/100 FROM Empleados inner join Clientes on Empleados.CodigoEmp1eado=C1ientes.CodigoEmp1eadoRepVentas natural join (select Codigocliente,CodigoPedido,sum(Cantidad*PrecioUnidad) as Tota1Pedido from Pedidos natural join Deta11ePedidos group by Codigocliente,CodigoPedido) Totales 4. Crea un trigger en la tabla Empleados que mantenga actualizada la tabla de comisiones cuandose modica el porcentaje de comisión de la misma. Modica la comisión de un empleado y comprueba que, efectivamente seha modicado. En la máquina 192.168.1.101 se ejecuta el siguiente código: create or replace trigger Tímpleadocomisiones after update of PorcentajeComision on empleados for each row begin update comisionescontabilidad set comision = totalpedidotznev.Porcentajecomision/100 where CodigoEmp1eado=:o1d.CodigoEmp1eado; end; / 5. Modica el Empleado con código 31 estableciendo un porcentaje de comisión del 10 70 y verica que efectivamente, se han modicado las comisiones: update empleados set porcentajecomision=10 where codigoempleado=31; select *fmm comisiones@contabilidad where codigoempleado=31; 285
  • 295.
    Bases de Datos 7.7.Prácticas propuestas Práctica 7.3: Fragmentación horizontalde tablas Una empresa de telefonía está implementando un sistema de recepción de inciden- cias. Estas incidencias se recogerán desde un único número de asistencia telefónica y se almacenarán en una base de datos distribuida. Esta tendrá 3 nodos Oracle. Se va. a fragmentar una tabla llamada incidencias de forma horizontal, de tal manera que las provincias cuyo nombre comience por las letras de la A a la C estén en el nodo O, de la D a la M en el nodo 1 y de la O a la Z en el nodo 2. De esta manera estarán equilibradas en número de registros por el número de población. Se pide: 1. Crear la estructura de las tablas en los tres nodos. La tabla incidencia tendrá los campos IdIncidencia, Fecha, Código de Cliente, Texto de la incidencia, Pro- vincia y Estado (abierta /cerrada). 2. Crear un enlace de base de datos entre cada uno de los servidores. 3. Ejecutar una consulta distribuida que devuelva todos los registros de la tabla incidencia. 4. Crear un procedimiento en el nodo 1 que inserte una incidencia en el nodo que le corresponda según la letra de la provincia. 5. Crear un procedimiento que borre una incidencia del nodo adecuado basándose en el campo de provincia. A continuación se desea fragmentar la tabla a través del campo IdIncídencia y el operador Mod (Resto de la división entera). La. operaciónIdIncidencia Mod 3 indicará en qué nodo debe estar almacenado elregistro (0,12). Para asignar el IdIncidencia sin duplicados se va a crear una secuencia (objeto sequence) para que antes de insertar un registro se consulte y se inserte en el nodo adecuado. Se pide: 1. Crea la secuencia con el comando create sequence enel nodo 0. 2. Crea una función llamada SiguienteIncidencia que devuelvael siguiente número de secuencia. 3. Ejecuta la consulta select siguienteIncidenciaO Qnodoü desdelos otros dos no- dos. 286
  • 296.
    Capítulo 7. BBDD distribuidas Práctica7.4: Fragmentación vertical Una aplicación comercial de marketing tiene una tabla de clientes muy grande con los siguientes campos: ICampos principales: Código de Cliente, Nombre, Apellidol, Apellido2, email, identicador de facebook, dirección, código postal y país. ICampos secundarios: película favorita 1, pelicula favorita 2, hobbie 1, hobbie 2, otros intereses y comentarios. Se pretende fragmentar la tabla utilizando una base de datos distribuida de dos nodos, para lo cual se pide: 1. Realizar la fragmentación de la tabla separando los campos principales y creándolos enun nodo y los campos secundarios(gustos y aciones) creándolos en otro nodo. 2. Crear un procedimiento que muestre por pantalla la información de un cliente determinado. El procedimiento recibirá como parámetro el código de cliente y consultará los dos nodos para mostrar toda la información. 3. Crear un prodecimiento que elimine un cliente de la base de datos. 287
  • 297.
    Bases de Datos Práctica7.5: Consultas distribuidas Sigue los siguientes pasos para ejecutar consultas distribuidas en Oracle: 1. 10. 288 Genera una copia de la máquina virtual con tu servidor Oracle, cámbiale la dirección IP y asegúrate de que tienen conectividad entre ambas. .Localiza el chero tnsnames detu servidor oracle original y agrega una entrada para que se pueda crear un enlace a la máquina virtual copiada. .Prueba con la utilidad tnsping que es posible conectar de la máquina virtual original a la copiada. Crea un usuario llamado Userl en la instacia oracle de la máquina virtual original con los permisos CREATE DATABASE LINK y CREATE PUBLIC DATABASE LINK y el rol RESOURCE. .Crea un usuario llamado User2 en la instancia oracle de la máquina virtual copiada con permiso CREATE SESSION y el rol RESOURCE. .Crea una tabla llamada Cliente(Código, Nombre, Dirección) en la máquina virtual original en el esquema Userl e inserta dos registros. .Crea una tabla llamada lIascotas(Código, Tipo, Raza, Nombre) en la máquina virtual copiada en el esquema User2e inserta dos mascotas para cada Cliente. .Ejecuta una. consulta que devuelva un listado con las mascotas de cada cliente incluyendo la dirección y el nombre del cliente. .Crea ahora la misma consulta, pero utilizando una tabla derivada para traer solamente las mascotas del primer cliente. Ejecuta la consulta anterior utilizando los hints NO_MERGE y DRIVING_SITE comparando su plan de ejecución con el comando explain plan.
  • 298.
    7.8. Capítulo 7. BBDDdistribuidas Resumen Los conceptos clave de este capítulo son los siguientes: Una base de datos está controlada por más de un servidor se dice que está dis- tribuida. Este tipo de organización proporciona más rapidez y exibilidad en el acceso y más capacidad de almacenamiento. Proporciona también escalabilidad y abilidad. Un sistema de BBDD distribuidas requiere una red de comunicacionesy enlaces entre bases de datos locales a cada servidor (DBLINKS). Se clasican en: o Homogéneas: todas las BBDD locales usan el mismo SGBD. o Heterogéneas: las BBDD locales pueden tener distinto SGBD. Se puede fragmentar una BBDD distribuida verticalmente, donde los frag- mentos son conjuntos de campos de una tabla u horizontalmente donde los fragmentos son conjuntos de registros. Una consulta distribuida es aquella que consulta múltiples tablas ubicadas en distintas ubicaciones. Se puede hacer uso de nombre Tabla@servidor para hacer referencia a una tabla en un servidor enlazado con un DBLINK. El comando DML create database link se utiliza para crear enlaces através de un enlace declarado en el chero tnsnamesora. Con la utilidad tnsping se puedecomprobar si hay conectividad con una BBDD remota. Una transacción distribuida utiliza el método TWO PHASE COMMIT a través de un coordinador local, un coordinador global y un Commit Point Site. En Oracle se puede consultar la vista vSsession para ver las sesionesabiertas con servidores remotos. Se puede eliminar una conexión abierta con el comando alter session close database link. Es posible utilizar hints en Oracle para parametrizar cómo se va a guiar la ejecución de la consulta. 289
  • 299.
    Bases de Datos 7.9. Testde repaso 1. Un DBLink es a) Una conexión unidireccional entre una BBDD cliente y una servidora b) Una conexión bidireccional entre dos BBDD locales c) Una conexión bidireccional entre dos BBDD distribuidas d) Ninguna de las anteriores 2. Es posible tener BBDD Distribuidas heterogéneas a) Si, a través de DB Links comunes b) Si, a t.ravésde software que hace las BBDD compatibles c) No, es imposiblecomunicar dosBBDD con distintos SGBD d) Sí, a travésde agentes llamados transpa- rent gateways 3. Con muchos DBLinks puede ocurrir que: a) Mejora el rendimiento del servidor b) No hay problemacon lasconexiones, pues- to que se cierran solas c) Es posible quese queden demasiadas cone- xiones abiertas d) Hay problemas deseguridad 4. TWO PHASE COMMIT es a) Un enlace doblea BBDD b) Un mecanismo para realizar transacciones locales c) Un mecanismo pararealizar transacciones distribuidas d) Un mecanismo pararealizar transacciones distribuidas y locales 290 5. Las fases de TWO PHASE COMMIT a Son dos fases b Son la fasede preparación, commit y olvido c Son 4 fases ) ) ) d) Son las fases de commit. y rollback 6. Un hint es un mecanismo para a) Cambiar la forma en la que una consulta funciona b) Ejecutar una consulta distribuida c) Ejecutar una consulta local d) Ninguna de las anteriores 7. ¿Cuál de estas sentencias es la correc- ta? a) CREATE DATA BASE LINK; b) CREATE DB LINK: c) CREATE DATABASE LINK; d) Ninguna de las anteriores 8. Para comprobar si hay conectividad entre BBDD remotas a) Se usa elcomando tnsnames b) Se usa el comando using c) Se usa el comando dblink d) Ninguna de las anteriores 9. Open links congura: a) El valor de commit en una transacción b) Máximo número de conexiones abiertas c) Tiempo máximo deejecución d) Ninguna de las anteriores
  • 300.
    7.10. 10. .¿Qué es unabase de datos distri- buida? .Enumera los tipos de BBDD distri- buidas según el SGBD que se utili- za. . Enumera las características de una BBDD distribuida. .¿Qué es la escalabilidad? . ¿Qué signica que una BBDD es able? . Enumera los 5 elementos que tiene una BBDD distribuida. . ¿Por qué se fragmenta una BBDD distribuida? .Dene los siguientes conceptos: IFragmentación vertical n Fragmentación horizontal - Fragmentación mixta .¿Qué reglas hay para que una frag- mentación sea correcta? ¿Qué diferencia hay entre una con- sulta distribuida y una remota? 11. 12. 13. 14. 1.5. 16. 17. 18. 19. 20. 21. Capítulo 7. BBDD distribuidas Comprueba tu aprendizaje ¿Cómo seejecuta una consulta dis- tribuida? ¿En quéconsiste un transparent ga- teway o pasarela transparente? ¿Qué esun DBLINK? ¿Qué requisitos debe tenerun usua- rio para poder crear un DB Link? ¿Qué almacena el chero tnsna- mes.ora? ¿Qué diferenciahay entre un dblink público y uno privado? Escribe el comando DDL para crear DBLINKS. ¿Para qué sirve la utilidad tnsping? ¿Cómo secierra una conexión a una base de datos remota? Describe el funcionamiento de una transacción distribuida a través del mecanismo TWO PHASE COM- MIT. Enumera los hints que tiene Oracle para optimizar las consultas distri- buidas.
  • 301.
    CAPÍTULO 8 BBDD Objeto-Relacionales ContenidosObjetivos W Las bases de datos Ñ Identicar las características de Objeto -Relacionales las bases de datos objeto rela- _ _ cionales Los atr1butos multlvaluados Crear tipos de datos ob jeto, sus Las Colecciones atributos v métodos Tablas anidadas Crear tablas de objetos v tablas Tipos de Objetos de columnas tipo objeto Los identicaciones de Objeto Crear tlpos de datos co1ecc1on Métodos en BBDD_OR Realizar Consultas .Modicar la información alma- Herencxa en BBDD-OR _ _ _ cenada manteniendo la 1ntegr1- DML con BBDD-OR_ dad y consistencia de los datos En este capítulo se explica cómo se gestiona la información almacenada en bases de datos objeto-relacionales, evaluando y utilizando las posibilidades que proporciona el sistema gestor. 293
  • 302.
    Bases de Datos 8.1. LasBases de datos ob jetos-relacionales A medida que el mundo de la informática va generando modelos del mundo real para crear aplicaciones, van apareciendo nuevasnecesidades parapoder dar solución a estosproblemas. A lo largo del libro se haestudia.do queun modelo de datos cuenta con las siguientes características: IEntidades IAtributos en cada una de estas entidades IRelaciones entre los atributos y entre las entidades n Directrices 0 reglas entre las entidades y los atributos Las BBDD pueden modelar todas estas características. En un modelo más complejo incluso se puede incluir acciones, operaciones o procedimientos entre entidades y atributos. Se puede decir que las Bases deDatos Objeto-Relacional (BBDDOR) son una extensión del modelo relacional que además, rompe ciertas reglas, tanto en el modelo relacional como en el paradigma de la orientación a objetos, pero seguro que aporta otra solución al modelado de información. A lo largo de este capítulo se podrá observar con ejemplos la diferencia de un modelo entidad relación E-R convencional y un modelo de datos objeto relacional O-R. La principal diferencia radica en la existencia de tipos. Estos tipos se pueden construir mediante sentencias DDL y serán la basedel desarrollo de BBDD O-R. Por tanto, para denir el modelo objeto-relacional habría que añadir a las características básicas deun modeloE/ R: entidades, atributos,relaciones yreglas ylos tipos. 8.2. Los atributos multivaluados Los atributos multivaluados, según lo estudiado, rompen directamente la primera formal normal. Con este tipo de atributo básicamente se expresa todo lo contrario a la IFN. Se dice, que un atributo puede tener más de un valor, pero son del mismo tipo. Existen autores, como Ted Codd, que hablan de la primera forma normal solo como atomicidad para evitar que el valor no se pueda dividir conceptualmente, por tanto se enfoca más no en que se pueda tener varios valores del mismo tipo, sino que esevalor en sí seaindivisible conceptualmente. En todo caso, estetipo de atributo amplia enormemente el modelo de cara a mo- delar en mundo real. Con los gestores BBDDO-R se puedelograr obtener atributos con múltiples valores. 294
  • 303.
    Capítulo 8. BBDDObjeto-Relacionadas 8.2. 1. Las colecciones Al realizar el paso al modelo relacional, los atributos se convierten en columnas. Podemos representar los atributos multivaluados en la BBDD a través de las colec- ciones. Una colección es un grupo de elementos del mismo tipo. En Oracle se usan los tipos para crear colecciones. Supóngase quese deseaguardar los nombres de los hijos de los empleados. Para esto sepuede usar una. colección.La relación puede tener las siguientes ocurrencias: III Apellidos m (luis-Insular (Jose Carlos» pedro) Lo primero sería crear la colección: SQL> create type colec_hijos as varray(10) of varchar2(30); 2 / Tipo creado. En esta instrucción se ha denido un nuevo tipo de datos llamado coleahijos que tendrán como máximo grupos de 10 valoresy además, que serán de máximo 30 caracteres. A continuación, se crea la tabla: SQL> create table empleado 2 (id number, 3 nombre varchar2(30), 4 apellido varchar2(30), 5 hijos co1ec_hijos) 6 / Tabla creada. Con esto se expresaque la columna de hijos será una colección de tipo colecjnjos ya denida. Es posible insertar datos tal y como sehace encualquier otra tabla con el comando INSERT, lo único a tener en cuenta es que hay que decirle que el tipo de la siguiente forma:
  • 304.
    Bases de Datos insertinto empleado values (2,Esperanza,Jiménez,co1ec_hijos(josé,carlos,pedro)); Obsérvese quees necesarioespecicar el tipo colecJzijos para que el SGBD realice las comprobaciones necesarias. Para consultar, también se puede utilizar SELECT: SQL> select * 2 from empleado; ID NOMBRE APELLIDO HIJOS 1 Francisco Pérez COLEC_HIJOS(luis, ursu1a) 2 Esperanza Jiménez CULEC_HIJOS(josé,carlos,pedro) De estamanera seha introducido una restricción al mundo real: que un empleado no puede tener más de 10 hijos. <> Actividad 8.1: Dene un tipo tabla llamadoAsignaturas. Después, crea una tabla llamada ciclosFownativos que pueda tener varias asignaturas, de tal manera que asignaturas sea una tabla anida.da. 8.2.2. Tablas anidadas 50 o 60 añosatrás, existía la posibilidad de que 10 hijos fuese unparámetro corto en algunas ocasionesy fuese posible ampliarlo hasta 20 o incluso 50, pero siempre tendría una restricción. Existe la posibilidad de no limitar la cantidad de Valores dentro del atributo multivaluado, deniendo lo que se denomina un tipo tabla, en la que solo se especica el tipo de datos que se deseapara ese atributo. Utilizando el mismo ejemplo se redene el tipo hijos de la siguiente forma: SQL> create type tab1a_hijos as table of varchar2(30); 2 / Tipo creado. 296
  • 305.
    Capítulo 8. BBDD Objeto-Relacionadas Yal igual que con el ejemplo anterior, se crea la tabla basándola en el tipo tabla_hijos: SQL> create table empleado 2 (id number, nombre varchar2(30), apellido varchar2(30), hijos tabla_hijos) nested table hijos store as t_hijos / Tabla creada. Ahora, tablajzíjos, ya no es un tipo colección . es un tipo tabla. Los tipo tabla utilizan para su almacenamiento una tabla anidada o nested table. Dicho de otro modo, la columna hijos es deltipo tablmhijos almacenada sobreun tipo de segmento especial llamado tabla anidada. A diferencia de la colección, seha denido esta tabla especial que permitirá almacenar en el atributo multivaluado tantos valores como sea necesario. ¿Sabías que .. . ? En Oracle, se puede consultar la tabladba_objects para examinar los objetos que se hancreado en el SGBD. También se puede consul- tar mediante dba_segments laestructura de almacenamiento que utiliza Oracle para almacenar el objeto: SQL> select object_name, object_type, status 2 from dba_objects 3* where object_name like %HIJDZ 0BJECT_NAME OBJECT_TYPE TABLA_HIJOS T_HIJOS SQL> select segment_name, segment_type 2 from dba_segments 3* where segment_name like ZHIJOS% SEGMENT_NAME SEGMENT_TYPE T_HIJDS NESTED TABLE 297
  • 306.
    Bases de Datos Paraconsultar, insertar, borrar o actualizar información en tablas anidadas, se realiza igual que con las colecciones. Con estos tipos se abren nuevas posibilidades al construir modelos de datos: es posible denir tipos de datos personalizados y muy completos, con comportamientos y características autónomas. El modelo pasa detener dos dimensiones (las y columnas), a tres dimensiones (las de tipos, las y columnas). La cantidad de colecciones tipo y tablas tipo, dependerá únicamente de la destreza que se posea y de la habilidad para aplicar estas ventajosascaracterísticas a cada uno de los modelos que representan el mundo que se desea modelar. 8.2.3. Tipos de Objeto Aunque no es objetivo del capítulo explicar la teoría de la programación orientada a objetos (POO), serecordará queuna clasees comoel moldeo un patrón para la fabricación de los objetos. Y visto desde el otro sentido, un objeto es una instancia de una clase. En Oracle, se puedencrear clases a través de los tipos, más concretamente de los tipos de objetos, usando la sentencia create type as object. Gracias a este tipo objeto se puede agregar información a la base de datos anidando la. información en única la en tantos niveles como se desee. Para ilustrar el funcionamiento de esta estructura recurrimos a la siguiente rela- ción: CLIENTES ( Id, Nombre, Apellido, Dirección, Población, Provincia, Teléfon Móvil) Se puede armar que todos sus atributos son atómicos y que cumple, al menos, la primera forma normal. Una instancia de esa relación cliente (Modelo Relacional), podría ser: [EI Apellido Mayor.20 Madrid Madrid 912823722 600000001 Suponiendo que este Cliente no cuenta con un móvil, sino que cuenta con 3 móviles, el móvil de su trabajo, su móvil particular de una compañía que le da una buena tarifa. por la mañana, y otro móvil de una compañía que le da buenos des- cuentos en SMS. Se podría pensar en conservar el mismo modelo de datos de forma elegante, y no con una entidad cliente que contenga hasta 10 atributos llamados 298
  • 307.
    Capítulo 8. BBDD Objeto-Relacionales movill,movi12,...movil10 (no es muy inusual encontrarse con BBDD que tienen estas soluciones). Ajustándose únicamente al modelo E-R la solución óptima sería crear una Re- lación que sea cliente-móvil, y que contenga el ID del chente y su número de móvil. Por ej emplo: É 1 600000001 1 600000002 1 600000003 Las BBDD orientadas a objeto brindan la posibilidad de crear un tipo de objeto de la siguiente forma: SQL> create or replace type telefono as object 2 (tipo varchar2(30), 3 numero number) 4 / Se puedeobservar que cada objeto telefono tendrá dos atributos, el tipo de teléfono móvil y el número. A continuación, se crea una tabla tipo llamada listin basada en el objeto tipo para añadir la funcionalidad de múltiples valores: SQL> create or replace type listin as table of telefono 2 / Tipo creado. Finalmente se crea la tabla Clientes: SQL> create table clientes 2 (id number, 3 nombre varchar2(10). apellido varchar2(10), direccion varchar2(30), poblacion varchar2(30), telefonos listin) nested table telefonos store as te1_tab 10 / 4 5
  • 308.
    Bases de Datos Apartir de aquí, se pueden ejecutar sentencias DML en la tabla clientes haciendo valer la deseada ampliación con relación al modelo de datos tradicional: SQL> insert into clientes 2 values 3 (1,Paco,Pérez,mayor 20,madrid,madrid, 4 1istin(te1efono(fijo,911234567). 5 te1efono(movi1 persona1,60000O001), 6 te1efono(movi1 empresa ,600000002))) 7 / 1 fila creada. SQL> commit; Confirmación terminada. Si se consulta la tabla se obtiene: SQL> select *from cliente; ID NOMRE APELLIDO DIRECCIONPOBLACION PROVINCIA TELEFONOS(TIPO, NUMRO) LISTIN(TELEFONO(fijo, 911234567), TELEFON0(movi1 personal, 600000001), TELEFON0(movi1 empresa, 60000O0O2)) Se puedeobservar cómo se anida la información dentro de la propia la. De esta manera, 1 cliente puede tener múltiples teléfonos y cada teléfono, varios atributos. Esto es la representación real de las relaciones anidadas. 8.3. Los identicadores de objeto Oracle trabaja con OID (Object Identiers). Un OID es un identicador para mejorar la búsqueda de la información. Cuando se crea una columna cuyo tipo es un tipo de objeto, en lugar de almacenarse todos los datos del objeto en la propia columna de la tabla, el SGBD solo almacena un identicador, que será la dirección de una la en una tabla auxiliar que el SGBD para almacenar los datos del objeto. Es decir, internamente, el SGBD solo almacena un número de 16-Bytes que le sirve como referencia para ir a buscar la información de la tabla objeto si esnecesario. Es posible ver estos OIDs con una pseudo-columna llamada objectJd. Para ver el valor del objeto, se puede utilizar objectwalue. Se ilustra en el siguiente ejemplo: 300
  • 309.
    Capítulo 8. BBDDObjeto-Relacíonales SQL> create type coche as object 2 (marca varchar(20), 3 modelo varchar(20)); 4 / Tipo creado. SQL> create table vehiculos of coche; Tabla creada. SQL> insert into vehiculos values (coche(seat,ibiza)); 1 fila creada. SQL> select object_id, object_va1ue from vehiculos; DBJECT_ID 0BJECT_VALUE(MARCA, MODELO) A5440089F85FFA3OE040007FOIOOOFDE COCHE(seat, ibiza) La ventaja de usarOIDs esquela informacióndel objeto estáalmacenadaen otro sitio distinto de la propia la, por tanto, en casode no usar esteobjeto, el SGBD no tendrá que accedera toda esta informaciónreduciendoel tiempo de respuesta. La desventajaesqueenel momentoderealizarconsultas sobrelastablas,el SGBD deberealizar accesos a bloquesextras de información,consumiendo más CPU. 8.4. Los métodos Al igual que en la POO cada clasedene el comportamientode susobjetos a travésde métodos,en lasBBDD-OR también esposiblecrearmétodospara lostipo objeto. Se pueden denir funciones o procedimientosmiembros,cuyas accionesmode- lan el comportamientode un tipo de objeto. Estas funcioneso procedimientosque pertenecena un tipo de objeto sedenominanmétodos. Para ilustrar como usar funcionesmiembro en tipos de objetos, se expone el siguienteejemplo:si se deseamodelar un objeto triángulo para almacenarsusca- 301
  • 310.
    Bases de Datos racterísticas(la base y la altura), y almacenar en la BBDD cientos de triángulos pudiendo calcular el área de cada triángulo, se podría. crear el siguiente esquema: SQL> create or replace type tipo_triangu1o as object 2 (base number, 3 altura number, 4 member function area return number) 5 / Tipo creado / Se puede observar que dentro del tipo de objeto tipoiriangulo se ha denido la cabecera de una funciónllamada área(método omember functionarea). A continuación se creará la denición del método área a través del cuerpo del tipo create 01" replacetype body: SQL> create or replace type body tipo_triangu1o as 2 member function area return number is a number; begin a := (base*a1tura)/2; return a; end; end; Cuerpo del tipo creado. Una vez creado el tipo triángulo, se puede crear una tabla para almacenar triángulos: SQL> create table triangulos 2 (id number, 3 triangulo tipo_triangulo); Tabla creada. SQL> desc triangulos TRIANGULD TIPD_TRIANGULD 302
  • 311.
    Capítulo 8. BBDDObjeto-Relacionales Y después, se insertan datos dentro la tabla, tal y como se haexpuesto previamente: SQL> insert into triangulos values (1,tipo_triangu1o(5,5)); 1 fila creada. SQL> insert into triangulos values (2,tipo_triangulo(10,10)); 1 fila creada. SQL> commit; Confirmación terminada. SQL> select * from triangulos; ID TRIANGULÜ(BASE, ALTURA) 1 TIPÜ_TRIANGULÜ(5, 5) 2 TIPD_TRIANGULÜ(10, 10) Finalmente. se puede declarar un pequeño bloque anónimo en PL-SQL para recorrer la tabla e invocar a1 método area: SQL> declare t tipo_triangu1o; begin for i in(select * from triangulos) loop t:=i.triangu1o; dbms_output.put_1ine(E1 triangulo con id:||i.id); dbms_output.put_1ine(Con base: IIt.base); dbms_output.put_1ine(Y altura: IIt.altura); dbms_output.put_line(tiene un area de: ||t.area); end loop; end; / El triangulo con id:1 Con base: 5 Y altura: 5 tiene un area de: 12,5 El triangulo con id:2 Con base: 10 Y altura: 10 tiene un area de: 50 Procedimiento PL/SQL terminado correctamente. 303
  • 312.
    Bases de Datos Porcada iteración del bucle, se hace una referencia a un objeto t. Obsérveseque tbase y t. altura son los atributos del objeto t, mientras que t. areaes la invocación al método. <> Actividad 3.2: Al igual que en POO,en BBDDes posible crear constructores. Consulta en la documentación de Oracle cómo crear constructores. 8.5. La herencia Una de las grandes ventajas de la POO es la herencia, gracias a la cual se pueden crear superclases abstractas para después, crear subclases más especicas que hereden los atributos y métodos de las superclases. En BBDDO-R es posible hacer algo parecido con los tipos de objetos: se pueden crear subtipos de objetos a partir de otros supertipos de objetos creadospreviamente. Un ejemplo sencillo en el que se aprecia con facilidad qué es la herencia es una escuela, donde hay estudiantes, profesores y empleados. Todos ellos tienen carac- terísticas de una persona: un nombre, un número de identicación, un teléfono, etc. Por tanto se puede construir un super tipo de objeto llamado tipo_persona que aglutine los atributos característicos de una persona. create or replace type tipo_persona as object (id number, nombre varchar2(10), telefonos listin) not final / creado. La creación del tipo lleva includa la claúsula not nal que indica que se pueden generar más tipos de objetos a partir de este. Dicho con nomenclatura POO, se pueden crear subclases apartir de la superclase,o dicho con un lenguaje más natural se pueden crear tipos de persona más especicos a partir del tipo genérico persona. A continuación se crea un tipo de persona especíca, el estudiante: 304
  • 313.
    Capítulo 8. BBDDObjeto-Relacionales SQL> create or replace type tipo_estudiante under tipo_persona 2 (facultad varchar2(10), 3 nota_media number) 4 not final 5 / Tipo creado. En este caso, la cláusula under especica a qué supertipo pertenece el tipo estu- diante. Nuevamente, se dene como notnal para poder generarclasicacionesmás amplias. Obsérvese queestetipo de construcciones puedenusarsetambién para las jerar- quíasen el modelo entidad relación.Ver sección2.4.1. Al igual queconcualquierotro objeto, se puede comprobar la estructura del tipo estudiante utilizando el comando describe, abreviado desc: SQL> desc tipo_estudiante tipo_estudiante extiende TJ.TIPD_PERSONA tipo_estudiante N0 es FINAL VARCHAR2(10) TELEFONOS LISTIN FACULTAD VARCHAR2(10) NÜTA_MEDIA NUMBER Incluso sería posible crear un tipo de subobjeto que tenga losatributos y méto- dos del tipmestudiante. Si además, se desearacrear un tipo para representar los estudiantesde intercambio,sepodría denir: SQL> create or replace type tipo_estudiante_intercambio 2 under tipo_estudiante 3 (pais varchar2(30), 4 universidad varchar2(30)) 5 / Tipo creado. SQL> desc tipo_estudiante_intercambio 305
  • 314.
    Bases de Datos tipo_estudiante_intercambioextiende TJ.TIPÜ_ESTUDIANTE VARCHAR2 (1 o) TELEFONOS LISTIN FACULTAD VARCHAR2(10) NÜTA_MEDIA NUMBER PAIS VARCHAR2(30) UNIVERSIDAD VARCHAR2(30) 8.6. Operaciones DML A lo largo del capítulo ya. se ha mostrado en los ejemplos cómo utilizar la sen- tencia insert y select cuando se tratan tipos de objetos: SQL> insert into empleado 2 values (1,Fernando,Moreno,tab1a_hijos(E1ena,Pab1o)); 1 fila creada. SQL> insert into empleado 2 values (2,David,Sanchez,tab1a_hijos(Carmen,Candela)); 1 fila creada. SQL> col hijos format a40 SQL> select *from empleado; ID NOMBRE APELLIDO HIJOS 1 Fernando Moreno TABLA_HIJÜS(Elena, Pab1o) 2 David Sanchez TABLA_HIJOS(Carmen, Candela) La única restricción es que no es posible operar sobre la tabla anidada: SQL> select * from t_hijos; select * from t_hijos * ORA-22812: no se puede hacer referencia a la tabla de almacenamiento de una columna de tabla anidada 306
  • 315.
    Capítulo 8. BBDDObjeto-Relacionadas Para realizar actualizaciones se utiliza update: SQL> update empleado 2 set hijos=TABLA_HIJOS(Carmen,Cande1a,Cayetana) 3 where id =1; 1 fila actualizada. Y para realizar borrados se utiliza delete. Obsérvese cómo se puede utilizar un determinado método para la selección delos registros a borrar o eliminar: SQL> select * from triangulos t where t.triangu1o.area()>20; ID TRIANGULÜ(BASE, ALTURA) 2 TIPÜ_TRIANGULÜ(10, 10) SQL> delete from triangulos t where t.triangu1o.area()>20; 1 fila suprimida. 8.7. Las referencias Una referencia es un puntero a un objeto creado a partir de su OID. Se utiliza principalmente para apuntar a un objeto que ya. existe y no tener que duplicar la información. Por ejemplo, si se deseacrear una tabla de mascotas en la que ca.da mascota tiene su veterinario, y esos veterinarios ya están almacenados en una tabla de objetos, se podría hacer uso de la palabra reservada REF para indicar que el veterinario ya existe y por tanto. solo se almacena una referencia a ese veterinario en la tabla de mascotas. SQL> create type veterinario as object 2 ( id integer, 3 nombre varchar(100), 4 direccion varchar(255)); 5 / Tipo creado. SQL> create type mascota as object 2 ( 307
  • 316.
    Bases de Datos 3id integer, 4 raza varchar(100), 5 nombre varchar(100), 6 vet REF veterinario 7 ) 8 / Tipo creado. SQL> create table veterinarios of veterinario; Tabla creada. SQL> insert into veterinarios values (1,Jesús Sánchez,C/El mareo 29); 1 fila creada. SQL> create table mascotas of mascota; Tabla creada. SQL> insert into mascotas 2 select 1,perro,sprocket, REF(v) 3 from veterinarios v 4 where v.id=1; 1 fila creada. Se puede ver cómo REF se utiliza en dos situaciones:Al crear el tipo mascota, para indicar que su veterinario seráuna referenciaal veterinarioreal, y después,al insertar la mascota,serealiza una sentenciade tipo ínsertselect para obtener una referenciaal veterinario cuyoid = 1. Si a continuación, se realiza una consulta se obtiene: SQL> select * from mascotas; ID RAZA NOMBRE VET 1 perro sprocket 000O220208A59467OFAD9FO874E040007F01002AF3A594670FAD9E08 Para obtener losdatos realessepuedeutilizar la palabra DEREF: SQL> select nombre,deref(vet) from mascotas; NOMBRE DEREF(VET)(ID, NOMBRE, DIRECCION) sprocket VETERINARIO(1, Jesús Sánchez, C/E1 mareo 29) 308
  • 317.
    Capítulo 8. BBDDObjeto-Relacionales 8.8. Prácticas Resueltas Práctica 8.1: Supermercado Para la gestión de un supermercado, se deseaconstruir un modelo para la gestión de las listas de la compra: 1. Crea un tipo para almacenar direcciones postales con dos campos, la dirección y el código postal. create or replace type tipo_direccion as object ( dir varchar2(100), CP number(5)) / 2. Crea un tipo contacto para almacenar un número de teléfono y un email. create or replace type tipo_contacto as object (telefono number, email varchar2(100)) / 3. Crea un tipo persona con los camposid, nombre, apellido, dirección y contacto. Después, creaun Subtipo cliente con otro campo adicional llamado número de pedidos. create or replace type tipo_persona as object (id varchar2(20), nombre varchar2(30). apellido varchar2(30). direccion tipo_direccion, contacto tipo_contacto) not final / create or replace type tipo_cliente under tipo_persona (n_pedidos number) / 4. Crea un tipo artículos con los camposid, nombre, descripción, precio y porcen- taje de IVA. Después crea un tipo tabla de objetos para registros de artículos. create or replace type tipo_articulo as object (id_art number, 309
  • 318.
    Bases de Datos nombrevarchar2(30). descripcion varchar2(100), precio number, porct_iva number) / create or replace type tab1a_articu1os as table of tipo_articu1o; / 5. Crea un tipo para la lista de la compra y otro para su detalle. La lista de la compra contendrá un identicador, fecha, cliente y una tabla de detalles de lista de la compra. A su vez, un detalle de lista de compra estará compuesto por un artículo y un campoque denote la cantidad pedida de eseartículo. Se deberá incluir en la denición una función miembro para calcular el total de la lista de la compra. create or replace type tipo_lista_deta11e as object ( numero number, articulo tipo_articu1o, cantidad number ) / create or replace type tab_1ista_deta11e as table of tipo_1ista_deta11e; / create or replace type tipo_lista_compra es object (id number, fecha DATE, cli REF tipo_c1iente, Detalle tab_1ista_detal1e, memberfunction total return number ) / 6. Crea ahora el cuerpodel tipo lista de la comprapara denir el métodototal: 310 create or replace type body tipo_1ista_compra as memberfunction total return number is i integer; tot number := O; begin for i in1..Deta1le.count loop tot := tot + (Detal1e(i).cantidad * Deta11e(i).articu1o.precio ) t (1+(Detal1e(i).articu1o.porct_iva/100)); end loop; return tot; end; end; /
  • 319.
    10. Capítulo 8. BBDDObjeto-Relacionadas Crea una tabla de clientes e inserta uno. create table Clientes of tipo_c1iente; insert into clientes values (1, Pedro,Suarez, TIPO_DIRECCION(Paseo del Museo 15,28099), TIPO_CONTACTO(917726S25,psuarez@ono.com),0); Crea una tabla para las listas de la compra e inserta una lista de la compra con un detalle de dosartículospara el clienteinsertadoanteriormente: create table listas_de_compras of tipo_1ista_compra nested table Detalle store as tDeta11e; insert into 1istas_de_compras select 1,current_date,ref(c), tab_1ista_deta11e( tipo_lista_deta11e(1.tipo_articu1o(1,Barra de pan,Tipo baguette,1,7),4), tipo_1ista_deta11e(2,tipo_articu1o(2,Lonchas de jamón,Iberico Be11ota,6,7),4) ) from Clientes c where c.id=1; Muestra.con una selectlosdatosde la lista de la compra: col cliente formats40 col detalla formatn50 set linesize 132 select idjcchmdcrccli) u cliente. detallo fromliltagdhcompns; l 13/06/11TIPILCLIENTEÜI,&#39;Padxo. Suarez. TIPTAB_LISTA_DÉI&#39;ALLE(TIPO_LISTA_DÉI&#39;ALLE(1, TIPÜ_ARTIC O_DIR.ECCIDN(Puoo del Husoo 15&#39;, 28099) ULOU,Burn depu, Tipo bnguotto, 1, 7), d). . TIPU_CONTACl&#39;0(917726525, Tsuuezdono. TIPO_LISTA_DÉTALLE(2.TIPCLARTICULCK?, Wonchu do com). 0) jamón, Iberico BeuataHG.7). 4)) Construyeuna selectpara mostrarpor pantalla el id de una lista de la compra y su total. SQL> select id, c.tota1() from 1istas_de_compras c; ID C.TOTAL() 311
  • 320.
    Bases de Datos 8.9.Prácticas Propuestas Práctica 8.2: Tipos básicosy herencia Realiza los siguientes ejercicios: 1. Crea. un tipo para las direcciones de empresas, contendrá el tipo de dirección y la dirección (número, calle y piso). 2. Crea un tipo colección para almacenar hasta 3 direcciones (scal, postal y administrativa). 3. Crea un supertipo empresa con los atributos CIF, Nombre y sus direcciones. 4. Crea un subtipo de empresa llamada Sociedad Anónima con los atributos número de accionistas, capital social y presupuesto. 5. Crea un subtipo de empresa llamada Sociedad Limitada que tenga una lista de socios,donde seespecique el nombre del socio y un porcentaje de posesión de la empresa. 6. Crea una tabla de empleados que tenga una referencia a una Empresa. Práctica 8.3: Comandos DMLcon objetos Con los tipos de la. práctica anterior realiza las siguientes operaciones: 1. Crea una tabla de empresasde tipo sociedades anonimas. 2. Inserta una sociedad anonima con dos direcciones. 3. Crea una tabla de empresasde tipo sociedades limitadas. 4. Inserta una sociedad limitada con dos direcciones y cuatro socios. 5. Inserta un empleado para cada una de las empresas insertadas. 6. Crea una consulta que muestre la empresa para la que trabajan los empleados utilizando la función DEREF. 312
  • 321.
    Capítulo 8. BBDDObjeto-Relacionales Práctica 8.4: Números complejos Un númerocomplejo a+bi está compuesto por unaparte imaginaria(b) y una parte real (a). Se deseacrear un tipo de objeto llamado tipo_complejo con una serie de métodos para poder operar con ellos. Se pide: 1. Crea el tipo tipo_complejo que contenga los atributos imaginario y real, y que dena la cabecera de los siguientes métodos: IMódulo: Retorna un valor numérico resultado de operar los valores ima- ginarios y reales con la fórmula x/ a2+ b? - Valor: Retorna una cadena decaracteres conla representación del número complejo (a+bi). IConjugado: Retorna una cadena de caracteres con la representación del conjugado del número complejo (a-bi). - Multiplicar(Número Complejo): Actualizarálos atributosdel númerocom- plejo resultado de multiplicar los propios atributos por otro número com- plejo que será pasadocomo parámetro: (a+bi)(c+di) = acbd+(ad+bc)i 2. Crea el cuerpo del tipo desarrollando los métodos denidos en la cabecera del tipo. 3. Crea el tipo tipo_tabla_co1nplejos para almacenar una serie de números com- plejos. Después, crea el tipo tipo_lista_complejos que almacene una tabla de complejos. 4. Crea una tabla de listas de números complejos e inserta un registro con 5 números. 5. Crea un bloque anónimo para multiplicar el primer número insertado por el segundo. 6. Crea un bloque anónimo que muestre el módulo, valor y conjugado de los números complejos insertados. 7. Crea una función que reciba una tabla de números complejos y devuelva un número complejo con la suma de todos ellos. 8. Crea un bloque anónimo que invoque a la función anterior y visualice la suma de los números complejos insertados. 313
  • 322.
    Bases de Datos 8.10. 314 Resumen Losconceptos clave de este capítulo son los siguientes: Muchos SGBD permiten la creación de tipos personalizados, que son la base de las BBDD-OR. Los atributosmultivaluados pueden almacenarse en colecciones (varray) de un número jo de elementos o entablas anidadas(nested tables)para almacenar un número variable de elementos . Los objetos denidos en Oracle se puedenconsultar utilizando la tabla dba_objects. Un tipo de objeto se crea con la sentencia DDL create type tipo as object. Es posible crear tipos de tabla de objetos con la sentencia DDL create type tipmtabla as table of objeto. Se puede anidar la creación de tipos en tantos niveles como se desee. Un OID es un número de 16 bytes para mejorar la búsqueda de la información. Se puedeconsultar con la función object_id. Un método es una función o un procedimiento miembro denido dentro de un tipo. Para invocar a un método se utiliza el operador punto objeto.metodo( Se pueden crear jerarquías de clases (u objetos tipo) deniendo tipos NOT FINAL . Para crear un subtipo de objetos se utiliza la cláusula under supertipo. Es posible compartir objetos mediante referenciasa objetos utilizando la cláusu- la REF. Para ver la información de un objeto referenciado mediante REF se utiliza la función DEREF.
  • 323.
    8.11. 1. En BBDD-ORun tipo Test de repaso a) Es la denición de unaestructura quesirve para crear objetos b) Se usa enla denición de unacolumna de una tabla c) Se puede utilizar como basepara otros ti- pos d) Todas de lasanteriores 2. Las colecciones se crean mediante a) vArrays b) nested tables c) under d) not nal 3. Una tabla anidada a) Se usa como modo de almacenamiento pa- ra un tipo tabla b) Es un tipo de segmento especial c) Se crea conla cláusulastore as d) Todas las anteriores 4. ¿Qué vista se utiliza en Oracle para ver las tablas anidadas? a) dba-objects b) user_nested_tables c) dbasegments d) Ninguna de las anteriores 5. Un OID a) Es un identicador que usa el SGBD para localizar el objeto b) Se puede vercon la función object_id c) Es el equivalente al ROWID en objetos d) Todas las anteriores Capítulo 8. BBDD Objeto-Relacionales 6. Para denir métodos en BBDD-OR a) Se usan funciones o procedimientos miem- bros de un tipo de datos b) Se utilizan paquetescon cuerpoy cabecera c) No es posible utilizar métodos d) Ninguna de las anteriores 7. Para invocar a un método en BBDD- OR a) Se utiliza el operador -> b) Se usa lafunción REF c) Se usa la función 0bject_value() d) Se usa eloperador punto 8. En BBDD-RO la herencia a) Permite que un tipo herede de más de un supertipo b) No es posible crear un subtipo a partir de un supertipo c) Es posible crear un supertipo a partir de un subtipo d) Ninguna de las anteriores 9. Cuando se usan comandos DML en BBDD-OR a) Se pueden realizarinserts y updates b) Se pueden usardeletes c) No es posible hacer select en tablas anida- das d) Todas las anteriores P6&#39;P&#39;8P&#39;¿&#39;9&#39;9P&#39;93&#39;rP¬9&#39;ZP&#3 315
  • 324.
    Bases de Datos 8.12.Comprueba tu aprendizaje 1. ¿Qué es una base de datos OR? 12. Explica cómo sepuede invocar a un _ , _ _ _ _ método denido en un tipo. 2. ¿Cual es la principal diferencia con las bases de daÉOS TGÏaCÍOHHÏGS? 13.Comenta cómo se aplica la herencia 3. ¿Qué es un atributo multivaluado? a las BBDD-OR 4. ¿Cómo encaja un atributo multiva- 14&#39; ¿Cómo Se puede insert? u? regis- luado en las bases de datos OR? tro en una tabla de Objetos 5_ Enumera dos formas distintas de15. Dene para qué sirven las siguien- almacenar atributosmultivaluados tes funclones en una tabla. IObject-id 6. Explica las diferencias entre usar _ Objechvalue una tabla anidada y unacoleccion. DEREF I 7. Escribe la sintaxis para crear: _ REF ITipos , _ , , _ _ 16. Dene para que sirvenlas siguien- - TlpOS colecciones tes Cláusulas - Tipos Tabla tore as ITablade objetos IS Iunder 8. ¿Qué es un tipo tabla? ¿Cómo se 1 crean? &#39; na n not nal 9. ¿Cómo se puedenconsultar en Ora- cle qué tipos de ob jetos hay deni- &#39; ¡member d Í , . OS 17. ¿Que es una referenciaÍQPara 10. ¿Cómo se puede consultar en Ora- qué 1153? cle las tablas anidadas creadas? , _ 18. ¿Como se puede insertar una refe- 11. ¿Cómo se creaun método en un ti- rencia a un objeto en un tabla de 316 po? objetos?
  • 325.
    «.2 arceta grupo editorial Bases deDatos ste libro está concebido desde laexperiencia delos autores, como administradores de bases de datos en empresasmultinacionales, comoprofesores de formación profesional(familia informática) y como pro- fesores de Universidad. Los profesionalesde la industria informática y neótos encontrarán unavaliosa fuente de infonnación para el desempeño de actividades relacionadas con basesde da- tos, detallandosu funcionamiento,composición, diseño y aplicaciones. El contenido del libro tiene una orientación puramente práctica, conactividades, consejos y ejercicios resueltos en Access,MySQL, Oracle y DBZ que facilitan la com- prensión yasimilación dela información. El objetivo del libro no esser unaguía dereferencia de un solo Sistema de Gestión de Bases de Datos, sino la formación de administradores de bases de datos actuali- zados, versátiles y competentes. Existe multitud de materialdisponible parala realización de las prácticas propuestas en lapágina web x . a .gen-cota«. y enel blog lvbtltl-gzirccta.blogsptlttnni www.garceta.es