Sie sind auf Seite 1von 107

Bases de datos

Versin 1.1

scar Gmez

Curso 2012-2013

ndice general

1. Introduccin 1.1. Historia de las bases de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2. Historia del software libre GNU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3. Un repaso al resto del libro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2. Diseo de bases de datos 2.1. Introduccin . . . . . . . . . . . . . . . . . . . . . . . . 2.2. Modelado de datos . . . . . . . . . . . . . . . . . . . . . 2.3. Modelos E/R . . . . . . . . . . . . . . . . . . . . . . . . 2.4. Problemas . . . . . . . . . . . . . . . . . . . . . . . . . 2.5. Transformacin de modelos E/R en modelos relacionales . 2.6. Normalizacin . . . . . . . . . . . . . . . . . . . . . . . 3. Diseo fsico 3.1. Introduccin . . . . . . 3.2. BBDD en Access . . . . 3.3. Claves ajenas . . . . . . 3.4. MySQL . . . . . . . . . 3.5. Tablespaces y undo les

3 3 3 3

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

5 . 5 . 6 . 6 . 11 . 22 . 24 27 27 27 31 31 37 39 39 39 39 41 44 45 46 59

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

4. Consultas SQL 4.1. Introduccin . . . . . . . . 4.2. La sentencia SELECT . . . 4.3. Condiciones . . . . . . . . 4.4. Consultas con agregados . . 4.5. Consultas multitabla . . . . 4.6. Algunos ejercicios resueltos 4.7. Subconsultas . . . . . . . . 4.8. Actualizacin y borrado . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

5. Programacin 61 5.1. Introduccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 5.2. Procedimientos almacenados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 5.3. Sentencias bsicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63


I

5.4. 5.5. 5.6.

Funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 Funciones MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 Solucin al examen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 79 79 79 80 82 82 83 85 85

6. Administracin 6.1. Introduccin . . . . . . . . . . . . 6.2. Aspectos bsicos de las contraseas 6.3. El sistema de privilegios . . . . . . 6.4. El sistema de concesiones . . . . . 6.5. Usuarios con restricciones . . . . . 6.6. Vistas . . . . . . . . . . . . . . . . 6.7. Recuperando la clave de root . . . . 6.8. Copias de seguridad . . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

7. Access 89 7.1. Introduccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 7.2. El entorno . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 8. BBDD Objeto relacionales 8.1. Introduccin . . . . . . . . . . . . . . 8.2. Instalacin de PostgreSQL . . . . . . . 8.3. Uso de Postgres en una mquina virtual 8.4. Funcionamiento bsico de Postgres . . 8.5. Comandos de Postgres . . . . . . . . . 8.6. Creacin de tipos de datos . . . . . . . 8.7. Soporte documental . . . . . . . . . . 8.8. Sistemas de informacin geogrca . . 9. ndices y tablas 91 91 91 91 92 92 96 98 99 103

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

. . . . . . . .

II

Bases de datos, Versin 1.1

Contents:

ndice general

Bases de datos, Versin 1.1

ndice general

CAPTULO 1

Introduccin

1.1 Historia de las bases de datos 1.2 Historia del software libre GNU 1.3 Un repaso al resto del libro

Bases de datos, Versin 1.1

Captulo 1. Introduccin

CAPTULO 2

Diseo de bases de datos

2.1 Introduccin
En general, la construccin de una casa se considera un proyecto de envergadura. Dado que no se puede permitir que cada uno de los participantes en el proyecto siga su propio ritmo o haga lo que crea conveniente, se asume que habr un arquitecto que disea una estructura y realiza los clculos necesarios para que todo se construya correctamente. En las bases de datos ocurre lo mismo: determinados negocios necesitarn una infraestructura de informacin muy sosticada por lo que puede ser conveniente disponer de unos planos que permitan la comunicacin entre los distintos miembros que participan en un proyecto de desarrollo de un programa informtico. Adems, muy a menudo ocurre que transcurrido un tiempo, el usuario del programa desea hacer mejoras o ampliaciones pero por desgracia, la estructura de una base de datos o de un programa no son tan visibles como los muros de una casa. La existencia de los planos o diagramas que expliquen como se hizo una base de datos pueden ser de gran ayuda para tales mejoras. Es de esperar que un cliente con visin de futuro exija una cierta documentacin de como se hizo un programa. Por otro lado, un problema habitual para los desarrolladores informticos es la necesidad de conocer un poco el dominio de conocimiento. Es decir, si se necesita construir una base de datos que almacene informacin sobre impuestos, es muy probable que primero se necesite conocer un poco ms como funciona ese mundo. El conocimiento que se obtenga junto a los requisitos que tenga el cliente deberan plasmarse de alguna forma en un documento. Al igual que la construccin de una casa requiere la elaboracin de planos y clculos el diseo de una estructura de almacenamiento de datos requiere que exista un mecanism Los diagramas como planos de una BBDD. Se utilizarn para que despues todo el mundo pueda entender qu hay dentro de la BBDD por si se necesita modicar algo. Un problema fundamental es el dominio de conocimiento. Como informticos debemos intentar adquirir el conocimiento del cliente para reejarlo en una BD. En esencia debemos intentar extraer la informacin RELEVANTE Otro problema de gran importancia es la ambigedad. Se debe concretar al mximo el signicado de cada palabra o trmino especco. En suma, un informtico va a construir un modelo del conocimiento del cliente. La primera labor a la hora de construir una BD es modelar la informacin.

Bases de datos, Versin 1.1

Las reuniones, el proceso de desambigacin etc... deben plasmarse en una especicacin de requisitos. Un ejemplo de especicacin es el estndar IEEE 830, que ofrece una plantilla que podemos rellenar. Una vez hecha la especicacin, se proceder a la realizacin del diseo, modelo, plano...

2.2 Modelado de datos


Al hacer un modelo, plano o diagrama de datos, se hacen abstracciones Hay que resear que no seremos expertos en el campo de aplicacin. Es muy importante utilizar un lenguaje estndar. Los distintos SGBD (Sistemas Gestores de Bases de Datos) son muy distintos entre s Por ejemplo, tenemos SGBD monolticos: se caracterizan por utilizar un solo programa de uso y administracin de los datos. Tambin existen los SGBD basados en un modelo cliente/servidor. Los SGBD cliente/servidor hacen que los datos estn gestionados por un solo programa llamado servidor. A dichos datos pueden acceder montones de clientes. Debido a estas diferencias el proceso de crear tablas necesita pasar por varias fases. Primero se debe hacer el llamado modelo conceptual. Este modelo consiste en hacer los diagramas que reejan los requisitos. Despues haremos el llamado diseo lgico que consiste en crear una estructura de tablas y claves. Por ltimo se debe hacer el diseo fsico que consiste en pasar el diseo lgico a un lenguaje SQL de un SGBD.

2.3 Modelos E/R


El modelo E/R se remonta al ao 1970, cuando Peter Chen observ lo complejo que era disear una base de datos. Decidi crear un lenguaje comn de smbolos que facilitara la comunicacin.

2.3.1 Entidades
Se denomina entidad a cualquier elemento sobre el cual se desea almacenar informacin. Aunque las entidades suelen corresponderse con los sustantivos, no todos los sustantivos merecen ser entidades que aparezcan en el modelo. Las entidades pueden ser fuertes o dbiles: Una entidad fuerte es aquella que existe por s sola. Una entidad dbil es aquella que requiere que otra entidad exista antes que ella. Supongamos una situacin como empleado realiza viajes. No se puede almacenar nada sobre un viaje si previamente no existe un empleado que lo realice. En la debilidad hay dos posibilidades:

Captulo 2. Diseo de bases de datos

Bases de datos, Versin 1.1

Dependencia en existencia: una entidad es dbil con dependencia en existencia si antes de poder existir o almacenarse requiere que otra entidad exista primero. Dependencia en identicacin: la entidad dbil no tiene clave propia sino que necesita la de otra entidad.

2.3.2 Ocurrencia de entidades


En general una misma entidad puede ocurrir muchas veces, se dice que una entidad puede tener varias instancias. Una entidad Coche puede tener innitas instancias como Seat Ibiza CR-2785-X, Renault 21 8765-CWG, ...

2.3.3 Interrelaciones
Son asociaciones entre entidades. En general se corresponden con los verbos. Se representan por medio de un rombo con el nombre dentro. Las interrelaciones pueden ser entre distintos conjuntos de entidades Interrelacin binaria: se da entre dos entidades. Interrelacin ternaria: se da entre tres entidades que participan de forma simultnea en una asociacin. Interrelacin n-aria. Interrelaciones reexivas: se dan entre una entidad y s misma. El principal ejemplo se da en la sentencia unos empleados son jefes de otros.

2.3.4 Participacin o cardinalidad


En las bases de datos se debe reejar el hecho de que las entidades puedan aparecer 0 veces, 1 vez, muchas veces. En el diagrama, se ponen las cardinalidades junto a la entidad y con el mnimo y el mximo. Para abreviar,a veces se ponen los mximos encima de la relacin y tendremos entonces relaciones como esta: Uno a uno o 1:1 Uno a muchos o 1:n Muchos a muchos o m:n Ejercicios: hacer el diagrama E/R con entidades, debilidades, interrelaciones y cardinalidades de los siguientes supuestos. Hombre se casa con mujer en sociedad mongama Hombre se casa con mujer en sociedad polgama masculina Hombre se casa con mujer en sociedad polgama mixta Pescador pesca pez Arquitecto disea casa

2.3. Modelos E/R

Bases de datos, Versin 1.1

Piezas forman producto Tngase en cuenta que producto no es dbil. Esto se debe a que podemos almacenar un producto en la base de datos indicando un hecho:el producto P1 est hecho de los tornillos T1, T2 y T3. Este hecho se puede almacenar aunque no tengamos fsicamente los tornillos. A la hora de comprobar la debilidad de una entidad se debe ver si podemos almacenar los hechos o no, sin pensar en productos o piezas fsicos. Turista visita hotel Jugador juega equipo Poltico gobierna pas. Autor publica libro en una editorial Podra verse la solucin a esto como tres relaciones 1. Autor escribe libro 2. Libro es editado por editorial 3. Editorial publica libro O como una relacin ternaria: Autor publica libro en editorial En resumen, ante las dudas debemos fabricar un diagrama que recoja las posibles asociaciones: supongamos que conocemos los siguientes hechos Cervantes escribe Quijote Cervantes escribe Novelas Ejemplares Ivn Lpez escribe Bases de datos M.J Castellanos escribe Bases de datos Ed. Anagrama publica Quijote Ed. Anagrama publica Novelas ejemplares Ed. Garceta publica Bases de datos Ed. Garceta publica Lazarillo Si en las distintas asociaciones encontramos que hay asociaciones rgidas que no pueden cambiar, deberemos usar una interrelacin ternaria: Cervantes escribe Quijote es un hecho que no puede variar. Es cierto que la otra asociacin s puede cambiar: por ejemplo, maana Ed. Anagrama publica Bases de datos. Aunque esto es un hecho exible la relacin AutorLibro no puede cambiarse.

2.3.5 Atributos
Se denomina atributos a propiedades de las entidades que tienen la importancia suciente para almacenar datos sobre ellas y que por tanto aparecern en el diagrama E/R. Los atributos suelen tener un dominio: es decir un conjunto de valores del cual toman su informacin. Un detalle sutil pero importante es que en ocasiones los atributos no son de las entidades, sino de las relaciones. Ej: pensemos en el diseo E/R de un enunciado como este: un mecanico repara un coche en una cierta fecha del ao. La informacin de un conjunto cualquiera de mecnicos podra ser la siguiente

Captulo 2. Diseo de bases de datos

Bases de datos, Versin 1.1

DNI 10 20 30

Nombre Juan Luis Angel

Ap1 Sanz Sanz Diaz

Ap2 Alcolea Ruiz Diaz

Es evidente que no podemos poner la fecha de reparacin en la entidad Mecnico: un mecnico solo podra reparar coches una vez en su vida, ya cada mecnico solo aparece una vez en la tabla. Por otro lado, supongamos la siguiente informacin sobre un conjunto de coches. Matric. 2211-ZW 4324-EE 5421-AA Marca Seat Renault VW Modelo Ibiza 21 Bora

La fecha de reparacin tampoco es de la entidad Coche: si lo hiciramos as un coche solo podra repararse una vez en la vida (recordemos que cada coche solo aparece una vez en la tabla). A veces, hay atributos que se comportan de una forma especial y esto se recoge en el diseo E/R Atributos opcionales: pueden aparecer o no. Atributos monovaluados: solo toman un valor (o como mucho dos, por exclusin). Atributos compuestos: por ejemplo, el campo Direccin. Atributos derivados: son aquellos que pueden obtenerse o calcularse a partir de otros. Por ejemplo, el campo Edad puede obtenerse a partir de Fecha de nacimiento.

2.3.6 Entidades dbiles


Ya hemos dicho que hay entidades que muestran debilidad en base a dos caractersticas Dependencia en existencia: por ejemplo la entidad Transaccin es dbil con respecto a Cuenta Corriente. En este caso, la interrelacin llevar una letra E, para indicar este tipo de dependencia. Dependencia de identicacin: en este caso, la relacin utiliza una I para sealar la dependencia. Ejercicio:Qu tipo de relacin existe entre estas entidades? 1. Toro y Ganadera: Toro es dbil (dependencia en identicacin) con respecto a Ganadera. 2. Una empresa tiene un prking y desea almacenar qu empleados aparcan vehculos y los datos sobre los mismos.

2.3.7 Ejercicio de modelado


Enunciado Analiza el siguiente enunciado y transfrmalo en DOS diagramas E/R. Qu caractersticas reejan uno u otro modelo?: Una serie de empresas con CIF, Nombre y Direccin desean ofrecer benecios a sus clientes. Estos benecios tienen un cdigo, una descripcin y una limitacin. Para obtener dichos benecios se emiten una serie de cupones que tienen un cdigo y una fecha de vencimiento

2.3. Modelos E/R

Bases de datos, Versin 1.1

Solucin No hay una solucin correcta a partir de lo que nos dicen. Podemos pensar en dos posible situaciones 1. Las empresas son libres de ofrecer benecios, modicarlos y hacer cambios cuando lo deseen. 2. Los benecios solo los inserta un administrador y las empresas deben ceirse a la lista de posibilidades que les ofrecemos Esto da lugar a que el ejemplo a) sea un modelo en el que se da libertad mientras que el modelo b) sea ms rgido, lo que a su vez condiciona el modelo Podemos por tanto contemplar dos soluciones a partir de las tres entidades Empresa, Benecio y Cupn 1. Dos relaciones binarias Relacin Empresa ofrece Benecio Relacin Benecio Se Plasma En Cupn 2. Una sola relacin ternaria Empresa con Benecio con Cupn Imaginemos las tres tablas, Empresa, Benecio y Cupn. CIF E1 E2 Codigo B1 B2 Codigo C1 C2 Nombre ACME XYZ Sport Direccion C/ Guadiana C/ Rio Limit. Excepto rebajas LaJ

Desc. 10 % desc. 5 % desc Fecha venc 31-12-2011 20-12-2011

A la hora de insertar en la tabla Benecios puede que si damos libertad acaben apareciendo las iguales Codigo B1 B2 B3 B4 B5 Desc. 10 % desc. 5 % desc 5 % desc 5 % desc 15 % desc. Limit. Excepto rebajas LaJ LaJ LaJ Solo S y D

En este caso, B2, B3 y B4 corresponden a los benecios que ofrecen distintas empresas, dando la casualidad de que sus descripciones son iguales. Hay quien considera eso un problema, pero no lo es, sino que es una consecuencia de la libertad que tienen las empresas para actuar.

2.3.8 Herencia
En ocasiones hay objetos que comparten muchas propiedades y caractersticas. Supongamos el ejemplo de una base de datos para la DGT. Para cada coche puede haber un dueo, pero este dueo puede ser una persona fsica o jurdica. Si construyramos dos entidades separadas Persona y Empresa descubriramos que tienen cosas en comn. Para ahorrar esfuerzos se puede poner una sola entidad general que ofrece los atributos, y dichos atributos son heredados por las entidades hija.

10

Captulo 2. Diseo de bases de datos

Bases de datos, Versin 1.1

Cuando hay una herencia es posible que una instancia pueda ser de dos entidades a la vez. Por ejemplo, pensemos en las entidades Personal Contratado y las entidades Estudiante y Trabajador. Puede una persona ser estudiante y trabajador a la vez? S . Por lo tanto esta herencia no es disjunta, pero la de Persona y Empresa s es disjunta. Las herencias disjuntas se marcan con una d en el tringulo.

2.3.9 Relaciones exclusivas


A veces dos entidades pueden ir relacionadas por dos o ms conexiones. En determinadas situaciones interesa restringir el nmero de conexiones posibles. Por ejemplo, cuando una entidad Cliente se conecta con una entidad Piso puede hacerlo por medio de varias relaciones como Vende, Alquila, Hace leasing. Si por ejemplo la ley obligase a que solo podamos tener un tipo de relacin, se pondr un arco en las relaciones.

2.4 Problemas
2.4.1 Problema 1: Comunidades de vecinos
Una rma de abogados dedicada a la administracin de ncas desea tener una base de datos para gestionar la informacin de sus clientes. La rma tiene varios abogados y cada uno de ellos ejerce de administrador de una o ms comunidades de vecinos, por lo que cobra unos honorarios anuales. Una comunidad es gestionada por un nico administrador (nombre, DNI y nmero de colegiado). Las funciones de un administrador consisten en llevar la contabilidad de la comunidad, gestionar los recibos y realizar los pagos a las distintas compaas (luz, agua...) De las empresas que cada comunidad tiene contratadas se guarda su nombre, direccin, telfono y una persona de contacto. Adems puede interesar tener agrupadas a las compaas por sectores (sector de seguridad, sector de suministros bsicos). De cada comunidad se almacena un cdigo, su nombre, calle, cdigo postal y poblacin. Cada comunidad consta de una serie de propiedades que pueden ser de tres tipos (vivienda particular, local y ocina). Cada propiedad se caracteriza por un nmero de portal, planta y letra, un nombre y apellidos del propietario, un porcentaje de participacin en los gastos de la comunidad as como los datos de la cuenta bancaria en la que el propietario desea se le domicilie el pago de los recibos. Si el propietario no habita en su propiedad se necesitan sus datos (nombre, apellidos, direccin y telfono) y los datos de su inquilino (nombre apellidos y telfono). Si la vivienda es particular se guarda el nmero de habitaciones. Si es un local se almacena el tipo de local y el horario. Si es una ocina se guarda la actividad a la que se dedica. Cada comunidad tiene un presidente (nombre, apellidos y propiedad de la que son dueos) y varios vocales que tratan con el administrador los asuntos que hay que tratar. Cada comunidad tiene una cuenta en un banco y todo banco tiene un cdigo y un nombre comercial. De las cuentas se almacena el cdigo de cuenta (que consta de un cdigo de sucursal, dos dgitos de control y un nmero de cuenta) y un saldo. Para identicar la cuenta hay que aadir el cdigo del banco al cdigo de cuenta. Se almacenan dos tipos de apuntes:

