Curso de MySQL
Curso de MySQL
Curso de MySQL
Introducción
Siguiendo con la norma de la página de usar software libre,
afrontamos un nuevo reto: trabajar con bases de datos mediante el
lenguaje de consulta SQL. Este curso será la base para otros que
nos permitirán usar bases de datos desde aplicaciones C/C++, PHP,
etc.
Originalmente, este curso iba a tratar sólo sobre MySQL. Mi
intención era limitarlo exclusivamente a explicar la sintaxis de las
sentencias y funciones SQL, hacer algunos ejemplos y completar
una referencia de MySQL.
Sin embargo, como me suele ocurrir cada vez que afronto un
nuevo proyecto, las cosas no salen como las tenía planeadas. Poco
a poco he ido añadiendo nuevos contenidos, (bastante lógicos,
teniendo en cuenta el tema que nos ocupa), y estos contenidos han
precisado la inclusión de otros...
Finalmente el curso se ha convertido en algo mucho más
extenso, y sobre todo, mucho más teórico, aunque espero que
también, en algo mucho más útil.
El curso permitirá (si he sido capaz de explicar todos los
conceptos claramente) diseñar bases de datos a partir de problemas
reales, haciendo uso de una base teórica firme.
El nivel será, teniendo en cuenta la complejidad del tema de las
bases de datos, y el de MySQL, bastante básico. Este documento
no pretende ser demasiado académico, está orientado a
programadores autodidactas que quieran incluir bases de datos en
sus aplicaciones. Tampoco entraremos en demasiados detalles
sobre configuración de MySQL, o sobre relaciones con Apache o
Windows. La principal intención es poder manejar bases de datos
complejas y grandes, y sobre todo, poder usarlas desde otros
lenguajes como C, C++ o PHP.
El presente curso nos obliga a tratar varios temas diferentes.
Dato
No es sencillo definir qué es un dato, pero intentaremos ver qué
es desde el punto de vista de las bases de datos.
Podemos decir que un dato es una información que refleja el
valor de una característica de un objeto real, sea concreto o
abstracto, o imaginario (nada nos impide hacer una base de datos
sobre duendes :-).
Debe cumplir algunas condiciones, por ejemplo, debe
permanecer en el tiempo. En ese sentido, extrictamente hablando,
una edad no es un dato, ya que varía con el tiempo. El dato sería la
fecha de nacimiento, y la edad se calcula a partir de ese dato y de la
fecha actual. Además, debe tener un significado, y debe ser
manipulable mediante operadores: comparaciones, sumas, restas,
etc (por supuesto, no todos los datos admiten todos los operadores).
Base de datos
Podemos considerar que es un conjunto de datos de varios tipos,
organizados e interrelacionados. Estos datos deben estar libres de
redundancias innecesarias y ser independientes de los programas
que los usan.
SGBD (DBMS)
Son las siglas que significan Sistema de Gestión de Bases de
Datos, en inglés DBMS, DataBase Manager System. En este caso,
MySQL es un SGBD, o mejor dicho: nuestro SGBD.
Consulta
Es una petición al SGBD para que procese un determinado
comando SQL. Esto incluye tanto peticiones de datos como creación
de bases de datos, tablas, modificaciones, inserciones, etc.
Redundancia de datos
Decimos que hay redundancia de datos cuando la misma
información es almacenada varias veces en la misma base de
datos. Esto es siempre algo a evitar, la redundancia dificulta la tarea
de modificación de datos, y es el motivo más frecuente de
inconsistencia de datos. Además requiere un mayor espacio de
almacenamiento, que influye en mayor coste y mayor tiempo de
acceso a los datos.
Inconsistencia de datos
Sólo se produce cuando existe redundancia de datos. La
inconsistencia consiste en que no todas las copias redundantes
contienen la misma información. Así, si existen diferentes modos de
obtener la misma información, y esas formas pueden conducir a
datos almacenados en distintos sitios. El problema surge al
modificar esa información, si lo sólo cambiamos esos valores en
algunos de los lugares en que se guardan, las consultas que
hagamos más tarde podrán dar como resultado respuestas
inconsistentes (es decir, diferentes). Puede darse el caso de que
dos aplicaciones diferentes proporcionen resultados distintos para el
mismo dato.
Integridad de datos
Cuando se trabaja con bases de datos, generalmente los datos
se reparten entre varios ficheros. Si, como pasa con MySQL, la base
de datos está disponible para varios usuarios de forma simultánea,
deben existir mecanismos que aseguren que las interrelaciones
entre registros se mantienen coherentes, que se respetan las
dependencias de existencia y que las claves únicas no se repitan.
Por ejemplo, un usuario no debe poder borrar una entidad de
una base de datos, si otro usuario está usando los datos de esa
entidad. Este tipo de situaciones son potencialmente peligrosas, ya
que provocan situaciones con frecuencia imprevistas. Ciertos
errores de integridad pueden provocar que una base de datos deje
de ser usable.
Los problemas de integridad se suelen producir cuando varios
usuarios están editando datos de la misma base de datos de forma
simultánea. Por ejemplo, un usuario crea un nuevo registro, miestras
otro edita uno de los existentes, y un tercero borra otro. El DBMS
debe asegurar que se pueden realizar estas tareas sin que se
produzcan errores que afecten a la integridad de la base de datos.
2 Diseño de bases de datos: El Modelo
conceptual El modelo Entidad-Relación
En este capítulo, y en los siguientes, explicaremos algo de teoría sobre el diseño bases de datos
para que sean seguras, fiables y para que tengan un buen rendimiento.
La teoría siempre es algo tedioso, aunque intentaremos que resulte amena, ya que es necesaria.
Aconsejo leer con atención estos capítulos. En ellos aprenderemos técnicas como el "modelado" y la
"normalización" que nos ayudarán a diseñar bases de datos, mediante la aplicación de ciertas reglas
muy sencillas. Aprenderemos a identificar claves y a elegir claves principales, a establecer
interrelaciones, a seleccionar los tipos de datos adecuados y a crear índices.
Ilustraremos estos capítulos usando ejemplos sencillos para cada caso, en próximos capítulos
desarrollaremos el diseño de algunas bases de datos completas.
Como siempre que emprendamos un nuevo proyecto, grande o pequeño, antes de lanzarnos a
escribir código, crear tablas o bases de datos, hay que analizar el problema sobre el papel. En el caso
de las bases de datos, pensaremos sobre qué tipo de información necesitamos guardar, o lo que es
más importante: qué tipo de información necesitaremos obtener de la base de datos. En esto consiste
el modelado de bases de datos.
Modelo Entidad-Relación
En esencia, el modelo entidad-relación (en adelante E-R), consiste en buscar las entidades que
describan los objetos que intervienen en el problema y las relaciones entre esas entidades.
Todo esto se plasma en un esquema gráfico que tiene por objeto, por una parte, ayudar al
programador durante la codificación y por otra, al usuario a comprender el problema y el
funcionamiento del programa.
Definiciones
Pero lo primero es lo primero, y antes de continuar, necesitamos entendernos. De modo que
definiremos algunos conceptos que se usan en el modelo E-R. Estas definiciones nos serán útiles tanto
para explicar la teoría, como para entendernos entre nosotros y para comprender otros textos sobre el
modelado de bases de datos. Se trata de conceptos usados en libros y artículos sobre bases de datos,
de modo que será interesante conocerlos con precisión.
Entidad
Estamos hablando del modelo Entidad-Relación, por lo tanto este es un concepto que no podemos
dejar sin definir.
Cada individuo puede pertenecer a diferentes conjuntos: habitantes de un país, empleados de una
empresa, miembros de una lista de correo, etc. Con los vehículos pasa algo similar, pueden pertenecer
a conjuntos como un parque móvil, vehículos de empresa, etc.
En el modelado de bases de datos trabajaremos con conjuntos de entidades, y no con entidades
individuales. La idea es generalizar de modo que el modelo se ajuste a las diferentes situaciones por
las que pasará el proceso modelado a lo largo de su vida. Será el usuario final de la base de datos el
que trabaje con entidades. Esas entidades constituirán los datos que manejará con la ayuda de la base
de datos.
Atributo: cada una de las características que posee una entidad, y que agrupadas
permiten distingirla de otras entidades del mismo conjunto.
En el caso de las personas, los atributos pueden ser características como el nombre y los apellidos,
la fecha y lugar de nacimiento, residencia, número de identificación... Si se trata de una plantilla de
empleados nos interesarán otros atributos, como la categoría profesional, la antigüedad, etc.
En el caso de vehículos, los atributos serán la fecha de fabricación, modelo, tipo de motor,
matrícula, color, etc.
Según el conjunto de entidades al que hallamos asignado cada entidad, algunos de sus atributos
podrán ser irrelevantes, y por lo tanto, no aparecerán; pero también pueden ser necesarios otros. Es
decir, el conjunto de atributos que usaremos para una misma entidad dependerá del conjunto de
entidades al que pertenezca, y por lo tanto del proceso modelado.
Por ejemplo, no elegiremos los mismos atributos para personas cuando formen parte de modelos
diferentes. En un conjunto de entidades para los socios de una biblioteca, se necesitan ciertos
atributos. Estos serán diferentes para las mismas personas, cuando se trate de un conjunto de
entidades para los clientes de un banco.
Una fecha de nacimiento o de matriculación tendrá casi siempre un dominio, aunque generalmente
se usará el de las fechas posibles. Por ejemplo, ninguna persona puede haber nacido en una fecha
posterior a la actual. Si esa persona es un empleado de una empresa, su fecha de nacimiento estará
en un dominio tal que actualmente tenga entre 16 y 65 años. (Por supuesto, hay excepciones...)
Los números de matrícula también tienen un dominio, así como los colores de chapa o los
fabricantes de automóviles (sólo existe un número limitado de empresas que los fabrican).
Generalmente, los dominios nos sirven para limitar el tamaño de los atributos. Supongamos que una
empresa puede tener un máximo de 1000 empleados. Si uno de los atributos es el número de
empleado, podríamos decir que el dominio de ese atributo es (0,1000).
Con nombres o textos, los dominios limitarán su longitud máxima.
Sin embargo, los dominios no son demasiado importantes en el modelo E-R, nos preocuparemos
mucho más de ellos en el modelo relacional y en el físico.
Relación
El otro concepto que no podemos dejar de definir es el de relación. Aunque en realidad, salvo para
nombrar el modelo, usaremos el término interrelación, ya que relación tiene un significado radicalmente
diferente dentro del modelo relacional, y esto nos puede llevar a error.
Tengamos los dos conjuntos: de personas y de vehículos. Podemos encontrar una interrelación
entre ambos conjuntos a la que llamaremos posee, y que asocie una entidad de cada conjunto, de
modo que un individuo posea un vehículo.
De este modo, en la anterior interrelación intervienen dos entidades, por lo que diremos que es de
grado 2 o binaria. También existen interrelaciones de grado 3, 4, etc. Pero las más frecuentes son las
interrelaciones binarias.
Podemos establecer una interrelación ternaria (de grado tres) entre personas, de modo que dos
personas sean padre y madre, respectivamente, de una tercera.
Existen además tres tipos distintos de interelaciones binarias, dependiendo del número de
entidades del primer conjunto de entidades y del segundo. Así hablaremos de interrelaciones 1:1 (uno a
uno), 1:N (uno a muchos) y N:M (muchos a muchos).
Nuestro ejemplo anterior de "persona posee vehículo" es una interrelación de 1:N, ya que cada
persona puede no poseer vehículo, poseer uno o poseer más de uno. Pero cada vehículo sólo puede
ser propidad de una persona.
Otras relaciones, como el matrimonio, es de 1:1, o la de amistad, de N:M.
Clave
Estaremos de acuerdo en que es muy importante poder identificar claramente cada entidad y cada
interrelación. Esto es necesario para poder referirnos a cada elemento de un conjunto de entidades o
interrelaciones, ya sea para consultarlo, modificarlo o borrarlo. No deben existir ambigüedades en ese
sentido.
En principio, cada entidad se puede distinguir de otra por sus atributos. Aunque un subconjunto de
atributos puedan ser iguales en entidades distintas, el conjunto completo de todos los atributos no se
puede repetir nunca. Pero a menudo son sólo ciertos subconjuntos de atributos los que son diferentes
para todas las entidades.
En nuestro ejemplo de las entidades persona, podemos pensar que de una forma intuitiva sabemos
qué atributos distinguen a dos personas distintas. Sabemos que el nombre por si mismo, desde luego,
no es uno de esos atributos, ya que hay muchas personas con el mismo nombre. A menudo, el
conjunto de nombre y apellidos puede ser suficiente, pero todos sabemos que existen ciertos nombres
y apellidos comunes que también se repiten, y que esto es más probable si se trata de personas de la
misma familia.
Las personas suelen disponer de un documento de identidad que suele contener un número que es
distinto para cada persona. Pero habrá aplicaciones en que este valor tampoco será una opción:
podemos tener, por ejemplo, personas en nuestra base de datos de distintas nacionalidades, o puede
que no tengamos acceso a esa información (una agenda personal no suele contener ese tipo de datos),
también hay personas, como los menores de edad, que generalmente no disponen de documento de
identidad.
Con otros tipos de entidad pasa lo mismo. En el caso de vehículos no siempre será necesario
almacenar el número de matrícula o de bastidor, o tal vez no sea un valor adecuado para usar como
clave (ya veremos más adelante que en el esquema físico es mucho mejor usar valores enteros).
En fin, que en ocasiones, por un motivo u otro, creamos un atributo artificial para usarlo sólo como
clave. Esto es perfectamente legal en el modelo E-R, y se hace frecuentemente porque resulta cómodo
y lógico.
Claves candidatas
Una característica que debemos buscar siempre en las claves es que contengan el número mínimo
de atributos, siempre que mantengan su función. Diremos que una clave es mínima cuando si se
elimina cualquiera de los atributos que la componen, deja de ser clave. Si en una entidad existe más de
una de estas claves mínimas, cada una de ellas es una clave candidata.
Clave principal
Si disponemos de varias claves candidatas no usaremos cualquiera de ellas según la ocasión. Esto
sería fuente de errores, de modo que siempre usaremos la misma clave candidata para identificar la
entidad.
Clave principal: (o primaria), es una clave candidata elegida de forma arbitraria, que
usaremos siempre para identificar una entidad.
Claves de interrelaciones
Para identificar interrelaciones el proceso es similar, aunque más simple. Tengamos en cuenta que
para definir una interrelación usaremos las claves primarias de las entidades interrelacionadas. De este
modo, el identificador de una interrelación es el conjunto de las claves primarias de cada una de las
entidades interrelacionadas.
Por ejemplo, si tenemos dos personas identificadas con dos valores de su clave primaria, clave1 y
clave2, y queremos establecer una interrelación "es padre de" entre ellas, usaremos esas dos claves.
El identificador de la interrelación será clave1,clave2.
A menudo la clave de una entidad está ligada a la clave principal de otra, aún sin tratarse de una
interrelación. Por ejemplo, supongamos una entidad viaje, que usa la clave de un vehículo y añade
otros atributos como origen, destino, fecha, distancia. Decimos que la entidad viaje es una entidad
débil, en contraposición a la entidad vehículo, que es una entidad fuerte. La diferencia es que las
entidades débiles no necesitan una clave primaria, sus claves siempre están formadas como la
combinación de una clave primaria de una entidad fuerte y otros atributos.
Además, la existencia de las entidades débiles está ligada o subordinada a la de la fuerte. Es decir,
existe una dependencia de existencia. Si eliminamos un vehículo, deberemos eliminar también todos
los viajes que ese vehículo ha realizado.
Dependencia de existencia
Dependencia de existencia: decimos que existe una dependencia de existencia entre una
entidad, subordinada, y otra, dominante, cuando la eliminación de la entidad dominante,
conlleva también la eliminación de la entidad o entidades subordinadas.
Desde cierto punto de vista, podemos considerar que las entidades dominantes y sus entidades
subordinadas forman parte de una misma entidad. Es decir, una entidad está formada por ella misma y
sus circunstancias (citando a Ortega :-). Esas circunstancias podrían ser, en el caso de nuestro
vehículo, además de los viajes que ha hecho, los dueños que ha tenido, las revisiones que se le han
efectuado, averías, etc. Es decir, todo su historial.
Generalización
A veces existen situaciones en que sea conveniente crear una entidad como una fusión de otras, en
principio, diferentes, aunque con atributos comunes. Esto disminuye el número de conjuntos de
entidades y facilita el establecimiento de interrelaciones.
Por ejemplo, estamos modelando la gestión de una biblioteca, en la que además de libros se
pueden consultar y prestar revistas y películas. Desde el punto de vista del modelo E-R, deberíamos
crear conjuntos de entidades distintos para estos tres tipos de entidad, sin embargo, todos ellos tienen
comportamientos y características comunes: préstamos, ubicaciones, ejemplares, editorial. También
tienen atributos específicos, como el número de revista, o la duración de la película.
La idea es crear una entidad con una única copia de los atributos comunes y añadir los atributos no
comunes. Además se debe añadir un atributo que indique que tipo de entidad estamos usando, este
atributo es un discriminador.
La desventaja de la generalización es que se desperdicia espacio de almacenamiento, ya que sólo
algunos de los atributos no comunes contienen información en cada entidad, el resto se desperdicia.
La ventaja es que podemos establecer el mismo tipo de interrelación con cualquier entidad del
conjunto. En nuestro ejemplo, en lugar de tener que establecer tres interrelaciones de péstamo, o
ubicación, bastará con una de cada tipo.
Especialización
Es el proceso inverso al de generalización, en lugar de crear una entidad a partir de varias,
descomponemos una entidad en varias más especializadas.
Entidad
Entidad
Las entidades se representan con un rectángulo, y en su interior el nombre de la
entidad:
Las entidades débiles pueden representarse mediante dos rectángulos inscritos. Ya sabemos que
existe una dependencia de existencia entre la entidad débil y la fuerte, esto se representa también
añadiendo una flecha a la línea que llega a la entidad débil.
Atributo
Atributo multivaluado: (o multivalorado) se dice del atributo tal que para Multivaluado
una misma entidad puede tomar varios valores diferentes, es decir, varios
valores del mismo dominio.
Interrelación
Dominio
Diagrama
Un diagrama E-R consiste en representar mediante estas figuras
un modelo completo del problema, proceso o realidad a describir, de
forma que se definan tanto las entidades que lo componen, como las
interrelaciones que existen entre ellas.
La idea es simple, aparentemente, pero a la hora de construir
modelos sobre realidades concretas es cuando surgen los
problemas. La realidad es siempre compleja. Las entidades tienen
Dominios muchos atributos diferentes, de los cuales debemos aprender a
elegir sólo los que necesitemos. Lo mismo cabe decir de las
interrelaciones. Además, no siempre está perfectamente claro qué es un atributo y qué una entidad; o
que ventajas obtenemos si tratamos a ciertos atributos como entidades y viceversa.
Al final, nuestra mejor arma es la práctica. Cuantos más problemas diferentes modelemos más
aprenderemos sobre el proceso y sobre los problemas que pueden surgir. Podremos aplicar la
experiencia obtenida en otros proyectos, y, si no reducir el tiempo empleado en el modelado, al menos
sí reducir los retoques posteriores, el mantenimiento y el tiempo necesario para realizar modificaciones
sobre el modelo.
Atributo multivaluado
Atributo multivaluado
Pero, aunque como su propio nombre
indica no dejan de ser atributos, es mejor considerar a los atributos multivaluados como entidades
débiles subordinadas. Esto nos evitará muchos problemas con el modelo lógico relacional.
Proceso
Para crear un diagráma conceptual hay que meditar mucho. No hay un procedimiento claro y
universal, aunque sí se pueden dar algunas directrices generales:
Hablar con el cliente e intentar dejar claros los parámetros y objetivos del problema o proceso a
modelar. Por supuesto, tomar buena nota de todo.
Estudiar el planteamiento del problema para:
Identificar los conjuntos de entidades útiles para modelar el problema,
Identificar los conjuntos de interrelaciones y determinar su grado y tipo (1:1, 1:n o m:n).
Trazar un primer diagrama E-R.
Identificar atributos y dominios para los conjuntos de entidades e interrelaciones.
Seleccionar las claves principales para los conjuntos de entidades.
Verificar que el modelo resultante cumple el planteamiento del problema. Si no es así, se vuelve a
repasar el proceso desde principio.
Seguir con los siguientes pasos: traducir el diagrama a un modelo lógico, etc.
Quiero hacer notar que, la mayor parte del proceso que hemos explicado para crear un diagrama E-
R, también puede servir para crear aplicaciones, aunque no estén basadas en bases de datos.
Extensiones
Existen varias extensiones al modelo E-R que hemos visto, aunque la mayor parte de ellas no las
vamos a mencionar.
Una de ellas es la cardinalidad de asignación, que se aplica a atributos multivaluados. Consiste en
establecer un número mínimo y máximo de posibles valores para atributos multivaluados.
Por ejemplo, en nuestra entidad persona habíamos usado un atributo multivaluado para los
teléfonos de contacto. Habíamos dicho que, para evitar problemas en el modelo lógico, era mejor
considerar este atributo como una entidad. Sin embargo hay otras soluciones. Si por ejemplo,
establecemos una cardinalidad para este atributo (0,3), estaremos imponiendo, por diseño, que para
cada persona sólo puede haber una cantidad entre 0 y 3 de teléfonos de contacto. Si esto es así,
podemos usar tres atributos, uno por cada posible teléfono, y de ese modo eliminamos el atributo
multivaluado.
No siempre será posible establecer una cardinalidad. En el ejemplo planteado se la elegido de una
forma completamente arbitraria, y probablemente no sea una buena idea. En otros casos sí existirá una
cardinalidad clara, por ejemplo, en un automóvil con cinco plazas, las personas que viajen en él tendrán
una cardinalidad (1,5), al menos tiene que haber un conductor, y como máximo otros cuatro pasajeros.
Otra posible extensión consiste en algo llamado "entidad compuesta". En realidad se trata de una
interrelación como las que hemos visto, pero a la que se añaden más atributos.
Por ejemplo, en la relación de matrimonio entre dos personas, podríamos añadir un atributo para
guardar la fecha de matrimonio.
Ejemplo 1
Nos enfrentamos al siguiente problema que debemos modelar.
Se trata de una base de datos que debe almacenar la información sobre varias estaciones
meteorológicas, en una zona determinada. De cada una de ellas recibiremos y almacenaremos un
conjunto de datos cada día: temperatura máxima y mínima, precipitaciones en litros/m2, velocidad del
viento máxima y mínima, y humedad máxima y mínima.
El sistema debe ser capaz de seleccionar, añadir o eliminar estaciones. Para cada una
almacenaremos su situación geográfica (latitud y longitud), identificador y altitud.
Bien, es un problema sencillo, pero nos sirve para ilustrar el procedimiento.
Ya tenermos la descripción del proceso, así que pasemos al segundo paso:
A primera vista, tenemos dos conjuntos de entidades: estaciones y muestras. Podríamos haber
usado sólo un conjunto, el de las muestras, pero nos dicen que debemos ser capaces de seleccionar,
añadir y borrar estaciones, de modo que parece que tendremos que usar un conjunto de entidades
para ellas.
Las relaciones son más simples, ya que sólo hay una: cada estación estará interrelacionada con
varias muestras. Es una relación 1:N.
Identificar atributos
Verificar el modelo
2º diagrama meteorológico
Todo está conforme el enunciado, nuestro diagrama E-R está terminado.
Ejemplo 2
Nota: a fecha de 12/04/2012 he detectado un error en el modelado de este ejemplo. El atributo
"categoría" de libro debe ser en realidad un atributo de ejemplar. Esto es porque lo que prestamos son
ejemplares, no libros. En la realidad la categoría queda definida para cada ejemplar. Podemos tener
para el mismo libro ejemplares que no se puedan prestar (primeras ediciones, encuadernaciones
antiguas, etc), y ejemplares que sí se puedan prestar (ediciones en rústica, copias digitales, etc). He
modificado los textos del ejemplo 2 en todo el curso para corregir este error.
Nuestro segundo ejemplo es más complicado. Se trata de gestionar una biblioteca, y nuestro cliente
quiere tener ciertas herramientas a su disposición para controlar libros, socios y préstamos.
Adicionalmente se necesita un control de los ejemplares de cada libro, su ubicación y su estado, con
vistas a su retirada o restitución, para esto último necesita información sobre editoriales a las que se
deben pedir los libros.
Tanto los ejemplares como los socios estarán sujetos a ciertas categorías, de modo que según ellas
cada ejemplar podrá ser o no prestado a cada socio. Por ejemplo, si las categorías de los ejemplares
van de A a F, y la de los socios de B a F, un ejemplar de categoría A nunca puede ser prestado a
ningún socio. Estos ejemplares sólo se pueden consultar en la biblioteca, pero no pueden salir de ella.
Un ejemplar de categoría B sólo a socios de categoría B, uno de categoría C se podrá prestar a socios
de categorías B y C, etc. Los ejemplares de categoría F siempre pueden prestarse.
El sistema debe proporcionar también un método de búsqueda para libros por parte de los socios,
por tema, autor o título. El socio sólo recibirá información sobre los libros de los que existen ejemplares,
y sobre la categoría.
Además, se debe conservar un archivo histórico de préstamos, con las fechas de préstamo y
devolución, así como una nota que el responsable de la biblioteca quiera hacer constar, por ejemplo,
sobre el estado del ejemplar después de su devolución. Este archivo es una herramienta para la
biblioteca que se puede usar para discriminar a socios "poco cuidadosos".
Los préstamos, generalmente, terminan con la devolución del libro, pero algunas veces el ejemplar
se pierde o el plazo supera un periodo de tiempo establecido y se da por perdido. Estas circunstancias
pueden cerrar un préstamo y provocan la baja del ejemplar (y en ocasiones la del socio :-). Nuestro
archivo histórico debe contener información sobre si el libro fue devuelto o perdido.
Sobre el tema habría mucho que hablar. Podríamos guardar el tema como un atributo de libro, pero
en la práctica será deseable considerar este atributo como una entidad, y establecer una interrelación
entre el libro y los temas. Esto nos permitiría elegir varios temas para cada libro, y nos facilitará las
búsquedas de libros.
3. Autor: contiene información sobre autores, hay que tener en cuenta que un libro puede no tener
autor (caso de libros anónimos), y también puede tener uno o varios autores (recopilaciones y
colaboraciones).
4. Editorial: necesitamos un conjunto de entidades para ellas, ya que deberemos hacer pedidos de
libros y esos pedidos se hacen a editoriales.
5. Ejemplar: para cada libro podemos tener uno o varios ejemplares. Cada ejemplar es una entidad,
de hecho, es posible que tengamos entidades en nuestra base de datos de libros de los que no
tenemos ningún ejemplar. Esto también nos permitirá hacer seguimiento de ejemplares concretos,
mantener información sobre distintas ediciones del mismo libro, el estado en que se encuentra,
diferentes formatos del libro (papel, informático o sonoro), etc.
Podemos tener ciertas dudas sobre si ciertas características del modelo son entidades o relaciones.
Por ejemplo, el préstamo puede ser considerado como una interrelación entre un socio y un ejemplar.
Sin embargo, necesitaremos alguna información extra sobre cada préstamo, como la fecha de
préstamo y la de devolución.
De hecho, lo consideraremos como una entidad compuesta, que relacionará un socio con un
ejemplar, (no prestamos libros, sino ejemplares) y al que añadiremos un atributo con la fecha de
préstamo.
Otro concepto difícil de catalogar puede ser el de las categorías. Puede ser un atributo o una
entidad, dependiendo de si necesitamos más atributos para definirlas o no. Hay que tener en cuenta
que tanto los libros como los socios pertenecen a una categoría, lo que tenemos que decidir es si se
trata del mismo conjunto de categorías o no.
En principio, y si no nos vemos obligados a cambiar el modelo, parece que lo más lógico es
considerar las categorías como un atributo de las entidades ejemplar y socio.
Nuestro cliente, además, dice que quiere conservar un archivo histórico de los préstamos.
Necesitamos por lo tanto, otro conjunto de entidades para el histórico de préstamos. Sin embargo, al
buscar las interrelaciones veremos que no necesitamos esta octava entidad.
Identificar conjuntos de interrelaciones
Llega el turno de buscar las interrelaciones entre los conjuntos de entidades que hemos definido.
Las primeras que encontramos son las existentes entre libro y tema, libro y autor, del tipo N:M.
Entre libro y editorial, existe una relación N:1.
Entre libro y ejemplar la relación es del tipo 1:N. En este caso, además, los ejemplares son
entidades subordinadas a libro. La interrelación, por lo tanto se convierte en una entidad compuesta.
Podríamos haber establecido un conjunto de relaciones entre ejemplar y editorial, del tipo 1:N; en
lugar de hacerlo entre libro y editorial. Esto es si consideramos posible que un mismo libro se edite por
varias editoriales, pero para este modelo consideraremos que un mismo libro editado por distintas
editoriales, son en realidad varios libros diferentes.
Otro conjunto de interrelaciones es la que existe entre ejemplar y socio, de tipo N:M. Ya dijimos que
esta interrelación será en realidad una entidad compuesta.
El último conjunto de interrelaciones es entre préstamo y su historial, en este caso, consideraremos
el historial como una entidad subordinada a préstamo.
Pero consideremos la posibilidad de hacer una generalización entre las entidades préstamo e
historial, a fin de cuentas, una entidad de historial es un préstamo cerrado, contendrá la misma
información que un préstamo abierto, más algunos datos sobre el cierre.
De este modo tampoco necesitaremos un atributo discriminador creado al efecto, podemos
considerar que si la fecha de devolución es nula, el préstamo está abierto.
Identificar atributos
1. Libro: guardaremos el título. Además, como el título no es único, ya existen muchos libros con el
mismo título, necesitaremos un atributo para usar como clave primaria, la clavelibro. Añadiremos
también algunos atributos como el idioma, título e idioma originales (para traducciones), formato,
etc. Podemos añadir algún otro atributo informativo, como el código ISBN, que facilita su petición a
la editorial.
2. Tema: igual que con la entidad libro, guardaremos el nombre del tema y un atributo clavetema para
usar como clave primaria.
3. Autor: el nombre del autor. Podemos añadir algún dato sobre el autor, biográfico o de cierta
utilidad para realizar búsquedas en detalle. También crearemos un atributo para usarlo como clave
principal, al que llamaremos claveautor.
4. Editorial: atributos interesantes para hacer peticiones de nuevos libros: nombre, dirección y
teléfono.
5. Ejemplar: edición, ubicación en la biblioteca y categoría. También necesitaremos un identificador
de orden, para poder distinguir entre varios ejemplares idénticos.
6. Socio: guardaremos el nombre, fecha de alta, categoría y, por supuesto, un identificador para usar
como clave primaria: el número de socio.
7. Préstamo/historial: necesitamos la fecha de préstamo y de devolución, así como un atributo de
comentarios.
No todas las entidades necesitarán una clave principal, veamos cuales necesitamos:
En el caso de libro, tema, autor, editorial y socio disponemos de atributos creados
específicamente para ser usados como claves principales.
Para ejemplar, en principio, al tratarse de una entidad subordinada, no necesitaría una clave
principal, pero como interviene en la interrelación de préstamo sí la necesitaremos. Esta clave se crea
mediante la combinación de la clave principal de libro y un atributo propio de ejemplar, que será el
identificador de orden.
Sin embargo, esta clave compuesta puede generar problemas a la hora de crear claves foráneas,
de modo que es mejor crear una clave primaria específica.
La entidad préstamo/historial es compuesta. En principio, con las claves de socio y ejemplar
debería ser suficiente para identificar un préstamo concreto, pero es posible que el mismo socio pida
prestado el mismo ejemplar más de una vez. Estaremos, por lo tanto, obligados a usar un atributo extra
para definir una clave candidata. Ese atributo puede ser, y de hecho debe ser, la fecha de préstamo. De
todos modos, esta entidad no precisa de clave principal, ya que no interviene en ninguna interrelación.
Si fuese necesaria, no sería posible usar el conjunto de atributos de clave de socio, clave de libro,
número de orden y fecha, ya que algunos de ellos podrían ser nulos (si se dan de baja socios o
ejemplares).
Verificar el modelo
Nota:
Definiciones
Igual que hicimos con el modelo E-R, empezaremos con algunas definiciones. Algunos de los
conceptos son comunes entre los dos modelos, como atributo o dominio. Pero de todos modos, los
definiremos de nuevo.
Relación
Es el concepto básico del modelo relacional. Ya adelantamos en el capítulo anterior que los
conceptos de relación entre el modelo E-R y el relacional son diferentes. Por lo tanto, usamos el
término interrelación para referirnos a la conexión entre entidades. En el modelo relacional este término
se refiere a una tabla, y es el paralelo al concepto conjunto de entidades del modelo E-R.
Tupla
A menudo se le llama también registro o fila, físicamente es cada una de las líneas de la relación.
Equivale al concepto de entidad del modelo E-R, y define un objeto real, ya sea abstracto, concretos o
imaginario.
Tupla: cada una de las filas de una relación. Contiene la información relativa a una única
entidad.
De esta definición se deduce que no pueden existir dos tuplas iguales en la misma relación.
Atributo
También denominado campo o columna, corresponde con las divisiones verticales de la relación.
Corresponde al concepto de atributo del modelo E-R y contiene cada una de las características que
definen una entidad u objeto.
Atributo: cada una de las características que posee una entidad, y que agrupadas
permiten distingirla de otras entidades del mismo conjunto.
Al igual que en el modelo E-R, cada atributo tiene asignado un nombre y un dominio. El conjunto de
todos los atributos es lo que define a una entidad completa, y es lo que compone una tupla.
Nulo (NULL)
Hay ciertos atributos, para determinadas entidades, que carecen de valor. El modelo relacional
distingue entre valores vacíos y valores nulos. Un valor vacío se considera un valor tanto como
cualquiera no vacío, sin embargo, un nulo NULL indica la ausencia de valor.
Nulo: (NULL) valor asignado a un atributo que indica que no contiene ninguno de los
valores del dominio de dicho atributo.
El nulo es muy importante en el modelo relacional, ya que nos permite trabajar con datos
desconocidos o ausentes.
Por ejemplo, si tenemos una relación de vehículos en la que podemos guardar tanto motocicletas
como automóviles, un atributo que indique a qué lado está el volante (para distinguir vehículos con el
volante a la izquierda de los que lo tienen a la derecha), carece de sentido en motocicletas. En ese
caso, ese atributo para entidades de tipo motocicleta será NULL.
Esto es muy interesante, ya que el dominio de este atributo es (derecha,izquierda), de modo que si
queremos asignar un valor del dominio no hay otra opción. El valor nulo nos dice que ese atributo no
tiene ninguno de los valores posibles del dominio. Así que, en cierto modo amplia la información.
Otro ejemplo, en una relación de personas tenemos un atributo para la fecha de nacimiento. Todas
las personas de la relación han nacido, pero en un determinado momento puede ser necesario insertar
una para la que desconocemos ese dato. Cualquier valor del dominio será, en principio, incorrecto.
Pero tampoco será posible distinguirlo de los valores correctos, ya que será una fecha. Podemos usar
el valor NULL para indicar que la fecha de nacimiento es desconocida.
Dominio
Modelo relacional
Ahora ya disponemos de los conceptos básicos para definir en qué consiste el modelo relacional. Es
un modelo basado en relaciones, en la que cada una de ellas cumple determinadas condiciones
mínimas de diseño:
Cardinalidad
La cadinalidad puede cambiar, y de hecho lo hace frecuentemente, a lo largo del tiempo: siempre se
pueden añadir y eliminar tuplas.
Grado
El grado de una relación es un valor constante. Esto no quiere decir que no se puedan agregar o
eliminar atributos de una relación; lo que significa es que si se hace, la relación cambia. Cambiar el
grado, generalmente, implicará modificaciones en las aplicaciones que hagan uso de la base de datos,
ya que cambiarán conceptos como claves e interrelaciones, de hecho, puede cambiar toda la estructura
de la base de datos.
Esquema
Esto es, el esquema es una lista de los atributos que definen una relación y sus dominios.
Instancia
Es como una fotografía de la relación, que sólo es válida durante un periodo de tiempo concreto.
Clave
Clave: es un conjunto de atributos que identifica de forma unívoca a una tupla. Puede
estar compuesto por un único atributo o una combinación de varios.
Dentro del modelo relacional no existe el concepto de clave múltiple. Cada clave sólo puede hacer
referencia a una tupla de una tabla. Por lo tanto, todas las claves de una relación son únicas.
Podemos clasificar las claves en distintos tipos:
Candidata: cada una de las posibles claves de una relación, en toda relación existirá al menos una
clave candidata. Esto implica que ninguna relación puede contener tuplas repetidas.
Primaria: (o principal) es la clave candidata elegida por por el usuario para identificar las tuplas. No
existe la necesidad, desde el punto de vista de la teoría de bases de datos relacionales, de elegir
una clave primaria. Además, las claves primarias no pueden tomar valores nulos.
Es preferible, por motivos de optimización de MySQL, que estos valores sean enteros, aunque no
es obligatorio. MySQL sólo admite una clave primaria por tabla, lo cual es lógico, ya que la
definición implica que sólo puede existir una.
Alternativa: cada una de las claves candidatas que no son clave primaria, si es que existen.
Foránea: (o externa) es el atributo (o conjunto de atributos) dentro de una relación que contienen
claves primarias de otra relación. No hay nada que impida que ambas relaciones sean la misma.
Interrelación
Decimos que dos relaciones están interrelacionadas cuando una posee una clave foránea de la
otra. Cada una de las claves foráneas de una relación establece una interrelación con la relación donde
esa clave es la principal.
Según esto, existen dos tipos de interrelación:
Extrictamente hablando, sólo la segunda es una interrelación, pero como veremos más tarde, en el
modelo relacional ambas tienen la forma de relaciones, al igual que las entidades compuestas, que son
interrelaciones con atributos añadidos.
Al igual que en el modelo E-R, existen varios tipos de interrelación:
Uno a uno: a cada tupla de una relación le corresponde una y sólo una tupla de otra.
Uno a varios: a cada tupla una relación le corresponden varias en otra.
Varios a varios: cuando varias tuplas de una relación se pueden corresponder con varias tuplas en
otra.
1. Para cada conjunto de entidades fuertes se crea una relación con una columna para cada atributo.
2. Para cada conjunto de entidades débiles se crea una relación que contiene una columna para los
atributos que forman la clave primaria de la entidad fuerte a la que se encuentra subordinada y una
columna para cada atributo de la entidad.
3. Para cada interrelación se crea una relación que contiene una columna para cada atributo
correspondiente a las claves principales de las entidades interrelacionadas.
4. Lo mismo para entidades compuestas, añadiendo las columnas necesarias para los atributos
añadidos a la interrelación.
Diagrama libro-autor
Siguiendo las normas indicadas obtendremos las siguientes relaciones:
Libro(Identificador, Título)
Autor(Clave, Nombre)
Escrito_por(Identificador, Clave)
Selección
Se trata de un operador unitario, es decir, se aplica a una relación y como resultado se obtiene otra
relación.
Consiste en seleccionar ciertas tuplas de una relación. Generalmente la selección se limita a las
tuplas que cumplan determinadas condiciones.
<relación>[<atributo>='<valor>']
tabla[id<'200']
id nombre apellido fecha estado
123 Fulano Prierez 4/12/1987 soltero
102 Tulana Liopez 24/6/1985 casado
005 Tutulano Gionzialez 2/6/1970 viudo
tabla[estado='soltero']
123 Fulano Prierez 4/12/1987 soltero
454 Mengano Sianchiez 15/1/1990 soltero
554 Filgana Gaomez 15/5/1998 soltero
Proyección
<relación>[<lista de atributos>]
tabla
id nombre apellido fecha estado
123 Fulano Prierez 4/12/1987 soltero
454 Mengano Sianchiez 15/1/1990 soltero
102 Tulana Liopez 24/6/1985 casado
554 Fulano Gaomez 15/5/1998 soltero
005 Tutulano Gionzialez 2/6/1970 viudo
tabla[id,apellido]
id apellido
123 Prierez
454 Sianchiez
102 Liopez
554 Gaomez
005 Gionzialez
tabla[nombre, estado]
nombre estado
Fulano soltero
Mengano soltero
Tulana casado
Tutulano viudo
En esta última proyección se ha eliminado una tupla, ya que aparece repetida. Las tuplas 1ª y 4ª
son idénticas, las dos personas de nombre 'Fulano' son solteras.
Producto cartesiano
tabla1
id nombre apellido
15 Fulginio Liepez
26 Cascanio Suanchiez
tabla2
id número
15 12345678
26 21222112
15 66525425
tabla1 x tabla2
id nombre apellido id número
15 Fulginio Liepez 15 12345678
26 Cascanio Suanchiez 15 12345678
15 Fulginio Liepez 26 21222112
26 Cascanio Suanchiez 26 21222112
15 Fulginio Liepez 15 66525425
26 Cascanio Suanchiez 15 66525425
Composición (Join)
Una composición (Join en inglés) es una restricción del producto cartesiano, en la relación de salida
sólo se incluyen las tuplas que cumplan una determinada condición.
La condición que se usa más frecuentemente es la igualdad entre dos atributos, uno de cada tabla.
<relación1>[<condición>]<relación2>
tabla1
id nombre apellido
15 Fulginio Liepez
26 Cascanio Suanchiez
tabla2
id número
15 12345678
26 21222112
15 66525425
La composición de estas dos tablas, para una condición en que 'id' sea igual en ambas sería:
tabla1[tabla1.id = tabla2.id]tabla2
id nombre apellido t2.id número
15 Fulginio Liepez 15 12345678
26 Cascanio Suanchiez 26 21222112
15 Fulginio Liepez 15 66525425
Composición natural
Cuando la condición es la igualdad entre atributos de cada tabla, la relación de salida tendrá parejas
de columnas con valores iguales, por lo tanto, se podrá eliminar siempre una de esas columnas.
Cuando se eliminan, el tipo de composición se denomina composición natural.
El grado, por lo tanto, en una composición natural es n+m-i, siendo i el número de atributos
comparados entre ambas relaciones. La cardinalidad de la relación de salida depende de la condición.
Si sólo se compara un atributo, el grado será n+m-1, si se comparan dos atributos, el grado será
n+m-2, y generalizando, si se comparan i atributos, el grado será n+m-i.
En el ejemplo anterior, si hacemos una composición natural, la columna t2.a1 no aparecería, ya que
está repetida:
La composición natural de estas dos tablas, para una condición en que 'id' sea igual en ambas
sería:
tabla1[tabla1.id = tabla2.id]tabla2
id nombre apellido número
15 Fulginio Liepez 12345678
26 Cascanio Suanchiez 21222112
15 Fulginio Liepez 66525425
tabla1(x, y, nombre)
tabla2(x, y, número)
tabla1
x y nombre
A 4 Fulginio
A 6 Cascanio
B 3 Melania
C 4 Juaninia
C 7 Antononio
D 2 Ferninio
D 5 Ananinia
tabla2
x y número
A 3 120
A 6 145
B 2 250
B 5 450
C 4 140
D 2 130
D 5 302
Si la condición es que tanto 'x' como 'y' sean iguales en ambas tablas, tendríamos:
Unión
<relación1> U <relación2>
tabla1
id nombre apellido
15 Fernandio Garcidia
34 Augustido Lipoez
12 Julianino Sianchiez
43 Carlanios Pierez
tabla2
id nombre apellido
44 Rosinia Ortiegaz
63 Anania Pulpez
55 Inesiana Diominguez
La unión de ambas tablas es posible, ya que tienen el mismo número y tipo de atributos:
tabla1 U tabla2
id nombre apellido
15 Fernandio Garcidia
34 Augustido Lipoez
12 Julianino Sianchiez
43 Carlanios Pierez
44 Rosinia Ortiegaz
63 Anania Pulpez
55 Inesiana Diominguez
Intersección
tabla1
id prenda color
10 Jersey Blanco
20 Jersey Azul
30 Pantalón Verde
40 Falda Roja
50 Falda Naranja
tabla2
id prenda color
15 Jersey Violeta
20 Jersey Azul
34 Pantalón Amarillo
40 Falda Roja
52 Falda Verde
Es posible obtener la intersección de ambas relaciones, ya que tienen el mismo número y tipo de
atributos:
Diferencia
<relación1> - <relación2>
tabla2
id prenda color
15 Jersey Violeta
20 Jersey Azul
34 Pantalón Amarillo
40 Falda Roja
52 Falda Verde
Es posible obtener la diferencia de ambas relaciones, ya que tienen el mismo número y tipo de
atributos:
tabla1 - tabla2
id prenda color
10 Jersey Blanco
30 Pantalón Verde
50 Falda Naranja
División
Integridad de datos
Es muy importante impedir situaciones que hagan que los datos no sean accesibles, o que existan
datos almacenados que no se refieran a objetos o entidades existentes, etc. El modelo relacional
también provee mecanismos para mantener la integridad. Podemos dividir estos mecanismos en dos
categorías:
En cuanto a las restricciones estáticas, las más importantes son las que afectan a las claves
primarias.
Ninguna de las partes que componen una clave primaria puede ser NULL.
Que parte de una clave primaria sea NULL indicaría que, o bien esa parte no es algo absolutamente
necesario para definir la entidad, con lo cual no debería formar parte de la clave primaria, o bien no
sabemos a qué objeto concreto nos estamos refiriendo, lo que implica que estamos tratando con un
grupo de entidades. Esto va en contra de la norma que dice que cada tupla contiene datos sólo de una
entidad.
Las modificaciones de claves primarias deben estar muy bien controladas.
Dado que una clave primaria identifica de forma unívoca a una tupla en una relación, parece poco
lógico que exista necesidad de modificarla, ya que eso implicaría que no estamos definiendo la misma
entidad.
Además, hay que tener en cuenta que las claves primarias se usan frecuentemente para establecer
interrelaciones, lo cual implica que sus valores se usan en otras relaciones. Si se modifica un valor de
una clave primaria hay que ser muy cuidadoso con el efecto que esto puede tener en todas las
relaciones en las que se guarden esos valores.
Existen varias maneras de limitar la modificación de claves primarias. Codd apuntó tres
posibilidades:
Que sólo un número limitado de usuarios puedan modificar los valores de claves primarias. Estos
usuarios deben ser conscientes de las repercusiones de tales cambios, y deben actuar de modo
que se mantenga la integridad.
La prohibición absoluta de modificar los valores de claves primarias. Modificarlas sigue siendo
posible, pero mediante un mecanismo indirecto. Primero hay que eliminar las tuplas cuyas claves
se quieren modificar y a continuación darlas de alta con el nuevo valor de clave primaria.
La creación de un comando distinto para modificar atributos que son claves primarias o partes de
ellas, del que se usa para modificar el resto de los atributos.
Integridad referencial
La integridad referencial se refiere a las claves foráneas. Recordemos que una clave foránea es un
atributo de una relación, cuyos valores se corresponden con los de una clave primaria en otra o en la
misma relación. Este mecanismo se usa para establecer interrelaciones.
La integridad referencial consiste en que si un atributo o conjunto de atributos se define como una
clave foránea, sus valores deben existir en la tabla en que ese atribito es clave principal.
Las situaciones donde puede violarse la integridad referencial es en el borrado de tuplas o en la
modificación de claves principales. Si se elimina una tupla cuya clave primaria se usa como clave
foránea en otra relación, las tuplas con esos valores de clave foránea contendrán valores sin
referenciar.
Existen varias formas de asegurarse de que se conserva la integridad referencial:
Restringir operaciones: borrar o modificar tuplas cuya clave primaria es clave foránea en otras
tuplas, sólo estará permitido si no existe ninguna tupla con ese valor de clave en ninguna otra
relación.
Es decir, si el valor de una clave primaria en una tupla es "clave1", sólo podremos eliminar esa
tupla si el valor "clave1" no se usa en ninguna otra tupla, de la misma relación o de otra, como
valor de clave foránea.
Transmisión en cascada: borrar o modificar tuplas cuya clave primaria es clave foránea en otras
implica borrar o modificar las tuplas con los mismos valores de clave foránea.
Si en el caso anterior, modificamos el valor de clave primaria "clave1" por "clave2", todas las
apariciones del valor "clave1" en donde sea clave foránea deben ser sustituidos por "clave2".
Poner a nulo: cuando se elimine una tupla cuyo valor de clave primaria aparece en otras relaciones
como clave foránea, se asigna el valor NULL a dichas claves foráneas.
De nuevo, siguiendo el ejemplo anterior, si eliminamos la tupla con el valor de clave primaria
"clave1", en todas las tuplas donde aparezca ese valor como clave foránea se sustituirá por NULL.
Veremos con mucho más detalle como se implementan estos mecanismos en MySQL al estudiar el
lenguaje SQL.
Propagación de claves
Se trata de un concepto que se aplica a interrelaciones N:1 ó 1:1, que nos ahorra la creación de una
relación. Supongamos las siguientes relaciones, resultado del paso del ejemplo 2 del modelo E-R al
modelo relacional:
Libro(ClaveLibro, Título, Idioma, Formato, Categoría)
Editado_por(ClaveLibro, ClaveEditorial)
Editorial(ClaveEditorial, Nombre, Dirección, Teléfono)
Cada libro sólo puede estar editado por una editorial, la interrelación es N:1. En este caso podemos
prescindir de la relación Editado_por añadiendo un atributo a la relación Libro, que sea la clave primaria
de la editorial:
Libro(ClaveLibro, Título, Idioma, Formato, Categoría, ClaveEditorial)
Editorial(ClaveEditorial, Nombre, Dirección, Teléfono)
Ejemplo 1
Para ilustrar el paso del modelo E-R al modelo relacional, usaremos los mismos ejemplos que en el
capítulo anterior, y convertiremos los diagramas E-R a tablas.
Empecemos con el primer ejemplo:
2º diagrama meteorológico
Sólo necesitamos dos tablas para hacer la conversión:
Este ejemplo es muy simple, la conversión es directa. Se puede observar cómo hemos introducido
un atributo en la relación Muestra que es el identificador de estación. Este atributo se comporta como
una clave foránea.
Ejemplo 2
2º diagrama de biblioteca
Este ejemplo es más complicado, de modo que iremos por fases. Para empezar, convertiremos los
conjuntos de entidades en relaciones:
La entidad Ejemplar es subordinada de Libro, es decir, que su clave principal se podría construir a
partir de la clave principal de Libro y el atributo NúmeroOrden. Sin embargo crearemos una clave
específica para ello.
Ahora veamos la conversión de las interrelaciones:
Trata_sobre(ClaveLibro, ClaveTema)
Escrito_por(ClaveLibro, ClaveAutor)
Editado_por(ClaveLibro, ClaveEditorial)
Ya vimos que podemos aplicar la propagación de claves entre conjuntos de entidades que
mantengan una interrelación N:1 ó 1:1. En este caso, la interrelación entre Libro y Editorial cumple esa
condición, de modo que podemos eliminar una interrelación y propagar la clave de Editorial a la entidad
Libro.
El esquema final queda así:
Normalización
Antes de poder aplicar el proceso de normalización, debemos
asegurarnos de que estamos trabajando con una base de datos
relacional, es decir, que cumple con la definición de base de datos
relacional.
El proceso de normalización consiste verificar el cumplimiento de
ciertas reglas que aseguran la eliminación de redundancias e
inconsistencas. Esto se hace mediante la aplicación de ciertos
procedimientos y en ocasiones se traduce en la separación de los
datos en diferentes relaciones. Las relaciones resultantes deben
cumplir ciertas características:
Nota:
Nota:
Agenda(Nombre, email)
Libros
Titulo autor fecha editorial
Que bueno es MySQL fulano 12/10/2003 La buena
Que bueno es MySQL mengano 12/10/2003 La buena
Catástrofes naturales tulano 18/03/1998 Penútriga
Dependencias funcionales
Ya hemos comentado que una relación se compone de atributos
y dependencias. Los atributos son fáciles de identificar, ya que
forman parte de la estructura de la relación, y además, los elegimos
nosotros mismos como diseñadores de la base de datos.
Pero no es tan sencillo localizar las dependencias, ya que
requieren un análisis de los atributos, o con más precisión, de las
interrelaciones entre atributos, y frecuentemente la intuición no es
suficiente a la hora de encontrar y clasificar todas las dependencias.
La teoría nos puede ayudar un poco en ese sentido, clasificando
las dependencias en distintos tipos, indicando qué características
tiene cada tipo.
Para empezar, debemos tener claro que las dependencias se
pueden dar entre atributos o entre subconjuntos de atributos.
Estas dependencias son consecuencia de la estructura de la
base de datos y de los objetos del mundo real que describen, y no
de los valores actualmente almancenados en cada relación. Por
ejemplo, si tenemos una relación de vehículos en la que
almacenamos, entre otros atributos, la cilindrada y el color, y en un
determinado momento todos los vehículos con 2000 c.c. son de
color rojo, no podremos afirmar que existen una dependencia entre
el color y la cilindrada. Debemos suponer que esto es sólo algo
casual.
Para buscar dependencias, pues, no se deben analizar los datos,
sino los entes a los que se refieren esos datos.
(No_habitación, fecha_entrada)
Ciudades
ID_ciudad Nombre población superficie renta país
continente
1 Paris 6000000 15 1800 Francia
Europa
2 Lion 3500000 9 1600 Francia
Europa
3 Berlin 7500000 16 1900 Alemania
Europa
4 Pekin 19000000 36 550 China
Asia
5 Bonn 6000000 12 1900 Alemania
Europa
Ciudades
ID_ciudad Nombre población superficie renta país
1 Paris 6000000 15 1800 Francia
2 Lion 3500000 9 1600 Francia
3 Berlin 7500000 16 1900 Alemania
4 Pekin 19000000 36 550 China
5 Bonn 6000000 12 1900 Alemania
Paises
país continente
Francia Europa
Alemania Europa
China Asia
Atributos multivaluados
Definición: se dice que un atributo es multivaluado
cuando para una misma entidad puede tomar varios
valores diferentes, con independencia de los valores que
puedan tomar el resto de los atributos.
Agenda
nombre fecha_nacimiento estado_civil teléfono
Mengano 15/12/1985 soltero 12322132
Fulano 13/02/1960 casado 13321232
Fulano 13/02/1960 casado 25565445
Fulano 13/02/1960 casado 36635363
Tulana 24/06/1975 soltera 45665456
Agenda
nombre fecha_nacimiento estado_civil
Mengano 15/12/1985 soltero
Fulano 13/02/1960 casado
Tulana 24/06/1975 soltera
Teléfonos
nombre teléfono
Mengano 12322132
Fulano 13321232
Fulano 25565445
Fulano 36635363
Tulana 45665456
Dependencias multivaluadas
Si existe más de un atributo multivaluado es cuando se
presentan dependencias multivaluadas.
Agenda
nombre fecha_nacimiento estado_civil teléfono
correo
Fulano 13/02/1960 casado 13321232
fulano@sucasa.eko
Fulano 13/02/1960 casado 25565445
fulano@sutrabajo.aka
Fulano 13/02/1960 casado 36635363
fulano@sucasa.eko
Agenda
nombre fecha_nacimiento estado_civil teléfono
correo
Fulano 13/02/1960 casado 13321232
fulano@sucasa.eko
Fulano 13/02/1960 casado 25565445
fulano@sutrabajo.aka
Fulano 13/02/1960 casado 36635363 NULL
Agenda
nombre fecha_nacimiento estado_civil teléfono
correo
Fulano 13/02/1960 casado 13321232
fulano@sucasa.eko
Fulano 13/02/1960 casado 25565445
fulano@sucasa.aka
Fulano 13/02/1960 casado 36635363
fulano@sucasa.eko
Fulano 13/02/1960 casado 13321232
fulano@sutrabajo.eko
Fulano 13/02/1960 casado 25565445
fulano@sutrabajo.aka
Fulano 13/02/1960 casado 36635363
fulano@sutrabajo.eko
Agenda
nombre fecha_nacimiento estado_civil teléfono
correo
Fulano 13/02/1960 casado 13321232 NULL
Fulano 13/02/1960 casado 25565445 NULL
Fulano 13/02/1960 casado 36635363 NULL
Fulano 13/02/1960 casado NULL
fulano@sutrabajo.eko
Fulano 13/02/1960 casado NULL
fulano@sucasa.eko
Teléfonos(nombre, teléfono)
Correos(nombre, correo)
Ahora en las dos relaciones se cumple la cuarta forma normal.
Ejemplo 1
Aplicaremos ahora la normalización a las relaciones que
obtuvimos en el capítulo anterior.
En el caso del primer ejemplo, para almacenar información sobre
estaciones meteorológicas y las muestras tomadas por ellas,
habíamos llegado a esta estructura:
Esta forma nos dice que todos los atributos deben ser atómicos.
Ya comentamos antes que este criterio es en cierto modo
relativo, lo que desde un punto de vista puede ser atómico, puede
no serlo desde otro.
En lo que respecta a la relación Estación, el Identificador y la
Altitud son claramente atómicos. Sin embargo, la Latitud y Longitud
pueden considerarse desde dos puntos de vista. En uno son
coordenadas (de hecho, podríamos haber considerado la posición
como atómica, y fundir ambos atributos en uno). A pesar de que
ambos valores se expresen en grados, minutos y segundos, más
una orientación, norte, sur, este u oeste, puede hacernos pensar
que podemos dividir ambos atributos en partes más simples.
Esta es, desde luego, una opción. Pero todo depende del uso
que le vayamos a dar a estos datos. Para nuestra aplicación
podemos considerar como atómicos estos dos atributos tal como los
hemos definido.
Para la relación Muestras todos los atributos seleccionados son
atómicos.
Para que una base de datos sea 2FN primero debe ser 1FN, y
además todas las columnas que formen parte de una clave
candidata deben aportar información sobre la clave completa.
Para la relación Estación existen dos claves candidatas:
identificador y la formada por la combinación de Latitud y Longitud.
Hay que tener en cuenta que hemos creado el atributo
Identificador sólo para ser usado como clave principal. Las
dependencias son:
Identificador -> (Latitud, Longitud)
Identificador -> Altitud
Ejemplo 2
Nuestro segundo ejemplo se modela una biblioteca, y su
esquema de relaciones final es este:
Para que una base de datos sea 2FN primero debe ser 1FN, y
además todas las columnas que formen parte de una clave
candidata deben aportar información sobre la clave completa.
En el caso de Libro, la única clave candidata es ClaveLibro.
Todos los demás valores son repetibles, pueden existir libros con el
mismo título y de la misma editorial editados en el mismo formato e
idioma. Es decir, no existe ningún otro atributo o conjunto de
atributos que puedan identificar un libro de forma unívoca.
Se pueden dar casos especiales, como el del mismo libro escrito
en diferentes idiomas. En ese caso la clave será diferente, de modo
que los consideraremos como libros distintos. Lo mismo pasa si el
mismo libro aparece en varios formatos, o ha sido editado por
distintas editoriales.
Es decir, todos los atributos son dependencias funcionales de
ClaveLibro.
Con Tema y Autor no hay dudas, sólo tienen dos atributos, y uno
de ellos ha sido creado específicamente para ser usado como clave.
Los tres atributos de Editorial también tienen dependencia
funcional de ClaveEditorial.
Y lo mismo cabe decir para las entidades Ejemplar, Socio y
Préstamo.
En cuanto a las relaciones que almacenan interrelaciones, la
clave es el conjunto de todos los atributos, de modo que todas las
dependencias son funcionales y triviales.
Ejemplo 3
La normalización será mucho más útil cuando nuestro diseño
arranque directamente en el modelo relacional, es decir, cuando no
arranquemos de un modelo E-R. Si no somos cuidadosos podemos
introducir relaciones con más de una entidad, dependencias
transitivas o atributos multivaluados.
5 Tipos de columnas
Una vez que hemos decidido qué información debemos
almacenar, hemos normalizado nuestras tablas y hemos creado
claves principales, el siguiente paso consiste en elegir el tipo
adecuado para cada atributo.
En MySQL existen bastantes tipos diferentes disponibles, de
modo que será mejor que los agrupemos por categorías: de
caracteres, enteros, de coma flotante, tiempos, bloques,
enumerados y conjuntos.
CHAR
CHAR()
VARCHAR()
SMALLINT
MEDIUMINT
INT
INTEGER
Es sinónimo de INT.
BIGINT
FLOAT()
DOUBLE
DECIMAL
DATE
DATETIME
DATETIME
TIMESTAMP
TIMESTAMP[(M)]
TIME
TIME
YEAR
YEAR[(2|4)]
Contiene un año en formato de 2 ó 4 dígitos (por defecto es 4).
Los valores válidos son entre 1901 y 2155, y 0000 en el formato de
4 dígitos. Y entre 1970-2069 si se usa el formato de 3 dígitos (70-
69).
MySQL muestra los valores YEAR usando el formato AAAA,
pero permite asignar valores a una columna YEAR usando tanto
cadenas como números.
TINYBLOB
TINYTEXT
BLOB, TEXT
BLOB
TEXT
MEDIUMBLOB, MEDIUMTEXT
MEDIUMBLOB
MEDIUMTEXT
Contiene una columna BLOB o TEXT con una longitud máxima
de 16777215 caracteres (224 - 1).
LONGBLOB, LONGTEXT
LONGBLOB
LONGTEXT
ENUM('valor1','valor2',...)
SET
SET('valor1','valor2',...)
Ejemplo 1
El siguiente paso del diseño nos obliga a elegir tipos para cada
atributo de cada relación. Veamos cómo lo hacemos para los
ejemplos que hacemos en cada capítulo.
Para el primer ejemplo teníamos el siguiente esquema:
Relación Estación
Relación Muestra
Ejemplo 2
Para el segundo ejemplo partimos del siguiente esquema:
Relación Libro
ClaveLibro: como clave principal que es, este atributo debe ser
de tipo entero. Una biblioteca puede tener muchos libros, de modo
que podemos usar el tipo INT.
Título: para este atributo usaremos una cadena de caracteres, la
longitud es algo difícil de decidir, pero como primera aproximación
podemos usar un VARCHAR(60).
Idioma: usaremos una cadena de caracteres, por ejemplo,
VARCHAR(15).
Formato: se trata de otra palabra, por ejemplo, VARCHAR(15).
ClaveEditorial: es una clave foránea, y por lo tanto, el tipo debe
ser el mismo que para el atributo 'ClaveEditorial' de la tabla
'Editorial', que será SMALLINT.
Relación Tema
Relación Autor
Relación Editorial
Relación Ejemplar
Relación Socio
Relación Préstamo
Relación Trata_sobre
ClaveLibro: INT.
ClaveTema: SMALLINT.
Relación Escrito_por
ClaveLibro: INT.
ClaveAutor: INT.
6 El cliente MySQL
Bien, ha llegado el momento de empezar a trabajar con el SGBD, es
decir, vamos a empezar a entendernos con MySQL.
Existen muchas formas de establecer una comunicación con el
servidor de MySQL. En nuestros programas, generalmente, usaremos un
API para realizar las consultas con el servidor. En PHP, por ejemplo, este
API está integrado con el lenguaje, en C/C++ se trata de bibliotecas de
enlace dinámico, etc.
Para este curso usaremos MySQL de forma directa, mediante un
cliente ejecutándose en una consola (una ventana DOS en Windows, o un
Shell en otros sistemas). En otras secciones se explicarán los diferentes
APIs.
Veamos un ejemplo sencillo. Para ello abrimos una consola y
tecleamos "mysql". (Si estamos en Windows y no está definido el camino
para MySQL tendremos que hacerlo desde "C:\mysql\bin").
Para entrar en la consola de MySQL se requieren ciertos parámetros.
Hay que tener en cuenta que el servidor es multiusuario, y que cada
usuario puede tener distintos privilegios, tanto de acceso a tablas como de
comandos que puede utilizar.
La forma general de iniciar una sesión MySQL es:
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
C:\mysql\bin>
Algunas consultas
Ahora ya sabemos entrar y salir del cliente MySQL, y podemos hacer
consultas. Lo más sencillo es consultar algunas variables del sistema o el
valor de algunas funciones de MySQL. Para hacer este tipo de consultas
se usa la sentencia SQL SELECT, por ejemplo:
mysql>
Usuarios y privilegios
Cuando trabajemos con bases de datos reales y con aplicaciones de
gestión de bases de datos, será muy importante definir otros usuarios,
además del root, que es el administrador. Esto nos permitirá asignar
distintos privilegios a cada usuario, y nos ayudará a proteger las bases de
datos.
Podremos por ejemplo, crear un usuario que sólo tenga posibilidad de
consultar datos de determinadas tablas o bases de datos, pero que no
tenga permiso para añadir o modificar datos, o modificar la estructura de
la base de datos.
Otros usuarios podrán insertar datos, y sólo algunos (o mejor, sólo
uno) podrán modificar la estructura de las bases de datos: los
administradores.
Dedicaremos un capítulo completo a la gestión de usuarios y
privilegios, pero de momento trabajaremos siempre con todos ellos, de
modo que tendremos cuidado con lo que hacemos. Además, trabajaremos
sólo con las bases de datos de ejemplo.
7 Lenguaje SQL Creación de
bases de datos y tablas
A nivel teórico, existen dos lenguajes para el manejo de bases
de datos:
DDL (Data Definition Language) Lenguaje de definición de datos.
Es el lenguaje que se usa para crear bases de datos y tablas, y para
modificar sus estructuras, así como los permisos y privilegios.
Este lenguaje trabaja sobre unas tablas especiales llamadas
diccionario de datos.
DML (Data Manipilation Language) lenguaje de manipulación de
datos. Es el que se usa para modificar y obtener datos desde las
bases de datos.
SQL engloba ambos lenguajes DDL+DML, y los estudiaremos
juntos, ya que ambos forman parte del conjunto de sentencias de
SQL.
En este capítulo vamos a explicar el proceso para pasar del
modelo lógico relacional, en forma de esquemas de relaciones, al
modelo físico, usando sentencias SQL, y viendo las peculiaridades
específicas de MySQL.
mysql>
mysql>
mysql>
mysql>
Valores nulos
Claves primarias
Columnas autoincrementadas
mysql>
Comentarios
Definición de creación
A continuación de las definiciones de las columnas podemos
añadir otras definiciones. La sintaxis más general es:
definición_columnas
| [CONSTRAINT [símbolo]] PRIMARY KEY
(index_nombre_col,...)
| KEY [nombre_index] (nombre_col_index,...)
| INDEX [nombre_index] (nombre_col_index,...)
| [CONSTRAINT [símbolo]] UNIQUE [INDEX]
[nombre_index] [tipo_index] (nombre_col_index,...)
| [FULLTEXT|SPATIAL] [INDEX] [nombre_index]
(nombre_col_index,...)
| [CONSTRAINT [símbolo]] FOREIGN KEY
[nombre_index] (nombre_col_index,...)
[definición_referencia]
| CHECK (expr)
Índices
Claves primarias
La sintaxis para definir claves primarias es:
definición_columnas
| PRIMARY KEY (index_nombre_col,...)
Pero esta forma tiene más opciones, por ejemplo, entre los
paréntesis podemos especificar varios nombres de columnas, para
construir claves primarias compuestas por varias columnas:
mysql>
Índices
Claves únicas
Y:
Claves foráneas
mysql>
mysql>
mysql>
personas3
id nombre fecha
1 Fulanito 1998/04/14
2 Menganito 1975/06/18
3 Tulanito 1984/07/05
telefonos3
numero id
12322132 1
12332221 1
55546545 3
55565445 3
personas3
id nombre fecha
1 Fulanito 1998/04/14
2 Menganito 1975/06/18
4 Tulanito 1984/07/05
telefonos3
numero id
12322132 1
12332221 1
55546545 4
55565445 4
No hemos usado todas las opciones. Las opciones de MATCH
FULL, MATCH PARTIAL o MATCH SIMPLE no las comentaremos
de momento (lo dejaremos para más adelante).
La parte opcional CONSTRAINT [símbolo] sirve para asignar un
nombre a la clave foránea, de modo que pueda usarse como
identificador si se quiere modificar o eliminar una definición de clave
foránea. También veremos esto con más detalle en capítulos
avanzados.
Otras opciones
Opciones de tabla
La parte final de la sentencia CREATE TABLE permite
especificar varias opciones para la tabla.
Sólo comentaremos la opción del motor de almacenamiento,
para ver el resto en detalle se puede consultar la sintaxis en
CREATE TABLE.
Motor de almacenamiento
{ENGINE|TYPE} =
{BDB|HEAP|ISAM|InnoDB|MERGE|MRG_MYISAM|MYISAM }
Verificaciones
Disponemos de varias sentencias para verificar o consultar
características de tablas.
Podemos ver la estructura de una tabla usando la sentencia
SHOW COLUMNS:
mysql>
mysql>
mysql>
mysql>
Ejemplo 1
Veamos ahora como crear las bases de datos y tablas
correspondientes a los ejemplos que vamos siguiendo desde el
principio del curso.
Nuestro primer ejemplo tenía este esquema:
Ejemplo 2
El segundo ejemplo consiste en modelar una biblioteca. Este era
el esquema:
mysql>USE biblio
Database changed
mysql>
mysql>
mysql>
mysql>
mysql>
mysql>
mysql>
8 Lenguaje SQL Inserción y
modificación de datos
Llegamos ahora a un punto interesante, una base de datos sin
datos no sirve para mucho, de modo que veremos cómo agregar,
modificar o eliminar los datos que contienen nuestras bases de
datos.
mysql>
mysql>
mysql>
Una vez más, a las columnas para las que no indiquemos
valores se les asignarán sus valores por defecto. También podemos
hacer esto usando el valor DEFAULT.
Para las sintaxis que lo permiten, podemos observar que cuando
se inserta más de una fila en una única sentencia, obtenemos un
mensaje desde MySQL que indica el número de filas afectadas, el
número de filas duplicadas y el número de avisos.
Para que una fila se considere duplicada debe tener el mismo
valor que una fila existente para una clave principal o para una clave
única. En tablas en las que no exista clave primaria ni índices de
clave única no tiene sentido hablar de filas duplicadas. Es más, en
esas tablas es perfectamente posible que existan filas con los
mismos valores para todas las columnas.
Por ejemplo, en mitabla5 tenemos una clave única sobre la
columna 'nombre':
mysql>
mysql>
Reemplazar filas
Existe una sentencia REPLACE, que es una alternativa para
INSERT, que sólo se diferencia en que si existe algún registro
anterior con el mismo valor para una clave primaria o única, se
elimina el viejo y se inserta el nuevo en su lugar.
mysql>
mysql>
Actualizar filas
Podemos modificar valores de las filas de una tabla usando la
sentencia UPDATE. En su forma más simple, los cambios se aplican
a todas las filas, y a las columnas que especifiquemos.
UPDATE [LOW_PRIORITY] [IGNORE] tbl_name
SET col_name1=expr1 [, col_name2=expr2 ...]
[WHERE where_definition]
[ORDER BY ...]
[LIMIT row_count]
mysql>
mysql>
mysql>
mysql>
mysql>
mysql>
Eliminar filas
Para eliminar filas se usa la sentencia DELETE. La sintaxis es
muy parecida a la de UPDATE:
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM table_name
[WHERE where_definition]
[ORDER BY ...]
[LIMIT row_count]
mysql>
mysql>
mysql>
mysql>
9 Lenguaje SQL Selección de
datos
Ya disponemos de bases de datos, y sabemos cómo añadir y
modificar datos. Ahora aprenderemos a extraer datos de una base
de datos. Para ello volveremos a usar la sentencia SELECT.
La sintaxis de SELECT es compleja, pero en este capítulo no
explicaremos todas sus opciones. Una forma más general consiste
en la siguiente sintaxis:
Forma incondicional
La forma más sencilla es la que hemos usado hasta ahora,
consiste en pedir todas las columnas y no especificar condiciones.
mysql>
mysql>
mysql>
mysql>
Alias
mysql>
mysql>
mysql>
mysql>
mysql>
Agrupar filas
Es posible agrupar filas en la salida de una sentencia SELECT
según los distintos valores de una columna, usando la cláusula
GROUP BY. Esto, en principio, puede parecer redundante, ya que
podíamos hacer lo mismo usando la opción DISTINCT. Sin
embargo, la cláusula GROUP BY es más potente:
mysql>
La primera diferencia que observamos es que si se usa GROUP
BY la salida se ordena según los valores de la columna indicada. En
este caso, las columnas aparecen ordenadas por fechas.
Otra diferencia es que se eliminan los valores duplicados aún si
la proyección no contiene filas duplicadas, por ejemplo:
mysql>
mysql>
mysql>
Cláusula HAVING
La cláusula HAVING permite hacer selecciones en situaciones
en las que no es posible usar WHERE. Veamos un ejemplo
completo:
mysql>
Ordenar resultados
Además, podemos añadir una cláusula de orden ORDER BY
para obtener resultados ordenados por la columna que queramos:
mysql>
mysql>
mysql>
mysql>
10 Lenguaje SQL Operadores
MySQL dispone de multitud de operadores diferentes para cada
uno de los tipos de columna. Esos operadores se utilizan para
construir expresiones que se usan en cláusulas ORDER BY y
HAVING de la sentencia SELECT y en las cláusulas WHERE de las
sentencias SELECT, DELETE y UPDATE. Además se pueden
emplear en sentencias SET.
Operador de asignación
En MySQL podemos crear variables y usarlas porteriormente en
expresiones.
Para crear una variable hay dos posibilidades. La primera
consiste en ulsar la sentencia SET de este modo:
mysql>
mysql>
mysql>
mysql>
Operador Y
mysql>
Operador O
mysql>
Operador O exclusivo
mysql>
Operador de negación
mysql>
Operadores de comparación
Para crear expresiones lógicas, a las que podremos aplicar el
álgebra de Boole, disponemos de varios operadores de
comparación. Estos operadores se aplican a cualquier tipo de
columna: fechas, cadenas, números, etc, y devuelven valores
lógicos: verdadero o falso (1/0).
Los operadores de comparación son los habituales en cualquier
lenguaje de programación, pero además, MySQL añade varios más
que resultan de mucha utilidad, ya que son de uso muy frecuente.
Operador de igualdad
mysql>
mysql>
mysql>
Operador de desigualdad
mysql>
mysql>
Verificación de NULL
Por ejemplo:
mysql>
mysql>
mysql>
Elección de no nulos
mysql>
mysql>
Verificar conjuntos
mysql>
Verificar nulos
ISNULL(<expresión>)
Por ejemplo:
mysql>
Encontrar intervalo
Nota:
mysql>
Operadores aritméticos
Los operadores aritméticos se aplican a valores numéricos, ya
sean enteros o en coma flotante. El resultado siempre es un valor
numérico, entero o en coma flotante.
MySQL dispone de los operadores aritméticos habituales: suma,
resta, multiplicación y división.
En el caso de los operadores de suma, resta, cambio de signo y
multiplicación, si los operandos son enteros, el resultado se calcula
usando el tipo BIGINT, es decir, enteros de 64 bits. Hay que tener
esto en cuenta, sobre todo en el caso de números grandes.
mysql>
Este operador, al igual que el de resta, multiplicación y división,
es binario. Como comentamos al hablar de los operadores lógicos,
esto no significa que no se puedan asociar, sino que la operaciones
se realizan tomando los operandos dos a dos.
mysql>
mysql>
Operador de producto o multiplicación
mysql>
mysql>
mysql>
Operadores de bits
Todos los operadores de bits trabajan con enteros BIGINT, es
decir con 64 bits.
Los operadores son los habituales: o, y, o exclusivo,
complemento y rotaciones a derecha e izquierda.
Operador de bits O
Por ejemplo:
mysql>
Operador de bits Y
mysql>
Por ejemplo:
mysql> SELECT 234 ^ 334, 32 ^ 23, 15 ^ 0;
+-----------+---------+--------+
| 234 ^ 334 | 32 ^ 23 | 15 ^ 0 |
+-----------+---------+--------+
| 420 | 55 | 15 |
+-----------+---------+--------+
1 row in set (0.00 sec)
mysql>
Por ejemplo:
mysql>
mysql>
mysql>
mysql>
mysql>
Contar bits
mysql>
Operadores de control de flujo
En MySQL no siempre es sencillo distinguir los operadores de
las funciones. En el caso del control de flujo sólo veremos un
operador, el CASE. El resto los veremos en el capítulo de funciones.
Operador CASE
mysql>
Operador LIKE
mysql>
mysql>
mysql>
mysql>
mysql>
Equivale a:
La sintaxis es:
mysql>
Que equivalen a:
Operadores de casting
En realidad sólo hay un operador de casting: BINARY.
Operador BINARY
mysql>
Paréntesis
Como en cualquier otro lenguaje, los paréntesis se pueden usar
para forzar el orden de la evaluación de determinadas operaciones
dentro de una expresión. Cualquier expresión entre paréntesis
adquiere mayor precedencia que el resto de las operaciones en el
mismo nivel de paréntesis.
mysql>
11 Lenguaje SQL Funciones
Si consideramos que MySQL es rico en lo que respecta a
operadores, en lo que se refiere a funciones, podemos considerarlo
millonario. MySQL dispone de multitud de funciones.
Pero no las explicaremos aquí, ya que este curso incluye una
referencia completa. Tan sólo las agruparemos por tipos, e
incluiremos los enlaces correspondientes a la documentación de
cada una.
Funciones matemáticas
Las funciones de la categoría de matemáticas son:
ABS Devuelve el valor absoluto
ACOS Devuelve el arcocoseno
ASIN Devuelve el arcoseno
ATAN y ATAN2 Devuelven el arcotangente
CEILING y CEIL Redondeo hacia arriba
COS Coseno de un ángulo
COT Cotangente de un ángulo
CRC32 Cálculo de comprobación de redundancia cíclica
DEGREES Conversión de grados a radianes
EXP Cálculo de potencias de e
FLOOR Redondeo hacia abajo
LN Logaritmo natural
LOG Logaritmo en base arbitraria
LOG10 Logaritmo en base 10
LOG2 Logaritmo en base dos
MOD o % Resto de una división entera
PI Valor del número π
POW o POWER Valor de potencias
RADIANS Conversión de radianes a grados
RAND Valores aleatorios
ROUND Cálculo de redondeos
SIGN Devuelve el signo
SIN Cálculo del seno de un ángulo
SQRT Cálculo de la raíz cuadrada
TAN Cálculo de la tangente de un ángulo
TRUNCATE Elimina decimales
Funciones de cadenas
Las funciones para tratamiento de cadenas de caracteres son:
ASCII Valor de código ASCII de un carácter
BIN Converión a binario
BIT_LENGTH Cálculo de longitud de cadena en bits
CHAR Convierte de ASCII a carácter
CHAR_LENGTH o Cálculo de longitud de cadena en
CHARACTER_LENGTH caracteres
COMPRESS Comprime una cadena de caracteres
Concatena dos cadenas de
CONCAT
caracteres
CONCAT_WS Concatena cadenas con separadores
CONV Convierte números entre distintas
bases
ELT Elección entre varias cadenas
EXPORT_SET Expresiones binarias como conjuntos
FIELD Busca el índice en listas de cadenas
FIND_IN_SET Búsqueda en listas de cadenas
Conversión de números a
HEX
hexadecimal
INSERT Inserta una cadena en otra
INSTR Busca una cadena en otra
Extraer parte izquierda de una
LEFT
cadena
Calcula la longitud de una cadena en
LENGTH u OCTET_LENGTH
bytes
LOAD_FILE Lee un fichero en una cadena
Encontrar la posición de una cadena
LOCATE o POSITION
dentro de otra
LOWER o LCASE Convierte una cadena a minúsculas
Añade caracteres a la izquierda de
LPAD
una cadena
Elimina espacios a la izquierda de
LTRIM
una cadena
Crea un conjunto a partir de una
MAKE_SET
expresión binaria
OCT Convierte un número a octal
Obtiene el código ASCII, incluso con
ORD
caracteres multibyte
QUOTE Entrecomilla una cadena
Construye una cadena como una
REPEAT
repetición de otra
Busca una secuencia en una cadena
REPLACE
y la sustituye por otra
Invierte el orden de los caracteres de
REVERSE
una cadena
RIGHT Devuelve la parte derecha de una
cadena
Inserta caracteres al final de una
RPAD
cadena
Elimina caracteres blancos a la
RTRIM
derecha de una cadena
Devuelve la cadena "soundex" para
SOUNDEX
una cadena concreta
Compara cadenas según su
SOUNDS LIKE
pronunciación
Devuelve cadenas consistentes en
SPACE
espacios
SUBSTRING o MID Extraer subcadenas de una cadena
Extraer subcadenas en función de
SUBSTRING_INDEX
delimitadores
Elimina sufijos y/o prefijos de una
TRIM
cadena.
UCASE o UPPER Convierte una cadena a mayúsculas
Descomprime una cadena
UNCOMPRESS
comprimida mediante COMPRESS
Calcula la longitud original de una
UNCOMPRESSED_LENGTH
cadena comprimida
Convierte una cadena que representa
UNHEX un número hexadecimal a cadena de
caracteres
Funciones de fecha
Funciones para trabajar con fechas:
Suma un intervalo de tiempo a una
ADDDATE
fecha
ADDTIME Suma tiempos
Convierte tiempos entre distintas
CONVERT_TZ
zonas horarias
CURDATE o CURRENTDATE Obtener la fecha actual
CURTIME o CURRENT_TIME Obtener la hora actual
Extraer la parte correspondiente a
DATE
la fecha
Calcula la diferencia en días entre
DATEDIFF
dos fechas
Aritmética de fechas, suma un
DATE_ADD
intervalo de tiempo
Aritmética de fechas, resta un
DATE_SUB
intervalo de tiempo
DATE_FORMAT Formatea el valor de una fecha
Obtiene el día del mes a partir de
DAY o DAYOFMONTH
una fecha
Devuelve el nombre del día de la
DAYNAME
semana
Devuelve el índice del día de la
DAYOFWEEK
semana
Devuelve el día del año para una
DAYOFYEAR
fecha
EXTRACT Extrae parte de una fecha
Obtener una fecha a partir de un
FROM_DAYS
número de días
Representación de fechas UNIX en
FROM_UNIXTIME
formato de cadena
GET_FORMAT Devuelve una cadena de formato
HOUR Extrae la hora de un valor time
Devuelve la fecha para el último
LAST_DAY
día del mes de una fecha
Calcula una fecha a partir de un
MAKEDATE
año y un día del año
Calcula un valor de tiempo a partir
MAKETIME
de una hora, minuto y segundo
Extrae los microsegundos de una
MICROSECOND
expresión de fecha/hora o de hora
Extrae el valor de minutos de una
MINUTE
expresión time
MONTH Devuelve el mes de una fecha
Devuelve el nombre de un mes
MONTHNAME
para una fecha
NOW o
CURRENT_TIMESTAMP o
LOCALTIME o Devuelve la fecha y hora actual
LOCALTIMESTAMP o
SYSDATE
Añade meses a un periodo
PERIOD_ADD
(año/mes)
Calcula la diferencia de meses
PERIOD_DIFF
entre dos periodos (año/mes)
Devuelve el cuarto del año para
QUARTER
una fecha
Extrae el valor de segundos de
SECOND
una expresión time
Convierte una cantidad de
SEC_TO_TIME segundos a horas, minutos y
segundos
Obtiene un valor DATETIME a
STR_TO_DATE partir de una cadena con una
fecha y una cadena de formato
Resta un intervalo de tiempo de
SUBDATE
una fecha
SUBTIME Resta dos expresiones time
TIME Extrae la parte de la hora de una
expresión fecha/hora
Devuelve en tiempo entre dos
TIMEDIFF
expresiones de tiempo
Convierte una expresión de fecha
TIMESTAMP en fecha/hora o suma un tiempo a
una fecha
Suma un intervalo de tiempo a una
TIMESTAMPADD
expresión de fecha/hora
Devuelve la diferencia entre dos
TIMESTAMPDIFF
expresiones de fecha/hora
TIME_FORMAT Formatea un tiempo
TIME_TO_SEC Convierte un tiempo a segundos
Calcula el número de días desde el
TO_DAYS
año cero
Devuelve un timestamp o una
UNIX_TIMESTAMP fecha en formato UNIX, segundos
desde 1070
UTC_DATE Devuelve la fecha UTC actual
UTC_TIME Devuelve la hora UTC actual
Devuelve la fecha y hora UTC
UTC_TIMESTAMP
actual
Calcula el número de semana para
WEEK
una fecha
Devuelve el número de día de la
WEEKDAY
semana para una fecha
Devuelve el número de la semana
WEEKOFYEAR
del año para una fecha
YEAR Extrae el año de una fecha
Devuelve el año y semana de una
YEARWEEK
fecha
De búsqueda de texto
Función de búsqueda de texto:
MATCH
Funciones de encripdado
Funciones de encriptado de datos y de checksum:
AES_ENCRYPT y Encriptar y desencriptar datos usando el
AES_DECRYPT algoritmo oficial AES
Desencripta una cadena usando una
DECODE
contraseña
Encripta una cadena usando una
ENCODE
contraseña
DES_DECRYPT Desencripta usando el algoritmo Triple-DES
DES_ENCRYPT Encripta usando el algoritmo Triple-DES
Encripta str usando la llamada del sistema
ENCRYPT
Unix crypt()
Calcula un checksum MD5 de 128 bits para
MD5
la cadena string
PASSWORD u Calcula una cadena contraseña a partir de
OLD_PASSWORD la cadena en texto plano
Calcula un checksum SHA1 de 160 bits
SHA o SHA1
para una cadena
Funciones de información
Información sobre el sistema:
BENCHMARK Ejecuta una expresión varias veces
Devuelve el conjunto de caracteres de una
CHARSET
cadena
COERCIBILITY Devuelve el valor de restricción de colección
de una cadena
Devuelve la colección para el conjunto de
COLLATION
caracteres de una cadena
CONNECTION_ID Devuelve el ID de una conexión
Devuelve el nombre de usuario y el del host
CURRENT_USER
para la conexión actual
Devuelve el nombre de la base de datos
DATABASE
actual
Calcular cuántas filas se hubiesen obtenido
FOUND_ROWS en una sentencia SELECT sin la cláusula
LIMIT
Devuelve el último valor generado
LAST_INSERT_ID automáticamente para una columna
AUTO_INCREMENT
USER o
Devuelve el nombre de usuario y host actual
SESSION_USER o
de MySQL
SYSTEM_USER
VERSION Devuelve la versión del servidor MySQL
Miscelanea
Funciones generales:
Devuelve el valor por defecto para una
DEFAULT
columna
Formatea el número según la plantilla
FORMAT
'#,###,###.##
Intenta obtener un bloqueo con el nombre
GET_LOCK
dado
Obtiene el entero equivalente a la dirección
INET_ATON de red dada en formato de cuarteto con
puntos
Obtiene la dirección en formato de cuarteto
INET_NTOA
con puntos dado un entero
IS_FREE_LOCK Verifica si un nombre de bloqueo está libre
IS_USED_LOCK Verifica si un nombre de bloqueo está en uso
Espera hasta que el esclavo alcanza la
MASTER_POS_WAIT
posición especificada en el diario maestro
RELEASE_LOCK Libera un bloqueo
UUID Devuelve un identificador único universal
De grupos
Funciones de grupos:
AVG Devuelve el valor medio
Devuelve la operación de bits AND para todos
BIT_AND
los bits de una expresión
Devuelve la operación de bits OR para todos los
BIT_OR
bits de una expresión
Devuelve la operación de bits XOR para todos
BIT_XOR
los bits de una expresión
Devuelve el número de valores distintos de
COUNT NULL en las filas recuperadas por una
sentencia SELECT
COUNT Devuelve el número de valores diferentes,
DISTINCT distintos de NULL
Devuelve una cadena con la concatenación de
GROUP_CONCAT
los valores de un grupo
MIN Devuelve el valor mínimo de una expresión
MAX Devuelve el valor máximo de una expresión
Devuelve la desviación estándar de una
STD o STDDEV
expresión
SUM Devuelve la suma de una expresión
VARIANCE Devuelve la varianza estándar de una expresión
12 Lenguaje SQL Consultas
multitabla
Hasta ahora todas las consultas que hemos usado se refieren
sólo a una tabla, pero también es posible hacer consultas usando
varias tablas en la misma sentencia SELECT.
Esto nos permite realizar otras dos operaciones de álgebra
relacional que aún no hemos visto: el producto cartesiano y la
composición.
Producto cartesiano
Usaremos el ejemplo de las tablas de personas2 y telefonos2 del
capítulo 7, e insertaremos algunos datos:
mysql>
Ahora insertaremos datos en la tabla de telefonos2:
mysql>
mysql>
Composición (Join)
Recordemos que se trata de un producto cartesiano restringido,
las tuplas que se emparejan deben cumplir una determinada
condición.
En el álgebra relacional sólo hemos hablado de composiciones
en general. Sin embargo, en SQL se trabaja con varios tipos de
composiciones.
Composiciones internas
Todas las composiciones que hemos visto hasta ahora se
denominan composiciones internas. Para hacer una composición
interna se parte de un producto cartesiano y se eliminan aquellas
tuplas que no cumplen la condición de la composición.
En el ejemplo anterior tenemos 24 tuplas procedentes del
producto cartesiano de las tablas personas2 y teléfonos2. Si la
condición para la composición es que personas2.id=telefonos2.id,
tendremos que eliminar todas las tuplas en que la condición no se
cumpla.
Estas composiciones se denominan internas porque en la salida
no aparece ninguna tupla que no esté presente en el producto
cartesiano, es decir, la composición se hace en el interior del
producto cartesiano de las tablas.
Para consultar la sintaxis de las composiciones ver JOIN.
Las composiciones internas usan estas sintaxis:
referencia_tabla, referencia_tabla
referencia_tabla [INNER | CROSS] JOIN referencia_tabla
[condición]
mysql>
mysql>
Por ejemplo:
mysql>
Composiciones externas
Al contrario que con las composiciones internas, las externas no
proceden de un producto cartesiano. Por lo tanto, en estas pueden
aparecer tuplas que no aparecen en el producto cartesiano.
Para hacer una composición externa se toman las tuplas de una
de las tablas una a una y se combinan con las tuplas de la otra.
Como norma general se usa un índice para localizar las tuplas
de la segunda tabla que cumplen la condición, y para cada tupla
encontrada se añade una fila a la tabla de salida.
Si no existe ninguna tupla en la segunda tabla que cumpla las
condiciones, se combina la tupla de la primera con una nula de la
segunda.
En nuestro ejemplo se tomaría la primera tupla de personas2,
con un valor de id igual a 1, y se busca en la tabla telefonos2 las
tuplas con un valor de id igual a 1. Lo mismo para la segunda tupla,
con id igual a 2.
En la tercera el id es 3, y no existe ninguna tupla en telefonos2
con un valor de id igual a 3, por lo tanto se combina la tupla de
personas2 con una tupla de telefonos2 con todos los atributos igual
a NULL.
Por ejemplo:
mysql>
mysql>
mysql>
mysql>
Se puede ver que aparecen dos filas con valores NULL, para los
id 7 y 8.
En contraposición, una composición interna dará esta salida:
mysql>
mysql>
Uniones
También es posible realizar la operación de álgebra relacional
unión entre varias tablas o proyecciones de tablas.
Para hacerlo se usa la sentencia UNION que permite combinar
varias sentencias SELECT para crear una única tabla de salida.
Las condiciones para que se pueda crear una unión son las
mismas que vimos al estudiar el álgebra relacional: las relaciones a
unir deben tener el mismo número de atributos, y además deben ser
de dominios compatibles.
Veamos un ejemplo:
mysql>
Podemos crear una unión de las tres tablas, a pesar de que los
nombres y tamaños de algunas columnas sean diferentes:
mysql>
mysql>
SELECT ...
UNION [ALL | DISTINCT]
SELECT ...
[UNION [ALL | DISTINCT]
SELECT ...]
mysql>
Niveles de privilegios
En MySQL existen cinco niveles distintos de privilegios:
Globales: se aplican al conjunto de todas las bases de datos en
un servidor. Es el nivel más alto de privilegio, en el sentido de que
su ámbito es el más general.
De base de datos: se refieren a bases de datos individuales, y
por extensión, a todos los objetos que contiene cada base de datos.
De tabla: se aplican a tablas individuales, y por lo tanto, a todas
las columnas de esas tabla.
De columna: se aplican a una columna en una tabla concreta.
De rutina: se aplican a los procedimientos almacenados. Aún no
hemos visto nada sobre este tema, pero en MySQL se pueden
almacenar procedimietos consistentes en varias consultas SQL.
Crear usuarios
Aunque en la versión 5.0.2 de MySQL existe una sentencia para
crear usuarios, CREATE USER, en versiones anteriores se usa
exclusivamente la sentencia GRANT para crearlos.
En general es preferible usar GRANT, ya que si se crea un
usuario mediante CREATE USER, posteriormente hay que usar una
sentencia GRANT para concederle privilegios.
Usando GRANT podemos crear un usuario y al mismo tiempo
concederle también los privilegios que tendrá. La sintaxis
simplificada que usaremos para GRANT, sin preocuparnos de temas
de cifrados seguros que dejaremos ese tema para capítulos
avanzados, es:
Conceder privilegios
Para que un usuario pueda hacer algo más que consultar
algunas variables del sistema debe tener algún privilegio. Lo más
simple es conceder el privilegio para seleccionar datos de una tabla
concreta. Esto se haría así:
La misma sentencia GRANT se usa para añadir privilegios a un
usuario existente.
mysql>
mysql>
Revocar privilegios
Para revocar privilegios se usa la sentencia REVOKE.
mysql>
mysql>
14 Lenguaje SQL Importar y
exportar datos
MySQL permite copiar tablas en diferentes formatos de texto, así
como importar datos a partir de fichero de texto en diferentes
formatos.
Esto se puede usar para exportar los datos de nuestras bases de
datos a otras aplicaciones, o bien para importar datos desde otras
fuentes a nuestras tablas. También se puede usar para hacer copias
de seguridad y restaurarlas posteriormente.
[FIELDS
[TERMINATED BY '\t']
[[OPTIONALLY] ENCLOSED BY '']
[ESCAPED BY '\\' ]
]
[LINES
[STARTING BY '']
[TERMINATED BY '\n']
]
mysql>
"Fulano";"1974-04-12"
"Mengano";"1978-06-15"
"Tulano";"2000-12-02"
"Pegano";"1993-02-10"
"Mengano";\N
mysql>
mysql>
Apendice A: Instalación de
MySQL
Existen varias versiones para varias plataformas diferentes:
Linux, Windows, Solaris.
Generalmente existen varias versiones distintas para cada
plataforma. Siempre es posible conseguir una versión estable, que
es la recomendada, alguna anterior, y la que actualmente esté en
fase de desarrollo, que está destinada a personas que quieran
colaborar en el desarrollo, buscando errores o probando las últimas
versiones.
Siempre que sea posible hay que elegir la versión recomendada.
Daremos una guía para la instalación en Windows, y
esperaremos colaboraciones desinteresadas para otras plataformas.
Instalación en Windows
En el momento de escribir estas líneas, la versión recomendada
es la 4.1.9. El fichero que hay que descargar se llama "mysql-4.1.9-
win32.zip". Se trata de un fichero zip que contiene un fichero de
instalación "setup.exe".
Después de descargarlo se descomprime y se ejecuta el fichero
"setup.exe".
El proceso de instalación está muy mejorado con respecto a
versiones anteriores, y bastará con seguir las indicaciones en cada
pantalla.
INTRODUCCIÓN
# installpkg mysql-4.0.20-i486-1.tgz
Nota:
Comprobación
# cd /mnt/cdrom/slackware/ap
# installpkg mysql-4.0.20-i486-1.tgz
# swaret update
y despues:
# su - mysql
$ mysql_install_db
Nota:
$ mysql_install_db
Preparing db table
Preparing host table
Preparing user table
Preparing func table
Preparing tables_priv table
Preparing columns_priv table
Installing all prepared tables
050418 22:23:27 /usr/libexec/mysqld: Shutdown Complete
You can test the MySQL daemon with the benchmarks in the
'sql-bench' directory:
cd sql-bench ; perl run-all-tests
Nota:
Hay que revisar antes que nada que el script puso los
permisos correctos para /var/lib/mysql deberían de quedar asi:
$ ls -ld /var/lib/mysql
drwxr-x--- 4 mysql mysql 96 2005-04-18 22:23
/var/lib/mysql/
Nota:
# chmod +x /etc/rc.d/rc.mysqld
Lo comprobamos asi:
# v /etc/rc.d/rc.mysqld
-rwxr-xr-x 1 root root 2260 2005-01-25 19:47
/etc/rc.d/rc.mysqld*
Ahora si podrá ser iniciado el servicio mysqld asi:
# /etc/rc.d/rc.mysqld start
# Starting mysqld daemon with databases from /var/lib/mysql
Nota:
COMPROBACIÓN INICIAL
$ /usr/bin/mysqladmin version
/usr/bin/mysqladmin Ver 8.40 Distrib 4.0.23a, for
slackware-linux-gnu on i486
Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX
DataKonsult AB
This software comes with ABSOLUTELY NO WARRANTY. This is
free software,
and you are welcome to modify and redistribute it under the
GPL license
$
También puedes hacer una comprobación con el siguiente
comando:
$ /usr/bin/mysqladmin variables
Nota:
# /etc/rc.d/rc.mysqld stop
# /etc/rc.d/rc.mysqld start
Ahora haremos otro test para verificar que el servicio esta
trabajando usando el comando mysqlshow asi:
$ mysqlshow
+-----------+
| Databases |
+-----------+
| mysql |
| test |
+-----------+
$
El cual nos dice que tiene las bases de datos "mysql" y "test".
# mysqlshow mysql
Database: mysql
+--------------+
| Tables |
+--------------+
| columns_priv |
| db |
| func |
| host |
| tables_priv |
| user |
+--------------+
#
Este comando solo podrá ser ejecutado como root (note el "#" en
el prompt) y nos mostrara las tablas de la base de datos "mysql".
Hasta ahora sabemos que tenemos correctamente instalado y
trabajando nuestro servicio mysqld, lo que sigue es empezar con las
configuraciones previas.
mysql>
mysql>
y ahora ejecutaremos:
Database changed
mysql> quit
Bye
o
mysql> \q
Bye
$ mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 7 to server version: 4.0.23a
mysql>
$ mysql -u root
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8 to server version: 4.0.23a
mysql>
Usaremos la base de datos "mysql" la cual es la que almacena
los privilegios y configuración de acceso con el siguiente comando:
Database changed
mysql>
mysql>
mysql>
Con esto vemos que ahora solo el usuario root puede acceder
desde el localhost sin contraseña al CLI, lo cual también lo
prevendremos mas adelante.
Ahora refrescaremos los privilegios para mysqld:
mysql>
mysql> quit
mysql> \q
$ mysql -u root
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10 to server version: 4.0.23a
mysql>
Método 2 (Recomendado):
$ mysql -u root
mysql> SET PASSWORD FOR root@localhost=PASSWORD('tu
contraseña');
Ahora que asignamos una contraseña al usuario root
comprobaremos que ya no puede accesar sin la contraseña:
Nota:
$ mysql -u root
ERROR 1045: Access denied for user: 'root@localhost' (Using
password: NO)
Para poder acceder como usuario "root" al CLI haremos uso del
parametro "-p" para usar validación por contraseña:
$mysql -u root -p
Enter password:
Database changed
mysql>
mysql> SELECT host,user,password FROM user;
+-----------+------+------------------+
| host | user | password |
+-----------+------+------------------+
| localhost | root | 565491d704013245 |
+-----------+------+------------------+
1 row in set (0.00 sec)
mysql>
Y salimos:
mysql> \q
bye
Database changed
mysql>
mysql>
mysql> quit
bye
# /etc/rc.d/rc.mysqld start
Nota:
Nota:
NOTA ULTIMA
Para deshabilitar las conexiones externas al servidor de bases
de datos (si no las necesitas, esto es recomendable para
incrementar la seguridad) entonces hay que descomentar la linea:
#SKIP="--skip-networking"
RESUMEN
Calificadores de identificadores
MySQL permite nombres que consisten en un único identificador o
en múltiples identificadores. Los componentes de un nombre
compuesto deben estar separados por un punto ('.'). Las partes iniciales
de un nombre compuesto actúan como calificadores que afectan al
contexto dentro de cual, se interpreta el identificador final.
En MySQL se puede hacer referencia a una columna usando
cualquiera de las formas siguientes:
Referencia de columna Significado
nombre_columna La columna
nombre_columna
de cualquiera de
las tablas usadas
en la consulta que
contenga una
columna con ese
nombre.
La columna
nombre_columna
de la tabla
nombre_tabla.nombre_columna
nombre_tabla de la
base de datos por
defecto.
La columna
nombre_columna
de la tabla
nombre_tabla de la
base de datos
nombre_basedatos.nombre_tabla.nombre_columna
nombre_basedatos.
Esta sintaxis no
está disponible
antes de MySQL
3.22.
Si cualquiera de los componentes d eun nombre con varias partes
requiere entrecomillado, hay que entrecomillar cada uno
individualmente en lugar de entrecomillarlo completo. Por ejemplo, `mi-
tabla`.`mi-columna` es legal, sin embargo `mi-tabla.mi-columna` no.
No será necesario especificar un prefijo de nombre de tabla o de
base de datos para una referencia de columna en una sentencia a no
ser que la referencia pueda ser ambigua. Supongamos que las tablas t1
y t2 contienen cada una una columna c, y se quiere recuperar c en una
sentencia SELECT que usa ambas tablas. En ese caso, c es ambiguo
porque no es único entre las dos tablas usadas. Se debe calificar con el
nombre de la tabla como t1.c o t2.c para indicar a que tabla nos
referimos. De modo similar, para recuperar datos desde una tabla t en
una base de datos db1 y desde una tabla t en una base de datos db2
en la misma sentencia, se debe hacer referencia a las columnas en
esas tablas como db1.t.nombre_columna y db2.t.nombre_columna.
La sintaxis .nombre_tabla significa la tabla nombre_tabla en la base
de datos actual. Esta sintaxis se acepta por compatibilidad con ODBC
ya que algunos programas ODBC usan el '.' como prefijos para
nombres de tablas.
Sensibilidad al tipo
En MySQL, las bases de datos corresponden a directorios dentro
del directorio de datos "data". A las tablas dentro de una base de datos
les corresponde, por lo menos, un fichero dentro del directorio de la
base de datos (y posiblemente más, dependiendo del motor de
almacenamiento). En consecuencia, la distinción entre mayúsculas y
minúsculas que haga el sistema operativo determinará la distinción que
se haga en los nombres de bases de datos y de tablas. Esto signigica
que los nombres de bases de datos y tablas no son sensibles al tipo en
Windows, y sí lo son en la mayor parte de las variantes de Unix. Una
excepción notable es Mac OS X, que está basado en Unix pero usa un
sistema de ficheros por defecto del tipo (HFS+) que no es sensible al
tipo. Sin embargo, Mac OS X también soporta volúmenes UFS, los
cuales son sensibles al tipo lo mismo que cualquier Unix.
Nota:
Nota:
a*
Coincidencia de cualquier secuencia de cero o más
caracteres.
a+
a?
de|abc
(abc)*
{1}
{2,3}
a?
[a-dX]
[^a-dX]
[.caracteres.]
[=clase_carácter=]
[:clase_carácter:]
[[:<:]]
[[:>:]]
Modelo E-R
Modelo relacional
Álgebra relacional
Normalización
Bases de datos
Universidad de Concepción
AulaClic:
Curso de SQL
Tabla de contenido
Prólogo
Introducción
Instalar el servidor MySQL
Y... ¿por qué MySQL?
1 Definiciones
Dato
Base de datos
SGBD (DBMS)
Consulta
Redundancia de datos
Inconsistencia de datos
Integridad de datos
2 Diseño I, Modelo entidad-relación E-R
Modelado de bases de datos
Modelo Entidad-Relación
Definiciones
Entidad
Conjunto de entidades
Atributo
Dominio
Relación
Grado
Clave
Claves candidatas
Clave principal
Claves de interrelaciones
Entidades fuertes y débiles
Dependencia de existencia
Generalización
Especialización
Representación de entidades y relaciones: Diagramas
Entidad
Atributo
Interrelación
Dominio
Diagrama
Construir un modelo E-R
Proceso
Extensiones
Ejemplo 1
Identificar conjuntos de entidades
Identificar conjuntos de interrelaciones
Trazar primer diagrama
Identificar atributos
Seleccionar claves principales
Verificar el modelo
Ejemplo 2
Identificar conjuntos de entidades
Identificar conjuntos de interrelaciones
Trazar primer diagrama
Identificar atributos
Seleccionar claves principales
Verificar el modelo
3 Diseño II, Modelo relacional
Modelo relacional
Definiciones
Relación
Tupla
Atributo
Nulo (NULL)
Dominio
Modelo relacional
Cardinalidad
Grado
Esquema
Instancia
Clave
Interrelación
Paso del modelo E-R al modelo relacional
Manipulación de datos, álgebra relacional
Selección
Proyección
Producto cartesiano
Composición (Join)
Composición natural
Unión
Intersección
Diferencia
División
Integridad de datos
Restricciones sobre claves primarias
Integridad referencial
Propagación de claves
Ejemplo 1
Ejemplo 2
4 Diseño III, Normalización
Normalización
Primera forma normal (1FN)
Dependencias funcionales
Dependencia funcional completa
Dependecia funcional elemental
Dependecia funcional trivial
Segunda forma normal (2FN)
Dependencia funcional transitiva
Tercera forma normal (3FN)
Forma normal Boycce Codd (FNBC)
Atributos multivaluados
Dependencias multivaluadas
Cuarta forma normal (4FN)
Quinta forma normal (5FN)
Ejemplo 1
Primera forma normal
Segunda forma normal
Tercera forma normal
Forma normal de Boyce/Codd
Cuarta forma normal
Ejemplo 2
Primera forma normal
Segunda forma normal
Tercera forma normal
Forma normal de Boyce/Codd
Cuarta forma normal
Ejemplo 3
5 Tipos de columnas
Tipos de datos de cadenas de caracteres
CHAR
VARCHAR()
VARCHAR()
Tipos de datos enteros
TINYINT
BIT, BOOL, BOOLEAN
SMALLINT
MEDIUMINT
INT
INTEGER
BIGINT
Tipos de datos en coma flotante
FLOAT
FLOAT()
DOUBLE
DOUBLE PRECISION, REAL
DECIMAL
DEC, NUMERIC, FIXED
Tipos de datos para tiempos
DATE
DATETIME
TIMESTAMP
TIME
YEAR
Tipos de datos para datos sin tipo o grandes bloques de
datos
TINYBLOB, TINYTEXT
BLOB, TEXT
MEDIUMBLOB, MEDIUMTEXT
LONGBLOB, LONGTEXT
Tipos enumerados y conjuntos
ENUM
SET
Ejemplo 1
Relación Estación
Relación Muestra
Ejemplo 2
Relación Libro
Relación Tema
Relación Autor
Relación Editorial
Relación Ejemplar
Relación Socio
Relación Préstamo
Relación Trata_sobre
Relación Escrito_por
6 El cliente MySQL
Algunas consultas
Usuarios y provilegios
7 Creación de bases de datos
Crear una base de datos
Crear una tabla
Valores nulos
Valores por defecto
Claves primarias
Columnas autoincrementadas
Comentarios
Definición de creación
Índices
Claves foráneas
Opciones de tabla
Motor de almacenamiento
Verificaciones
Eliminar una tabla
Eliminar una base de datos
Ejemplo 1
Ejemplo 2
8 Inserción de datos
Insertción de nuevas filas
Reemplazar filas
Actualizar filas
Eliminar filas
Vaciar una tabla
9 Consultas
Forma incondicional
Limitar columnas: proyección
Alias
Mostras filas repetidas
Limitar las filas: Selección
Agrupar filas
Cláusula HAVING
Ordenar resultados
Limitar el número de filas de salida
10 Operadores
Operador de asignación
Operadores lógicos
Operador Y
Operador O
Operador O exclusivo
Operador de negación
Reglas para las comparaciones de valores
Operadores de comparación
Operador de igualdad
Operador de igualdad con NULL seguro
Operador de desigualdad
Operadores de comparación de magnitud
Verificación de NULL
Verificar pertenencia a un rango
Elección de no nulos
Valores máximo y mínimo de una lista
Verificar conjuntos
Verificar nulos
Encontrar intervalo
Operadores aritméticos
Operador de adición o suma
Operador de sustracción o resta
Operador unitario menos
Operador de producto o multiplicación
Operador de cociente o división
Operador de división entera
Operadores de bits
Operador de bits O
Operador de bits Y
Operador de bits O exclusivo
Operador de bits de complemento
Operador de desplazamiento a la izquierda
Operador de desplazamiento a la derecha
Contar bits
Operadores de control de flujo
Operador CASE
Operadores para cadenas
Operador LIKE
Operador NOT LIKE
Operadores REGEXP y RLIKE
Operadores NOT REGEXP y NOT RLIKE
Operadores de casting
Operador BINARY
Tabla de precedencia de operadores
Paréntesis
11 Funciones
Funciones de control de flujo
Funciones matemáticas
Funciones de cadenas
Funciones de comparación de cadenas
Funciones de fecha
De búsqueda de texto
Funciones de casting (conversión de tipos)
Funciones de encripdado
Funciones de información
Miscelanea
De grupos
12 Consultas multitabla
Producto cartesiano
Composición (Join)
Composiciones internas
Composición interna natural
Composiciones externas
Composición externa izquierda
Composición externa derecha
Composiciones naturales externas
Unión
13 Usuarios y privilegios
Niveles de privilegios
Crear usuarios
Conceder privilegios
Revocar privilegios
Mostrar los privilegios de un usuario
Nombres de usuarios y contraseñas
Borrar usuarios
14 Importar y exportar datos
Exportar a otros ficheros
Importar a partir de ficheros externos
A Instalación de MySQL
Instalación en Windows
Instalación en Solaris
INTRODUCCIÓN
Comprobación
Inicialización del Servidor (servicio) mysqld
COMPROBACIÓN INICIAL
CONFIGURACIÓN INICIAL DE SEGURIDAD
NOTA ULTIMA
RESUMEN
B Reglas para nombres
Calificadores de identificadores
Sensibilidad al tipo
C Expresiones regulares
D Husos horarios
E Palabras reservadas
F Bibliografía