2.4. Problemas

11

Bases de datos, Versin 1.1

El banco emite los recibos, pero el administrador guarda informacin sobre dichos recibos como el nmero de recibo, fecha, importe y si se ha podido cobrar o no. Esta ltima informacin se necesitar para llevar un registro de impagados. En cuanto a los apuntes sobre gastos se tienen los importes que cobran las empresas contratadas por cada comunidad. Las compaas cobran sus recibos (nmero, fecha e importe) cargndolo en la cuenta de la comunidad

2.4.2 Solucin al problema 1


0. Leer el enunciado completo 1. Leer otra vez examinando cuidadosamente los elementos siguientes 1.1. Sustantivos: entidades/atributos 1.1.1. Abogado/administrador 1.1.2. Finca/propiedad 1.1.2.1. Num de portal 1.1.2.2. Planta y letra 1.1.2.3. Nombre y ap del propietario? Esta frase nos dice que el nombre y el apellido del propietario deben estar aqui. Sin embargo, si luego resulta que necesito una entidad Propietario, ya no podremos poner a esa entidad estos atributos. Si resulta que luego necesitamos esta entidad habremos descubierto que Propiedad es dbil por identicacin. 1.1.2.4. Porcentaje de particip. 1.1.2.5. Datos cuenta bancaria 1.1.3. Comunidad de vecinos 1.1.3.1. Nombre 1.1.3.2. Calle 1.1.3.3. CP 1.1.3.4. Poblacin 1.1.4. Honorarios 1.1.5. Funciones 1.1.6. Pagos 1.1.7. Compaa 1.1.8. Empresa 1.1.8.1. Nombre 1.1.8.2. Direccin 1.1.8.3. Telfono 1.1.8.4. Persona de contacto 12 Captulo 2. Diseo de bases de datos

Bases de datos, Versin 1.1

1.1.9. Sector 1.1.10. Tipos 1.1.10.1. Viv. particular Num. habitaciones 1.1.10.2. Local Tipo Horario 1.1.10.3. Ocina Actividad 1.1.11. Propietario 1.1.1. Nombre 1.1.2. Apellidos 1.1.3. Direccin 1.1.4. Telfono Al leer que un propietario tiene que aparecer como entidad, descubrimos que Propiedad va a ser dbil, como supusimos. 1.1.12. Inquilino 1.1.12.1. Nombre 1.1.12.2. Apellidos 1.1.13. Presidente 1.1.13.1. Nombre 1.1.13.2. Apellidos 1.1.13.3. Propiedad que poseen 1.1.14. Vocales 1.1.15. Cuenta 1.1.15.1. Cdigo de cuenta 1.1.15.2. DC 1.1.15.3. Nmero de cuenta 1.1.15.4. Cdigo de banco Como nos dicen que se necesita el cdigo del banco para poder identicar esta entidad, hemos descubierto que esta entidad es dbil 1.1.16. Banco 1.1.16.1. Codigo de banco 1.1.16.2. Nombre comercial

2.4. Problemas

13

Bases de datos, Versin 1.1

1.1.17. Apunte 1.1.17.1. Recibo (cobramos a prop) Nmero de recibo Fecha Importe Se pag? 1.1.17.2. Pago (pagamos luz..) Nmero de recibo Importe Fecha 1.2. Verbos: relaciones 1.2.1 Abogado administra Comunidad 1.2.2 Abogado cobra Honorarios (MAL!!, los honorarios no llegarn a ser entidad) 1.2.3 Comunidad es gestionada por Abogado es lo mismo que administra 1.2.4 Administrador realiza funciones 1.2.5 Comunidad contrata Empresa 1.2.6 Comunidad consta de Propiedades 1.2.7 Propiedad paga a travs de Cuenta 1.2.8 Comunidad tiene Presidente 1.2.9 Comunidad posee Vocales 1.2.10 Comunidad opera con Cuenta 1.2.11 Banco emite Recibo

2.4.3 Problema 2: Ajedrez


La federacin de ajedrez desea disponer de una base de datos de todas las partidas que se celebren bajo su auspicio. Toda partida viene caracterizada por una fecha de inicio, una duracin en horas, los jugadores que se enfrentaron y si eligieron blancas o negras Dos jugadores pueden enfrentarse solo una vez por da, aunque pueden hacerlo muchas veces en das distintos. Se anota cada movimiento de la partida: nmero de movimiento, casilla de origen y casilla de destino. Si se borra una partida se deben borrar los movimientos Las partidas no pueden ser aplazadas De los jugadores se recogen sus nombres, apellidos, direccin postal y electrnica, la federacin a la que pertenecen y el nmero de federado (que es nico en cada federacin)

14

Captulo 2. Diseo de bases de datos

Bases de datos, Versin 1.1

Solo hay una federacin por pas con un nombre, pas al que pertenece, telefono de contacto y fecha de fundacin Una federacin no se clausura hasta que no se reasignan sus jugadores a otra federacin. Las partidas pueden darse o no dentro de un torneo. Los torneos tienen un nombre, periodicidad, fecha de creacin y son organizados por una federacin En cada edicin de un torneo (nmero ordinal) se registran todos los enfrentamientos y el nombre del ganador. Tambin se anotan la fecha de inicio, la cuanta del premio y el jugador que lo gana Si desaparece una federacin, desaparecen los torneos y por ende, sus ediciones Aunque un jugador desaparezca, sus partidas no deben desaparecer

2.4.4 Solucin al problema 2 (ajedrez)


Entidades Federacin Atributo:nombre Atributo:pas Partida Atributo:fecha de inicio Atributo:duracin Atributo:blancas? Jugador Atributo:nombre Atributo:apellidos Atributo:direccin postal Atributo:direccin electrnica Atributo:num de federado Movimiento Atributo:nmero Atributo:casilla origen Atributo:casilla destino Torneo: es una entidad dbil ya que nos dicen Si desaparece una federacin, desaparecen los torneos y por ende, sus ediciones. Por tanto, no puede haber torneo en la BD sin que haya una federacin que lo organice. Atributo:nombre Atributo:periodicidad Atributo:fecha

2.4. Problemas

15

Bases de datos, Versin 1.1

Atributo:ganador Atributo:fecha inicio Atributo:periodicidad Atributo:cuanta del premio Relaciones Se necesita una relacin para conectar los jugadores con partida: Partida enfrenta jugadores. El enfrentamiento tiene atributos Tambin podramos considerar que hay una sola relacin reexiva Jugador Se Enfrenta Con Jugador. Esta relacin tendra atributos como fecha de inicio, duracin, etc... Partida Consta De Movimiento: aqu se descubre que Movimiento es dbil, no puede almacenarse un movimiento sin que est dentro de una partida Jugador Pertenece A Federacin. Hay dos posibilidades de relacin Federacin organiza Torneo que Consta De Partidas: relacin ternaria Federacin organiza Torneo y Torneo Consta De Partidas: dos binarias Dado que se permite que las partidas estn o no dentro de un torneo es ms apropiados que el modelo permita cierta libertad para lo cual es ms apropiado utilizar las dos binarias.

2.4.5 Problema 3: Formacin


El departamento de formacin de una empresa desea construir una BD para planicar y gestionar la formacin de sus empleados. Los supuestos semnticos que deben recogerse son los siguientes: La empresa organiza cursos internos de formacin de los que se desea conocer el cdigo de curso, el nombre, una descripcin, el nmero de horas de duracin y el coste del curso. Un curso puede tener como prerrequisito haber realizado otro(s) previamente, y, a su vez, la realizacin de un curso puede ser prerrequisito de otros. Un curso que es prerrequisito de otro puede serlo de forma obligatoria u opcional. Un mismo curso tiene diferentes ediciones, es decir, se imparte en distintos lugares,fechas y con diversos horarios (intensivo, maana o tarde). En una misma fecha de inicio slo puede impartirse una edicin de un curso. Los cursos se imparten por personal de la propia empresa. Un curso puede tener varios docentes pero una edicin slo tiene un profesor. De los empleados se desea almacenar su cdigo de empleado, nombre y apellidos,direccin, telfono, NIF, fecha de nacimiento, nacionalidad, sexo, rma y salario,as como si est o no capacitado para impartir cursos. Un mismo empleado puede ser docente en una edicin de un curso y alumno en otra edicin, pero nunca puede ser ambas cosas a la vez (en una misma edicin de un curso o lo imparte o lo recibe)

16

Captulo 2. Diseo de bases de datos

Bases de datos, Versin 1.1

2.4.6 Solucin al problema 3 (Formacin)


Entidades Curso Cdigo de curso (clave) Nombre Descripcin Duracin (nmero de horas) coste Edicin (dbil con respecto a curso) Lugar Fecha: clave Horario Empleado Nombre Ap Direccin Tlf Dni: clave Nacionalidad Firma Sexo Salario Capacitado Relaciones Curso Es Prerrequisito De Curso: muchos a muchos Curso Celebra Ediciones: edicin es dbil con respecto a curso Empleado Imparte Edicin. Empleado Sigue Edicin Nos dicen que no se puede hacer las dos cosas a la vez en una edicin, o una u otra.

2.4. Problemas

17

Bases de datos, Versin 1.1

2.4.7 Problema 4: viveros


Se desea disear una Base de Datos para gestionar los empleados y productos a la venta de una cadena de viveros dedicados a la venta de diversos productos relacionados con la jardinera. Los supuestos que hay que recoger en la BD son los siguientes: La cadena de viveros dispone de varios viveros en la provincia de Madrid identicados por un cdigo de tienda y de los que se almacenar un telfono, una direccin y un responsable que ser uno de los empleados que trabaja en el vivero (es necesario almacenar durante qu perodos de tiempo ha sido responsable cada empleado). Los productos que se venden tienen asignado un cdigo de producto y nos interesa guardar el precio y el stock que hay de cada producto en cada uno de los viveros y pueden ser de tres tipos: plantas de las que se guardar su nombre, y una breve descripcin de los cuidados que requiere; accesorios de jardinera y artculos de decoracin. Estos productos se distribuyen en zonas dentro de cada vivero cada una de ellas identicadas por un nombre dentro de cada vivero (zona exterior regado, interior climatizada, zona de caja, etc.). Se desea conocer el stock de cada producto de acuerdo a las zonas del vivero.Los empleados estarn asignados a una determinada zona en un vivero la cual podr cambiar a lo largo del tiempo (se guardar histrico de ello) y adems, los empleados puedenmo verse de un vivero a otro segn las necesidades en distintos perodos de tiempo. De los empleados se quiere conocer su DNI, su nombre y un telfono de contacto.En cuanto al proceso de venta de los distintos productos, slo se almacenarn los pedidos que realizan los clientes pertenecientes al Club VIP que es una promocin especial que permite a los clientes obtener descuentos segn las cuantas de sus compras. De estos clientes se almacena su DNI, su nombre, direccin, telfono y la fecha de incorporacin al club as como los datos de sus pedidos que incluyen un nmero de pedido, la fecha de realizacin, los productos adquiridos junto con las unidades y el descuento realizado; por ltimo, tambin se incluye el precio de los portes en caso de que se hayan contratado. De cada cliente se almacenarn todos los pedidos que haya realizado hasta la fecha.En cuanto a estos pedidos de clientes pertenecientes al Club VIP interesa tambin guardar quin fue el empleado que lo gestion y en qu vivero se realiz el pedido teniendo en cuenta que un pedido en un determinado vivero lo gestiona un nico empleado Solucin al problema 4 (Viveros) Entidades: Empleado DNI Nombre Nmero de contacto Producto Cdigo Precio Stock (ms tarde se descubre que stock NO ES UN ATRIBUTO DE PRODUCTO sino de una relacin) Planta es una entidad hija de Producto 18 Captulo 2. Diseo de bases de datos

Bases de datos, Versin 1.1

Nombre Cuidados Accesorio de jardinera (hija de producto) Artculo Viveros Cdigo Telfono Direccin Responsable? No, esto es una relacin Zona Nombre (clave) Pedido Nmero: clave Fecha Unidades, precio de portes y descuento son atributos de una relacin cuyo nombre todava no conocemos. Cliente: habr Normales y Club VIP DNI Direccin Telfono Fecha de incorporacin (solamente para el club VIP) Relaciones: Empleado es Responsable De Vivero tiene unos atributos de fecha de inicio y n. Producto Se Distribuye en Zona. Esto implica que hay un atributo en esta relacion llamado Stock. Empleado Trabaja en Zona A la hora de almacenar el hecho de que un pedido consta de varios productos vamos a descubrir que la relacin ternaria no es la mejor opcin ya que nos obligara a que en un pedido solo apuntsemos un producto VIP1 VIP1 VIP1 Ped1 Ped1 Ped1 Rosas Tijeras Semillas

Tcnicamente, esta relacin ternaria es capaz de guardar el hecho de que el cliente VIP1, en su pedido 1 compr Rosas, Tijeras y Semillas, sin embargo este modelo ternario nos est obligando a repetir datos. Como conclusin la relacin Cliente hace pedido que consta de Artculos no es la mejor opcin, sino que desglosaremos esto en dos binarias Vip Realiza Pedido (esto implica que Pedido es dbil)

2.4. Problemas

19

Bases de datos, Versin 1.1

Pedido consta de Productos. Hay una relacin a cuatro entre Pedido Cliente VIP, Vivero y Empleado Problema

2.4.8 Problema 5: Universidad


El Departamento de Informtica de la universidad necesita una base de datos para almacenar la informacin concerniente a los proyectos de investigacin tanto actuales como pasados en los que trabajan los profesores y as poder llevar a cabo una gestinms eciente. La informacin que se desea almacenar corresponde a los siguientes supuestossemnticos. En el departamento los profesores participan en proyectos de investigacin caracterizados por un cdigo de referencia nico, por un nombre, un acrnimo, un presupuesto total, el programa de I+D que lo nancia, una fecha de inicio y una fecha de nalizacin y una breve descripcin de los objetivos del proyecto. En los proyectos trabajan profesores del departamento durante un perodo de tiempo, esdecir, una fecha de inicio y una fecha de n, pudiendo ocurrir que un profesor trabaje en elmismo proyecto en varias pocas (f_ini, f_n) diferentes. Un profesor se identica por su nombre y apellidos y se caracteriza por su despacho y telfono y puede trabajar en varios proyectos simultneamente y en un proyecto de investigacin trabajan varios profesores. De todos los profesores que trabajan en el proyecto hay uno que es el investigador principal deproyecto que interesa conocer. Es importante tener en cuenta que el profesor investigador del proyecto nunca vara a lo largo de la vida del proyecto de investigacin. Los profesores pueden ser doctores o no doctores, de tal manera que un profesor nodoctor siempre tiene a un nico profesor doctor como supervisor en un momento determinado,interesando almacenar los supervisores y perodos de tiempo de la supervisin que ha tenido undeterminado profesor no doctor. En relacin con la participacin de los profesores en proyectosde investigacin, el investigador principal de un proyecto siempre tiene que ser un doctor.Por otro lado, los proyectos de investigacin producen una serie de publicaciones sobrelas que tambin interesa guardar informacin. Una publicacin se caracteriza por un nmero en secuencia dentro de cada proyecto de investigacin y se guardar el ttulo y los profesores que la han escrito; las publicaciones son de dos tipos, publicaciones en congresos y publicaciones en revista; de las primeras se almacenar el nombre del congreso, su tipo (nacional ointernacional), la fecha de inicio y de n, el lugar de celebracin, pas y la editorial que hapublicado las actas del congreso (si es que se han publicado); de las publicaciones en revista interesa saber el nombre de la revista, la editorial, el volumen, el nmero y las pginas de inicio y n. No solamente interesa conocer los profesores que han participado en las publicaciones de los proyectos de investigacin sino tambin las lneas de publicacin que cubren estas publicaciones. Una lnea de investigacin se identica por un cdigo, un nombre (por ejemplo,recuperacin de informacin multilinge, bases de datos espacio-temporales, etc.) y un conjunto de descriptores (por ejemplo, la lnea de investigacin bases de datos temporales puede tener como descriptores Bases de Datos, SGBD Relacional, Dimensin temporal). Los profesores tendrn asociados en la BD las lneas de investigacin en las quetrabajan incluso podra ocurrir que hubiera profesores que no tuvieran ninguna lnea asignada.As, tanto los profesores doctores como los no doctores pueden escribir publicaciones sobre una o ms lneas de investigacin y nos interesa saber sobre qu lnea de investigacin ha escrito un determinado 20 Captulo 2. Diseo de bases de datos

Bases de datos, Versin 1.1

profesor en una publicacin, teniendo en cuenta que un profesor queparticipa en una publicacin slo escribe en el mbito de una lnea de investigacin y que una determinada publicacin puede cubrir varias lneas de investigacin Solucin: entidades Proyecto cdigo de referencia nico un nombre un acrnimo un presupuesto total el programa de I+D que lo nancia una fecha de inicio y una fecha de nalizacin y una breve descripcin Profesor Nombre y apellidos. Despacho y telfono. Investigador principal hijo de Profesor? Es mala idea porque usaramos una entidad para algo que aparecer una sola vez. Doctor y No doctor s pueden ser entidades hija. Publicacin. Nmero Ttulo Profesores que lo escriben (esto ser una relacin) En congreso y En revista sern entidades hija. En congreso tiene los atributos: Tipo, nombre, fecha de inicio, de n, lugar de celebracin, pas y editorial. En revista tiene los atributos: nombre de revista, el volumen, editorial, pginas de inicio y n. Lnea Cdigo Nombre Descriptores: Nombre

2.4. Problemas

21

Bases de datos, Versin 1.1

Solucin: relaciones Profesor Participa en Proyecto Profesor dirige proyecto, esta relacin contiene el hecho de que un proyecto tiene 1 y solo 1 investigador principal. Doctor supervisa a No Doctor Doctor dirige proyecto, esta relacin sustituye a la anterior Profesor dirige proyecto. Proyecto produce publicacin. En realidad, ms adelante descubriremos que el Profesor debe intervenir en esta relacin dando lugar a una relacin ternaria Proyecto produce publicacin en la que interviene profesor

2.5 Transformacin de modelos E/R en modelos relacionales


Toda entidad se convierte en tabla. Toda entidad dbil se convierte en tabla. La clave de esta tabla ser la mezcla de la clave del dbil ms la clave del fuerte. En una herencia, la entidad padre se convierte de forma normal. Las hijas heredan la clave del padre (y en las hijas ser adems clave ajena). En las relaciones se trabaja de la siguiente forma Si la relacin es 1:1 ambas entidades se convierten a tablas Y UNA DE ELLAS TOMA LA CLAVE DE LA OTRA que actuar solo como clave ajena Si la relacin es 1:N el que tiene el N toma la clave del que tiene el 1, que actuar como parte de la clave primaria adems de ser clave ajena. Si adems la relacin tuviera atributos, estos atributos van en el que tiene el N. Si la relacin es M:N LA RELACIN SE CONVIERTE EN TABLA. La clave de esa tabla es la mezcla de las claves de los participantes. Todas ellas actan adems como claves ajenas. Si la relacin tiene atributos los ponemos en esta tabla.

2.5.1 Transformacin del modelo Universidad


Se muestran en negrita las claves primarias. Publicacin (Nmero, Ttulo) EnCongreso(Nmero, Ttulo, Tipo, FechaInicio, FechaFin, Lugar, Pas, Editorial) Clave ajena: La pareja (Nmero,Ttulo) es clave ajena sobre Publicacin(Nmero,ttulo) EnRevista(Nmero, Ttulo, Nombre, Volumen, Editorial, PaginaInicio, PaginaFin) Clave ajena: La pareja (Nmero,Ttulo) es clave ajena sobre Publicacin(Nmero,ttulo) Lnea (CdigoLnea, Nombre) Descriptor (Nombre) EntraEn(CdigoLnea, NombreDescriptor) Clave ajena: CdigoLnea es clave ajena sobre Lnea(Cdigo) 22 Captulo 2. Diseo de bases de datos

Bases de datos, Versin 1.1

Clave ajena: NombreDescriptor es clave ajena sobre Descriptor(Nombre) Cubre(Numero, Ttulo, CodigoLinea) Clave ajena: La pareja (Nmero,Ttulo) es clave ajena sobre Publicacin(Nmero,ttulo) Clave ajena: El atributo CodigoLinea es clave ajena sobre Linea(Codigo) Profesor (Nombre, apellidos, Despacho, Tlf) Doctor (Nombre, apellidos) NoDoctor (Nombre, apellidos, Nombre, apellidos) Clave ajena: La segunda pareja (nombre,apellidos) es clave ajena sobre Doctor(Nombre, apellidos). Solo es clave ajena por ser una relacin 1:n Produce (Nombre, apellidos, nmero, ttulo, cdigo) Clave ajena: La pareja (nombre,apellidos) es clave ajena sobre Profesor(Nombre, apellidos). Clave ajena: La pareja (nmero, ttulo) es clave ajena sobre Publicacin (nmero, ttulo) Clave ajena: El atributo Cdigo es clave ajena sobre Lnea(Cdigo) Proyecto (CdigoProyecto, Nombre, Acrnimo, Presupuesto, programa, FechaInicio, Fechan, Descripcin, Nombre, apellidos) Clave ajena: La pareja (nombre,apellidos) es clave ajena sobre Doctor(Nombre, apellidos). Solo es clave ajena por ser una relacin 1:n. Por favor, tngase en cuenta que Doctor es la entidad que intervena en la relacin Y NO LA ENTIDAD PROFESOR. Participa (Nombre, apellidos, CodigoProyecto) Clave ajena: La pareja (nombre,apellidos) es clave ajena sobre Profesor(Nombre, apellidos). Clave ajena: El atributo CdigoProyecto es clave ajena sobre Proyecto(CodigoProyecto)

2.5.2 Transformacin del modelo Ajedrez


Partida (CdigoPartida, FechaInicio, Duracin) Movimiento (CodigoPartida, Numero, CasillaOrigen, CasillaDestino) Clave ajena: CodigoPartida es clave ajena sobre Partida(CodigoPartida) Inciso: Segn la regla de transformacin 1:n, codigo partida debe ser ajena. Sin embargo una regla anterior nos ha dicho que debe formar parte de la clave primaria. Federacion(Nombre, Pais) Jugador (Nombre, apellidos, NumeroDeFederado, DireccionPostal, DireccionElectronica, NombreFederacion) NombreFederacion es clave ajena sobre Federacion(Nombre) Enfrenta es una relacin m:n. Se convierte en tabla. frenta(CodigoPartida,Nombre,Ap,Fecha,Vencedor, NombreBlancas, ApBlancas) CodigoPartida es ajena sobre Partidas(CodigoPartida) La pareja (Nombre, Apellidos) es clave ajena sobre Jugador(Nombre, Apellidos) La pareja (NombreBlancas,ApellidoBlancas) es ajena sobre Jugador(Nombre,Apellidos) 2.5. Transformacin de modelos E/R en modelos relacionales 23 En-

Bases de datos, Versin 1.1

A tener en cuenta: esta tabla ilustra que un diseo mejor habra sido tener dos relaciones como Se enfrenta con blancas y Se enfrenta con negras. An as, habra que programar Torneo (NombreTorneo, NombreFed, Periodicidad,Cuantia) NombreFed es clave ajena sobre Federacin(Nombre) Edicin (Numero, NombreTorneo,NombreFed, Nombre,Apellidos) La pareja (NombreTorneo,NombreFed) neo(NombreTorneo,NombreFed) es clave ajena sobre Tor-

La pareja (Nombre,Apellidos) es clave ajena sobre Jugador(Nombre,Apellidos) En este punto debemos reformar la tabla partida y dejarla as Partida (CdigoPartida, FechaInicio, Duracin, NumeroEdicion, NombreTorneo, NombreFederacion) El tro (NumEdicion, NombreTorneo, NombreFederacion) es clave ajena sobre Edicion(NumEdicion,NombreTorneo,NombreFederacion)

2.5.3 Transformacin del modelo Fincas


Resuelto en la pizarra

2.6 Normalizacin
Cuando se elabora un diseo de tablas, puede ocurrir que an siga existiendo mucha redundancia. Al disear tablas se debe examinar la redundancia que pueda existir en ellas. Estas redundancias suelen ser visibles a simple vista: Dado un CP se puede deducir la Poblacin. Estas redundancias adoptan un nombre muy concreto: Dependencias funcionales o tambien implicaciones. A veces, las dependencias funcionales implican varios campos en conjunto. Supongamos una tabla como esta Jugador (Nombre,ap, pas) Cuando en una dependencia hay varios atributos se le llama dependencia funcional completa. Para eliminar una dependencia crearemos una tabla separada de la tabla inicial. En la nueva tabla pondremos estos campos: el implicante y los implicados La clave de la nueva tabla es el implicante (o los implicantes, si hay varios) En la tabla vieja se borran todos los implicados y el implicante se convierte en clave ajena sobre la nueva tabla. Recordemos un par de conceptos Clave primaria: es un atributo (o pareja, o tro) que sabemos que no se va a repetir. Clave candidata: es un atributo (o pareja) que PODRA ACTUAR COMO PRIMARIA pero no lo hemos elegido. Transitividad: supone que si A implica B y B implica C, automticamente sabremos que A implica C.

24

Captulo 2. Diseo de bases de datos

Bases de datos, Versin 1.1

2.6.1 Primera forma normal (1FN)


Una tabla est en 1FN si en cada atributo se prohbe insertar ms de un valor.

2.6.2 Segunda forma normal (2FN)


Una tabla est en segunda forma normal si todos los campos tienen dependencia completa respecto a la clave. Supongamos una base de datos con una tabla como esta Compras(CodigoProveedor, CodigoProducto, NombreProducto, Cantidad). En esta tabla es fcil observar que hay una dependencia funcional pero no completa con respecto a la clave (CodigoProveedorProducto) sino parcial, de la forma CodigoProducto implica Nombre.

2.6.3 Tercera forma normal


Una tabla est en 3FN si est en 2FN y adems no hay dependencias transitivas.

2.6. Normalizacin

25

Bases de datos, Versin 1.1

26

Captulo 2. Diseo de bases de datos

CAPTULO 3

Diseo fsico

3.1 Introduccin
En general hemos seguido un proceso lgico en la creacin de bases de datos. Tema 1: posibilidades Tema 2: Diseo Anlisis Diseo E/R Pasar a un diseo relacional Normalizacin.

3.2 BBDD en Access


3.2.1 Interfaz Vista de tabla
Access crea automticamente un campo llamado ID que actuar como clave primaria. Este campo ID usar un tipo llamado Autonumrico Dicho campo es un nmero entero Se incrementa automticamente cuando pasamos a otra la.

3.2.2 Tipos de datos


Access maneja los siguientes tipos de datos Texto Acepta letras, nmeros y smbolos pero solo acepta conjuntos de longitud pequea (255 smbolos mximo)

27

Bases de datos, Versin 1.1

Memo Acepta textos largos. Fecha Permite manejar datos relacionados con las fechas y con sus intervalos. Numricos Se reservan para datos para los cuales se deseen hacer operaciones matemticas. Los tipos numricos pueden concretarse an ms: Byte: acepta nmeros en el rango 0-255 Enteros cortos: nmeros entre -32767 y 32768 Entero largo: a nivel interno usa 32 bits (-2^32 hasta 2^32) Decimal: acepta decimales al nivel que le indiquemos Simple: acepta negativos y decimales de precisin variable Doble: acepta negativos y decimales muchsimo ms grandes y con mucha ms precisin decimal En general la regla es: cuanto ms corto es el campo ms rpido se procesa pero menos precisin nos ofrece S/No Reservado para valores lgicos (True/False)

3.2.3 Formato de datos


Se puede controlar la apariencia que tendrn los datos en pantalla, por ejemplo, una fecha puede mostrarse como 13-2-85 o 13/2/1985 Formato de la fecha En el formato de la fecha se deben usar tres smbolos bsicos para manejar el da, el mes y el ao,que son respectivamente d, m y a d-m-aa: Escribe algo como 1-3-81 d-m-aaaa: Escribe algo como 1-3-1981 d-mmm-aaaa: Escribe algo como 1-Mar-1981 dd-mmm-aaaa: Escribe la fecha 01-Mar-1981 dd-mm-aaaa: Escribe la fecha 01-03-1981 dd/mm/aaaa: Escribe la fecha 01/03/1981 dd/mmmm/aaaa: Escribe la fecha 01/Marzo/1981 28 Captulo 3. Diseo fsico

Bases de datos, Versin 1.1

hh:nn:ss dd/mmmm/aaaa: Escribe la fecha 01/Marzo/1981 Formato de cadenas El nico smbolo de inters es @ @@-@@ Coge los dos primeros smbolos y los separa de los dos segundos por un guin. Desde @@ hacia @@ Formato de nmeros Para modicar la presentacin de los nmeros se utiliza el smbolo 0. 000,00: Extraer un nmero de 3 cifras, si no lo hay se rellena con ceros, y despues extraer dos decimales. Mostrar eso en pantalla

3.2.4 Mscaras de entrada


Hemos dicho que el formato cambia la forma de mostrar las cosas en pantalla (pero no cambia como se almacenan por dentro). Sin embargo a veces es importante intentar evitar que se almacenen datos incorrectos. Para indicar a Access las mscaras de entrada, usaremos estos cdigos 0: Es obligatorio insertar una cifra en esa posicin L: Es obligatorio insertar una letra en esa posicin 9: Es optativo insertar algo, pero si se hace que sea una cifra ?: Es optativo insertar algo, pero si se hace que sea una letra A: Es obligatorio insertar algo aqu y puede ser una letra o un nmero. a: Es optativo insertar algo aqu y puede ser una letra o un nmero. Ejercicio: como sera la mscara que permite a la gente insertar su DNI con o sin letra? Solucin: 90000000? Ejercicio: como sera la mscara de entrada de un campo login que puede tener 3-4 letras seguidas de 4-5 nmeros? Solucin: la solucin sera ?LLL00009 (se recomienda dejar los elementos optativos en las esquinas). Ejercicio: como sera la mscara de entrada de un campo password, donde se obliga a que la clave tenga entre 8 y 12 smbolos que pueden ser letras o nmeros? Solucin: AAAAAAAAaaaa

3.2.5 Ttulo
El ttulo es lo que se mostrar en los formularios. Se puede dejar en blanco.

3.2. BBDD en Access

29

Bases de datos, Versin 1.1

3.2.6 Valor predeterminado


Es un valor que Access puede insertar automticamente para casos de tablas donde la mayor parte de registros tienen el mismo valor.

3.2.7 Regla de validacin


Es ms potente que una mscara de entrada, ya que permite indicar condiciones que los datos deben cumplir antes de ser insertados

3.2.8 Texto de validacin


Es el texto que aparecer cuando la regla no se cumple.

3.2.9 Requerido
Nos indica si es obligatorio que haya dentro del campo o si por el contrario puede estar vaco.

3.2.10 Indexado
Indica si el campo deber estar en un ndice de la base de datos. Un ndice es un archivo de la base de datos que el programa puede utilizar para hacer bsquedas ms deprisa. No fabricaremos un ndice para todos los campos ya que el proceso puede ser lento y ocupar mucho espacio. Puede ser la primera y mejor opcin cuando los usuarios se quejan de que las bsquedas son lentas.

3.2.11 Compresin Unicode


Permite seguir utilizando un solo byte por smbolo a pesar de que utilicemos Unicode (que utiliza de 2 a 4 bytes por smbolo)

3.2.12 Modo IME


IME signica Input Method Editor, y especica los diversos sistemas existentes para introducir smbolos. Es relevante solamente en casos como el uso de lenguajes asiticos y similares.

3.2.13 Oraciones IME


Permite controlar como Access va a procesar las frases en otros idiomas.

3.2.14 Etiquetas inteligentes


Permite que Access procese de una forma especial diversos campos. Para ello debemos saber como funciona el vocabulario XML de Microsoft

30

Captulo 3. Diseo fsico

Bases de datos, Versin 1.1

3.2.15 Alineacin
Controla como aparecer el texto: alineado a la derecha, a la izquierda, distribuido (justicado). Los puntos del 11 al 15 no entran en examen.

3.3 Claves ajenas


Access denomina a este concepto Relaciones. Para indicar que un campo es clave ajena sobre otro, se deber acudir a este men y arrastrar la clave ajena sobre la primaria. Se denomina integridad referencial a la capacidad del SGBD de obligar a que los datos de una tabla existan previamente en otra. Cuando se conectan campos y la clave ajena es autonumrica se est cometiendo un error, ya que Access intentara cambiar los valores sin ceirse a la clave primaria. Al crear una clave ajena se pueden hacer cumplir dos condiciones extrar 1. Actualizacin en cascada: si alguien cambia la clave primaria, el que se marc como clave ajena cambiar automticamente 2. Borrado en cascada: si alguien borra el registro de la clave primaria, los registros asociados en la clave ajena se borrarn tambin. No siempre es necesario hacer esto.

3.4 MySQL
3.4.1 Comandos bsicos
Mostrar las bases de datos en el servidor: show databases; Utilizar una BD a partir de un instante dado: use cdcol; Mostrar las tablas de una base de datos: show tables; Mostrar las descripciones detalladas de las tablas: desc user;

3.4.2 Creacin de bases de datos y tablas


El comando para crear una base de datos: create database <nombre>. Sin embargo la creacin de una tabla es un proceso complejo.
create table publicacion ( numero int, titulo char(60) ); create table <nombre> ( <campo1> <tipo de datos> , <campo2> <tipo de datos> , ...

3.3. Claves ajenas

31

Bases de datos, Versin 1.1

<campo20> <tipo de datos> );

3.4.3 Tipos de datos en MySQL


Los tipos pueden ser Numricos: pueden ser unsigned o no Enteros: no aceptan decimales TINYINT: -128,+127 O 0-255 SMALLINT: -32768,32767 O 0-65535 INT -2100 millones, 2100 millones o 0-4200 millones BIGINT: -2^63, 2^63 o 0-2^64 Decimales: s aceptan parte fraccionarios DECIMAL (c, d): la c indica el total de cifras, y la d indica cuantas de ellas sern decimales. As, DECIMAL (10,2) nos da un nmero con 10 cifras en total y dos de ellas decimales, es decir, que tenemos 8 cifras para la parte entera. FLOAT: hasta 8 decimales DOUBLE: hasta 12 decimales Cadenas CHAR(x): la x indica la longitud mxima de la cadena. Reserva el espacio aunque no se utilice. Son ms rpidos de procesar pero gastan ms espacio. VARCHAR(x): la x indica un mximo que no se puede sobrepasar pero si no se usa ese mximo el resto del espacio est libre. Son ms lentos de procesar pero ahorran espacio. Fechas DATE: almacena fechas en formato aaaa-mm-dd TIME: almacena tiempos en formato hh:mm:ss:fraccion DATETIME: almacena fechas junto con las horas en formato predenido aa-mm-dd hh:mm:ss TIMESTAMP: es una marca de tiempo gestionada por el SGBD y no se puede modicar directamente. BLOB: Binary Large OBjects.

3.4.4 Claves en MySQL


En MySQL se pueden denir indicaciones de como se va a comportar un campo: Clave primaria: es un conjunto de campos cuyo valor no se puede repetir. Adems, las claves primarias suponen crear automticamente un ndice.

32

Captulo 3. Diseo fsico

Bases de datos, Versin 1.1

use ... ; drop table empleado; create table empleado ( dni char(10), nombre varchar(60), apellidos varchar(120), primary key (dni) );

insert into empleado values ( "5678123W", "Juan", "Ramirez Diaz" ); insert into empleado values ( "1234567Z", "Angel", "Sanchez Gomez" );

insert into empleado values ("5678123W", "Tomas", "Perez Perez"); select * from empleado;

Una alternativa sera utilizar como clave primaria un conjunto de campos


create table empleado ( dni char(10), nombre varchar(60), apellidos varchar(120), primary key (nombre, apellidos) ); insert into empleado values ( "10X", "Juan", "Gomez Gomez" ); insert into empleado values ( "10X", "Angel", "Gomez Gomez" ); insert into empleado values ( "20Z", "Juan", "Gomez Gomez" );

Clave ajena
create table empleado ( dni char(10),

3.4. MySQL

33

Bases de datos, Versin 1.1

nombre varchar(60), apellidos varchar(120), primary key (nombre, apellidos) ); create table sueldos ( dni char(10), sueldo decimal(6,2), primary key (dni), foreign key (dni) references empleado (dni) ); insert into sueldos values ("99Q", 950.45); insert into sueldos values ("1234567Z", 950.45); insert into sueldos values ("5678123W", 1430.91);

3.4.5 Resolucin del modelo de tablas Universidad


create table publicacion ( titulo varchar(100), numero smallint, primary key (titulo, numero) ); create table encongreso ( titulo varchar(100), numero smallint, fechainicio date, fechafin date, primary key (titulo, numero), foreign key (titulo, numero) references publicacion (titulo,numero) );

create table enrevista( titulo varchar(100), numero smallint, nombre varchar(50), volumen smallint, editorial varchar(30), paginainicio smallint, paginafinal smallint, primary key (titulo,numero), foreign key (titulo,numero) references publicacion(titulo,numero) ); create table lineas ( codigolinea smallint unsigned, nombre varchar(200),

34

Captulo 3. Diseo fsico

Bases de datos, Versin 1.1

primary key (codigolinea) ); create table descriptor ( nombre varchar(220), primary key (nombre) ); /* Ojo: esta definicin estara mal porque los tipos de datos no coinciden. -O codigolinea arriba es un int, o aqui lo cambiamos para que sea smallint unsigned -O nombre lo ponemos aqui como varchar(200) o arriba ponemos varchar(80)*/ create table entraen ( codigolinea int, nombredescriptor varchar(80), primary key (codigolinea, nombredescriptor), );

create table entraen ( codigolinea smallint unsigned, nombredescriptor varchar(220), primary key (codigolinea, nombredescriptor), foreign key(codigolinea) references lineas(codigolinea), foreign key (nombredescriptor) references descriptor(nombre) ); create table cubre ( numero smallint, titulo varchar(100), codigolinea smallint unsigned, primary key (numero, titulo, codigolinea), foreign key (titulo, numero) references publicacion(titulo, numero), foreign key (codigolinea) references lineas(codigolinea) ); create table profesor ( nombre varchar(80), apellidos varchar(140), despacho smallint unsigned, tlf varchar(25), primary key (nombre, apellidos) ); create table doctor

3.4. MySQL

35

Bases de datos, Versin 1.1

( nombre varchar(80), apellidos varchar(140), primary key (nombre, apellidos), foreign key (nombre, apellidos) references profesor(nombre, apellidos) ); create table nodoctor ( nombre_nodoctor varchar(80), apellidos_nodoctor varchar(140), nombre_doctor varchar(80), apellidos_doctor varchar(140), primary key (nombre_nodoctor, apellidos_nodoctor), foreign key (nombre_nodoctor, apellidos_nodoctor) references profesor(nombre, apellidos), foreign key (nombre_doctor, apellidos_doctor) references doctor(nombre, apellidos) ); create table produce ( nombre varchar(80), apellidos varchar(140), titulo varchar(100), numero smallint, codigo smallint unsigned, primary key (nombre, apellidos, titulo, numero, codigo), foreign key (nombre, apellidos) references profesor(nombre, apellidos), foreign key (titulo, numero) references publicacion(titulo, numero), foreign key (codigo) references lineas(codigolinea) ); create table proyecto ( codigo int, nombre varchar(150), acronimo varchar(15), primary key (codigo) ); create table participa ( nombre varchar(80), apellidos varchar(140), codigoproyecto int, primary key (nombre,apellidos,codigoproyecto), foreign key (codigoproyecto) references proyecto(codigo), foreign key (nombre,apellidos) references profesor(nombre,apellidos)

36

Captulo 3. Diseo fsico

Bases de datos, Versin 1.1

);

3.4.6 Resolucin del modelo Ajedrez


create database ajedrez; use ajedrez; create table partida ( codigo int, fechainicio date, duracion_minutos smallint unsigned, primary key (codigo) ); create table movimiento ( codigopartida int, numero int, casillaorigen char(2), casilladestino char(2), primary key (codigopartida, numero), foreign key (codigopartida) references partida(codigo) ); create index ind_casilla_origen on movimiento(casillaorigen); create table federacion ( nombre varchar(120), pais varchar(80), primary key (nombre) ) tablespace ts_disco_lento; create table jugador ( nombre varchar(80), apellidos varchar(140), email varchar(120), dir_postal varchar(200), num_federado int, nombre_federacion varchar(120), primary key (nombre,apellidos), foreign key (nombre_federacion) references federacion(nombre) ) tablespace ts_disco_lento;

3.5 Tablespaces y undo les


Los undo les son archivos utilizados por el SGBD para anotar los hechos que van teniendo lugar (por ejemplo, al sacar dinero de un cajero). Si algo va mal, el SGBD puede utilizar dichos cheros para

3.5. Tablespaces y undo les

37

Bases de datos, Versin 1.1

deshacer operaciones por completo. Para crear un log en la base de datos que se almacene en un archivo logs en un directorio cualquiera podemos hacer lo siguiente. Adems, es obligatorio elegir un sistema interno a utilizar al almacenar los datos. Hoy en da, el engine InnoDB es el ms actual.
create logfile group logs_ajedrez add undofile "D:\oscar\logs" engine=innodb;

create tablespace ts_disco_lento add datafile "d:\oscar\lento" use logfile group logs_ajedrez engine=InnoDB;

38

Captulo 3. Diseo fsico

CAPTULO 4

Consultas SQL

4.1 Introduccin
Las consultas, las sentencias SELECT se apoyan sobre dos conceptos matemticos denominados Algebra relacional Clculo relacional

4.2 La sentencia SELECT


La sentencia SELECT permite extraer datos de las tablas en base a condiciones muy diversas. La operacin ms bsica que podemos hacer es extraer todo lo que hay en una tabla.
select select select select * * * * from from from from proveedores; partes; proyectos; suministra;

4.3 Condiciones
Muy a menudo no necesitaremos mostrar todos los datos de la tabla, sino solo algunos que se especicarn mediante condiciones. Si por ejemplo, deseramos mostrar solo los proveedores cuya ciudad sede est en Pars haramos algo como esto.
select * from proveedores where ciudad="Paris";

Otra posible consulta sera mostrar todos los proveedores cuyo estado tiene el codigo 10
select * from proveedores where estado=10;

39

Bases de datos, Versin 1.1

Las condiciones pueden ser muy complejas, y se pueden construir utilizando los operadores AND y OR. Por ejemplo, mostrar todos los proveedores cuya ciudad es Londres y su estado es 10.
select * from proveedores where ciudad="Londres" and estado=10;

Mostrar las partes cuyo peso es mayor de 15.


select * from partes where peso>19;

No es obligatorio mostrar todos los campos, se pueden mostrar solamente algunos de ellos indicando su nombre. Por ejemplo, mostrar el nombre de proveedor y la ciudad de los proveedores cuyo estado sea 20.
select nombreprov, ciudad from proveedores where estado=20;

Qu mostrar la siguiente consulta?


select nombreprov from proveedores where estado<=10 and estado>=20;

La respuesta es que no se muestra nada. La condicin est mal escrita ya que no puede haber un nmero que sea menor de 10 y a la vez mayor de 20. Mostrar los nombres de proveedores cuyo estado sea 10 y su ciudad Paris o Londres. Un primer intento sera este .. code-block:: mysql select nombreprov from proveedores where estado=10 and (ciudad=Paris or ciudad=Londres); Sin embargo, no funciona correctamente. La propia pregunta es ambigua Una posibilidad es que la pregunta fuera as Mostrar los nombres de proveedores cuyo estado sea 10 y (su ciudad Paris o Londres). La otra posibilidad es que la pregunta fuera as Mostrar los nombres de proveedores cuyo (estado sea 10 y su ciudad Paris) o Londres. Es importante recordar que cuando en una condicin hay tres o ms elementos de comparacin puede que sea necesario utilizar parntesis. Mostrar las partes rojas o verdes que pesen 17 o ms. Esta pregunta debe aclararse antes de resolverse. Mostrar las partes siempre que pesen 17 o ms y que luego cumplan una de estas dos: tener color rojo o tener color verde. Mostrar las partes (rojas o verdes) que pesen 17 o ms. Mostrar las partes que siendo verdes pesen 17 o ms o si no que simplemente sean rojas.

40

Captulo 4. Consultas SQL

Bases de datos, Versin 1.1

Mostrar las partes rojas o (verdes que pesen 17 o ms). Normalmente, se suele asumir la primera pregunta, que se resuelve as
select * from partes where peso>=17 and (color="Rojo" or color="Verde"); select * from partes where (color="Rojo" or color="Verde") and peso>=17;

4.4 Consultas con agregados


Se denomina agregado a alguna funcin de tipo estadstico aplicada a un subconjunto de los datos de una tabla.

4.4.1 Recuento
La funcin COUNT nos dice cuantas las cumplen una cierta condicin. No es obligatorio poner dicha condicin.
select count(*) from partes;

Si deseramos una condicin como por ejemplo hacer el recuento de partes cuyo color sea Azul
select count(*) from partes where color="Azul";

Cuantas partes hay que no sean rojas?


select count(*) from partes where color<>"Rojo";

Cuantos proveedores hay cuya ciudad sea Londres?


select count(*) from proveedores where ciudad="Londres";

Cuantas partes hay que sean rojas y pesen ms de 16?


select count(*) from partes where peso>16 and color="Rojo";

Cuantos proyectos hay en Madrid?


select count(*) from proyectos where ciudad="Madrid";

4.4. Consultas con agregados

41

Bases de datos, Versin 1.1

4.4.2 Promedio
Esta funcin calcula la media aritmtica de las las que cumplan una cierta condicin. Tampoco es obligatorio poner la condicin. La funcin promedio en SQL es AVG(*) Cual es el peso medio de las partes?
select avg(peso) from partes;

Cual es la media de peso de la partes azules?


select avg(peso) from partes where color="Azul";

4.4.3 Mximos y mnimos


Son operaciones que nos devuelven el valor ms grande o ms pequeo de entre los que cumplan una condicin. Estas funciones en SQL son MAX(campo-numrico) MIN(campo-numrico) Cual es peso ms grande de alguna parte?
select max(peso) from partes;

Cual es el peso ms pequeo de alguna parte?

4.4.4 Sumas
La operacin SUM(campo-numrico) efecta la suma de ese campo para las las que cumplan una cierta condicin. Cuantas partes en total ha suministrado el proveedor v1?
select sum(cantidad) from suministra where numprov="v1";

Cuantas partes ha recibido el proyecto y1?


select sum(cantidad) from suministra where numproyecto="y1";

Cuantas partes p2 ha suministrado el proveedor v2?


select sum(cantidad) from suministra where numparte="p2" and numprov="v2";

42

Captulo 4. Consultas SQL

Bases de datos, Versin 1.1

4.4.5 Mltiples agregados


A veces no se har una sola operacin matemtica sino muchas. En ese caso es muy importante indicar a SQL en base a qu debe hacer los resultados, o lo que es lo mismo como agrupar antes de hacer las operaciones. En SQL se indicarn los grupos sobre los cuales se va a hacer cada operacin mediante la clusula GROUP BY (campo). Adems, al hacer un group by es obligatorio tambin seleccionar el campo por el que se hacen los grupos. La respuesta a una pregunta como:Cual es la media de peso de las partes por color?
select avg(peso), color from partes group by (color);

Cual es la media de los pesos en funcin del nombre de parte?


select avg(peso), nombreparte from partes group by (nombreparte);

Cuantos proveedores hay en cada ciudad?


select count(*), ciudad from proveedores group by (ciudad);

Cual es la media de suministros por cada proveedor?


select avg(cantidad), numprov from suministra group by (numprov);

Cual es la media de pesos de las piezas rojas o verdes?


select avg(peso), color from partes where color="Rojo" or color="Verde" group by (color);

4.4.6 Condiciones de los agregados


Los agregados pueden llevar sus propias condiciones: NO VAN CON EL WHERE Van por separado utilizando HAVING El HAVING debe ir despues del GROUP BY Mostrar cuantos proveedores hay por ciudad, pero solo cuando haya dos o ms La primera parte de este ejercicio es igual que el anterior. Sacamos cuantos proveedores hay por ciudad
select count(*), ciudad from proveedores group by (ciudad);

4.4. Consultas con agregados

43

Bases de datos, Versin 1.1

Si ahora deseamos mostrar solo aquellos cuyo recuento sea mayor o igual que 2 debemos aadir una clusula HAVING como esta
select count(*), ciudad from proveedores group by (ciudad) having count(*)>=2;

El WHERE es una condicin que se aplica antes de hacer los clculos. Sin embargo, si una vez hechos los clculos no deseamos mostrarlos todos deberemos utilizar el HAVING. Mostrar cuantos tornillos hay en total Al hacer esta consulta se pueden cometer varios errores, como por ejemplo este, que muestra todas las partes
select count(*), nombreparte from partes group by nombreparte;

Esto no es exactamente un error, sino ms bien una trampa: se hizo el recuento a mano y se hizo trampa Error: En este caso se ha confundido el where con el having
select count(*), nombreparte from partes group by nombreparte having nombreparte="Tornillo";

Pregunta: Podramos quitar el group by? Respuesta: aunque en este caso s podramos no se debe hacer. Cuando nos pidan una operacin matemtica por grupos, debemos poner group by
select count(*), nombreparte from partes where nombreparte="Tornillo" group by nombreparte

4.5 Consultas multitabla


En ocasiones la informacin que nos pidan puede que est dispersa por distintas tablas. SQL ofrece un mecanismo para conectar tablas y as poder hacer las comparaciones que nos pidan. Por ejemplo, si nos piden el nombre de las partes suministradas en una cantidad >=500 descubriremos que El nombreparte est en la tabla partes La cantidad esta en la tabla suministra Las tablas partes y suministra tienen un campo en comn, el campo numparte Utilizando una clusula denominada inner join SQL puede establecer las correspondencias correctas entre dos o ms tablas. Cruce de datos entre las tablas partes y suministra basndonos en que el campo numparte de suministra debe ser igual que el numparte de suministra De aqui sacamos solamente los campos que nos piden

44

Captulo 4. Consultas SQL

Bases de datos, Versin 1.1

4.6 Algunos ejercicios resueltos


1. Deseamos saber los numeros de proveedor que realizan suministros
select numprov from suministra;

2. Deseamos saber los numeros de proveedor que realizan suministros pero sin que se muestren repetidos
select distinct numprov from suministra;

3. Sumar las cantidades que se han suministrado (cuantas piezas se han suministrado?)
select sum(cantidad) from suministra;

4. Se desea ver la suma de las distintas cantidades de partes suministradas


select sum(cantidad),numparte from suministra group by numparte;

5. Se desea saber las cantidades totales que ha suministrado cada proveedor


select sum(cantidad),numprov from suministra group by numprov;

6. Cantidades totales suministradas por v1 y v4


select sum(cantidad), numprov from suministra where numprov=v1 or numprov=v4 group by (numprov);

7. Mostrar los numeros de parte suministrados en una cantidad total mayor o igual que 1000
select sum(cantidad), numparte from suministra group by (numparte) having sum(cantidad)>=1000;

8. Mostrar la suma de las partes suministradas por v1, v2, o v3 en una cantidad mayor de 550
select sum(cantidad),numparte from suministra where numprov=v1 or numprov=v2 or numprov=v3 group by (numparte) having sum(cantidad)>550;

9. Mostrar cuantos proveedores hay en Londres


select count(*) from proveedores where ciudad=Londres;

10. Cuantas partes rojas hay?


select count(*) from partes where color="Rojo";

11. Qu colores estn repetidos en las partes?

4.6. Algunos ejercicios resueltos

45

Bases de datos, Versin 1.1

select count(*),color from partes group by color having count(*)>=2;

4.7 Subconsultas
Al hacer consultas hemos observado que hay clusulas que permiten establecer condiciones. Al hacer las condiciones es posible que necesitemos hacer una subpregunta y que la sentencia SELECT quede algo as
select .... from ... where campo>(select max(cantidad) from suministra)

Supongamos una pregunta como la siguiente: Cuales son los nombres de parte que pesan lo mismo que la parte ms pesada? Podemos sacar el peso maximo con esta consulta
select max(peso) from partes; select nombreparte from partes where peso>=(select max(peso) from partes);

Qu nombres de parte pesan ms que la media?


Se saca la media select avg(peso) from partes; select * from partes where peso>=(select avg(peso) from partes);

Dentro de las subconsultas, aparte de las comparaciones tpicas como >, >=, <>, <=, <, etc... existen otros elementos para hacer comparaciones EXISTS: nos dar las las donde exista alguna la que cumpla la condicin ALL: la condicin deben cumplirla todas las las 12. Qu nombres de parte corresponden a una pieza azul o almacenada en Pars?
select nombreparte from partes where color="Azul" or ciudad="Paris"

13. Qu colores tienen las distintas partes que no sean tornillos?


select * from partes where nombreparte<>"Tornillo";

14. Cuantos proveedores hay que no tengan su almacn en Atenas?


select count(*) from proveedores where ciudad<>"Atenas";

15. Qu nombres de parte se suministran en una cantidad mayor o igual de 400?

46

Captulo 4. Consultas SQL

Bases de datos, Versin 1.1

select nombreparte,cantidad from partes inner join suministra on partes.numparte=suministra.numparte where cantidad>=400;

16. Qu proveedores suministran partes en una cantidad <300? Por un lado, el nombre de proveedor est en la tabla proveedores, que podemos ver haciendo esta consulta
select * from proveedores;

numprov v1 v2 v3 v4 v5

nombreprov Smith Jones Blake Clarke Adams

estado 20 10 30 20 30

ciudad Londres Paris Paris Londres Atenas

Sin embargo, las cantidades de suministro estn en la tabla suministra que podemos ver ejecutando esta consulta
select * from suministra;

numprov v1 v1 v2 v2 v2 v2 v2 v2 v2 v2 v3 v3 v4 v4 v5 v5 v5 v5 v5 v5 v5 v5 v5

numparte p1 p1 p3 p3 p3 p3 p3 p3 p3 p5 p3 p4 p6 p6 p1 p2 p2 p3 p4 p5 p5 p6 p6

numproyecto y1 y4 y1 y2 y3 y4 y5 y6 y7 y2 y1 y2 y3 y7 y4 y2 y4 y4 y4 y4 y5 y2 y4

cantidad 200 700 400 200 300 500 600 400 600 100 200 500 300 300 100 200 100 200 800 400 500 200 500

Como la informacin est dispersada, necesitamos cruzar las tablas con un inner join teniendo en cuenta que tienen un campo igual, en este caso el campo numprov. Podemos hacer el cruce haciendo un inner join con esta consulta
select * from proveedores inner join suministra on proveedores.numprov=suministra.numprov;

4.7. Subconsultas

47

Bases de datos, Versin 1.1

Cuyo resultado es que se cruzan los datos correctamente y se obtiene una tabla como esta numprov v1 v1 v2 v2 v2 v2 v2 v2 v2 v2 v3 v3 v4 v4 v5 v5 v5 v5 v5 v5 v5 v5 v5 numparte p1 p1 p3 p3 p3 p3 p3 p3 p3 p5 p3 p4 p6 p6 p1 p2 p2 p3 p4 p5 p5 p6 p6 numproyecto y1 y4 y1 y2 y3 y4 y5 y6 y7 y2 y1 y2 y3 y7 y4 y2 y4 y4 y4 y4 y5 y2 y4 cantidad 200 700 400 200 300 500 600 400 600 100 200 500 300 300 100 200 100 200 800 400 500 200 500 numprov v1 v1 v2 v2 v2 v2 v2 v2 v2 v2 v3 v3 v4 v4 v5 v5 v5 v5 v5 v5 v5 v5 v5 nombreprov Smith Smith Jones Jones Jones Jones Jones Jones Jones Jones Blake Blake Clarke Clarke Adams Adams Adams Adams Adams Adams Adams Adams Adams estado 20 20 10 10 10 10 10 10 10 10 30 30 20 20 30 30 30 30 30 30 30 30 30 ciudad Londres Londres Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Londres Londres Atenas Atenas Atenas Atenas Atenas Atenas Atenas Atenas Atenas

Si ponemos la condicin que nos falta el ejercicio se resuelve correctamente


select nombreprov,cantidad from proveedores inner join suministra on proveedores.numprov=suministra.numprov where cantidad<300 order by nombreprov desc;

17. Cuantos proveedores suministran partes en una cantidad <300?


Para orientarnos, extraemos las filas en las que la cantidad es menor de 300 select numprov from suministra where cantidad<300; Si hacemos el recuento, observaremos que hay 9 filas, pero proveedores reales solo estn v1, v2, v3 y v5. select count(numprov) from suministra where cantidad<300; Si ponemos distinct, no nos repetir los proveedores select distinct numprov from suministra where cantidad<300; Por tanto la solucin pasa por hacer el recuento

48

Captulo 4. Consultas SQL

Bases de datos, Versin 1.1

de los distintos numprov select count(distinct numprov) from suministra where cantidad<300;

18. Qu nombre tienen las partes suministradas en una cantidad total de 550 o ms?
select sum(cantidad), partes.numparte,nombreparte from suministra inner join partes on suministra.numparte=partes.numparte group by (partes.numparte) having sum(cantidad)>=550;

19. Qu nombres de parte suministran los distintos proveedores?


select nombreprov, nombreparte from proveedores inner join suministra on suministra.numprov=proveedores.numprov inner join partes on partes.numparte=suministra.numparte;

20. Queremos saber los proveedores que estn ubicados en el mismo sitio que alguna parte. Examinemos la tabla partes numparte p1 p2 p3 p4 p5 p6 nombreparte Tuerca Perno Tornillo Tornillo Leva Engranaje color Rojo Verde Azul Rojo Azul Rojo peso 12 17 17 14 12 19 ciudad Londres Paris Roma Londres Paris Londres

Examinemos la tabla proveedores numprov v1 v2 v3 v4 v5 nombreprov Smith Jones Blake Clarke Adams estado 20 10 30 20 30 ciudad Londres Paris Paris Londres Atenas

Se puede comprobar que no nos piden para nada datos de la tabla suministra. Lo nico que se necesita es emparejar las las donde las ciudades sean iguales.
select nombreprov,nombreparte,partes.ciudad from partes inner join proveedores on partes.ciudad=proveedores.ciudad;

21. Como se llaman las piezas que se suministran en la cantidad mxima?


select nombreparte,max(cantidad) from suministra inner join partes on suministra.numparte=partes.numparte where cantidad=(select max(cantidad) from suministra);

4.7. Subconsultas

49

Bases de datos, Versin 1.1

22. Que numeros de proveedores suministran por encima de la media de suministros?


select numprov, cantidad from suministra where cantidad > ( select avg(cantidad) from suministra ); Cuidado: si nos dijeran "suministran una cantidad total que est por encima de la media", deberamos sumar las cantidades por proveedor y compararlas con la media. select sum(cantidad), numprov from suministra group by numprov having sum(cantidad)> ( select avg(cantidad) from suministra );

23. Nmeros de parte suministradas en una cantidad media mayor de 450


select avg(cantidad),numparte from suministra group by numparte having avg(cantidad)>450;

24. Cual es el peso medio de las partes?


select avg(peso) from partes;

25. Obtener el nombre de los provedores, el nombre de parte que suministran y la cantidad en que suministran
select nombreprov, nombreparte,cantidad from proveedores inner join suministra on suministra.numprov=proveedores.numprov inner join partes on suministra.numparte=partes.numparte

26. Obtener las parejas de proveedores que NO estn en la misma ciudad


select prov1.numprov, prov1.ciudad, prov2.numprov, prov2.ciudad from proveedores as prov1 inner join proveedores as prov2 where prov1.ciudad<>prov2.ciudad;

27. Mostrar suministros donde el proveedor y la parte hayan resultado ser de una ciudad distinta
select suministra.numprov, suministra.numparte, proveedores.ciudad, partes.ciudad from suministra inner join proveedores

50

Captulo 4. Consultas SQL

Bases de datos, Versin 1.1

on proveedores.numprov=suministra.numprov inner join partes on partes.numparte=suministra.numparte where proveedores.ciudad<>partes.ciudad;

28. Cuantos proveedores suministran partes rojas o que pesen 12 gramos o ms? Trozo 1: partes rojas
select numparte from partes where color="Rojo"

Trozo 2: partes que pesan 12 o mas


select numparte from partes where peso>12;

Partes que cumplen alguna de las dos cosas Los proveedores que hacen suministros estn en el campo numprov de la tabla suministra
select numprov from suministra;

29. Cuantas piezas se han suministrado de cada ciudad de piezas?


select sum(cantidad),ciudad from partes inner join suministra on suministra.numparte=partes.numparte group by (ciudad);

30. De qu ciudad de proveedor ha salido la cantidad ms grande de suministros?. Esta pregunta podra entenderse de dos formas Obtener la cantidad ms grande suministrada y la ciudad del proveedor correspondiente En primer lugar necesitamos cruzar proveedores y suministra

4.7. Subconsultas

51

Bases de datos, Versin 1.1

v1 v1 v2 v2 v2 v2 v2 v2 v2 v2 v3 v3 v4 v4 v5 v5 v5 v5 v5 v5 v5 v5 v5

p1 p1 p3 p3 p3 p3 p3 p3 p3 p5 p3 p4 p6 p6 p1 p2 p2 p3 p4 p5 p5 p6 p6

y1 y4 y1 y2 y3 y4 y5 y6 y7 y2 y1 y2 y3 y7 y4 y2 y4 y4 y4 y4 y5 y2 y4

200 700 400 200 300 500 600 400 600 100 200 500 300 300 100 200 100 200 800 400 500 200 500

v1 v1 v2 v2 v2 v2 v2 v2 v2 v2 v3 v3 v4 v4 v5 v5 v5 v5 v5 v5 v5 v5 v5

Smith Smith Jones Jones Jones Jones Jones Jones Jones Jones Blake Blake Clarke Clarke Adams Adams Adams Adams Adams Adams Adams Adams Adams

20 20 10 10 10 10 10 10 10 10 30 30 20 20 30 30 30 30 30 30 30 30 30

Londres Londres Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Londres Londres Atenas Atenas Atenas Atenas Atenas Atenas Atenas Atenas Atenas

Una primera aproximacin sera esta consulta


select max(cantidad),ciudad from suministra inner join proveedores on suministra.numprov=proveedores.numprov;

Sin embargo esto no funciona porque cualquier operacin de agregado no involucra a ninguna la. De hecho esa consulta nos devuelve un mximo correcto pero no nos devuelve la ciudad asociada, sino la primera que encuentra. Hay que encontrar otra forma de expresar esta consulta
select ciudad from proveedores inner join suministra on suministra.numprov=proveedores.numprov where cantidad= ( select max(cantidad) from suministra );

La otra forma de entender la pregunta sera Sumar las cantidades por proveedor y decir la ciudad del proveedor con la cantidad mxima Una primera aproximacin sera esta
select ciudad from suministra inner join proveedores on suministra.numprov=proveedores.numprov group by (proveedores.numprov)

52

Captulo 4. Consultas SQL

Bases de datos, Versin 1.1

having sum(cantidad)>= ALL ( select sum(cantidad) from suministra group by (numprov) ) ;

31. Qu ciudad de parte tiene la mayor media de suministros? Cruzamos suministra y partes
select * from suministra inner join partes on suministra.numparte=partes.numparte

Por otra lado, sacamos la media por partes de la tabla suministra


select avg(cantidad) from suministra group by numparte;

Si mezclamos la primera parte con la segunda


select ciudad from suministra inner join partes on suministra.numparte=partes.numparte group by partes.numparte having avg(cantidad)>= ALL ( select avg(cantidad) from suministra group by numparte );

32.Obtener todos los detalles de todos los proyectos


select nombreprov, nombreparte,nombreproyecto,cantidad from suministra inner join proyectos on suministra.numproyecto=proyectos.numproyecto inner join partes on suministra.numparte=partes.numparte inner join proveedores on suministra.numprov=proveedores.numprov ;

33. Obtener todos los detalles de todos los proyectos ubicados en Londres.
select nombreprov, nombreparte,nombreproyecto,cantidad from suministra inner join proyectos on suministra.numproyecto=proyectos.numproyecto

4.7. Subconsultas

53

Bases de datos, Versin 1.1

inner join partes on suministra.numparte=partes.numparte inner join proveedores on suministra.numprov=proveedores.numprov where proyectos.ciudad="Londres" ;

34. Obtener los cdigos de proveedor que suministran al proyecto Y1.


select numprov from suministra where numproyecto=y1;

35. Obtener los datos de los proyectos que usan partes en cantidades comprendidas entre 300 y 750.
select distinct proyectos.* from suministra inner join proyectos on suministra.numproyecto=proyectos.numproyecto where ( cantidad>=300 ) and ( cantidad<=750 ) order by proyectos.numproyecto ;

36. Obtener las combinaciones posibles parte-color Este ejercicio requiere tener dos copias de la misma tabla. Ser necesario utilizar los alias para combinar la tabla partes consigo misma.
select distinct p1.nombreparte, p2.color from partes as p1 inner join partes as p2;

37. Obtener los colores de las partes que se han suministrado por V1.
select partes.color from suministra inner join partes on partes.numparte=suministra.numparte where numprov=v1;

38. Obtener la cantidad total de partes P1 usadas por parte de V1.


Datos del proveedor v1 select * from suministra where numprov=v1;

Suma de todas las partes de v1


select sum(cantidad) from suministra where numprov=v1 and numparte=p1;

54

Captulo 4. Consultas SQL

Bases de datos, Versin 1.1

39. Obtener las parejas de nombres de ciudad tales que un proveedor ubicado en la primera ciudad suministra a algn proyecto ubicado en la segunda ciudad.
select proveedores.ciudad, proyectos.ciudad from suministra inner join proveedores on suministra.numprov=proveedores.numprov inner join proyectos on suministra.numproyecto=proyectos.numproyecto;

40. Obtener los cdigos de parte suministrados a los proyectos ubicados en la misma ciudad del proveedor.
select suministra.numparte from suministra inner join proyectos on suministra.numproyecto=proyectos.numproyecto inner join proveedores on suministra.numprov=proveedores.numprov where proveedores.ciudad=proyectos.ciudad;

41. Obtener los cdigos de proyecto a los que suministra un proveedor que no est en la misma ciudad.
select suministra.numproyecto from suministra inner join proveedores on proveedores.numprov=suministra.numprov inner join proyectos on proyectos.numproyecto=suministra.numproyecto where proyectos.ciudad<>proveedores.ciudad;

42. Obtener las parejas de partes suministradas por el mismo proveedor.


select distinct s1.numparte,s2.numparte from suministra as s1 inner join suministra as s2 on s1.numprov=s2.numprov;

43. Obtener los cdigos de parte suministrados a cualquier proyecto que est ubicado en Londres
select numparte from suministra inner join proyectos on suministra.numproyecto=proyectos.numproyecto where proyectos.ciudad="Londres";

44. Obtener los cdigos de proyecto que usan al menos una parte suministrada por el proveedor V1

4.7. Subconsultas

55

Bases de datos, Versin 1.1

En primer lugar seleccionamos las partes suministradas por v1


select numparte from suministra where numprov=v1;

En segundo lugar queremos saber los proyectos cuyas partes sean alguna de las que hemos extrado antes.
select numproyecto from suministra where numparte in ( select numparte from suministra where numprov=v1 );

45. Obtener los cdigos de proveedor que suministran al menos una parte roja. Seleccionamos las partes cuyo color es rojo
select numparte from partes where color="Rojo";

Ahora, en la tabla suministra sacamos las las donde la parte sea alguna de las extradas antes
select numprov from suministra where numparte in ( select numparte from partes where color="Rojo" );

Una solucin distinta


select numprov from suministra inner join partes on suministra.numparte=partes.numparte where partes.color="Rojo";

46. Obtener los cdigos de proyecto cuya ciudad es la primera en la lista de ciudades. Seleccionamos la ciudad ms pequea
select min(ciudad) from proyectos; select * from proyectos where ciudad in ( select min(ciudad) from proyectos );

Otra forma de hacerlo con inner joins sera la siguiente


select p1.numproyecto,p1.ciudad from proyectos as p1 inner join proyectos as p2 on p1.numproyecto=p2.numproyecto where p1.ciudad= ( select min(ciudad) from proyectos );

56

Captulo 4. Consultas SQL

Bases de datos, Versin 1.1

47. Obtener los cdigos de proyecto a los que se suministra la parte P1 en una cantidad promedio igual o superior a la cantidad ms grande que se suministra al proyecto Y1. Extraemos la cantidad ms grande del proyecto y1
select max(cantidad) from suministra where numproyecto="y1";

Al haber una condicin para el promedio deberemos poner algo como esto
select numproyecto,avg(cantidad) from suministra where numparte=p1 group by numproyecto having avg(cantidad)>= ( select max(cantidad) from suministra where numproyecto="y1" );

48. Obtener los cdigos de proveedor de los que suministran la parte P1 a algn proyecto en una cantidad superior a la cantidad promedio de la parte P1 para ese proyecto. Podemos empezar intentando sacar la media de partes p1 para cada proyecto
select numproyecto, avg(cantidad) from suministra where numparte=p1 group by numproyecto;

Extraemos las las de la tabla suministra donde la parte sea p1


select numprov from suministra as s1 where numparte=p1 and cantidad > ( select avg(cantidad) from suministra as s2 where numparte=p1 and s2.numproyecto=s1.numproyecto group by numproyecto );

49. Obtener los cdigos de proyecto a los que ningn proveedor de Londres suministra una parte roja. Primero averiguamos los proveedores de Londres que suministran partes rojas.
select suministra.numprov from suministra inner join partes on partes.numparte=suministra.numparte inner join proveedores on proveedores.numprov=suministra.numprov where proveedores.ciudad="Londres" and partes.color="Rojo";

Ahora examinamos la tabla suministra y comprobamos que el proveedor no est en el conjunto devuelto por la consulta anterior

4.7. Subconsultas

57

Bases de datos, Versin 1.1

select * from suministra where numprov not in ( select suministra.numprov from suministra inner join partes on partes.numparte=suministra.numparte inner join proveedores on proveedores.numprov=suministra.numprov where proveedores.ciudad="Londres" and partes.color="Rojo" );

50. Hay algn proveedor que suministre la misma parte a TODOS los proyectos? Para conseguir la solucin a este problema se deben utilizar algunas caractersticas de los cuanticadores. Replanteamos la pregunta se desea saber los proveedores donde para todos los proyectos existe una misma parte suministrada o ms desarrollado proveedores (de la tabla suministra) donde para todo proyecto (de la tabla proyectos) existe un suministro donde el codigo de proveedor es dicho proveedor y la parte es la misma parte que mirbamos en suministra
select numprov from suministra as s1 where not exists ( select numproyecto from proyectos where numproyecto not in ( select numproyecto from suministra as s2 where s1.numparte=s2.numparte and s1.numprov=s2.numprov )

);

51. Obtener los cdigos de proyecto que usan todas las partes suministradas por el proveedor v1 Obtener los cdigos de proyecto donde para toda parte de la tabla suministra existe una parte suministrada por v1 Obtener el conjunto de parte suministradas por v1.
select numparte from suministra where numprov=v1;

Las las de la tabla suministra donde para toda parte de v1 existe alguna la asociada

58

Captulo 4. Consultas SQL

Bases de datos, Versin 1.1

select numprov from suministra as s1 where not exists ( select numparte from suministra as s2 where numprov=v1 and not exists ( select numparte,numproyecto from suministra as s3 where s2.numparte=s3.numparte and s1.numproyecto=s3.numproyecto ) );

52. (Para nota) Obtener los pares de proveedores V1 y V2 que suministren EXACTAMENTE el mismo conjunto de partes. La pregunta podra replantearse como obtener parejas de proveedores donde para toda parte de un proveedor de la primera tabla existe otro proveedor distinto tal que la parte es la misma que la parte del primero.

4.8 Actualizacin y borrado


Una vez que se han insertado datos, estos no son inmutables. Pueden cambiarse valores de las las o incluso pueden borrarse las las. Estas operaciones se hacen con las sentencias UPDATE y DELETE. Para cambiar valores se hace lo siguiente UPDATE <TABLA> SET <CAMPO>=VALOR WHERE <CONDICION> Por ejemplo, si quisiramos hacer que en la tabla partes se cambiara la ciudad Londres por Madrid haramos algo como esto
UPDATE partes SET ciudad="Madrid" WHERE ciudad="Londres";

Poner en la tabla partes el peso a 30 en todas las partes cuyo peso sea mayor que 16;
update partes set peso=30 where peso>16;

Poner a Amarillo el color de las partes de Paris


update partes set color="Amarillo" where ciudad="Paris";

Para borrar datos DELETE FROM <TABLA> WHERE <CONDICION> Borrar todas las partes cuyo peso es 12
delete from partes where peso=12;

4.8. Actualizacin y borrado

59

Bases de datos, Versin 1.1

60

Captulo 4. Consultas SQL

CAPTULO 5

Programacin

5.1 Introduccin
Los elementos de los lenguajes de programacin son muy similares entre s y el cambio de lenguaje solamente supone la modicacin de ciertos hbitos. En el entorno de las bases de datos se pueden encontrar programas que acten mediante dos mecanismos distintos. Estos dos mecanismos se denen como Procedimientos almacenados: residen en el propio servidor de bases de datos. Programas externos: utilizando algn mecanismo los programas externos se comunican con el servidor para intercambiar datos mediante un lenguaje de programacin cualquiera. Entre los mecanismos de comunicacin ms utilizados encontramos ODBC (Open DataBases Communication). Este estndar especica claramente a servidores y cliente como tienen que dar o pedir datos. Una versin modicada de ODBC es JDBC que ha modernizado el estndar pero solo sirve para programas Java.

5.2 Procedimientos almacenados


5.2.1 Carga de programas
Para cargar cdigo almacenado en un chero SQL externo se utiliza lo siguiente
\. d:\oscar\t5\prueba1.sql

5.2.2 Variables
Una variable es una posicin de memoria con nombre. Normalmente las variables conllevan un tipo que restringe lo que podemos almacenar en ella. En MySQL las variables se declaran con la palabra clave DECLARE. Los tipos utilizables con las variables son los mismos que tiene MySQL.

61

Bases de datos, Versin 1.1

5.2.3 Declaracin de procedimientos


Los procedimientos en MySQL actan igual que las funciones en Java con las diferencias en la sintaxis. El primer problema que aparece en los procedimientos MySQL viene dado por el hecho de que los procedimientos a veces intereren con el delimitador ;. Para evitarlo, debemos avisar a MySQL de que durante un tiempo cambiaremos de delimitador, para ello se usa la siguiente sentencia Dentro de cdigo podrn ir sentencias que terminarn de forma normal, con el punto y coma ; El problema viene dado porque el intrprete de MySQL intenta procesar todo lo que haya hasta llegar a un punto y coma. Si no cambisemos el delimitador, se ejecutara la denicin del procedimiento sin haber encontrado un end y todo fallara. Ejercicio: crear un procedimiento que acepte una cantidad c y que seleccione todos los suministros cuyo campo cantidad sea mayor que c
delimiter //

create procedure mayores (cant int) begin select * from suministra where cantidad>cant; end // delimiter ;

Ejercicio: crear un programa que acepte un color co y una ciudad ci y que busque todas las partes cuyo color sea ese co pasado y la ciudad ese ci pasado. Co y ci son parmetros y NO LLEVAN COMILLAS
delimiter // create procedure Color_parte (color_pasado varchar(20), ciudad_pasada varchar(20) ) begin select * from partes where color=color_pasado and ciudad=ciudad_pasada; end // delimiter ;

Ejercicio: crear un procedimiento que permita sumar la cantidad de partes suministradas cuyo color sea el mismo que un cierto color pasado
drop procedure suministradas_color; delimiter // create procedure suministradas_color ( color_pasado varchar(20) ) begin select sum(cantidad)

62

Captulo 5. Programacin

Bases de datos, Versin 1.1

from suministra inner join partes on suministra.numparte=partes.numparte where color=color_pasado; end //

delimiter ; call suministradas_color("Rojo"); call suministradas_color("Gris");

Ejercicio: crear un procedimiento que reciba dos cosas Color_pasado Nombre_prov_pasado El procedimiento deber decirnos cuantas partes de ese color suministra ese nombre de proveedor. Ejercicio: crear un procedimiento que reciba dos cosas Nombre_parte_pasada Cantidad_pasada El procedimiento deber decirnos cuantas partes con ese nombre han sido suministradas en una cantidad mayor o igual que la cantidad pasada
drop procedure mayores_que; delimiter // create procedure mayores_que( nombre_parte_pasada varchar(11), cantidad_pasada int) begin select * from suministra inner join partes on suministra.numparte=partes.numparte where nombreparte=nombre_parte_pasada and cantidad>cantidad_pasada; end // delimiter ;

5.3 Sentencias bsicas


5.3.1 Decisiones con IF
La sintaxis de un IF es prcticamente igual a la de Java

5.3. Sentencias bsicas

63

Bases de datos, Versin 1.1

IF (<comparacion>) THEN BEGIN <sentencias> END ELSE BEGIN END END IF;

Ejemplo: crear un procedimiento que extraiga las las de la tabla suministra que cumplan cierta condicion sobre la cantidad. Si el usuario pasa un simbolo > el procedimiento nos devuelve las las mayores que cierta cantidad. Si no pasa un < nos devuelve las las con una cantidad menor que la pasada
drop procedure selector_v2; delimiter // create procedure selector_v2 ( operacion char(1), cantidad_pasada int) begin if (operacion="<") then begin select * from suministra where cantidad<cantidad_pasada; end; else begin select * from suministra where cantidad>cantidad_pasada; end; end if; end;

// delimiter ;

Ejercicio:crear un procedimiento que dados los parmetros siguientes compruebe cuantas partes con un cierto nombre tienen una cantidad menor o mayor que una cierta cantidad pasada nombre_parte_pasado cantidad_pasada operacion
drop procedure selector_v3; delimiter // create procedure selector_v3 ( nombre_parte_pasada varchar(11), cantidad_pasada int, operacion varchar(1) ) begin if (operacion=">") then begin select * from suministra inner join partes on

64

Captulo 5. Programacin

Bases de datos, Versin 1.1

suministra.numparte=partes.numparte where nombreparte=nombre_parte_pasada and cantidad>cantidad_pasada; end; else begin select * from suministra inner join partes on suministra.numparte=partes.numparte where nombreparte=nombre_parte_pasada and cantidad<cantidad_pasada; end; end if; end; // delimiter ;

Ejercicio: ampliar el programa anterior para que soporte bsquedas utilizando los comparadores <, >, >=, <=, = y <>.

5.3.2 5.3.2 Decisiones mltiples con CASE..WHEN


El programa anterior puede resolverse utilizando sentencias if-then-else anidadas, sin embargo es poco prctico y difcil de ampliar. La sintaxis de la sentencia case es la siguiente
CASE <variable> WHEN ">" THEN BEGIN END; WHEN ">=" THEN BEGIN END; WHEN "<" THEN BEGIN END; ... ELSE BEGIN END; END CASE;

Basndonos en esta sintaxis, una posible solucin al problema anterior sera esta
drop procedure selector_v4; delimiter // create procedure selector_v4 ( nombre_parte_pasada varchar(11), cantidad_pasada int, operacion varchar(1) )

5.3. Sentencias bsicas

65

Bases de datos, Versin 1.1

begin case operacion when ">" then begin select * from suministra inner join partes on suministra.numparte=partes.numparte where nombreparte=nombre_parte_pasada and cantidad>cantidad_pasada; end; when ">=" then begin select * from suministra inner join partes on suministra.numparte=partes.numparte where nombreparte=nombre_parte_pasada and cantidad>=cantidad_pasada; end; when "<>" then begin select * from suministra inner join partes on suministra.numparte=partes.numparte where nombreparte=nombre_parte_pasada and cantidad<>cantidad_pasada; end; when "<" then begin select * from suministra inner join partes on suministra.numparte=partes.numparte where nombreparte=nombre_parte_pasada and cantidad<cantidad_pasada; end; when "<=" then begin select * from suministra inner join partes on suministra.numparte=partes.numparte where nombreparte=nombre_parte_pasada and cantidad<=cantidad_pasada; end; when "=" then begin select * from suministra inner join partes on

66

Captulo 5. Programacin

Bases de datos, Versin 1.1

suministra.numparte=partes.numparte where nombreparte=nombre_parte_pasada and cantidad=cantidad_pasada; end; else begin select ("Operacion no reconocida"); end; end case; end; // delimiter ;

Ejercicio: crear un programa que acepte un nombre de parte,luego dos ciudades C1 y C2 y luego un comparador que puede ser AND o OR. El programa debe decirnos las partes que pertenecen a las dos ciudades o a una de ellas.
drop procedure comparador; delimiter // create procedure comparador ( nombre_parte_pasada varchar(11), c1_pasada varchar(15), c2_pasada varchar(15), operador varchar(3) ) begin case operador when "AND" then begin select * from partes as p1, partes as p2 where p1.nombreparte=nombre_parte_pasada and p2.nombreparte=nombre_parte_pasada and (p1.ciudad=c1_pasada and p2.ciudad=c2_pasada); end; when "OR" then begin select * from partes as p1, partes as p2 where p1.nombreparte=nombre_parte_pasada and p2.nombreparte=nombre_parte_pasada and (p1.ciudad=c1_pasada or p2.ciudad=c2_pasada); end; else begin select ("Escriba OR o AND (maysculas)"); end; end case; end // delimiter ;

5.3. Sentencias bsicas

67

Bases de datos, Versin 1.1

5.3.3 Bucles con WHILE


Utilizando la sentencia WHILE podemos repetir una tarea que se repita un cierto nmero de veces por medio de una variable. La sintaxis de WHILE es la siguiente
set variable_control=0; WHILE (<condicion>) DO ... <sentencias> .. set variable_control=variable_control+1; END WHILE;

Ejercicio resuelto: hacer un programa MySQL que imprima los 10 primeros nmeros pares.
drop procedure pares; delimiter // create procedure pares() begin declare contador int; set contador=0; while (contador<=20) do select (contador); set contador=contador+2; end while; end; // delimiter ;

5.3.4 Cursores
Un cursor es un puntero que apunta a la primera la del resultado de una consulta. Podemos ir haciendo avanzar el puntero y procesar cada la por separado. Podemos dejar de procesar las cuando lo deseemos, sin que sea obligatorio examinar todos los resultados. No se puede declarar variables nuevas despues de un cursor. Es decir, esto no es vlido
declare un_cursor cursor for... declare contador int;

Esto s es vlido
declare contador int; declare un_cursor cursor for...

Un ejemplo de cursor sera el siguiente


DECLARE nombre_cursor CURSOR FOR SELECT * FROM .... ;

Para empezar a visitar la primera la se debe hacer lo siguiente. No debemos olvidar CERRAR el cursor

68

Captulo 5. Programacin

Bases de datos, Versin 1.1

CLOSE nombre_cursor;

Ejercicio: extraer los proveedores que han recibido las 5 cantidades ms grandes de suministros.
drop procedure mejores_clientes; delimiter // create procedure mejores_clientes() begin declare contador int; declare num_prov_sacado varchar(5); declare cantidad_sacada int; declare cur1 cursor for select numprov, cantidad from suministra order by cantidad desc; open cur1; set contador=0; while (contador<5) do fetch cur1 into num_prov_sacado, cantidad_sacada; select (num_prov_sacado); select (cantidad_sacada); set contador=contador+1; end while; close cur1; end;

// delimiter ;

Ejercicio: hacer un programa que saque las 2 partes de ms peso de la tabla partes. La consulta para este ejercicio sera:
select * from partes order by peso desc;

Y el procedimiento sera
drop procedure mayores_pesos; delimiter // create procedure mayores_pesos() begin declare contador int; declare peso_extraido int; declare ciudad_extraida varchar(15); declare cur1 cursor for select ciudad,peso from partes order by peso desc; open cur1; set contador=0; while (contador<2) do begin fetch cur1 into ciudad_extraida, select (ciudad_extraida),(peso_extraido); set contador=contador+1; end; end while; close cur1;

5.3. Sentencias bsicas

69

Bases de datos, Versin 1.1

end; // delimiter ;

Ejercicio: sumar las cinco cantidades ms bajas de la tabla suministra. La consulta sera sta:
select * from suministra order by cantidad;

Y la solucin sera
drop procedure suma_filas; delimiter // create procedure suma_filas() begin declare contador int; declare suma int; declare cantidad_extraida int; declare cur1 cursor for select cantidad from suministra order by cantidad asc; open cur1; set suma=0; set contador=0; while contador<5 do fetch cur1 into cantidad_extraida; set suma=suma+cantidad_extraida; set contador=contador+1; end while; close cur1; select suma; end; // delimiter ;

5.3.5 Parmetros de salida


Si un procedimiento tiene que devolver cosas puede hacerlo utilizando parmetros en la cabecera que hayan sido etiquetados como out.
drop procedure suma_filas; delimiter // create procedure suma_filas(out suma_devuelta int) begin declare contador int; declare suma int; declare cantidad_extraida int; declare cur1 cursor for select cantidad from suministra order by cantidad asc; open cur1; set suma=0; set contador=0; while contador<5 do fetch cur1 into cantidad_extraida;

70

Captulo 5. Programacin

Bases de datos, Versin 1.1

set suma=suma+cantidad_extraida; set contador=contador+1; end while; close cur1; set suma_devuelta=suma; end; // delimiter ;

Ejercicio: realizar un procedimiento que devuelva en una variable la ciudad del proveedor con una cantidad total (sumar) de suministros mayor. La consulta sera algo as
select sum(cantidad),suministra.numprov, ciudad from suministra inner join proveedores on suministra.numprov=proveedores.numprov group by numprov having sum(cantidad)>=ALL ( select sum(cantidad) from suministra group by numprov );

El procedimiento sera as:


drop procedure mayor_suministro; delimiter // create procedure mayor_suministro (out ciudad_devuelta varchar(11) ) begin declare c_devuelta varchar(11); declare suma int; declare num_proveedor varchar(2); declare cur1 cursor for select sum(cantidad),suministra.numprov, ciudad from suministra inner join proveedores on suministra.numprov=proveedores.numprov group by numprov having sum(cantidad)>=ALL ( select sum(cantidad) from suministra group by numprov ); open cur1; fetch cur1 into suma, num_proveedor,c_devuelta; set ciudad_devuelta=c_devuelta; close cur1; end; //

5.3. Sentencias bsicas

71

Bases de datos, Versin 1.1

delimiter ;

5.4 Funciones
La sintaxis de una funcin es la siguiente
delimiter // create function <nombre> (parametros) returns string begin end; // delimiter ;

Ejercicio: construir una funcin que devuelva la suma total de cantidades de la tabla suministra La consulta sera as:
select sum(cantidad) from suministra;

Y la funcin
drop function suma_suministra; delimiter // create function suma_suministra() returns int begin declare suma int; declare cur1 cursor for select sum(cantidad) from suministra; open cur1; fetch cur1 into suma; close cur1; return suma; end; // delimiter ;

set @s=suma_suministra();

5.5 Funciones MySQL


La primera funcin de utilidad es la funcin CONCAT. Este trozo de cdigo une dos cadenas en una sola
set @cadena1=CONCAT(apellido, nombre);

Hacer una funcin que devuelva el nombre de la pieza y el color en una sola cadena. Se debe devolver la pieza con un peso mayor.

72

Captulo 5. Programacin

Bases de datos, Versin 1.1

La solucin sera:
delimiter // create function pieza_mayor_peso() begin declare declare declare declare cadena varchar(25); nombre_pieza varchar(10); color_pieza varchar(10); cur1 cursor for select nombreparte, color from partes where peso=( select max(peso) from partes returns varchar(25)

);

open cur1; fetch cur1 into nombre_pieza, color_pieza; set cadena=CONCAT(nombre_pieza, ":", color_pieza); return cadena; close cur1; end; // delimiter ;

Hay una pareja de funciones llamadas LEFT y RIGHT, que nos permiten extraer trozos de las cadenas. Por ejemplo, la funcin LEFT(peso, 1) nos devuelve la primera letra del campo peso. Ejercicio: construir una funcin que nos devuelva la pieza de mayor peso con la letra inicial del color entre parntesis (es decir, se debe devolver algo como Engranaje (R)) Para resolver este ejercicio era necesario utilizar la funcin LEFT (cadena, longitud). Esta funcin nos devuelve un trozo de la cadena que mide lo que diga el parmetro longitud. Existe una variante que extrae trozos desde el lado derecho y que se llama RIGHT (cadena, longitud).
drop procedure pieza_pesada_inicial; delimiter // create procedure pieza_pesada_inicial() begin declare parte_extraida varchar(15); declare color_extraido varchar(15); declare cadena varchar(30); declare inicial varchar(1); declare cur1 cursor for select nombreparte, color from partes where peso=( select max(peso) from partes open cur1; fetch cur1 into parte_extraida, color_extraido; set inicial=LEFT(color_extraido, 1); set cadena=CONCAT(parte_extraida, " (", inicial, ")" ); select (cadena); close cur1; end;

);

5.5. Funciones MySQL

73

Bases de datos, Versin 1.1

// delimiter ;

Ejercicio: construir una funcin que nos devuelva el codigo de proyecto con una cantidad de suministros menor. Por problemas de integracin con otra base de datos necesitamos que se devuelva todo en maysculas. Para resolver esto existe una funcin que convierte una cadena a su equivalente en maysculas.
drop function proveedor_minimo; delimiter // create function proveedor_minimo () returns varchar(3) begin declare num_prov_extraido varchar(3); declare cur1 cursor for select numprov from suministra where cantidad=( select min(cantidad) from suministra ); open cur1; fetch cur1 into num_prov_extraido; set num_prov_extraido=UPPER(num_prov_extraido); close cur1; return num_prov_extraido; end; // delimiter ;

Ejercicio: crear un procedimiento que acepte una cadena como parmetro. El procedimiento deber mostrar todas las partes de la tabla partes cuyo nombre contenga la subcadena pasada como parmetro. Es decir, podemos hacer algo como sto
CALL buscar("To");

En general, la bsqueda de secuencias, cadenas o patrones es algo muy comn pero muy sencillo de resolver con algunas funciones. La funcin INSTR() permite comprobar si una cierta subcadena est dentro de una cadena. Existe un operador llamado LIKE que permite hacer bsquedas difusas. Por ejemplo, se puede hacer una bsqueda como esta
select * from partes where nombreparte LIKE "uer%";

El programa resuelto quedara as


drop procedure buscar; delimiter // create procedure buscar (subcadena varchar(15) ) begin declare patron varchar(17);

74

Captulo 5. Programacin

Bases de datos, Versin 1.1

set patron=CONCAT("%", subcadena, "%"); select * from partes where nombreparte like patron; end; // delimiter ;

Ejercicio: se desea crear un procedimiento que permita marcar como obsoletas ciertas partes de la tabla partes. Para ello, el usuario ejecutar un procedimiento como este
call marcar_obsoleta("To");

Este procedimiento CAMBIAR los nombres de parte de la tabla partes ponindoles un asterisco al principio. Para resolverlo ser necesario manejar correctamente la condicin de NOT FOUND para un cursor. Adems, necesitamos un procedimiento principal que construya el patrn y que luego llame al procedimiento auxiliar que actualiza las las.
drop procedure marcar_obsoletas; drop procedure actualizar; delimiter //

create procedure actualizar (patron varchar(15) ) begin declare terminar int; declare nombre_extraido varchar(35); declare nuevo_nombre varchar(38); declare cur1 cursor for select nombreparte from partes where nombreparte like patron; declare continue handler for not found set terminar=true; open cur1; set terminar=FALSE; while (terminar!=TRUE) do fetch cur1 into nombre_extraido; select (nombre_extraido); set nuevo_nombre=CONCAT("* ", nombre_extraido); update partes set nombreparte=nuevo_nombre where nombreparte=nombre_extraido; end while; close cur1; end; #Este procedimiento fabrica el patron y despues #llama a actualizar create procedure marcar_obsoletas(subcadena varchar(15)) begin declare patron varchar(17); set patron=concat("%", subcadena, "%"); call actualizar(patron);

5.5. Funciones MySQL

75

Bases de datos, Versin 1.1

end;

// delimiter ;

Ejercicio: crear un procedimiento que indique la desviacin media de los pesos de las partes.
drop procedure desviaciones_medias; delimiter // create procedure desviaciones_medias() begin declare terminado boolean; declare media decimal(8,2); declare peso_extraido decimal(8,2); declare desv decimal(8,2); declare cur1 cursor for select avg(peso) from partes; declare cur2 cursor for select peso from partes; declare continue handler for not found set terminado=true; open cur1; open cur2; fetch cur1 into media; fetch cur2 into peso_extraido; set terminado=false; while not terminado do # Se calcula la desviacion set desv= abs ( peso_extraido-media ); select desv; fetch cur2 into peso_extraido; end while; close cur1; close cur2; end;

// delimiter ;

Aparte de la funcin ABS, que calcula el valor absoluto se pueden encontrar otras funciones de utilidad como las siguientes: CEIL (valor): Redondear el valor hacia arriba. FLOOR (valor): Redondea hacia abajo. ROUND (valor, decimales): si hacemos ROUND (3.6576, 2) nos devolvera el valor 3.66

5.6 Solucin al examen


Clculo de la mediana de un conjunto de valores

76

Captulo 5. Programacin

Bases de datos, Versin 1.1

drop procedure mediana; delimiter // create procedure mediana (out mediana int) begin declare cuantos int; declare peso_extraido int; declare contador int; declare cur1 cursor for select count(*) from partes; declare cur2 cursor for select peso from partes order by peso asc; open cur1; fetch cur1 into cuantos; close cur1; open cur2; set cuantos=ceil(cuantos/2); set contador=0; while (contador<cuantos) do fetch cur2 into peso_extraido; set contador=contador+1; end while; set mediana=peso_extraido; close cur2; end; // delimiter ;

Crear una funcin que nos devuelva s si hay la misma cantidad de partes rojas que de proyectos de Atenas. Si no es as debe devolver no.
drop function cuantos; delimiter // create function cuantos() returns varchar(2) begin declare cuantos_rojos, cuantos_atenas int; declare cur1 cursor for select count(*) from partes where color="Rojo"; declare cur2 cursor for select count(*) from proyectos where ciudad="Atenas"; open cur1; open cur2; fetch cur1 into cuantos_rojos; fetch cur2 into cuantos_atenas; if (cuantos_rojos=cuantos_atenas) then return "SI";

5.6. Solucin al examen

77

Bases de datos, Versin 1.1

else return "NO"; end if; close cur1; close cur2;

end; // delimiter ;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

drop procedure insertar_madrid; delimiter // create procedure insertar_madrid( codigo_proyecto varchar(11), nombre_proyecto varchar(11) ) begin insert into proyectos values (codigo_proyecto,nombre_proyecto,"Madrid"); end; // delimiter ;

78

Captulo 5. Programacin

CAPTULO 6

Administracin

6.1 Introduccin
La administracin de un SGBD suele referirse a un SGBD corporativo. El administrador de bases de datos o DBA es el responsable de todo lo concerniente a los datos. Puede haber muchas personas que trabajen con los datos: programadores SQL, programadores Java, programadores web, etc... Los SGBD corporativos, como MySQL ofrecen muchas posibilidades, casi tantas como un sistema operativo. Un problema fundamental en la administracin de un SGBD pasa es asegurar el uso correcto de los permisos: en lneas generales, los permisos deberan restringirse al mnimo. Adems, para obtener la mxima seguridad deberamos hacer otras tareas como las siguientes: Se debe comprobar tambin la seguridad del resto del equipo: seguridad fsica, seguridad del sistema operativo, etc... No compartir la clave de root. Dar solamente los permisos mnimos necesarios, aunque sea ms trabajoso. No se debe trabajar con claves sin cifrar. Se deben utilizar cortafuegos.

6.2 Aspectos bsicos de las contraseas


6.2.1 La clave de root
Cuando nos conectamos a un servidor hacemos esto
mysql -u root -p

lo que es potencialmente inseguro, ya que es posible capturar tramas en redes y obtener contraseas. Si se desea acceder a otro host distinto (tal vez un remoto) se debe hacer lo siguiente:

79

Bases de datos, Versin 1.1

mysql -u root -p -h 10.9.0.91

6.2.2 Las claves de usuarios no root


Es posible conectar con un servidor MySQL de varias formas
mysql -u pepito --password=1234 mysql -u pepito -p

La segunda es preferible, aunque ms incmoda.

6.2.3 Hashes
Un hash es un clculo que se hace sobre una secuencia de datos que se utiliza para asegurar la integridad de la secuencia de datos.

6.2.4 Cambios entre versiones


En MySQL 4.1 se cambi el sistema. Los nuevos hashes se almacenan con un asterisco delante.

6.2.5 Asegurando contra atacantes


En sistemas UNIX MySQL no debe ejecutarse con el usuario root. Al crear usuarios debe tenerse mucho cuidado al usar comodines. No debe permitirse a los usuarios crear cheros. No debe haber usuarios sin clave.

6.3 El sistema de privilegios


MySQL tiene un sistema interno que controla quien puede hacer qu. Se debe tener en cuenta que MySQL tiene dos barreras 1. La primera barrera se da en la conexin: se debe disponer de un usuario y de una clave. 2. La segunda barrera se comprueba cada vez que el usuario escribe una sentencia. Se debe tener cuidado porque a veces los cambios en los permisos no se ejecutan inmediatamente. Si observamos que esto est ocurriendo podemos lanzar el comando siguiente:
FLUSH PRIVILEGES;

Para ver los permisos concedidos al usuario que utilizamos podemos lanzar este comando
show grants;

A partir de ahora debemos recordar que un usuario no es solamente un login, sino tambin un sitio desde el que se conecta. Estos dos usuario NO SON IGUALES

80

Captulo 6. Administracin

Bases de datos, Versin 1.1

pepito@localhost pepito@10.9.0.0/255.255.0.0; pepito@sede-a.empresaacme.com;

Los permisos pueden ser de tres tipos: Administrativos: controlan la forma en que MySQL se comporta. De base de datos: afectan a todas las tablas de una BD. De tabla: controlan los accesos a solo una de las tablas de una BD. Los permisos de MySQL estn controlados por medio de una BD especial llamada mysql. La tabla user almacena los privilegios asociados a los usuarios
select user, host,password from user;

Se puede observar que hay dos usuarios llamados root@localhost y root@127.0.0.1. Son usuarios distintos y ambos tienen la clave vaca. No deben tenerse SGBD con la clave de root vaca. Adems la instalacin por defecto tambin crea un usuario vaco y sin contrasea que permite conectarse sin clave. Para borrar un usuario se usa el comando DROP USER
DROP USER @localhost;

Si un cambio no tiene lugar es posible que los cambios no se hayan volcado en el sistema de MySQL. Podemos forzar a que los cambios tengan efecto usando este comando
FLUSH PRIVILEGES;

Se debe tener en cuenta que para poder conectar a una base de datos remota debemos disponer del usuario con el host correspondiente. Qu ocurre si aparentemente podemos entrar como dos posible usuarios distintos?. Supongamos que nos conectamos desde la IP 10.9.0.200 con el usuario root y en MySQL hay dos usuarios (el % signica cualquier cosa). usuario root root host 10.9.0.200 % password sesamo 12341234

La regla es que cuando un usuario se conecta y se le pueden aplicar dos o ms reglas se utiliza siempre la ms restrictiva. Para crear un usuario debemos especicar su login y su host. El host podra ser %.
create user dam1@10.9.0.0/255.255.0.0 identified by sesamo; create user dam1@10.9.0.254 identified by 12341234; create user dam1@ % identified by 6789;

En ocasiones un usuario puede haber olvidado su clave o simplemente se desea renovar la misma por una poltica de seguridad.

6.3. El sistema de privilegios

81

Bases de datos, Versin 1.1

set password for dam1@10.9.0.0/255.255.0.0 = PASSWORD(12345678);

ESTO ES UN ERROR
set password for dam1@10.9.0.0/255.255.0.0 = 12345678;

6.4 El sistema de concesiones


Para permitir a un usuario lanzar comandos se debe utilizar el comando siguiente
GRANT <PERMISOS> ON <BASE_DE_DATOS>.<COLUMNA1>, <BASE_DE_DATOS>.<COLUMNA2>, .. <BASE_DE_DATOS>.<COLUMNAN>, proyectos.* *.* TO dam1@10.9.0.0/255.255.0.0;

Un ejemplo sera este


grant insert,select on proyectos.partes to dam1@10.9.0.0/255.255.0.0; flush privileges; revoke insert,select on proyectos.partes from dam1@10.9.0.0/255.255.0.0; flush privileges;

Aparte de los permisos SELECT, INSERT, UPDATE Y DELETE, CREATE, CREATE INDEX, CREATE VIEW Ejercicio: disear un esquema de seguridad para dar respuesta a las siguientes necesidades de acceso a datos. Se necesita dar acceso a dos usuarios que puedan seleccionar datos de cualquier tabla que exista en la base de datos proyectos. De uno de los usuarios sabemos su IP (preguntar al compaero). El otro usuario puede provenir de cualquier punto de la red 10.9.xxx.xxx. Existe un usuario admin que puede provenir de cualquier punto de la red 10.9 y que puede hacerlo todo con cualquier tabla de la base de datos proyectos. Extra: se desea que el usuario admin tenga a su vez permisos para conceder permisos.

6.5 Usuarios con restricciones


Al crear un usuario puede ser interesante limitar la cantidad de actividad que dicho usuario ejecuta por hora. Al crear los usuarios con CREATE USER se pueden indicar algunas limitaciones como las siguientes

82

Captulo 6. Administracin

Bases de datos, Versin 1.1

create user admin@10.9.0.0/255.255.0.0 identified by 1234 grant select on proyectos.* to admin@10.9.0.0/255.255.0.0 with max_queries_per_hour 8 with max_connections_per_hour 3 with max_updates_per_hour 2 ;

El parmetro max_queries_per_hour se reere a mximo de comandos generales, mientras que max_update_per_hour se reere especcamente a consultas que involucren cambios.

6.6 Vistas
Una vista es un trozo extrado de una tabla en base a una consulta. Las vistas pueden utilizarse para restringir an ms la cantidad de informacin que pueden ver los usuarios. Antes de crear una vista se debe tener muy clara la consulta que se va a aplicar. Por ejemplo, si deseamos tener por separado los datos de Paris sin incluir el estado podramos crear una vista como esta:
CREATE VIEW PROV_PARIS AS SELECT NUMPROV,NOMBREPROV,CIUDAD FROM PROVEEDORES WHERE CIUDAD="Paris"; CREATE USER usu_paris@10.9.0.0/255.255.0.0 IDENTIFIED BY paris; CREATE USER usu_paris@localhost IDENTIFIED BY paris; GRANT SELECT ON PROYECTOS.PROV_PARIS TO usu_paris@10.9.0.0/255.255.0.0; GRANT SELECT ON PROYECTOS.PROV_PARIS TO usu_paris@localhost;

Ejercicio: los administradores de la base de datos de proyectos necesitan establecer una conguracin de seguridad de acuerdo a las siguientes caracteristicas Existe un usuario admin que puede conectarse desde cualquier punto de la red 10.9 que puede hacer lo siguiente Insertar, seleccionar, actualizar y borrar datos de cualquier tabla Puede crear tambin vistas nuevas Existe un usuario jefe_londres que puede hacer cualquier cosa con los datos de cualquier tabla donde la ciudad sea Londres. Puede conectarse desde cualquier sitio. Existe un usuario usu_continental que puede insertar y seleccionar datos en tablas donde la ciudad sea Atenas o Paris. Puede conectarse desde cualquier sitio. Existe un usuario pruebas que puede hacer consultas a cualquier tabla. Solo puede hacerlo el que tenga cierta IP (la del compaero de al lado) Solucin: 6.6. Vistas 83

Bases de datos, Versin 1.1

drop user admin@10.9.0.0/255.255.0.0; create user admin@10.9.0.0/255.255.0.0 identified by 1234; grant insert,select,update,delete, create view on proyectos.* to admin@10.9.0.0/255.255.0.0;

Para el segundo apartado hay que permitir a jefe_londres que manipule las tablas donde la ciudad sea Londres. Las tablas que cumplen este requisito son proveedores, partes y proyectos. Este requisito obliga a crear tres vistas separadas para cada una de las tres tablas.
create view partes_londres as select * from partes where ciudad=Londres; create view proveedores_londres as select * from proveedores where ciudad=Londres; create view proyectos_londres as select * from proyectos where ciudad=Londres; create user jefe_londres@ % identified by londres; grant all privileges on proyectos.partes_londres, proyectos.proveedores_londres, proyectos.proyectos_londres to jefe_londres@ %;

Para el tercer apartado


create user jefe_continental@ % identified by continental; create view partes_continentales as select * from partes where ciudad=Atenas or ciudad=Paris; create view proveedores_continentales as select * from proveedores where ciudad=Atenas or ciudad=Paris; create view proyectos_continentales as select * from proyectos where ciudad=Atenas or ciudad=Paris; grant insert,select on proyectos.proyectos_continentales, proyectos.partes_continentales, proyectos.proveedores.continentales to jefe_continental@ %; create user pruebas@10.9.0.99

84

Captulo 6. Administracin

Bases de datos, Versin 1.1

identified by prueba; grant select on proyectos.* to pruebas@10.9.0.99

6.7 Recuperando la clave de root


Para recuperar la clave de root de MySQL se necesitar la clave de Administrador de Windows o la clave de root de Linux. Puede ser necesario manejar varias consolas, al menos dos. En el modo especial que vamos a utilizar NO SE PUEDEN USAR LOS COMANDOS SET PASSWORD. Sin embargo la sentencia UPDATE sigue funcionando, por lo que podremos usarla para restaurar a una nueva clave conocida. El proceso tiene varios pasos 1. Arrancar una consola e ir al directorio de MySQL. Se debe re-arrancar el mysqld con una opcin especial para no utilizar los permisos. Para parar el proceso puede ser necesario parar el proceso mysqld.exe
mysqld --skip-grant-tables

Con esto el servidor de bases de datos arranca, ignorar todas las claves y permisos y se quedar en segundo plano. 2. En otra consola, volvemos a conectar con mysql, pero ahora no har falta poner clave a root.
mysql -u root mysql> use mysql; mysql> select user,host,password from user; mysql> update user set password=PASSWORD("1234") where user=root and host=localhost;

3. Una vez hecho el update, podemos parar el proceso mysqld y volver a arrancarlo normalmente disponiendo de la clave de root recuperada.

6.8 Copias de seguridad


6.8.1 Introduccin
Las copias de seguridad permiten a un administrador recuperar los datos en casos de desastre informtico. En lneas generales cualquier desastre conllevar cierta prdida de datos. Existen diversos tipos de copia de seguridad: Fsicas: copiar los directorios de la base de datos. La ventaja es que es muy fcil de hacer. El inconveniente es que MySQL no reconoce directorios que no estn gestionados por l. Lgicas: son copias procesadas y generadas por el propio SGBD. Son un poco ms difciles de hacer (hay que aprender comandos) pero son muy fciles de restaurar. Si hay muchos datos en muchas tablas, las lgicas pueden llegar a ser muy lentas.

6.7. Recuperando la clave de root

85

Bases de datos, Versin 1.1

Otra posibilidad es distinguir las copias de seguridad que se hacen en caliente o en fro. En fro: el servidor SE PARA y nadie puede registrar datos nuevos o borrar datos viejos. En caliente: el servidor no se para, an a riesgo de que haya datos que no entren en esta copia de seguridad y se queden para la siguiente.

6.8.2 El comando mysqldump


El comando mysqldump es el ms utilizado para hacer copias de seguridad lgicas en caliente. Este comando se conectar al servidor de bases de datos y volcar los datos que pidamos a un chero SQL. Las opciones que maneja el programa son las siguientes single-transaction: con este parmetro hacemos que nuestra copia se procese como un nico gran conjunto de operaciones de lectura de datos. Esto permite asegurar que no hay solapamientos en operaciones de cambios en los valores de los datos. -u root -p: No siempre hace falta ser el administrador. Si existe un usuario dam1@10.9.0.0/255.255.0.0 y dicho usuario tiene permisos de lectura en una base de datos tambin los tendr para hacer la copia de seguridad.
mysqldump -u root -p --single-transaction proyectos > copia1.sql

Es posible hacer copias de seguridad solo de ciertas tablas. Esto permite ahorrar tiempo en la copia y adems perturbar menos la carga de trabajo del SGBD. Si por ejemplo, desesemos copiar solo la tabla partes, basta con indicar su nombre detrs del nombre de la base de datos
mysqldump -u root -p --single-transaction proyectos partes > copia2.sql

6.8.3 Los outles


Los outles son archivos donde se pueden dejar los resultados de consultas. Proporcionan mucha versatilidad y exibilidad, pero se deben tener los permisos correspondientes por parte del administrador del sistema operativo. Por ejemplo, para hacer una copia de seguridad de los proveedores de Londres haramos esto
mysql -u root -p mysql> use proyectos; mysql> select * into outfile prov_londres.txt" from proveedores where ciudad=Londres;

Se podra poner una ruta como C:prov_londres.txt. Si no lo ponemos el archivo se crear en mysqldataproyectos Supongamos que se pierden los datos de los proveedores de Londres
mysql> delete from proveedores where ciudad=Londres;

Para recargar datos guardados en un outle se usara algo como esto


mysql> load data infile prov_londres.txt into table proveedores;

86

Captulo 6. Administracin

Bases de datos, Versin 1.1

6.8.4 Copias de seguridad incrementales


Las copias de seguridad completas son muy fciles de restaurar. Sin embargo, si una BD es grande ser muy lenta de hacer, interrumpir el trabajo del SGBD y el espacio en disco se agotar rpidamente. Las copias de seguridad incrementales permiten almacenar solamente los cambios hechos desde un cierto momento. Por ejemplo, se podra hacer una copia completa el da 1 de cada mes y luego al nal de cada da, una incremental. Si hubiera un fallo, por ejemplo, el da 17, se necesitarn aplicar las copias en orden empezando por la completa seguida de los 16 incrementos. Esto signica que la restauracin de copias incrementales es ms pesada de hacer que las completas. Para poder hacer copias incrementales, MySQL debe haber sido arrancado con la opcin correcta.
mysqld --log-bin mysql -u root -p mysql> update... #Esto obliga a volcar los nuevos logs que #se hayan podido generar mysqladmin -u root -p flush-logs

Usando los comandos mysqlbinlog podemos volcar cualquier archivo de log en un chero mysql.

6.8. Copias de seguridad

87

Bases de datos, Versin 1.1

88

Captulo 6. Administracin

CAPTULO 7

Access

7.1 Introduccin
Access es un SGBD omtico. Una caracterstica fundamental de su uso es que es monousuario. Si se desea un SGBD multiusuario de MS, se necesitar utilizar SQL Server (Express) Access ofrece un entorno de desarrollo integrado, lo que supone una ventaja en cuanto a la comparacin con otros productos. Como curiosidad histrica, Access proviene de un conjunto de bibliotecas llamados JetDB. Access respeta el estndar ODBC que permite compartir bases de datos para que sean consultadas por programas que se conecten desde un sitio remoto.

7.2 El entorno
Al arrancar Access se ofrecen un conjunto de plantillas que contienen BD prefabricadas con tablas ya creadas junto con las claves y las relaciones entre dichas tablas. Esto permite acelerar el tiempo de desarrollo en ciertos casos, sin embargo en otros se deber asumir el control y crear las tablas, claves y relaciones desde cero. Al crear una base de datos en blanco, Access ofrece un diseo inicial de la tabla en la que ya hay un campo llamado Id de tipo autonumrico. Un tipo autonumrico es un nmero que se incremente en uno de forma automtica. Se pueden quitar y poner columnas desde este entorno inicial as como indicar los tipos de los datos de forma sencilla. Se pueden marcar varios campos como nico, es decir sus valores no se pueden repetir. Si un campo tiene la marca se requiere es que es obligatorio rellenarlo con algo. Cuando un nmero se manipula para que muestre ms o menos decimales no se va a modicar el nmero almacenado. Access permite indicar que una columna se va a utilizar a menudo para hacer bsquedas. Si algunos valores se usan mucho la insercin ser ms cmoda. El botn Relaciones permite establecer relaciones de clave ajena entre las tablas de una base de datos.

89

Bases de datos, Versin 1.1

7.2.1 Ejercicio
Utilizando el entorno de Access, crear la estructura de proveedores, partes y proyectos utilizada en el tema 4, en el archivo SQL BD Proveedores, partes y proyectos.

90

Captulo 7. Access

CAPTULO 8

BBDD Objeto relacionales

8.1 Introduccin
Un objeto es una representacin de una entidad fsica que consta de atributos y mtodos. La herencia es la capacidad de compartir automticamente atributos y/o mtodos. En BBDD una relacin es lo mismo que una tabla. El nombre relacin proviene del concepto matemtico de relacin. Las bases de datos objeto-relacionales son aquellas capaces de manipular relaciones utilizando conceptos relacionados con la programacin orientada a objetos. Aparte de todo esto, las bases de datos objeto-relacionales suelen tener otras capacidades interesantes, como la manipulacin de datos espaciales, textuales e incluso representaciones en XML. XML es un formato de intercambio de datos basado en marcas. En este tema veremos como utilizar PostgreSQL, que es un sistema de BBDD objeto-relacional que ofrece las capacidades que hemos comentado.

8.2 Instalacin de PostgreSQL


Durante la instalacin de Postgres podremos elegir los directorios de instalacin del programa y de datos. Se puede obtener una pequea mejora en la eciencia almacenando los datos en un disco duro distinto. Por otro lado, en la instalacin se nos pedir la clave de administracin del usuario principal (llamado postgres).

8.3 Uso de Postgres en una mquina virtual


Las mquinas virtuales tienen diversos modos de funcionamiento que condicionan lo que tenemos que hacer para que alguien pueda acceder a nuestro Postgres (o MySQL) dentro de Virtual BOX NAT: El antrin acta de router Red Interna: la comunicacin solo se da entre VM

91

Bases de datos, Versin 1.1

Puente: El SO virtualizado es una mquina ms. Solo host: la comunicacin solo se da entre antrin y virtualizado.

8.3.1 Acceso a Postgres con VM en modo puente


Como la mquina virtual es una ms de la red, bastar con congurar el SO virtualizado para que alguien pueda acceder a la IP del SO virtualizado y conectar con el puerto 5432 que es el de Postgres.

8.3.2 Acceso a Postgres con VM en modo NAT


Este modo ofrece una mayor seguridad, ya que VirtualBox acta como un router con su propio cortafuegos. Para congurar el acceso a Postgres dentro de VirtualBox hay que congurar correctamente el envo de puertos. El objetivo nal es que cuando alguien conecte con la IP de nuestro SO virtualizado, VirtualBox autorice esa entrada de trco. El proceso es el mismo que se conoce como abrir puertos. Se debe autorizar el trco para el puerto TCP 5432 y reenviarlo a la IP del SO virtualizado sin poner nada en la IP del SO antrin (lo que indica que nos da igual la IP de origen que inicia la conexin).

8.3.3 Acceso a Postgres en modo Solo host


En este caso, se debe congurar el SO antrin para que reenve el trco hacia el SO virtualizado. Es decir, el SO antrin debe tener capacidades de enrutamiento.

8.3.4 Acceso a Postgres en modo red interna


No funcionar si alguien se conecta desde otra mquina fsica distinta. El modo red interna es para hacer experimentos y el trco generado nunca sale de la mquina.

8.4 Funcionamiento bsico de Postgres


El funcionamiento es muy similar a MySQL. Hay un programa servidor que espera peticiones y nos conectamos a l con un programa cliente. Un cliente puede ser grco o textual. En cualquiera de los dos casos, las operaciones que se pueden hacer son las mismas. Al usar el interfaz grco podemos hacer distintas operaciones de creacin con el botn derecho del ratn mientras que en el interfaz textual deberemos lanzar comandos.

8.5 Comandos de Postgres


Postgres respeta el estndar ANSI SQL, al igual que MySQL, por lo que los comandos son iguales.

92

Captulo 8. BBDD Objeto relacionales

Bases de datos, Versin 1.1

8.5.1 Creacin de tablas


CREATE TABLE <nombre> ( <nombre_de_campo> <nombre_de_campo> <nombre_de_campo> <nombre_de_campo> );

<tipo>, <tipo>, <tipo>, <tipo>

Ejemplo:
CREATE TABLE partes ( id nombre color peso ciudad );

integer primary key, varchar(20), varchar(8), numeric(3,1), varchar(15)

Se pueden poner tambin claves ajenas, de la misma forma que se poda en MySQL.
CREATE TABLE propietarios ( id integer primary key, nombre varchar(20), id_parte integer, foreign key (id_parte) references partes(id) );

Al tener las tablas vacas, si intentsemos insertar este valor, veremos que no se puede. Si el propietario con el cdigo 3, llamado Juan posee la parte 1, deberamos escribir lo siguiente:
INSERT INTO propietarios VALUES (3, Juan, 1 );

Para que esto funcione, primero deberamos hacer algo como esto
INSERT INTO partes VALUES (1,Tornillo, Rojo, 12.3, Londres );

Para ver las tablas que hay se puede usar el pseudocomando d. Para ver la descripcin de una tabla concreta se puede usar d <nombre_de_tabla> Herencia La herencia permite que una tabla herede automticamente los campos y restricciones de otra tabla a la que se llama tabla padre. Por ejemplo, supongamos que en una empresa hay empleados con id y sueldo, pero despues hay varios tipos de empleado, como investigador, becario y administrativo. Creacin de la tabla padre:
CREATE TABLE empleados ( id

integer primary key,

8.5. Comandos de Postgres

93

Bases de datos, Versin 1.1

nombre sueldo );

varchar(50), numeric(6,2)

Creacin de la tabla hija investigadores


CREATE TABLE investigadores ( nombre_proyecto varchar(30) ) INHERITS (empleados);

Ejercicio: insertar el investigador con id 5, con nombre Tomas, sueldo 3500 y nombre_proyecto Consola. Respuesta: El cdigo SQL es el siguiente:
INSERT INTO investigadores VALUES (5,Tomas, 3500, Consola);

Si ahora consultamos las dos tablas veremos que el valor SE INSERTA EN LAS DOS TABLAS Podemos repetir la insercin de valores, las veces que deseemos, y siempre se propagarn los valores
INSERT INTO investigadores VALUES ( 7,Julian, 5100, Antena );

INSERT INTO investigadores VALUES ( 42, Andres, 2400, Disco );

Ejercicio: Construir las tablas Becarios y Administrativos que heredan de Empleados. La tabla Becarios tiene los campos duracion_contrato (integer) y la Administrativos tiene los campos categoria varchar(10) y titulacion varchar(15). Insertar valores en las dos tablas.
CREATE TABLE becarios ( duracion_contrato integer ) inherits (empleados); INSERT INTO becarios VALUES ( 4, Luis, 1900, 9 ); CREATE TABLE administrativos ( categoria varchar(10), titulacion varchar(15) ) INHERITS (empleados); INSERT INTO administrativos VALUES ( 13, Angel, 2450, B1, Tec. Sup. DAM );

Ejercicio: Borrar el empleado cuyo cdigo es el nmero 7. Examinar las tablas investigadores y empleados para ver qu ha ocurrido.
delete from empleados where id=7;

Ejercicio: Borrar el investigador cuyo cdigo es el nmero 42. Examinar las tablas investigadores y empleados para ver qu ha ocurrido.

94

Captulo 8. BBDD Objeto relacionales

Bases de datos, Versin 1.1

delete from investigadores where id=42;

Ejercicio: La empresa en la que trabajamos ha decidido crear dos categoras adicionales de empleados. Los becarios repartidores y los becarios auxiliares. La tabla Repartidores tiene un solo campo llamado km y que es de tipo numeric (6,1). La tabla auxiliares tiene dos campos denominados horas_extra, de tipo integer, y el campo tipo_acceso, que es un varchar(30). Insertar valores en Repartidores y Auxiliares y comprobar qu ocurre en las diversas tablas.
CREATE TABLE repartidores ( km numeric(6,1) ) INHERITS (becarios); CREATE TABLE auxiliares ( horas_extra integer, tipo_acceso varchar(30) ) INHERITS (becarios);

Un repartidor tiene un id (22), un nombre (Ramon), un sueldo (870), una duracin de contrato (6 meses), y un kilometraje 1450.
INSERT INTO repartidores VALUES ( 22, Ramon, 870, 6, 1450 );

Un auxiliar tiene un id (33), un nombre (Ricardo), un sueldo (760),una duracin de contrato (18 meses), unas horas extra (85), y un tipo de acceso (Convenio)
INSERT INTO auxiliares VALUES ( 33, Ricardo, 760, 18, 85, Convenio );

Conclusin: la herencia funciona como un rbol de tablas, en las cuales el SGBD propaga correctamente todos los datos hacia las tablas padre. Adems, al construir las tablas no es necesario construir ninguna clave ajena ni especicar borrados o actualizaciones en cascada. Tipos de herencia En Postgres, la herencia no es absoluta. Es decir, en nuestro ejemplo de empleados, becarios y administrativos, podemos tener datos que aparezcan en una tabla, pero no en las tablas hija. En el ejemplo que hemos visto, la pregunta sera puede haber alguien que est simplemente en la tabla empleados, sin estar en ninguna de las hijas?. S Probemos por ejemplo este SQL.
INSERT INTO empleados VALUES (

8.5. Comandos de Postgres

95

Bases de datos, Versin 1.1

5, Alicia, 1950 );

Cuando en una tabla hay datos suyos y datos de otras tablas que heredan, la seleccin de datos puede requerir comandos especiales. Cmo se pueden recuperar simplemente las personas que son empleados normales, sin tener en cuenta becarios o investigadores?. Para recuperar tales datos se debe hacer lo siguiente
select * from only empleados;

En resumen: si se desea recuperar los datos de una tabla sin incluir los datos de sus posibles tablas hija, se debe hacer un select * from only <nombre_de_la_tabla>

8.6 Creacin de tipos de datos


Los lenguajes de programacin ofrecen soporte para crear nuestros propios tipos de datos (en Java, se llaman clases). PostgreSQL ofrece soporte para crear nuestros propios tipos o clases. Una vez creado un tipo, podemos crear tablas cuyos campos sean del tipo que hemos creado. Para crear un tipo de datos, se debe hacer lo siguiente
CREATE TYPE Rectangulo AS ( la_base int, altura int );

Y para usar ese tipo en un campo, se usa de la misma forma que cualquier otro tipo.
CREATE TABLE rectangulos ( id int primary key, r Rectangulo );

Como se insertan datos en estas tablas?. La insercin de tipos creados por nosotros requiere usar ( <datos> ).
INSERT INTO rectangulos VALUES ( 1, (2, 12) ); INSERT INTO rectangulos VALUES ( 2, (6, 2) ); INSERT INTO rectangulos VALUES ( 3, (2, 12) );

96

Captulo 8. BBDD Objeto relacionales

Bases de datos, Versin 1.1

Ejercicio: crear una tabla que pueda almacenar el tipo de datos Punto3D. Un punto en 3D tiene tres coordenadas x, y, z que pueden ser nmeros con hasta 2 decimales. Insertar algunos valores en la tabla.
CREATE TYPE Punto3D AS ( x decimal(8,2), y decimal(8,2), z decimal(8,2) ); CREATE TABLE puntos ( id integer primary key, punto Punto3D ); insert into puntos values ( 1, (2.25, 6.57, 8.96 );

insert into puntos values ( 2, (12.25, 9.7, 5.6 ) ); insert into puntos values ( 3, (9.65, 8.7, 3.6 ) );

Un detalle importante es que cuando los valores sean cadenas NO SE DEBEN DEJAR ESPACIOS ENTRE LAS COMAS. Ejercicio: crear un tipo de datos Linea que tenga un campo m (que es la pendiente de la recta) de tipo decimal(8,2), un campo k que es la constante a sumar, de tipo decimal(8,2) y un campo orientacion que es varchar(5). Crear una tabla que permita almacenar valores e insertar 3.
CREATE TYPE Linea AS ( m decimal(8,2), k decimal(8,2), orientacion varchar(5) ); CREATE TABLE lineas ( id integer primary key, l Linea );

Cuidado: al insertar informacin de los varchar, se deben evitar los espacios entre comas.
INSERT INTO lineas VALUES ( 1, (3,2,N-S)

8.6. Creacin de tipos de datos

97

Bases de datos, Versin 1.1

); INSERT INTO lineas VALUES ( 2, (2.41,-7.22,SE-NO) ); INSERT INTO lineas VALUES ( 3, (-4.46,-12.33,NE-SO) );

8.7 Soporte documental


El procesamiento de documentos involucra resolver una serie de problemas Stop words: artculos, preposiciones. En general, palabras que no aportan (casi) nada al discurso. Relevancia: es una medida de como de bueno es un documento en relacin a una bsqueda. Rendimiento: es la capacidad de un programa para ser eciente en las bsquedas de texto. Postgres ofrece soporte documental permitiendo almacenar campos de tipo text. Para poder hacer bsquedas hay que conocer algunas funciones de Postgres. La funcin to_tsvector coge un campo y lo procesa de forma eciente para poder buscar en l. La funcin to_tsquery coge una cadena y la procesa como si fuera una bsqueda. El operador que intenta asociar una bsqueda con un texto es el @@. Una prueba muy simple
select to_tsvector( Postgresql es un sistema gestor de base de datos) @@ to_tsquery (mysql); select to_tsvector( Postgresql es un sistema gestor de base de datos) @@ to_tsquery (mysql & postgresql); select to_tsvector( Postgresql es un sistema gestor de base de datos) @@ to_tsquery (mysql | postgresql);

Qu captulo es el que habla de algo virtual? y de VirtualBox?


select id from capitulos where to_tsvector(texto) @@

98

Captulo 8. BBDD Objeto relacionales

Bases de datos, Versin 1.1

to_tsquery(virtual); select id from capitulos where to_tsvector(texto) @@ to_tsquery(VirtualBox | (Virtual & Box));

Ejercicio: Qu nmero de captulo es el que habla de algn cliente de Postgres?


select id from capitulos where to_tsvector(texto) @@ to_tsquery(cliente);

Ejecuta estas dos consultas y comprueba el resultado

select to_tsvector(Postgres es un cliente de BD orientado a objetos con una gran capaci

select to_tsvector(spanish, Postgres es un cliente de BD orientado a objetos con una

Si indicamos el idioma del texto, Postgres utilizar una base de datos interna para eliminar las stop-words adecuadas para ese idioma. Qu ocurre si una misma palabra buscada aparece en dos o ms documentos?.

8.8 Sistemas de informacin geogrca


Son programas especializados en el procesamiento de informacin geogrca. Esta informacin puede procesarse en dos formas 2 Dimensiones: es un mecanismo ms rpido pero ms impreciso 3 Dimensiones: se obtiene ms precisin pero suele requerir ms operaciones, lo que lo hace ms lento. Los SIG ofrecen (a veces) soporte para el clculo de rutas, lo que es un problema de difcil solucin cuando hay muchos pueblos/ciudades y muchas rutas.

8.8.1 Uso de PostGIS


Distintos usuarios pueden haber utilizado distintos sistemas de referencia. Si se proporciona al GIS las diferencias entre los dos puntos (0,0) el GIS puede calcular automticamente los movimiento entre dos mapas que hayan usado distintos Sistemas de Referencia. En un SIG tenemos tres elementos principales para almacenar informacin geogrca Puntos Lneas Polgonos Para crear una base de datos, podemos hacer lo siguiente desde la lnea de comandos o desde el pgAdmin.

8.8. Sistemas de informacin geogrca

99

Bases de datos, Versin 1.1

create database espanya;

Esto indica que queremos que nuestra BD acte como una extensin PostGIS, es decir como una base de datos SIG
create extension postgis;

Creamos una tabla de puntos


create table puntos ( id integer primary key, punto geometry(POINT) );

E insertamos algunos valores


insert into puntos values ( 1, ST_GeomFromText(POINT(5 4)) ); insert into puntos values ( 2, ST_GeomFromText(POINT(6 5.2)) ); insert into puntos values ( 3, ST_GeomFromText(POINT(9 7)) );

Creamos ahora una tabla de lneas


create table lineas ( id integer primary key, linea geometry(LINESTRING) );

Insertamos algunos valores


insert into lineas values ( 10, ST_GeomFromText ( LINESTRING(5 4, 7 5, 9 7) ) ); insert into lineas values ( 20, ST_GeomFromText

100

Captulo 8. BBDD Objeto relacionales

Bases de datos, Versin 1.1

( LINESTRING(4 1, 4 4,5 7) ) ); insert into lineas values ( 30, ST_GeomFromText ( LINESTRING(6 2, 6 5, 4 7) ) );

Se puede calcular la longitud de una ruta utilizando la funcin ST_Length. Ejercicio: crear una consulta select que nos d la carretera de mayor longitud.
select id, ST_Length(linea) from lineas where ST_Length(linea) = ( select max(ST_Length(linea)) from lineas );

Aparte de calcular longitudes, es posible comprobar otras cuestiones de inters geogrco. Est una cierta ciudad en una cierta ruta?. Para averiguar esto, tenemos la funcin ST_Within. Esta funcin devuelve f si no se cumple o t en el caso de que s se cumpla. Ejercicio: listar los codigos de punto que estn dentro de alguna ruta de la tabla lineas. PostGIS (que es como se llama la extensin que hemos instalado, tambin soporta la denicin de reas). Para ello, hay que crear tablas que almacenen tipos POLYGON.
create table parcelas ( id integer primary key, parcela geometry(POLYGON) ); insert into parcelas values ( 1, ST_GeomFromText ( POLYGON (( 0 0, 0 1000, 100 1000, 100 0, 0 0 )) ) );

8.8. Sistemas de informacin geogrca

101

Bases de datos, Versin 1.1

insert into parcelas values ( 2, ST_GeomFromText ( POLYGON (( 100.1 0, 100.1 1000, 200 1000, 200 0, 100.1 0 )) ) ); select id, ST_AsText(parcela) from parcelas; insert into parcelas values ( 3, ST_GeomFromText ( POLYGON (( 199.5 1000, 300 1000, 300 0, 199.5 0, 199.5 1000 )) ) );

Ejercicio: Utilizando la funcin ST_Intersects averiguar qu parcelas tienen intersecciones con otras parcelas.
select p1.id, p2.id from parcelas as p1, parcelas as p2 where ST_Intersects ( p1.parcela, p2.parcela )=t and p1.id<>p2.id;

Se puede calcular el area de un polgono cualquiera por irregular que sea o independientemente de los huecos son ST_Area
select id, ST_Area(parcela) from parcelas;

102

Captulo 8. BBDD Objeto relacionales

CAPTULO 9

ndices y tablas

genindex modindex search

103