25.03.2015 Views

Teoria y práctica

Teoria y práctica

Teoria y práctica

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

INTRODUCCIÓN A LAS BASES DE DATOS<br />

Miguel Ángel Sanz Santos<br />

2004


1.- Introducción y definición.<br />

Desde los primeros tiempos en los que el hombre comenzó a registrar todo tipo de<br />

fenómenos y proezas sobre cualquier soporte, surgió la necesidad de su interpretación para ser<br />

información útil y esta tarea supuso la agrupación y clasificación de dicha información. En la<br />

actualidad y gracias a los medios informáticos y los sistemas de almacenamientos de gran cantidad<br />

de datos sobre soporte magnético, se ha conseguido manejar una considerable cantidad de<br />

información, ahorrándose tiempo y espacio de almacenamiento de datos.<br />

El objetivo básico de las bases de datos es permitir y favorecer el almacenamiento de<br />

símbolos, números y letras cadentes de un significado en sí, que con un tratamiento adecuado se<br />

convierten en información útil, utilizada por gran número de profesionales como base de su<br />

negocio y como soporte para la toma de decisiones.<br />

El termino BASE DE DATOS apareció a mediados de la década de los 1960, más<br />

concretamente en 1963, en un simposium celebrado en California –USA; pero no es hasta 1981<br />

cuando la popularización de los programas de gestión de bases de datos comienza su andadura. En<br />

general su definición es muy variada, dependiendo de los fines para los que se utiliza. La Real<br />

Academia de la Lengua Española la define como:<br />

“Conjunto de datos almacenados en fichas, cintas o discos magnéticos, del cual<br />

se puede extraer en cualquier momento, generalmente mediante un computador<br />

electrónico, una determinada información”.<br />

Si lo analizamos desde un punto de vista estadístico la definición cambia, así la Conferencia<br />

de Estadísticos Europeos la define como:<br />

“Una colección o depósito de datos, donde estos están lógicamente relacionados<br />

entre sí, tiene una definición y descripción comunes y están estructurados de<br />

una forma particular. Una base de datos es también un modelo del mundo real y,<br />

como tal, debe poder servir para toda una gama de usos y aplicaciones”.


Si miramos las definiciones dadas desde una perspectiva informática vemos que varia<br />

nuevamente su definición, así:<br />

“Es una colección de datos organizados y con un formato regular a la que una o<br />

varias personas tienen acceso y/o que se emplean para más de un propósito”.<br />

De estas definiciones se pueden sacar una serie de puntos que nos permiten discernir en<br />

que consiste una base de datos; el más claro de todos ellos es que es un conjunto de datos<br />

(números, alfanuméricos, símbolos, etc.), la segunda característica es que se encuentran agrupados<br />

de una forma concreta que permite su posterior tratamiento para obtener información útil, en<br />

tercer lugar que puede ser utilizada por diferentes usuarios y en último lugar, aunque un poco<br />

velada, que es un modelo de algo real que hemos simplificado, desglosado en características, para<br />

poder catalogarlo. Podríamos decir pues que una base de datos es un conjunto de datos que<br />

representan las características de un hecho o fenómeno real, almacenados de una forma<br />

estructurada que permite su manipulación, ordenación, relación y actualización por uno o<br />

varios usuarios, facilitando de este modo al obtención de criterios útiles en base a ellos.<br />

Una vez centrado el significado de bases de datos, debemos aclarar que los programas que<br />

se encargan de la gestión de las bases de datos se les denomina Sistemas Gestores de Bases de<br />

Datos o más conocidos como SGDB; de ellos es la responsabilidad de la gestión, mantenimiento,<br />

actualización e integridad de las bases de datos.


2.- Tipos de Bases de datos.<br />

Las pueden clasificarse según dos criterios básicos: por su función y por el modelo de<br />

administración de los datos.<br />

En relación a las primeras se diferencian dos tipo:<br />

●<br />

●<br />

Bases de datos analíticas: son de solo lectura, utilizadas para almacenar datos<br />

históricos que posteriormente se pueden utilizar para estudiar el comportamiento de un<br />

conjunto de datos a través del tiempo, realizar proyecciones y tomar decisiones.<br />

Bases de datos operacionales: son más dinámicas, orientadas a almacenar información<br />

que se modifica con el tiempo, permitiendo operaciones como actualización y adiciones<br />

de datos, además de la operaciones normales de consulta.<br />

En cuanto a la segunda se basa en que la base de datos es un contenedor en el que se<br />

guarda información de algo conocido analizando la metodologías que se utilizan para realizar la<br />

operación de almacenaje; los modelos son abstracciones de esa realidad que permiten un sistema<br />

eficaz de ordenación. Los modelos más usuales y utilizados son:<br />

●<br />

●<br />

●<br />

Planas: son las primeras que se utilizarón y consisten en representar la información de<br />

forma plana (texto plano), ya sea como una tabla (organizada por renglones y columnas)<br />

o simplemente dando tratamiento de base de datos a un archivo de texto.<br />

Jerárquicas: se almacena la información en una estructura jerárquica, similar a las raíces<br />

de un árbol, en donde un nodo padre de información tiene varios hijos; siendo el nodo<br />

que no tiene padre conocido como raíz y a los nodos que no tienen hijos se les<br />

denomina hojas. La principal delimitación de este tipo de bases de datos es su<br />

incapacidad de representar eficazmente la redundancia de datos.<br />

Red: es muy parecido al jerárquico, diferenciándose de la anterior en el concepto de<br />

nodo, permitiendo que en un mismo nodo tenga varios padres, dando solución al<br />

problema de la redundancia de datos.


●<br />

Relacional: es el más utilizado actualmente tanto en el modelado como en la<br />

administración de datos. Su estructura se basa en el concepto de tablas, compuestas de<br />

registros (filas) y campos (columnas). La información es almacenada y recuperada por<br />

medio de consultas muy flexibles. El lenguaje utilizado para la realización de las<br />

consultas es SQL(Structurate Query Language – Lenguahe de Consulta Estructurado).<br />

●<br />

Orientada a objeto: En el se trata de almacenar en la base de datos la información<br />

organizada en objetos complejos (estado y comportamiento), no solo en atributos.


3.- Diseño, alcance y criterios de calidad de una base de datos<br />

La metodología de diseño se divide en tres etapas:<br />

●<br />

●<br />

Modelo Global: se centra en representar gráficamente y de forma clara el flujo de<br />

información dentro de la organización, siendo un esquema lo más sencillo posible.<br />

Modelado Lógico: se trata de una representación gráfica mediante símbolos y signos<br />

normalizados de la base de datos, es pues, la conversión del mundo real a un mundo<br />

formado por datos. La abstracción se puede realizar de varias formas:<br />

➢<br />

Clasificación: se genera una única entidad de conceptos con características<br />

comunes, la diferencias entre ellos vendrían dadas por los diferentes valores que<br />

tomen dichas características. Ejemplo:<br />

CURSOS<br />

INGLES FRANCES ESPAÑOL<br />

➢<br />

Agregación: consiste en separar cada una de las partes en concepto para generar<br />

distintas entidades. Ejemplo


RUEDAS<br />

MOTOR<br />

CHASIS<br />

COCHE<br />

➢ Generalización: consiste en ir generando entidades de diferentes niveles de tal<br />

forma que cada entidad de nivel agrupe las de nivel inferior. Ejemplo:<br />

PERSONAL<br />

EMPLEADO CLIENTE PROVEEDOR<br />

NACIONAL<br />

EXTRANJERO<br />

➢<br />

Asociación: consiste en la generalización de entidades a partir de entidades:<br />

Ejemplo:<br />

ALBARAN PEDIDO FACTURA<br />

+ =<br />

● Modelo Físico: es la base de datos en si misma.<br />

En el desarrollo de esta metodología no solamente interviene el especialista de bases de<br />

datos o el administrador del sistema, es imprescindible la intervención del usuario o grupo de<br />

usuarios que demanda la base de datos, ya que de ellos depende fundamentalmente el diseño<br />

global, dentro del cual se establecerán los criterios básicos de sus necesidades.<br />

En el momento de la creación de una base de datos se debe analizar el alcance o vida de la<br />

base de datos; este consta de siete pasos fundamentales:<br />

●<br />

Análisis de las necesidades: se deben documentar los tres tipos básicos de usuarios<br />

que tendrán acceso a la base de datos, las necesidades de información de cada uno de<br />

ellos, los informes que generarán cada uno y los contenidos de estos. Los tres tipos de<br />

usuarios se clasifican en :<br />

➢ PED (procesamiento electrónico de datos – operarios): se centran<br />

fundamentalmente en el almacenamiento de datos, el procesamiento de los<br />

mismos y el flujo de datos. Generan informes de tipo listado de los datos. Su<br />

acceso se restringido a la información.<br />

➢<br />

SIM (sistema de información de gestión – mandos intermedios) se centran en<br />

la toma de decisiones basándose en los datos del grupo PED; el volumen de<br />

información aportada por este grupo a la base de datos es pequeña. Tienen un<br />

acceso medianamente restringido a la información. Los informes generados son<br />

resúmenes de datos basados en los datos aportados por el grupo PED y listados<br />

de la información introducida por ellos.


➢<br />

STD (sistema de apoyo a la toma de decisiones – nivel más alto de la<br />

organización) se centra en la toma de decisiones, la entrada de información en la<br />

base de datos es mínima. El acceso a los datos es total. Los informes presentados<br />

son de carácter global y sirven de apoyo a la toma de decisiones.<br />

Podría considerarse un cuarto tipo de usuarios que podríamos denominar usuarios<br />

avanzados y que son los administradores del sistema. Este grupo de usuarios participaría<br />

en la selección del soporte de datos, evitar la duplicidad de la información y el<br />

conocimiento del sistema.<br />

●<br />

●<br />

●<br />

●<br />

●<br />

●<br />

●<br />

●<br />

Estudio de viabilidad: supone la creación de un informe en el que se plasman las<br />

siguiente características:<br />

Viabilidad tecnológica (tecnología suficiente).<br />

Viabilidad operacional (recursos humanos, presupuestos, experiencia, etc.).<br />

Viabilidad económica (identificación de beneficios, relación coste - beneficios, etc.).<br />

Definición de requisitos: establece los requisitos de software y hardware necesarios<br />

para implementación, los recursos humanos, la formación del personal, las<br />

responsabilidades de cada miembro del equipo, fijar quienes serán los interlocutores y<br />

quien será el validador.<br />

Diseño: en este punto se crea el esquema que hemos descrito al inicio de este apartado.<br />

Implementación: consiste en el desarrollo de las tablas, indicies, condiciones de<br />

validación de los datos entre las distintas tablas, definición de consultas y sus<br />

parámetros, medidas de seguridad, etc.<br />

Evaluación y perfeccionamiento: es la última etapa y en ella todos los usuarios se<br />

conectan a la base de datos para comprobar su correcto funcionamiento, así como si<br />

cada uno ellos dispone de información y herramientas necesarios para realizar su<br />

trabajo.<br />

En el desarrollo de la base de datos se deben seguir una serie de criterios de calidad, cuanto<br />

más de estos criterios sean aceptados y se busque en ellos la máxima eficacia mayor será la calidad<br />

y fiabilidad de nuestra base de datos. Los criterios ha considerar son:<br />

● Legibilidad: el diseño debe estar redactado con la suficiente claridad par que pueda ser<br />

entendido rápidamente.<br />

●<br />

●<br />

●<br />

Fiabilidad: debe ser lo suficientemente robusto como para recuperarse frente a errores o<br />

usos inadecuados.<br />

Portabilidad: el diseño debe permitir la implementación del modelo físico en diferentes<br />

gestores de bases de datos.<br />

Modificabilidad: la base de datos debe adaptarse a los nuevas necesidades, permitiendo<br />

el mantenimiento, modificaciones y actualizaciones.<br />

● Eficiencia: se deben aprovechar al máximo los recurso de la computadora, minimizando<br />

el uso de memoria y el tiempo de proceso o ejecución.<br />

●<br />

Auto descripción: en la documentación debe encontrarse todos los detalles del diseño.<br />

● Trivialidad: tanto diseño como implementación deben realizarse utilizándose los<br />

estándares fijados a priori.<br />

● Claridad: la documentación debe estar redactara de forma clara y fácil de entender; los<br />

nombres utilizados deben ser auto_descriptivos y estar documentados.


● Coherencia: las anotaciones y terminologías utilizadas deben ser uniformes.<br />

●<br />

●<br />

●<br />

●<br />

●<br />

Completo: todos los elementos constitutivos de la base de datos existen.<br />

Concisión: No existen elementos inútiles ni repetitivos.<br />

Facilidad de aprendizaje: La documentación de la base de datos se puede utilizar sin<br />

necesidad de otros conocimientos informáticos.<br />

Facilidad de uso: los datos deben ser fáciles de elaborar y los resultados fáciles de<br />

entender.<br />

Generalidad: la base de datos se debe adaptarse a cualquier tipo de empresa y a<br />

cualquier casuística.<br />

● Independencia del usuario: la base de datos no debe estar ligada a la utilización en una<br />

única instalación.<br />

● Independencia del sistema: las prestaciones y el diseño de la base de datos no están<br />

sujetas al entorno.<br />

●<br />

Independencia de instalación: la base de datos debe poderse transportar fácilmente de<br />

una instalación a otra.<br />

● Modularidad: la base de datos puede ser descompuesta en elementos independientes.<br />

●<br />

●<br />

●<br />

●<br />

Observable: se deben permitir observar los accesos a los datos y utilización de los<br />

datos.<br />

Precisión: los cálculos se deben realizar con la precisión requerida.<br />

Protección: la base de datos debe permitir la protección de los datos frente a usos no<br />

debidos, debe tener unos sistemas de accesos bien desarrollados para los diferentes<br />

usuarios con diferentes claves.<br />

Trazabilidad: tomando como punto de partida la versión actual puede remontarse su<br />

diseño hasta las especificaciones iniciales.


4.- El modelo relacional<br />

El modelo relacional fue propuesto por E.F. Good en 1970 que trabajaba para IBM en San<br />

José - California, gracias a su coherencia y facilidad de uso se convirtió en los 80 en el más usado;<br />

los motivos de esa aceptación son:<br />

1. Ofrecen un sistema simple y eficaz para representar y manipular datos.<br />

2. Se basa en un modelo con solidas bases teóricas y un método de diseño basado en<br />

postulados formales.<br />

La estructura sobre la que se basa este modelo es la “relación” , o lo que es lo mismo, tablas<br />

bidimensionales constituidas por lineas o tuplas y columnas o atributos; las relaciones representan<br />

las entidades que se consideran interesantes en la base de datos. La relación es pues el nombre y<br />

la lista de atributos que definen una tabla, cuando añadimos las tuplas o lineas se habla de<br />

instancias de la relación.<br />

Las bases de datos son gestionadas por lo general por uno o varios programas que suelen<br />

ser denominados como Sistemas Gestores de Bases de Datos o SGBD y que se componen de:<br />

●<br />

●<br />

●<br />

●<br />

Datos almacenados en tablas.<br />

Operadores de manipulación de tablas.<br />

Reglas de integridad aplicadas a las tablas.<br />

Se debe cumplir por parte del programas o programas que:<br />

➢<br />

➢<br />

➢<br />

No se permite grupos repetitivos.<br />

No se permite jerarquías implícitas<br />

Ningún enlace estructural fijo debe formar parte de la base de datos.<br />

Pero todo modelo no es perfecto, como puntos en contra del modelo relacional podríamos<br />

destacar una serie de puntos, estos son:<br />

●<br />

Dificultad en consultas recursivas.


●<br />

●<br />

●<br />

Problema con procesos que trabajan con valores nulos.<br />

Falta de apoyo en tipos de datos complejos o abstractos.<br />

Diferencias en la representación de datos y en la semántica funcional entre los<br />

programas SGBD.<br />

4.1.- Elementos de una base de datos<br />

Los nombres que se asignan a los elementos de una base de datos son:<br />

●<br />

●<br />

●<br />

●<br />

●<br />

●<br />

Entidad: son los objetos existentes en la realidad o bien abstractos, a cerca de los cuales<br />

se quiere almacenar y recuperar información en una base de datos y que se diferenciarán<br />

unos de otros por una serie de atributos o características.<br />

Grupo de entidades: será la agrupación de entidades del mismo tipo.<br />

Atributo: son los datos reales que caracterizan una entidad que los describe.<br />

Dominio: es el conjunto de datos admitidos para un atributo.<br />

Campos: son la columnas de la tabla y se corresponden con cada uno de los datos que<br />

componen un registro y hacen referencia a un dominio de la entidad que deseamos<br />

describir. Están definidos por el tipo de datos que contienen. El campo o conjunto de<br />

campos que representa a cada de forma única se le denomina CLAVE.<br />

Registro lógico, fila o tupla: son las filas o fichas de la tabla y contienen todos los<br />

datos de interés de una entidad. Estos registros pueden ser de dos tipo atendiendo a su<br />

longitud:<br />

➢<br />

➢<br />

Longitud fija: son conocidos el número de campos y su longitud por anticipado.<br />

Los campos que no tengan dato se quedan en blanco.<br />

Longitud variable: se conoce el número de campos y su longitud se indica como<br />

un máximo, es decir, si la información no ocupa el campo completo este se<br />

compacta.<br />

●<br />

●<br />

●<br />

Archivo, dispositivos o unidades lógicas: son una colección de datos que conforman la<br />

base de datos. Cada uno de ellos es gestionado por un único hilo de entrada/salida del<br />

sistema operativo.<br />

Base de datos: son entidades lógicas en las que el SGDB sitúa los datos y objetos<br />

asociados.<br />

Tablas: es un contenedor de datos dividido en filas o registros y columnas o campos.<br />

Tienen las siguientes propiedades:<br />

➢<br />

➢<br />

➢<br />

➢<br />

Cada entrada en la tabla corresponde a un iten individual.<br />

Todos los iten de una columna son de la misma clase.<br />

Cada columna tiene asignado un nombre único en el conjunto de columnas de la<br />

tabla.<br />

Para una tabla dada todas las filas son diferentes.


➢<br />

Tanto las filas como las columnas pueden ser consideradas en cualquier<br />

secuencia sin afectar ni el contenido ni la representación de la información.<br />

●<br />

●<br />

Vista o consulta: es una definición almacenada en un sistema de bases de datos que<br />

especifica las filas y columnas que se deben recuperar o con las que hay que operar.<br />

Relación: desde un punto de vista matemático es un subconjunto de un producto<br />

cartesiano de una lista de dominios. En cada relación hay dos componentes:<br />

➢<br />

➢<br />

Intención o comprensión: la estructura estática del objeto en el mundo real, el<br />

cual es representado mediante una relación (los atributos).<br />

Extensión: depende del momento específico en el que la relación es tenida en<br />

cuanta y representa a cada uno de las tuplas pertenecientes a un mismo tipo<br />

existentes.<br />

●<br />

Índices: funciona de forma similar al catálogo de una biblioteca, existe varios tipos:<br />

➢<br />

Índice primario: es el índice cuya clave de búsqueda especifica el orden<br />

secuencial del archivo. Identifican de forma única y sin ambigüedad a cada una de<br />

las tuplas o registros; pueden existir índices con claves candidatas que serán<br />

alternativas a la clave primaria. Se pueden diferenciar dos tipos de índices<br />

primarios:<br />

✗<br />

✗<br />

Densos: tiene un registro índice para cada valor de la clave de búsqueda<br />

en el archivo.<br />

Escasos: se crean indines para algunos registros.<br />

➢<br />

Índices secundarios: el resto de los índices.<br />

4.2.- Proceso de normalización<br />

El proceso de normalización es un estándar que consiste en convertir las relaciones de las<br />

entidades para evitar:<br />

●<br />

●<br />

●<br />

●<br />

La redundancia de datos.<br />

Anomalías de actualización.<br />

Anomalías de borrado.<br />

Anomalías de inserción<br />

Esta tarea es la mas complicada en el desarrollo del diseño de la base de datos y de ella<br />

depende el funcionamiento y eficacia de la misma. Antes de proceder a la normalización de una<br />

tabla debemos definir una clave, esta debe contener un valor único para cada registro y podrá estar<br />

formada por uno o varios campos de la tabla.<br />

Existen varia etapas en la normalización que reciben el nombre genérico de forma normal,<br />

caracterizada cada una de ellas por una serie de características, que deben incluir las de la formas<br />

anteriores, como si se tratara de capas envolventes.<br />

●<br />

Primera forma normal: se dice que una tabla esta en primera forma normal si y solo si<br />

cada uno de los campos contienen un único valor para un registro determinado.


●<br />

Segunda forma normal: comparados todos y cada uno de los campos de una tabla con<br />

la clave definida todos ellos dependen directamente de dicha clave.<br />

●<br />

●<br />

Tercera forma normal: una tabla está en tercera forma normal si y solo si los campos de<br />

la tabla dependen únicamente de la clave y no unos de otros.<br />

Cuarta forma normal: si y solo si para cualquier combinación clave-campo no existen<br />

valores duplicados.<br />

4.3.- Las interrelaciones<br />

Con interrelaciones hacemos referencias a las diferentes relaciones existentes entre tablas<br />

del sistema. Se diferencias tres tipos de interrelaciones que dependen de la diferente cardinalidad<br />

con la que se combinan los elementos de varias tablas:<br />

●<br />

●<br />

●<br />

Interrelaciones uno a uno (A 1 : 1 B): a cada elemento de A le corresponde un único<br />

elemento de la tabla B. Generalmente este tipo de interrelación aparece cuando tenemos<br />

tablas muy grandes.<br />

Interrelaciones uno a varios (A 1 : n B): cuando una clave de la tabla A posee varios<br />

elementos de la tabla B y cuando una clave de la tabla B posee un único elemento de la<br />

tabla A.<br />

Interrelaciones de varios a varios (A n : n B): cuando una clave de la tabla A posee<br />

varios elementos de la tabla B y una clave de la tabla B posee varios elementos de la clave<br />

A. Es difícil establecer relaciones de este tipo dentro de una base de datos, debido<br />

fundamentalmente a la complejidad que supone esta interrelación.<br />

Los problemas que se pueden presentar en las interrelaciones pueden ser de dos tipos, que<br />

suponen un grabe problema si definimos una relación con integridad referencial y decidimos<br />

eliminar en cascada, en cuyo caso perderemos más datos de los necesarios.<br />

1. Interrelaciones recursivas: un elemento se relaciona consigo mismo directamente.<br />

2. Interrelaciones circulares o cíclicas: una elemento A se relaciona con un elemento B<br />

que a su vez se relaciona con un elemento C y este último se relaciona con A.<br />

En la mayoría de las interrelaciones definidas será conveniente exigir integridad relacional<br />

entre las claves, con lo que conseguiremos que no se establezcan ningún valor en la tabla destino<br />

si no existe en la tabla origen. Definida esta integridad podremos exigir la actualización en cascada<br />

que permitirá una vez modificado un código en la tabla inicial se modifique en la tabla destino.


5.- Álgebra relacional<br />

Las operaciones de álgebra relaciona manipulan relaciones y tiene como resultado una<br />

nueva relación. El álgebra relacional consta de nueve operaciones de las cuales las cuatro primeras<br />

se toman de la teoría de conjuntos de las matemática, las cuatro siguientes son operadores propios<br />

del álgebra relacional y la última es la operación estándar de dar valor a un elemento.<br />

●<br />

●<br />

●<br />

●<br />

●<br />

●<br />

Unión: permite combinar datos de varias relaciones. Es necesario para realizar esta<br />

operación que las tablas a unir tengan las mismas estructuras y los campos los mismos<br />

valores. Un ejemplo seria la unión de las tablas de los empleados de una empresa que<br />

tiene filiares en varios países, se podrián unir las tablas para sacar un listado completo<br />

de todos los empleados.<br />

Intersección: permite identificar filas que son comunes en dos relaciones. Supongamos<br />

que tenemos una tabla en la que hemos introducido las características de la colección de<br />

minerales y una segunda tabla que contiene las características cristalográficas de cada<br />

especie mineral, podremos con una operación de intersección relacionar cada uno de<br />

nuestros ejemplares con la especie mineral que le corresponde.<br />

Diferencia: permite identificar que filas están en una relación y no en otra.<br />

Producto: es la obtención de un producto cartesiano entre dos tablas dando como<br />

resultado todas las posibles combinaciones entre los registros de la primera y la segunda<br />

tabla.<br />

Selección: consiste en recuperar un conjunto de registros de una tabla o de una relación<br />

indicando las condiciones que deben cumplir los registros recuperados. Esta operación<br />

también se conoce como consulta.<br />

Proyección: es un caso concreto de una selección, en la que se devuelven todos los<br />

campos que cumplen la condición establecida, en otras palabras, es una selección en la<br />

que indicamos los campos que deseamos visualizar.


●<br />

Reunión: La reunión se utiliza para recuperar datos a través de varias tablas conectadas<br />

unas a otras mediante la cláusula JOIN en cualquiera de sus variantes.<br />

●<br />

●<br />

División: es la operación contraria al producto, en la que buscamos los campos que<br />

contiene la tabla B que se encuentran en la tabla A.<br />

Asignación: es la operación que consiste en asignar valor a uno o varios campos de una<br />

tabla.


Práctica de uso de Mysql<br />

1.- Introducción<br />

El objetivo de este manual es el apoyo de las prácticas sobre bases de datos de las<br />

asignaturas: Aplicaciones Informáticas en Geología 1 y Fundamentos de Informática y<br />

Programación 2 , impartidas en la Facultad de Ciencias Geológicas de la U.C.M.<br />

El desarrollo del mismo no sigue la estructura de un documento de este tipo, si no la forma<br />

de trabajo habitual con este tipo de programas. Se comienza con la explicación para la obtención<br />

del programa y su instalación, seguidamente se pasa a la creación básica de una base de datos, sus<br />

tablas e indicies, como introducir datos y en último lugar la forma de obtener información.<br />

No se pretende hacer una publicación intensiva de todas las posibilidades del gestor y<br />

seguramente dejemos muchas cosas en el tintero, sin tener que mencionar las diferentes APIs<br />

(Interfaz de Programación de Aplicaciones) de programación y algunas de las más intrincadas<br />

posibilidades de administración.<br />

1 Asignatura de 3º curso de la titulación de Ingeniero Geólogo.<br />

2 Asignatura del 1º ciclo de la titulación de Licenciado en Geología.


2.- Como conseguir e instalar mysql<br />

Mysql es un sistema de gestión de bases de datos relacionales (SGBDR o en ingles<br />

RDBMS relacional data-base management system) basado en SQL 3 con estructura clienteservidor<br />

4 que tiene su origen en Escandinava, remontándose a 1979 cuando Michael Monty<br />

Widenius desarrolla la herramienta de base de datos UNIREG para la empresa sueca TcX; en 1996 la<br />

empresa sueca libero la forma binaria del código al mundo, actualmente mysql funciona en<br />

numerosas plataformas y tanto el código binario como el fuente están disponibles.<br />

En la mayoría de las distribuciones Linux se encuentra dentro de los numerosos paquetes<br />

que contienen y puede instalarse durante el proceso de instalación del sistema operativo. En<br />

cuanto a Windows puede obtenerse el código binario en la dirección:<br />

http://www.mysql.com/ o bien en ftp://ftp.mysql.com/pub/mysql/<br />

Aunque existen numerosos servidores ftp que permiten acceder al programa de forma más rápida y<br />

cercana a nosotros, es el caso del servidor ftp de Red Iris:<br />

ftp://ftp.rediris.es/<br />

Una vez que hemos obtenido el código, binario, fuente o ambos, podemos decidir que<br />

instalar en el ordenador. En el caso de que deseemos instalar mysql desde el código fuente,<br />

deberemos primeramente compilar este código para obtener los binarios, operación que no<br />

describiremos aquí ya que se sale de los objetivos de este manual y sobre todo, de las asignaturas<br />

para las cuales va destinado. En el caso de instalar desde los binarios tendremos que tener en<br />

cuenta las siguientes posibilidades:<br />

● Instalar servidor-cliente en nuestro propio ordenador.<br />

3 SQL es un acrónimo del ingles structured query language o lenguaje de petición estructurada. Originalmente fue un<br />

lenguaje de acceso al sistema de gestión de bases de datos denominado DB2 de la plataforma 390 de IBM.<br />

4 Hace referencia a la filosofía de funcionamiento informático en el que los recursos de un ordenador central al cual se<br />

llama servidor, este acceso se realiza gracias a un programa al que se denomina cliente. En nuestro caso el paquete<br />

informático mysql, contiene tanto el cliente como el servidor.


● Instalar solamente el cliente, conectándonos vía red a un servidor situado en otro<br />

ordenador.<br />

En el caso de las practicas que realizaremos, instalaremos el paquete completo (clienteservidor)<br />

en nuestro ordenador. Si nuestro ordenador trabaja con Windows en versiones 2000 o XP<br />

podemos hacer que el servidor se ejecute como un servicio más, permitiendo así disponer en<br />

cualquier momento del programa sin preocuparnos de si hemos cargado o no el servidor de bases<br />

de datos. En caso de trabajar con Linux podemos activar el servicio en la configuración del sistema.<br />

Una vez instalado mysql deberemos arrancar el servidor de bases de datos. Desde Windows<br />

la activación del servidor se realiza con el comando:<br />

c:\mysql\bin\mysqld -------> servidor estándar<br />

c:\mysql\bin\mysqld-opt ----> servidor optimizado para procesadores Pentium<br />

c:\mysql\bin\mysqld-nt ------> servidor que se instala como servicio NT<br />

En el último caso podemos activar el servicio de la siguiente forma:<br />

c:\mysql\bin\mysql-nt --install ----> instala el servicio<br />

net start mysql ----> inicia el servicio del servidor mysql<br />

net stop mysql ----> para el servicio del servidor mysql.<br />

Para cerrar el servidor deberemos ejecutar la siguiente orden:<br />

c:\mysql\bin\mysqladmin -u root shutdown<br />

Si hemos instalado en nuestro PC el servidor y cliente de mysql bajo un sistema Linux las<br />

operaciones de arrancar el servidor y cerrar el servidor se realizarán con los siguientes comandos:<br />

La primera operación una vez instalado el servidor es ejecutar el script que genera el<br />

directorio de datos:<br />

mysql_install_db<br />

Si por alguna circunstancia no se instala correctamente podemos eliminar toda la base de datos<br />

mysql con el comando:<br />

rm -rf DATADIR/mysql<br />

El servidor se iniciará con el comando :<br />

safe_mysqld --user=mysqladm &<br />

o<br />

safe_mysqld --user=mysqladm --log &<br />

(la instalación por defecto permite a root ejecutar el cliente y servidor sin contraseña pero es<br />

recomendable asignarle una contraseña)<br />

Para detener el servidor bastará con ejecutar el comando:<br />

mysqladmin –user=root shutdown<br />

La forma más común para arrancar el cliente es utilizar una consola de modo texto, en el<br />

caso de que tendamos en el path del sistema la localización del servidor, bastara con teclear:<br />

mysql


En el caso de que no tengamos este camino especificado deberemos situarnos en el directorio bin<br />

que contiene los ejecutables de mysql y desde allí repetir la orden anterior (c:\mysql\bin\mysql).<br />

Por lo general cada usuario tiene una clave y nombre para utilizar la base de dato, asignada por el<br />

administrador del servidor; por defecto en la instalación se crea una serie de usuarios, uno de ellos<br />

se denomina root y para trabajar en el ordenador donde se ha instalado mysql (denominado<br />

localhost) no se necesita clave para entrar; es recomendable activar una clave para root y para los<br />

demás usuarios si no la tuvieran, siempre y cuando el ordenador que tengamos tenga acceso a red.<br />

Al asignar una clave la forma de entrada a mysql será de la siguiente forma:<br />

mysql -u root -p<br />

Deberemos sustituir el valor de root por nuestro nombre de usuario, al presionar la tecla intro se<br />

nos solicitará un password o clave, que no será visible al introducirla, si se realizan bien la<br />

operaciones se nos dará acceso a las bases de datos que podamos utilizar; solamente root tiene<br />

acceso a todas las bases de datos existentes.<br />

Si nuestra conexión se va a realizar a un servidor remoto (situado en otro ordenador), ni<br />

que decir tiene que deberemos tener conexión a la red y permiso de conexión, por tanto<br />

deberemos indicar el host (nombre del ordenador) desde el cual nos conectamos, el comando<br />

anterior será:<br />

mysql - h nombre_ordenador -u mi_nombre -p<br />

El atributo de usuario (-u) puede ser sustituido por --user y clave (-p) por --password.


3.- Primeros pasos dentro de mysql.<br />

Cuando nos introducimos en el programa se nos da un saludo y se indica que deberemos<br />

terminar los comandos con ';' o bien '\g' (sin las comillas); se indica además el nº de identificación<br />

de nuestra conexión y la versión del servidor, además de mostrar la forma de pedir ayuda y de<br />

limpiar el buffer de ordenes.<br />

Ilustración 1: Captura de pantalla del mensaje de bienvenida del servidor mysqld<br />

La primera operación que se suele realizar es el reconocimiento de las bases de datos con<br />

las que podemos trabajar, el comando que muestra todas las bases de datos disponibles es:<br />

show databases;<br />

Es recomendable, aunque hay comandos que no lo necesitan, terminar cada linea de<br />

comando con un ';', lo que indica al cliente que la orden termina en ese punto y debe enviarla al<br />

servidor.<br />

Una vez ejecutado el comando se nos mostrará el listado de bases de datos ; para poder<br />

empezar a trabajar con cualquiera de ellas bastara utilizar el siguiente comando:


use nombre_base;<br />

Deberemos sustituir nombre_base por el nombre de la base de datos con la que deseamos trabajar.<br />

Si no existe ningún error en la orden se nos mostrará un mensaje de cambio de base de datos<br />

(Database change), que nos informa de que la base de datos ha sido seleccionada (Ilustración 3).<br />

En el listado de la Ilustración 2 existen dos<br />

bases de datos que se crean automáticamente con la<br />

instalación del programa, text y mysql. La primera es<br />

una base de datos para testear el servidor, mientras la<br />

segunda es una base de datos interna del programa en<br />

la que se almacenan todos los datos de los usuarios,<br />

bases de datos, utilización, etc.<br />

Una vez seleccionada la base de datos con la<br />

que vamos a trabajar es conveniente conocer la<br />

estructura de tablas que componen la base de datos,<br />

esta operación se realiza con el comando:<br />

show tables;<br />

Ilustración 2: Obtención del listado de bases de datos<br />

Es importante acordarse que no podemos utilizar este<br />

comando si no hemos seleccionado previamente una<br />

base de datos, ya que el programa no tendrá<br />

información de la base con la que deseamos trabajar.<br />

Ilustración 3: Selección de la base de datos y petición de información sobre las tabas que contiene.<br />

En muchos casos es necesario conocer la estructura de las tablas, sobre todo cuando vamos<br />

a realizar operaciones de extracción de datos o de introducción de los mismos; estas características<br />

se obtienen con el comando:<br />

describe nombre_tabla;<br />

Ilustración 4: Tabla de descripción de una tabla denominada minerales.


Sustituiremos nombre_tabla por el nombre real de la tabla que deseamos conocer. En la ilustración<br />

4 se muestra la información de la tabla mineral. La información dada se muestra en una tabla de 6<br />

columnas y tantas filas como campos tenga la base solicitada; el primero de los campos muestra el<br />

nombre del mismo, el segundo el tipo de datos que almacena y la capacidad del mismo (puede<br />

aparecer otras informaciones como es el caso de la utilización o no de signo en los valores<br />

numéricos – unsigne -> sin signo-), tercera columna si el campo admite o no valor nulo, la cuarta<br />

columna señala los diferentes índices y a que campos implica, así como su tipo; la quinta columna<br />

nos permite ver el valor por defecto que tomará cada campo ( en el caso de que aparezca null<br />

señala que el campo quedara vario sin datos); la sexta y última columna indica los extras, como<br />

puede ser auto_incrementos en los campos numéricos.<br />

El cliente mysql mantiene en un buffer las últimas ordenes enviadas, estas se pueden volver<br />

a mostrar con las flechas de cursor arriba-abajo y podemos modificarlas moviéndonos con las<br />

flechas izquierda-derecha y reescribiendo las palabras deseadas.<br />

La visualización de las diferentes tablas de datos no se puede hacer por grupos, debe<br />

hacerse de forma individual.


4.- Creación de una base de datos y sus tablas.<br />

Previamente a la creación de una base de datos hemos tenido que realizar los pasos para el<br />

diseño de la base de datos, en donde hemos intentado convertir un modelo real a un modelo<br />

funcional , además de normalizarlo para impedir errores no deseados.<br />

Partimos desde el momento en el que nos introducimos en el programa de base de datos,<br />

nuestros privilegios de uso del programa nos deben permitir la creación y edición de bases de<br />

datos. Los siguientes pasos mostrarán las diferentes etapas no sólo en la creación de bases de<br />

datos sino también de las tablas que contendrá nuestra datos. El comando principal para crear una<br />

base de datos es el siguiente:<br />

create database nombre-base;<br />

Deberemos sustituir el valor de nombre-base por el nombre de la bases de datos que<br />

deseamos crear; este primer paso sólo ha creado el espacio destinado a la base no ha creado<br />

ninguna estructura de almacenamiento. En el directorio data, incluido en el directorio mysql se<br />

creará un nuevo directorio con el nombre de nuestra base de datos, en el se almacenarán las<br />

diferentes tablas que constituirán la base de datos.<br />

La creación de tablas nuevas en nuestra base requiere algo más de conocimientos, ya que<br />

deberemos explicar o definir las características de cada uno de los campos que contendrán las<br />

tablas (la tabla 1 muestra los diferentes tipos de campos y valores que éstos pueden tomarse en<br />

una tabla). En la definición deberemos señalar el nombre de cada uno de los campos , aclarar sus<br />

características, dimensiones, valor por defecto etc. Esta estructura es la que anteriormente hemos<br />

analizado con la orden describe.<br />

create table nombre-tabla (<br />

nombre-campo tipo-dimensión índice nulo otras-características,<br />

...


);<br />

En la orden anterior deberemos repetir la línea de nombre-campo tantas veces como<br />

atributos para cada ficha queramos poner, la opción nombre-campo la deberemos sustituir por el<br />

nombre del atributo , es un elemento necesario; la opción tipo-dimensión es también obligatoria<br />

y determina el tipo de datos que se almacenará y las dimensiones de los mismos (ver tabla 1); la<br />

opción de índice nos permite establecer la columna como índice primario (primary key), índice<br />

único (unique) o como un índice secundario (index); null determina la posibilidad de establecer<br />

que el campo puede quedar en blanco o que debiera admitir siempre un valor (not null), en este<br />

último caso podremos establecer un valor por defecto que ocupa el espacio del campo sí le<br />

dejamos en blanco (default y entre dobles comillas ' "' el valor asignado); por último, otras<br />

características hacen referencia a la posibilidad de auto-incrementó en valores numéricos y otras<br />

características.<br />

Tabla 1 Tipos de datos que otorgarse a un campo de una base de datos en Mysql. En la tabla las letras m y<br />

d hacen referencia a máxima anchura de visualización y al número de dígitos que siguen al punto decimal; el<br />

primero debe estar comprendido entre 0 y 255 y el segundo entre 0 y 30, no superando el valor de m-2. En<br />

el caso de las cadenas m estará comprendido entre 0 y 255.<br />

Tipo<br />

Descripción<br />

Valor<br />

Pred.<br />

Tipos numéricos<br />

Dimensiones<br />

TINYINT (m) Entero muy pequeño. 1 byte NULL / 0 -2 7 a 2 7 / 0 a 2 8 -1<br />

SMALLINT (m) Entero pequeño. 2 bytes NULL / 0 -2 15 a 2 15 / 0 a 2 16 -1<br />

MEDIUMINT (m)<br />

INT (m)<br />

Entero de tamaño medio. 3<br />

bytes<br />

Entero de tamaño normal. 4<br />

bytes<br />

NULL / 0 -2 23 a 2 23 / 0 a 2 24 -1<br />

NULL / 0 -2 31 a 2 31 / 0 a 2 32 -1<br />

BIGINT (m) Entero grande. 8 bytes NULL / 0 -2 63 a 2 63 / 0 a 2 64 -1<br />

FLOAT (m,d) 5<br />

DOUBLE (m,d) 6<br />

Un número de coma<br />

flotante, precisión simple. 4<br />

bytes<br />

Número grande de coma<br />

flotante, doble precisión. 8<br />

bytes<br />

NULL / 0<br />

NULL / 0<br />

±1.175494351E -38<br />

±3.402823466E +38<br />

Atributos<br />

auto_increme<br />

nt, unsigned,<br />

zerofill<br />

auto_increme<br />

nt, unsigned,<br />

zerofill<br />

auto_increme<br />

nt, unsigned,<br />

zerofill<br />

auto_increme<br />

nt, unsigned,<br />

zerofill<br />

auto_increme<br />

nt, unsigned,<br />

zerofill<br />

zerofill<br />

±2.250738585072014E -308<br />

±1.7976931348623157E+ 3<br />

08<br />

zerofill<br />

DECIMAL(m,d)<br />

CHAR (m)<br />

Corresponde aun número de<br />

coma flotante almacenado<br />

como una cadena (1byte por<br />

dígito,punto decimal o<br />

signo).<br />

Cadena de longitud de<br />

caracteres fijos. Las cadenas<br />

más cortas que m son<br />

NULL / 0<br />

Tipos de cadenas<br />

El rango es el mismo que el<br />

de DOUBLE<br />

zerofill<br />

NULL / “ “ 0 a 255 caracteres binary<br />

5 En MYSQL 3.23, FLOAT(4) establece un tipo autentico de coma flotante, en el que los valores se almacenan con la máxima<br />

precisión permitida por el ordenador y sin redondeo.<br />

6 Como en la nota anterior DOUBLE(8) estable un tipo autentico de coma flotante de doble precisión. Tiene algunos<br />

sininimos en su utilización como son DOUBLE PRECISION(m,d) y REAL(m,d).


Tipo<br />

Descripción<br />

almacenadas con espacios a<br />

la derecha hasta completar<br />

m<br />

Valor<br />

Pred.<br />

Dimensiones<br />

VARCHAR (m) Cadena de longitud variable. NULL / “ “ 0 a 255 caracteres binary<br />

TINYBLOB<br />

Un pequeño valor blob.<br />

Distinción entre mayúsculas<br />

y minúsculas. Son<br />

contenedores binarios.<br />

NULL / “ “<br />

BLOB Blob de tamaño normal NULL / “ “<br />

MEDIUMBLOB Blob de tamaño medio NULL / “ “<br />

LONGBLOB Blob de tamaño grande NULL / “ ”<br />

TINTEXT<br />

Texto corto, no distingue<br />

mayúsculas de minúsculas<br />

NULL / “ ”<br />

TEXT Texto de tamaño normas NULL / “ ”<br />

MEDIUMTEXT Texto de tamaño medio NULL / “ ”<br />

LONGTEXT Texto de tamaño grande NULL / “ “<br />

ENUM (“val1”,<br />

“val2”,..)<br />

SET (“val1”,<br />

“val2”,..)<br />

DATE<br />

TIME<br />

DATETIME<br />

Una enumeración, lista de<br />

valores fijos establecidos<br />

previamente de los cuales<br />

hay que seleccionar uno.<br />

Un conjunto, lista de valores<br />

fijos establecidos<br />

previamente de los cuales se<br />

puede seleccionar un<br />

numero variable de ellos<br />

Fecha en formato AAAA-<br />

MM-DD, valores<br />

comprendidos entre 1000-<br />

01-01 al 9999-12-31<br />

Hora en formato, hh:mm:ss,<br />

se trata de tiempo<br />

transcurrido, aunque puede<br />

tratarse como tiempo en el<br />

día. De -838:59:59 a<br />

838:59:59<br />

Una fecha y hora con<br />

formatos anteriores.<br />

Limitándose a 1000-01-01<br />

NULL / 1º<br />

valor de la<br />

lista<br />

NULL / “ “<br />

Tipos de fecha y hora<br />

NULL /<br />

0000-00-00 3 bytes<br />

NULL /<br />

00:00:00<br />

NULL /<br />

“0000-00-<br />

00 00:00:00<br />

0 a 2 8 -1 (longitud del valor<br />

más 1 byte para registrar la<br />

longitud)<br />

0 a 2 16 -1 longitud del valor<br />

más 2 byte para registrar la<br />

longitud)<br />

0 a 2 24 -1 longitud del valor<br />

más 2 byte para registrar la<br />

longitud)<br />

0 a 2 32 -1 longitud del valor<br />

más 3 byte para registrar la<br />

longitud)<br />

0 a 2 8 -1 (longitud del valor<br />

más 1 byte para registrar la<br />

longitud)<br />

0 a 2 16 -1 (longitud del valor<br />

más 2 byte para registrar la<br />

longitud)<br />

0 a 2 24 -1 (longitud del valor<br />

más 3 byte para registrar la<br />

longitud)<br />

0 a 2 32 -1 (longitud del valor<br />

más 4 byte para registrar la<br />

longitud)<br />

1 byte para enumeraciones<br />

de 1 a 255 y 2 bytes para<br />

enumeraciones de 256 a<br />

65535 elementos<br />

1 byte (conjunto de 1 a 8<br />

elementos), 2 byte<br />

(conjunto de 9 a 16<br />

elementos), 3 byte<br />

(conjunto de 17 a 24<br />

elementos), 4 byte<br />

(conjunto de 25 a 32<br />

elementos) y 8 byte<br />

(conjunto de 33 a 64<br />

elementos)<br />

3 bytes<br />

8 bytes<br />

Atributos


Tipo<br />

Descripción<br />

Valor<br />

Pred.<br />

Dimensiones<br />

Atributos<br />

00:00:00 hasta 9999-12-<br />

31 23:59:59<br />

TIMESTAMP<br />

Un sello de tiempo en<br />

formato<br />

AAAAMMDDhhmmss, Desde<br />

197001010000000 a<br />

algunas horas del 2037<br />

Fecha y hora<br />

actual<br />

4 bytes<br />

YEAR<br />

Un año en formato AAAA,<br />

desde 1900 a 2155<br />

NULL /<br />

0000<br />

1 byte<br />

El siguiente ejemplo muestra la construcción de una tabla, la operación la deberemos<br />

repetir tantas veces como tablas queramos tener en nuestra bases de datos. Es una de las labores<br />

más tediosas, ya que conlleva múltiples equivocaciones; si en algún momento nos equivocamos<br />

deberemos repetir la operación nuevamente desde el principio, si reconocemos algún error a lo<br />

largo de la introducción de datos es conveniente determinar la línea con punto y coma y comenzar<br />

nuevamente; recordemos que el programa almacena en memoria las últimas ordenes establecidas,y<br />

por tanto, no tendremos que escribir las líneas nuevamente, bastará moverse con los cursores para<br />

repetir las órdenes dadas correctamente.<br />

Vamos a crear una base de datos sobre nuestra colección de minerales en las que deseamos<br />

introducir las características de cada uno de los ejemplares que tenemos, intentaremos establecer<br />

todas las características visuales de los mismos y la situación geográfica donde fue recogida.<br />

Deberemos tener al menos una tabla con las descripciones de de nuestras muestras, otra con las<br />

localizaciones de los yacimientos y una tabla con las características básicas de los diferentes<br />

grupos cristalográficos.<br />

Creación de la base de datos:<br />

CREATE DATABASE minerales;<br />

No debemos olvidar que antes de iniciar el proceso de creación de las tablas debemos establecer<br />

como base de datos activa minerales, para lo cual deberemos activarla con el comando use visto en<br />

el apartado 3.<br />

Creación de la tabla de muestras:<br />

CREATE TABLE muestras(<br />

codigo int primary key not null auto_increment,<br />

nombre varchar(50) not null,<br />

forma varchar(50) not null,<br />

color varchar (50) not null,<br />

brillo enum(“metálico”, “resinoso”, “graso”, “vítreo”, “adamantino”, “mate”),<br />

raya varchar(50),<br />

dureza float(2,2),<br />

densidad float(2,2),<br />

exfoliación varchar(75),<br />

sistemacrista tinyint (3),


yacimiento tinyint(3));<br />

Ilustración 5 Proceso de creación de la base de datos y de la primera tabla, dentro del cliente de Mysql. Las<br />

contestaciones de "Query OK, ..." informan que el comando ha sido ejecutado correctamente.<br />

En las diferentes columnas creadas para la tabla muestras tenemos varias palabras cuyo<br />

significado vamos a describir para entender lo que hemos escrito. El primero que difiere de lo<br />

descrito hasta el momento es primary key, que corresponde a un tipo de índice 7 . Los tipos de<br />

índice que se pueden establecer son los siguientes:<br />

●<br />

●<br />

●<br />

primary key: establece que la columna es una clave principal y solamente puede<br />

contener valores únicos. Dentro de una tabla solamente puede existir un índice primario<br />

Index: es un índice simple en el que permiten repeticiones de elementos. Un índice<br />

especial si se aplica sobre campos de texto, si bien es solamente aplicable a tablas de<br />

tipo MyISAM 8 ; permite crear índices de campos de texto y buscar cadenas o fragmentos<br />

de cadenas en ellos, su único problema es que solo se puede aplicar a un número<br />

determinado de caracteres.<br />

unique: hace que en una columna no puedan existir valores repetidos, es similar a<br />

primry key, pero dentro de una tabla pueden existir varias columnas con este tipo de<br />

índices.<br />

En mysql se pueden crear múltiples índices en cada tabla, e incluso crear índices que<br />

engloben varias columnas dentro del mismo índice.<br />

La siguiente palabra que encontramos es auto_incremente, que se utiliza en campos<br />

numéricos de tipo entero para aumentar el valor del máximo número existente en la columna en<br />

una unidad y asignarla al nuevo registro. No es necesario establecer el valor al rellenar el registro,<br />

ya que el programa se encarga de rellenarlo si el usuario no lo hace; se suele utilizar en las<br />

columnas que tienen primary key asignada. En las columnas de tipo MyISAM puede establecerse el<br />

valor inicial al definir la tabla (auto_increment=n).<br />

La orden que hemos analizado y las siguientes termina con una coma (,), no como los<br />

comandos que finalizan con punto y coma (;), solamente la última linea y después del paréntesis<br />

que finaliza la definición de cada columna termina con punto y coma. Debemos fijarnos también<br />

que esta última linea no finaliza con coma por ser la última del script.<br />

Los dos últimos campos que se han creado tienen valores enteros, lo que hacen referencia a<br />

dos campos claves de dos tablas diferentes; una hace referencia a las características de los<br />

diferentes sistemas cristalográficos y la otra a los yacimientos donde se han recogido las muestras.<br />

En ambos caso realizan un gran ahorro de espacio respecto a los datos introducidos.<br />

7 Un índice es una estructura ligada a las tablas que permite realizar búsquedas dentro de los datos de forma más rápida.<br />

8 Tipo de tablas que se pueden definir dentro de mysql,mirar apéndice A.


El problema de la introducción de la definición de la tabla es que no podemos equivocarnos,<br />

si lo hacemos y confirmamos una linea con la tecla intro no podremos modificarla: si no nos<br />

damos cuenta hasta concluir el script nos mostrara un mensaje de error que marca la primera linea<br />

que contiene el error. Si nos damos cuenta en el momento de dar al intro será mejor terminar una<br />

linea con punto y coma para finalizar el script y poder comenzar de nuevo con la definición de la<br />

tabla. En ambos casos no es necesario escribir nuevamente las lineas antes tecleadas, basta con<br />

presionar las teclas de curso flecha arriba y flecha abajo para visualizar los comandos introducidos<br />

y volver a ejecutarlos, lo que confirmaremos con la pulsación de la tecla intro.<br />

De igual forma que en el caso anterior crearemos dos nuevas tablas que denominaremos<br />

CRISTALOGRAFIA y YACIMIENTOS, y que contendrían las siguientes definiciones de columnas 9 :<br />

CREATE TABLE cristalografia(<br />

codigo int primary key not null auto_increment,<br />

sistema varchar(50) not null,<br />

holometria varchar(70),<br />

holometria1 varchar (70),<br />

holometria2 varchar (70),<br />

constantescaras varchar(50),<br />

constantesangulos varchar(50));<br />

CREATE TABLE yacimiento(<br />

codigo int primary key not null auto_increment,<br />

nombre varchar(50) not null,<br />

uso tinyint(3),<br />

utmx float (15,2),<br />

utmy float(15,2),<br />

provincia varchar(75),<br />

poblacion varchar(75),<br />

roca varchar(75),<br />

tipoyacimiento varchar (50),<br />

acccesibilidad varchar(100));<br />

9 Los campos de holometria1 y 2 son en realidad los correspondientes a las hemiedrías trapezoédrica y escalenoédrica,<br />

Posteriormente serán cambiadas de nombre, en el apartado de modificaciones de la estructura de tablas.


Ilustración 6: Creación de las tablas cristalografia y yacimientos.


5.- Introducción de registros<br />

La tarea más pesada es la de introducir los datos dentro de las diferentes tablas y suele<br />

conllevar múltiples equivocaciones y errores; antes de comenzar esta tarea debemos planificarla<br />

para reducir en lo posible las equivocaciones.<br />

Existen varias formas de introducir los registros, por lo general se suele utilizar una interfaz<br />

de usuario que facilita esta tarea (un programa, una hoja web, una interfaz gráfica de usuario, etc.).<br />

En el caso que nos ocupa vamos a conocer la forma más rudimentaria de introducirlos, desde la<br />

linea de comandos, así como desde ficheros que contienen listados de datos tabulados.<br />

5.1.- Los comandos de linea para introducir registros<br />

La forma más usual de introducir fichas en una tabla es con el comando insert que permite<br />

dos modalidades. La primera de ellas tiene la siguiente forma genérica simplificada:<br />

insert tabla (columna1, columna2, ... , columnan) values (valor1, valor2, ... , valorn);<br />

Las referencias a columna1, ...., columnan, hacen mención a los nombres asignados a cada una de<br />

las columnas de la tabla referida con la palabra 'tabla' del comando, estos campos no tienen<br />

porque estar en el orden en el que creamos la tabla, ni estar todos; los campos no se delimitarán<br />

entre comillas.<br />

Los valores de cada uno de los campos deberán seguir el orden establecidos en estos, es<br />

decir, si cambiamos el orden de los campos respecto a la forma en que se definieron en la tabla,<br />

sus valores deberán respetar el orden de referencia a los campos, tanto en posición como en<br />

número. Si hemos incluido un campo con la clausula not null deberemos asignarle un valor<br />

obligatoriamente, salvo que tengamos un valor por defecto o una clausula auto_increment, en


cuyos caso la falta de valor será asignada al valor por defecto o al incremento de una unidad<br />

respecto al último valor introducido. Un ejemplo de este comando sería:<br />

INSERT cristalografia (codigo, sistema, holometría, holometria1, holometria2, constatescaras,<br />

constantesangulos) VALUES ( 3, “exagonal”, “E6+6E2++7P+C”, “E6+6E2”, “”, “a=b=b'c”,<br />

“A=B=B'C”);<br />

Si no existen fallos de sintaxis en el comando se introducirá en la tabla indicada. Como se puede<br />

apreciar se ha cometido un fallo en la descripción de la holometría, hay dos signos '+', este fallo es<br />

intencionado como el de los nombres de los campos, para ver con posterioridad la forma de<br />

corregirlos.<br />

Ilustración 7: La ilustración muestra los registros existentes en la tabla cristalografia entes y<br />

despues de introducir un nuevo registro, cuyo comando se encuentra entre las dos salidas de<br />

registros.<br />

La otra forma de introducir los registro se realiza con al clausula set y asignando a cada<br />

campo su valor. La forma básica del comando sería:<br />

insert tabla set columna1=valor, columna2=valor, ... columnan=valor;<br />

Como en el caso anterior habría que sustituir columna1...n por los nombres de los campos<br />

asignados en la tabla y valor por los contenidos de cada campo, teniendo en cuenta que las<br />

cadenas de carácter (literales) deberán ir entre comillas dobles. El ejemplo anterior quedaría de la<br />

siguiente forma:<br />

INSERT cristalografia set codigo=3, sistema=“exagonal”, holometría=“E6+6E2++7P+C”,<br />

holometria1=“E6+6E2”, holometria2= “”, constatescaras= “a=b=b'c”,<br />

constantesangulos=“A=B=B'C”;


Estas formas son básicas, los comandos son más complejos y permiten realizar operaciones<br />

más complicadas; la definición completa del comando se encuentra en el apéndice C, donde se<br />

detallan todos los comandos utilizables.<br />

5.2.- Volcado de datos desde un fichero<br />

Otra forma de introducir datos de forma masiva es hacerlo desde un fichero que contenga<br />

estos mismos delimitados y en el orden de los campos de la tabla de datos; cada campo debe estar<br />

delimitado por un separador que puede ser una coma, un punto y coma, un tabulador, etc. Las<br />

cadenas de caracteres deberán estar encerradas entre comillas y cada registro deberá situarse en<br />

una linea del fichero; si existe algún campo con clave única deberemos asegurarnos que ninguno<br />

de los registros a introducir este repetido en dicho campo, así como que no existe en la base de<br />

datos, si existiese se produciría un error y los registros no se introducirían.<br />

El comando de volcado es complicado y no deben come terse errores en su sintaxis; la<br />

forma del comando sería:<br />

LOAD DATA LOCAL INFILE “nombre.fichero” INTO TABLE nombre.tabla;<br />

En esta sentencia se supone que se siguen una serie de normas establecidas o por defecto del<br />

comando, como que el orden de las columnas es el mismo en el que se crearon en la tabla, la<br />

separación entre los campos está establecida por un tabulador y que el final de linea viene dado<br />

por un retorno de carro. Pero esta forma de maquetación de los ficheros no suele ser normal, la<br />

sintaxis más normal podría ser algo parecido a los siguiente:<br />

LOAD DATA LOCAL INFILE “nombre.fichero” INTO TABLE nombre.tabla FIELDS TERMINATED BY<br />

'cadena' ENCLOSED BY 'cadena' LINES TERMINATED BY 'cadena';<br />

La descripción del comando empieza por la clausula LOCAL es optativa, pero si se pone el<br />

servidor supone que el fichero que referencia en nombre.fichero se encuentra en el directorio de<br />

trabajo actual del usuario, esto si no se especifica ningún camino; en caso de que la clausula no se<br />

ponga, el servidor hará el siguiente análisis para encontrar el fichero:<br />

●<br />

●<br />

Si el nombre es un nombre de ruta absoluto, el servidor comenzará a buscar desde el<br />

directorio raíz.<br />

Si el nombre es un nombre de ruta relativo, primero se analizará si solamente contiene<br />

un componente o varios; en el primer caso el servidor buscará el fichero en el directorio<br />

de la base de datos predeterminada; en el segundo caso el servidor comenzará la<br />

búsqueda a partir del directorio de datos.<br />

La clausula INTO TABLE nombre.tabla especifica la tabla donde se volcarán los datos del<br />

fichero; la clausula FIELDS incluye las tras siguientes partes, en la primera se establece la forma de<br />

terminación de cada uno de los campos o columnas de la base de datos, que seguirán las normas<br />

de los caracteres de escape de la tabla 2. ENCLOSED BY “cadena” especifica el carácter que<br />

encerrará las cadenas de caracteres y LINES TERMINATED “cadena” especifica los caracteres que<br />

determinan la terminación de cada registro.<br />

Tabla 2: Caracteres de escape, permiten introducir caracteres especiales en las cadenas alfanuméricas.<br />

Secuencia de escape<br />

\0 ASCII 0<br />

\b Retroceso<br />

\n Linea nueva<br />

\r Retorno de carro<br />

Significado


Secuencia de escape<br />

\s Espacio<br />

\t Tabulador<br />

\'<br />

Comilla simple<br />

\” Comillas dobles<br />

\\ Barra invertida<br />

Significado<br />

Debemos tener en cuenta que el nombre del fichero también debe seguir las normas de los<br />

códigos de escape, por lo que si estamos incluyendo una dirección absoluta con los nombres de<br />

varios directorios, la separación entre los mismos debería hacerse con una doble barra invertida.<br />

El fichero de datos debe contener todos los campos definidos en la base al crearla; además<br />

deberán encontrarse en el mismo orden en el que fueron definidos.<br />

En nuestro ejemplo volcaremos el contenido del fichero minerales.txt que contiene una<br />

colección de muestras de minerales, el comando es el siguiente:<br />

LOAD DATA LOCAL INFILE “c:\\temp\\mineral.txt” INTO TABLE mineral FIELDS TERMINATED BY ';'<br />

OPTIONALLY ENCLOSED BY '\”' LINES TERMINATED BY '\n\r';<br />

Ilustración 8: Entrada de datos desde un fichero<br />

La parte final del comando (\n\r) indica a mysql que cada registro termina con un retorno<br />

de carro y un comando de nueva linea, es decir, que cada registro se encuentra en una linea<br />

independiente. En el fichero de datos que introducimos los valores que corresponden a datos<br />

numéricos no deben ir encerrados entre comillas y los valores decimales indicados con un punto<br />

decimal. La clausula OPTIONALLY de ENCLOSED, indica que solamente los campos var y varchar<br />

estarán delimitados por dobles comillas; si no la pusiésemos todos los campos deberían estar entre<br />

doble comilla.


6.- Modificación de la estructura de la base de datos y registros<br />

Una vez creadas las tablas de la base de datos e introducidos los registro, puede ocurrir que<br />

deseemos modificar la estructura de las tablas o modificar algún registro mal introducido. En otros<br />

caso nos será más fácil eliminar lo introducido y volver a introducirlo nuevamente, ya que las<br />

modificaciones son tantas que perderemos más tiempo en modificar que introducir nuevamente,<br />

pero estos casos son excepcionales y demasiado radicales.<br />

6.1.- Modificación de la estructura de las tablas<br />

En algunos casos es necesario la modificación de la estructura de alguna tabla, los motivos<br />

son variados: se nos ha olvidado un campo, nos hemos confundido en un nombre de campo,<br />

hemos dimensionado mal un campo, nos falta un índice, etc.<br />

Es importante conocer que cualquier variación de la dimensión de los campos de una tabla<br />

afectará a los datos contenidos en ella; por ejemplo, si modifico la dimensión de un campo varchar<br />

disminuyéndola, todos los registros que sobrepasen la nueva dimensión serán cortados, perdiendo<br />

por tanto la información.<br />

La sentencia que nos permitirá realizar las modificaciones es ALTER TABLE, la cual es mi<br />

compleja y versátil, aquí no describiremos todas sus propiedades. La sintaxis básica es la siguiente:<br />

ALTER TABLE nombre_tabla Accion...<br />

Dentro de la opción Accion... tenemos una gran variedad de posibilidades simples, algunos<br />

ejemplos de su uso pueden ser:<br />

●<br />

Renombrado de una tabla:


ALTER TABLE mitabla RENAME AS tutabla<br />

●<br />

Cambio del tipo de una columna: imaginemos que dentro de tutabla tenemos una<br />

columna denominada valor1 y que tiene asignado un entero pequeño (smallint) y<br />

deseamos cambiarlo a un entero medio (mediumint). El comando seria:<br />

ALTER TABLE tutabla MODIFY valor1 MEDIUMINT UNSIGNED<br />

En este caso hemos cambiado el tipo de dato y la propiedad sin signo. Además de la<br />

clausula MODIFY se puede utilizar CHANGE que actúa como sinónimo, La diferencia<br />

fundamental entre MODIFY y CHANGE es que este ultimo puede modificar el nombre de la<br />

columna, cosa que no puede hacer MODIFY. Si utilizamos CHANGE en el caso anterior<br />

deberíamos usar el comando de la siguiente forma:<br />

ALTER TABLE tutabla CHANGE valor1 valor1 MEDIUMINT UNSIGNED<br />

Si deseamos modificar el nombre de la columna bastara cambiar el segundo valor1 por el<br />

nuevo nombre de la columna.<br />

●<br />

Conversión de una tabla de filas de longitud variable a filas de longitud fija.<br />

ALTER TABLE tutabla MODIFY nombre CHAR(10), MODIFY apellido VAR(20), ....<br />

La modificación deberá hacerse en todas las columnas que deseemos que cambien.<br />

También podríamos realizar la operación inversa, es decir, cambiar de CHAR a VARCHAR.<br />

●<br />

Añadir una nueva columna a la tabla: nos añadirá una nueva columna a la que deberemos<br />

de asignar sus características de la misma forma que hicimos cuando definimos la tabla,<br />

por ejemplo:<br />

ALTER TABLE tutabla ADD calle VARCHA(30) NOT NULL<br />

●<br />

Borrar una columna:<br />

ALTER TABLE tutabla DROP calle<br />

●<br />

Añadir indices:<br />

ALTER TABLE tutabla ADD INDEX nombre_indice (lista_columnas)<br />

En esta opción se puede modificar la palabra INDEX puede ser sustituida por UNIQUE o<br />

PRIMARY KEY, con lo que podremos crear los otros tipos de indicies; debemos recordar<br />

que una tabla solamente puede contener un primary key. La opción lista_columnas debe<br />

contener al menos una columna, aunque el índice puede estar formado por varias columnas<br />

● Conversión del tipo de tabla podemos cambiar el tipo de tabla (Apéndice A)<br />

ALTER TABLE tutabla TYPE = MYISAM<br />

Para nuestro ejemplo vamos a modificar la tabla cristalografía que contenía dos campos con<br />

el nombre mal puesto y además, debemos introducir otros dos campos nuevos. En el primer caso<br />

vamos a cambiar los nombres de los campos Holometría 1 y 2 por los de Hemiedría trapezoides<br />

y Hemiedría escalenoédicas; además añadiremos los campos de Hemiedría octaédricas<br />

pentagonal, Clase escalenoédicas y Clase piramidales. Los comandos para modificar los<br />

nombres son:<br />

ALTER TABLE cristalografía CHANGE holometria1 hemiedriatrapezoe varchar(70);<br />

El resultado se puede ver en la figura 9, repetiremos la operación para cambiar la segunda<br />

holometria en hemiedría escalenoédrica con el comando siguiente:


Ilustración 9: Modificación del nombre de una columna<br />

ALTER TABLE cristalografia CHANGE<br />

holometria2 hemiedriaescaleno<br />

varchar(70);<br />

La siguiente modificación será la<br />

introducción de las nuevas columnas que se<br />

realizarán con los siguientes comandos:<br />

ALTER TABLE cristalografía ADD<br />

hemiedriadodecae varchar(70);<br />

ALTER TABLE cristalografía ADD<br />

claseescalenoe varchar(70);<br />

ALTER TABLE cristalografía ADD<br />

clasebipirami varchar(70);<br />

El resultado de la modificación se muestra en la<br />

ilustración 10; debemos recordar que la tabla ha<br />

sido modificada pero los nuevos campos no<br />

contienen datos, debemos completar la tabla<br />

para poderla utilizar correctamente en el resto de<br />

la práctica, lo cual podemos realizar<br />

introduciendo los datos del archivo<br />

cristalografía1.txt.<br />

Ilustración 10: Modificación de la tabla cristalografia<br />

con la entrada de nuevos columnas o atributos<br />

6.2.- Borrado de los elementos de una base de datos<br />

Tanto las bases de datos completas como de forma parcial, registro o tablas, pueden ser<br />

eliminadas. Esta eliminación es completa, al menos no son recuperables desde el programa gestor.


Para eliminar una base de datos completa basta con un comando que eliminará toda la<br />

base, incluyendo registros y tablas. El comando solamente se debe de utilizar en ocasiones<br />

puntuales, ya que por muy mal que hallamos iniciado una base de datos, siempre hay opciones<br />

para modificarla y mejorarla; perder los datos supone en muchos casos la perdida de tiempo<br />

dedicado a crearla. El comando de eliminación es:<br />

DROP DATABASE nombre_base_datos;<br />

En nuestro ejemplo no vamos a realizar esta operación ya que perderíamos todo el trabajo<br />

realizado hasta el momento.<br />

El borrado de una tabla es un comando parecido, pero en este caso solamente se borrara la<br />

tabla y todos los registros contenidos en ella; al igual que en el caso anterior es un comando que<br />

debemos restringir en lo posible. El comando para borrar la tabla cristalografía seria:<br />

DROP TABLE cristalografia;<br />

El Borrado de registros concretos de una tabla no se realiza con la sentencia DROP, si no<br />

con la sentencia DELETE; esta sentencia borrara los registros que le indiquemos, por lo que si nos<br />

descuidamos podríamos eliminar la totalidad de los registro introducidos. Pero a diferencia del<br />

comando anterior, aunque borremos todos los registros, la estructura de la tabla permanece sin<br />

borrarse, en otras palabras la dejamos vacía. La forma más simple de esta sentencia borrará todos<br />

los registros de una tabla y es la siguiente:<br />

DELETE FROM nombre_tabla;<br />

Si nuestra intención es borrar un registro determinado o conjunto de registros deberemos<br />

especificarlo a través de una expresión WHERE 10 correcta, por ejemplo si deseamos borrar el<br />

registro introducido con id igual a 1 la sentencia seria:<br />

DELETE FROM minerales WHERE id=1;<br />

Si deseáramos borrar todos los registro cuya dureza sea superior a 7 la sentencia sería:<br />

DELETE FROM minerales WHERE DUREZA >7;<br />

La sentencia DROP también se utiliza para la eliminación de índices, si bien también se<br />

puede realizar con la sentencia ALTER. En el primero de los casos la forma básica sería:<br />

DROP INDEX nombre_indicie ON nombre_tabla;<br />

En el segundo de los casos sería:<br />

ALTER TABLE nombre_tabla DROP INDEX nombre_índice;<br />

En el caso de eliminar un PRIMARY KEY no será necesario especificar el nombre del indicie, ya que<br />

una tabla solamente puede contener un índice de este tipo.<br />

6.3.- Modificación de registros<br />

Existen dos formas de modificar registros, La más simple es la realizada con el comando<br />

UPDATE, cuya estructura es muy parecida a DELETE. La forma básica es :<br />

10 La clausula WHERE se utiliza en varias sentencias de MYSQL para restringir aquello que deseamos realizar, en el caso de<br />

una búsqueda delimitaremos esta a unos pocos registros, en el caso de eliminación de registro permitirá borrar aquellos<br />

que cumplen una determinada condición, así como en la modificación de registros. La forma de construir una condición<br />

valida es indicando las columnas con los valores que marcarán la restricción; cada columna y su valor, en el caso de que<br />

existan varias, se encontrarán separadas de las demás por un operador lógico (and, or, not)<br />

La columna y su valor pueden estar relacionado a través de cualquiera de los operadores de relación permitidos por<br />

MYSQL.


UPDATE nombre_tabla SET columna=cambio WHERE condición;<br />

Recordar que cambio hace referencia al nuevo contenido, por tanto si este corresponde a una<br />

cadena de caracteres deberá ir encerrado entre comillas. La clausula WHERE en cierta forma es<br />

obligatoria, ya que si no se pusiera todos los valores de la columna indicada se modificaría a lo<br />

marcado en cambio. La forma en delimitar los cambios es indicando en la clausula WHERE los<br />

registros que cumplen una o varias condiciones para ser modificados.<br />

Un ejemplo de utilización podría ser el siguiente: imaginemos que durante la introducción<br />

de los datos hemos cometido un error en una de nuestras muestras, en un cristal de cuarzo<br />

transparente hemos equivocado su dureza y hemos puesto 2 en vez de 7; además nuestra<br />

colección dispone de varios cuarzos, pero ninguno de ellos es transparente. La forma de<br />

modificación más sencilla seria conocer el id del registro y hacer la sustitución de la siguiente<br />

forma:<br />

UPDATE mineral SET dureza=7 WHERE id=1;<br />

Imaginemos ahora que no conocemos el id y debemos hacer la modificación con las características<br />

indicas anteriormente, así tendríamos:<br />

UPDATE mineral SET dureza=7 WHERE (nombre=”cuarzo” and color=”transparente”);<br />

No es necesario los paréntesis, si bien son preferibles para entender mejor el comando.<br />

Existe otra forma de modificación de los registros, si bien necesita de un requisito especial,<br />

la tabla donde se realizará la modificación debe contener un indicie PRIMERY KEY, si este indicie<br />

no existe el intento de modificación se convertida en el duplicado del registro. El comando que<br />

permite modificar el registro previo es REPLACE, su funcionamiento es similar al de la sentencia<br />

INSERT vista en la introducción de registros; en el caso de que en la tabla contenga un índice único<br />

(UNIQUE o PRIMARY KEY) y el registro existe dentro de la tabla, la modificación consistirá en<br />

eliminar el registro existente en la tabla y sustituirlo por el nuevo. En este comando debemos<br />

introducir todos los valores de los campos, si dejamos alguno sin poner quedara en blanco; un<br />

ejemplo pude ser:<br />

REPLACE INTO muestras SET id=1, nombre=”cuarzo”, forma=”prismático”, color=”incoloro”,<br />

brillo=”vítreo”, raya=”blanca”, dureza=7.0, densidad=2.65, exfoliacion=””, sistemacrista=3,<br />

yacimiento=0;<br />

En este caso se sustituirá el registro del cuarzo por este nuevo registro.


7.- Selección de registros<br />

Uno de los comandos más utilizados en MYSQL y de otros gestores de bases de datos<br />

basados en el estándar SQL es SELECT, ya que nos permite recuperar información y realizar la<br />

unión entre las diferentes tablas que componen una base de datos. Es un comando muy versátil y<br />

por tanto complejo en sus formas mas enrevesadas.<br />

7.1.- Selecciones básicas<br />

La complejidad de las búsquedas la aprenderemos paulatinamente, comenzando con un<br />

ejemplo simple al que iremos complicando poco a poco, en nuestro caso para ver todos los<br />

registros de una tabla basta con escribir:<br />

SELECT * FROM muestras;<br />

En este caso se nos mostrarán todos los registros con todos sus campos (*) de la tabla<br />

muestras. En este caso no mostraremos una pantalla de ejemplo ya que ocuparía mucho espacio. Si<br />

no deseamos mostrar todos los campos de la tabla deberemos indicar , separados por comas,<br />

aquellos que deseamos ver de la siguiente forma:<br />

SELECT código, nombre, color FROM muestras;<br />

En este caso solamente se nos mostrará de todos los registros el identificador, el nombre y el color.


Si deseamos especificar algunos<br />

criterios de búsqueda, sobre todo para<br />

restringir el número de registros<br />

mostrados utilizaremos la clausula<br />

WHERE, ya mencionada en apartados<br />

anteriores. Los diferentes operados que<br />

podemos utilizar dentro de esta clausula<br />

son los mostrados en la tabla 2. Un<br />

ejemplo de utilización de la clausula<br />

WHERE podrían ser los siguientes:<br />

SELECT nombre, color, forma<br />

FROM muestras WHERE codigo=13;<br />

Ilustración 11: Muestra de una selección parcial<br />

SELECT nombre, color, forma<br />

FROM muestra WHERE (dureza<br />

>=7 AND densidad >= 2.2);<br />

Ilustración 12: Salida del comando Select con el uso de la clausula where<br />

En el primero de los casos buscamos un registro concreto, si recordamos cuando creamos<br />

la tabla, asignamos a esta un índice PRIMARY KEY basado en el campo código por los que este<br />

campo solamente puede tener un registro con valor 13, es único. En el segundo caso estamos<br />

buscando los registros que contienen minerales con durezas mayores o iguales a 7 y densidades<br />

mayores o iguales a 2.2.


Operadores<br />

Aritméticos Comparación Lógicos<br />

Adición + Menor que < Y AND<br />

Sustracción - Menor o igual que =<br />

Mayor que ><br />

Tabla 3: Operadores que pueden ser utilizados con la sentencia WHERE<br />

Tenemos un problema con el valor NULL de los campos, es especial ya que no significa un<br />

valor 0, sino nulo. Para poder tratar este valor con la clausula WHERE debemos utilizar una de las<br />

siguientes formulas:<br />

SELECT .......... WHERE color IS NULL;<br />

-> que contenga nulo en color<br />

SELECT .......... WHERE color IS NOT NULL;<br />

SELECT .......... WHERE color NULL;<br />

-> que no contenga nulo en color<br />

-> equivalente a la primera<br />

SELECT .......... WHERE NOT (color NULL);<br />

-> equivalente a la segunda<br />

El siguiente paso en la complicación de nuestra sentencia SELECT es pedir que la<br />

información a mostrase se ordene por alguno de los campos de la tabla, puede ser de forma<br />

alfabética, por densidades, por durezas o por varias a la vez. Esto se puede realizar con la clausula<br />

ORDER BY, si lo aplicamos al segundo ejemplo anterior, el comando queda de la siguiente forma:<br />

Ilustración 13: Comparación entre dos selecciones de registros una sin ordenación y otra ordenada por el<br />

campo nombre


SELECT nombre, color, forma FROM muestra WHERE (dureza >=7 AND densidad >= 2.2) ORDER BY<br />

nombre;<br />

Podemos adamás agrupar los resultados en función de alguno de los campos con la<br />

clausula GROUP BY lista_columnas, la salida mostrara grupos de registros según el orden<br />

especificado.<br />

Como última modificación al comando escrito dentro de este apartado, será el limitar los<br />

registros que deseamos ver; supongamos que solo queremos los tres primeros registros, el<br />

comando será:<br />

SELECT nombre, color, forma FROM muestra WHERE (dureza >=7 AND densidad >= 2.2)<br />

ORDER BY nombre LIMIT 3;<br />

Con esta modificación solamente se nos mostrarán los tres primeros registro de la lista. Es<br />

importante mantener esta estructura de las clausulas para que el servidor comprenda nuestras<br />

peticiones.<br />

7.2.- Unión de tablas<br />

Existen varias formas de unión de tablas, la elección de una u otra dependerá del resultado<br />

que deseemos obtener o bien de nuestras necesidades. Seguidamente describiremos cada una de<br />

ellas.<br />

7.2.1.- Unión completa<br />

Consiste en obtener un producto cartesiano de varias tablas, cruzándose cada registro de<br />

una tabla con todos los de la siguiente, este tipo de unión se conoce también como unión cruzada.<br />

El comando es el más simple y en el solamente es necesario nombrar las tablas a cruzar.<br />

SELECT muestras.*, cristalografia.* FROM muestras, cristalografia;<br />

7.2.2.- Unión equi<br />

Es similar a la anterior pero con la presencia de una clausula WHERE que limitara el número<br />

de registro seleccionados a aquellos que tengan igual en un determinado campo. En nuestro caso<br />

podría ser:<br />

SELECT muestras.*, cristalografia.* FROM muestras, cristalografia<br />

muestra.sistemacrista=cristalografía.codigo;<br />

En este caso obtendremos una tabla con cada muestra y las características del sistema<br />

cristalográfico de la misma.<br />

Es similar a la forma anterior la siguiente que utiliza la palabra reservado JOIN:


SELECT muestras.*, cristalografia.* FROM muestras JOIN cristalografia<br />

muestra.sistemacrista=cristalografía.codigo;<br />

ON<br />

7.2.3.- Unión STRAINGHT_JOIN<br />

Es similar al Unión completa pero en este caso se hace caso al orden en que se especifican<br />

las tablas. Hay dos formas de realizarlo:<br />

SELECT STRANINGHT_JOIN muestras.*, cristalografia.* FROM muestras, cristalografia;<br />

o<br />

SELECT muestras.*, cristalografia.* FROM muestras STRANINGHT_JOIN cristalografia;<br />

7.2.4.- Unión izquierda<br />

La unión equi solamente muestra los registros en donde se puede encontrar una relación<br />

entre las dos tablas, en el caso de la unión izquierda además se mostrarán las filas de la tabla<br />

izquierda que no tiene correspondencia con la tabla derecha. Un ejemplo será:<br />

SELECT muestras.*, cristalografia.* FROM muestras LEFT JOIN cristalografia ON<br />

muestras.sistemacrista=cristalografia.codigo;<br />

Adamás de ON se puede utilizar la palabra clave USING (lista_columnas) en donde lista de<br />

columnas son nombres de columnas coincidentes en ambas tablas.<br />

También existe la unión derecha (RIGHT JOIN) con las mismas características de lo<br />

expuesto pala unión izquierda.<br />

7.3.- Unión de búsquedas<br />

Desde la versión 4 de MYSQL es posible la unión en una misma salida de varias selecciones,<br />

el comando que permite esta operación en UNION. El resultado aparecerá como una única tabla en<br />

la que se mostrarán la primera selección seguida de la segunda. Un ejemplo de esta operación<br />

pode ser:<br />

SELECT * FROM muestras WHERE dureza > 7 UNION SELECT * FROM muestras WHERE<br />

dureza< 2;<br />

7.4.- Tipos de salida de las búsquedas<br />

Por defecto cualquier búsqueda que realicemos se direcciona al monitor del ordenador,<br />

pero esto se puede variar. Si deseamos que nuestras salidas se guarden en un archivo basta con<br />

indicarlo con la clausula INTO OUTFILE seguido del nombre del fichero entre comillas. Es


importante tener permisos de escritura para que no se produzcan errores y si estamos trabajando<br />

en windows, la barra separadora de directorios debe ser doble 11 . Un ejemplo puede ser :<br />

SELECT codigo, nombre, color, dureza FROM muestras WHERE dureza > 7 UNION SELECT<br />

codigo, nombre, color, dureza FROM muestras WHERE dureza< 2 INTO OUTFILE<br />

“c:\\temp\\salida1.txt”;<br />

El fichero de salida es necesario que no exista, si así fuese se producirá un error al intentar<br />

grabarse el resultado.<br />

La salida suele ser un poco básica, pero puede ser mejorada con las opciones de salida,<br />

cuyas reglas son las mismas que se utilizaron en la sentencia LOAD DATA. La salida del ejemplo<br />

anterior es:<br />

5 Andalucita Rosado 7.50<br />

10 Berilo Verde claro 8.00<br />

11 Turmalina Negro 7.50<br />

28 Rejalgar Rojo anaranjado 1.50<br />

33 Molibdenita Gris plomizo 1.00<br />

39 Grafito Gris 1.00<br />

40 Azufre Amarillo 1.50<br />

45 Bausita Blanco 1.00<br />

48 Pirolusita Negro 1.00<br />

55 Fosforita Blanco-anaranjado 0.00<br />

60 Eritrina Carmín 1.50<br />

Ilustración 12: Salida en pantalla de la búsqueda y escritura del comando de salida aun fichero<br />

11 Recordemos que la barra “\” es un carácter especial en MYSQL y la forma de indicar que deseamos ponerla es “\\”.


8.- Copias de Seguridad<br />

Aunque seamos muy escrupulosos en nuestro trabajo, tengamos el ordenador con<br />

doscientos candados para que solamente lo toquemos nosotros, es posible que por circunstancias<br />

ajenas a nuestros designios, un accidente provoque la perdida de datos. En estos casos se hecha de<br />

menos aquellas recomendaciones de hacer copias de seguridad. MYSQL tiene un comando externo<br />

que nos permite realizar copias de seguridad de nuestros datos en muy poco tiempo; en realidad<br />

este comando lo que crea es un script con los comandos necesarios para que se regenere toda la<br />

base de datos, sus tablas y registros.<br />

Este comando es MYSQLDUMP y funciona desde el pront del sistema, el resultado de la<br />

ejecución genera un fichero de texto plano editable desde cualquier editor de texto. Es importante<br />

que si lo modificamos en un procesador de texto lo guardemos como fichero de texto, de lo<br />

contrario el cliente MYSQL no lo reconocerá. La forma básica del comando se:<br />

mysqldump base_datos > fichero_salida<br />

Esta es una forma muy simple y por lo general deberemos indicar el usuario y clave que<br />

tenemos para realizar la copia, con lo que tendremos limitadas las opciones a extraer ficheros de<br />

datos, salvo que seamos el administrador. En caso de tener que dar estos parámetros el comando<br />

anterior quedaría:<br />

mysqldump -u usuario -p base_datos > fichero_salida<br />

Antes de ejecutarse el comando se nos pedirá que confirmemos la clave de acceso y si esta es<br />

correcta se ejecutará el comando generando el fichero.<br />

El modo de recuperar una copia de seguridad es tan simple como lo es el crearla, basta con<br />

ejecutar el comando de la siguiente manera:<br />

mysql -u usuario -p < fichero_salida<br />

Entendiendo por fichero salida el creado anteriormente.<br />

Podemos modificar la creación estándar del fichero con comandos para que se ejecuten<br />

antes de la creación de la base de datos en su recuperación, estos comandos se situarán en la


cabecera del escript y serán los primeros en ejecutarse antes de la creación de la base de datos, la<br />

forma de introducirlos durante la creación de la copia de seguridad es la siguiente:<br />

mysqldump -u usuario -p --add-drop-table --lock-tables --databases --user=pepito --<br />

password nombre_base > nombre_fichero<br />

El fichero resultante contendrá una serie de comandos que chequearan la existencia de la base de<br />

datos y de sus tablas; en el caso que la base de datos se creará nueva, tanto tablas como registros<br />

previos sería borrados, para crearlos nuevamente desde la copia de seguridad.


APENDICE A: Tipos de tablas dentro de Mysql.<br />

Mysql permite usar varios tipo de almacenamiento en las tablas, dependiendo del uso que<br />

vallamos a hacer de los datos. Los tipos soportados son:<br />

●<br />

●<br />

ISAM: es el más antiguo y se mantiene para permitir la compatibilidad con versiones<br />

inferiores a la 3.23 de Mysql. El nombre proviene de la abreviación de indexed<br />

sequential access method (método de acceso secuencial indexado).<br />

MYISAM: es tipo predeterminado; tiene de diferencia con el anterior que los ficheros<br />

pueden ser mayores, el formato es independiente de la maquina siendo el byte menor el<br />

primero, los valores de índice numérico son menores, mejora del uso de<br />

AUTO_INCREMENT, puede indexar columnas con valores NULL, BLOB y TEST, tiene<br />

mejoras en la comprobación de la integridad de la tablas. Estas tablas pueden ser de tres<br />

tipos:<br />

➢<br />

➢<br />

Estíticas: se activara como estática si la tabla no contiene campos de tipo<br />

VARCHAR, TEXT o BLOB. Los registros siempre ocupan el mismo tamaño, son las<br />

más rápidas cuando se trata de leer información desde el disco y ocupan mayor<br />

espacio que las dinámicas.<br />

Dinámicas. se activan automáticamente si alguno de sus campos son de tipo<br />

VARCHAR,TEXT o BLOB. Cada registro estará precedido de un valor que indica el<br />

espacio que el registro ocupa, requiera menos espacio que las anteriores, pero se<br />

necesita más tiempo para el acceso a los datos.<br />

➢ Comprimidas: el espacio ocupado es mínimo y solamente se puede leer de ella ,<br />

mejora el acceso a los datos en dispositivos muy lentos.<br />

●<br />

InnoDB: son tablas que proporcionan bloqueo por registro y control de transacciones,<br />

con lo que cumplen el estándar ACID (Atomic, Consistent, Isolated and Durable), para<br />

lo cual se sacrifica un poco de la velocidad de mysql. La diferencia fundamental con el


tipo anterior es que en este tipo al hacer una modificación sobre un registro de una tabla<br />

solamente queda bloqueado el registro en cuestión, mientras que con MYISAM se<br />

bloquea toda la tabla. La opción de transacciones permite que cuando sobre los datos de<br />

las tablas se estén realizando operaciones estas estarán confirmadas entre los dos<br />

extremos de la transacción, si alguno de ellos falla la operación se anulará. Son las bases<br />

de datos usadas generalmente por los bancos.<br />

●<br />

●<br />

HEAP: son tablas que se almacenan en memoria RAM, lo que las hace muy rápidas; su<br />

desventaja es que solamente son activas mientras el servidor se encuentre encendido, al<br />

apagarse se borran de memoria.<br />

MARGE: son tablas especiales que nos permiten agrupar tablas con idénticas<br />

características, lo que permite simplificar la gestión de las mismas. Esto es muy cómodo<br />

cuando las tablas son muy grandes o necesitamos manejar muchas tablas pequeñas.


Apendice B: Operadores y funciones de Mysql<br />

OPERADORES<br />

Lo primero que se debe conocer de los diferentes operadores que posee Mysql es la<br />

prioridad de operación, así los operadores en un nivel superior de prioridad se evaluarán antes que<br />

los que se encuentran por debajo de él. La precedencia es:<br />

BINARY<br />

NOT !<br />

– (menos unario)<br />

* / %<br />

+ -<br />

><br />

&<br />

|<br />

< = > IN IS LIKE REGEXP RLIKE<br />

BETWEEN<br />

AND &&<br />

OR ||<br />

A la hora de realizar cualquier opración se pueden utilizar parentesis para variar o mejorar<br />

la visualización de la misma.<br />

1.- Operadores aritméticos<br />

Los operadores básicos aritméticos (+ - * / %) solo aptos para operaciones con números, no<br />

con cadenas de caracteres. La aritmética con valores NULL en los campos da como resultado NULL.<br />

Los operadores y su significado son:<br />

● + Calcula la suma de los argumentos.


● - Calcula la diferencia entre los argumentos siempre que se encuentre entre ellos. Si se<br />

encuentra delante del argumento a operar, modificará el signo de este.<br />

● * Calcula el producto de los operandos.<br />

● / Determina el cociente de la división de los operandos.<br />

● % Operador de modulo. Calcula el resto de la división de los operandos.<br />

2.- Operadores de comparación<br />

El comportamiento de estos operadores durante los cálculos es de devolver 1 si la<br />

comparación es verdadera y 0 si es falsa. Son posibles de usas con números y con cadenas de<br />

caracteres. Existen una serie de normas para su utilización, que son:<br />

1. Todas las operaciones con valores NULL dan como resultado NULL, salvo con el<br />

operador (NULLNULL da verdadero).<br />

2. Si los dos argumentos de la comparación son cadenas, estas se comparan<br />

lexicográficamente, el conjunto de caracteres para comparar será el activo en el servidor.<br />

3. Si los argumentos son números enteros se les compara como tales.<br />

4. Las constantes hexadecimales que no son comparadas con ningún número lo son con<br />

cadenas binarias.<br />

5. Si el operador es un valor TIMESTAMP o DATETIME y el otro es una constante, los<br />

argumentos son comparados como TIMESTAMP.<br />

6. Si no se aplica ninguna de las normas anteriores los argumentos de la comparación<br />

serán evaluados como números de coma flotante. Las cadenas se convierte a 0 si no<br />

contiene números (solo números).<br />

Los operadores y su significado son:<br />

● = Devuelve 1 si los argumentos son iguales.<br />

● Es similar al anterior, salvo que puede operar con valores NULL.<br />

● != ó Devuelve 1 si los argumentos son distintos.<br />

● < Devuelve 1 si el argumento a la izquierda es menor que el de la derecha.<br />

● = Devuelve 1 si el argumento a la izquierda es mayor o igual que el de la derecha.<br />

● > Devuelve 1 si el argumento a la izquierda es mayor que el de la derecha.<br />

●<br />

●<br />

expr. BETWEEN min AND max Devuelve 1 si min es menor o igual que expr y si max<br />

es mayor o igual que expr. Si exp es una cadena los argumentos se comparan<br />

lexicográficamente; sin es un entero los argumentos se comparan como enteros.<br />

expr IN (valor1, valor2, ..) ó expr NOT IN (valor1, valor2, ...) Devolverá 1 si expr es<br />

uno de los valores de la lista, de lo contrario devolverá 0. En la otra expresión devolverá<br />

1 si el valor de expr no se encuentra en la lista.


●<br />

expr IS NULL, expr IS NOT NULL ó IS NULL Devolverá 1 en la primera expresión si expr<br />

en NULL, lo contrario que en la segunda expresión y en la tercera, devolverá 1 si el<br />

argumento contiene valor NULL, si lo que deseamos averiguar es si no contiene NULL<br />

utilizaremos la forma IS NOT NULL.<br />

3.- Operadores a nivel de bits<br />

Estos operadores se utilizan con valores BIGINT (enteros de 64 bits) que limitan el alcance<br />

de las operaciones convencionales. La operación con valores NULL da NULL. Los operadores son:<br />

● | Calcula el desplazamiento de bit 0 de los operadores (unión) Ejemplo:<br />

1 | 2 -> 3<br />

● > Desplaza hacia la derecha el valor del argumento situado a la izquierda del<br />

operador tantas veces como el valor del argumento situado a la derecha marque. El<br />

cambio de una cantidad negativa da 0. Ejemplo:<br />

16 >> 3 -> 2<br />

4.- Operadores lógicos<br />

Son también conocidos como booleanos comprueban la veracidad o falsedad de las<br />

expresiones. Se devuelve 1 si la expresión es verdadera y 0 si es falsa.<br />

●<br />

●<br />

●<br />

NOT ó ! (negación lógica) Devuelve 1 si el siguiente operando es falso y 0 si es<br />

verdadero, salvo que NOT NULL sea NULL.<br />

OR ó || (O lógico) Devuelve 1 si cualquiera de los operandos es verdadero y 0 si todos<br />

son falsos.<br />

AND ó && (Y lógico) Devuelve 1 si todos los operandos son verdaderos, si todos o<br />

alguno es falso devuelve 0.<br />

5.- Operadores de promoción<br />

Solamente existe el operador BINARY que hace que el operando al que acompaña sea<br />

tratado como una cadena binaria, por tanto las letras se diferenciarán en mayúsculas y minúsculas.<br />

Los números serán tratados como cadenas de caracteres. Devolverá 1 si las cadenas de caracteres<br />

coinciden y 0 si no coinciden.


6.- Operadores de patrón de equivalencia<br />

Se utilizan como patrones de equivalencia SQL. Los patrones de equivalencia SQL<br />

devolverán un resultado si los patrones se ajustan completamente con el valor indicado en el<br />

patrón.<br />

● cadena LIKE patrón [escape'c'] cadena NOT LIKE patrón [escape'c']. LIKE lleva a<br />

cabo una comparación de patrón, devolverá 1 si la cadena coincide totalmente con el<br />

valor indicado en patrón, en caso contrario devuelve 0. Existe unos caracteres que<br />

pueden ser utilizados como comodines: % coincide con cualquier secuencia de caracteres<br />

diferentes de NULL y coincide con cualquier carácter sencillo. No se considera la<br />

diferenciación entre mayúsculas y minúsculas, salvo que la cadena sea binaria. Ejemplo:<br />

“catatonico” LIKE “cat%” -> 1<br />

● cadena REGEXP patrón cadena NOT REGEXP patrón. REGEXP lleva a cabo la<br />

comparación entre la cadena y el patrón de forma extendida devolviendo 1 si la cadena<br />

patrón aparece en cualquier parte de la cadena y 0 si no aparecen. Se pueden utilizar<br />

una serie de comodines dentro de la cadena de búsqueda, los cuales aparecen en la tabla<br />

4.<br />

Tabla 4: Secuencias de expresiones regulares extendidas<br />

^<br />

Secuencia<br />

Coincide con el principio de la cadena<br />

$ Coincide con el final de la cadena<br />

Significado<br />

. Coincide con culaquier carácter sencillo, incluso con el de linea nueva<br />

[...] Coincide con los caracteres que aparecen entre los parentesis<br />

[^...]<br />

Coinciden con los caracteres que no aparecen entre los parentesis<br />

e* Coincide con ninguna o más instancis del elemento patrón e<br />

e+ Coincide con una o más instancias del elemento patrón e<br />

e? Coincide con ninguna o más instancias del elemento patrón e<br />

e1|e2<br />

e{m}<br />

e{m,}<br />

e{,n}<br />

e{m,n}<br />

Coincide con el elemento patrón e1 o e2<br />

Coincide con m instancial del elemento patrón e<br />

Coincide con m o más instancias del elemento patrón e<br />

Coinciden de 0 a n instancias del elemento patrón e<br />

Coinciden de m a n instancias del elemento patrón e<br />

{...} Agrupa los elementos patrón en un elemento sencillo<br />

Otros<br />

Caracteres no especiales coinciden cansigo mismo<br />

●<br />

cadena RLIKE patrón cadena NOT RLIKE patrón. son sinónimos de REGEXP<br />

Las secuencias de escape son similares a las de C y han sido señaladas dentro de la práctica.<br />

FUNCIONES<br />

Las funciones son pequeños conjuntos de código que realizan una operación, tras la cual<br />

devuelven un valor. Si se pasan argumentos múltiples a una función estos estarán separados por<br />

comas.


1.- Funciones de comparación<br />

●<br />

GREATEXT(expr1, expre2, ...) Devuelve el argumento de mayor valor de la secuencia. Las<br />

reglas por las que se rige son:<br />

> Si los argumentos son enteros los números serán comparados como enteros.<br />

> Si los números pasados como argumentos son en su totalidad valores de coma<br />

flotante, serán comparados como de coma flotante.<br />

> Si no se cumple nada de lo anterior los argumentos son tratados como cadenas.<br />

●<br />

●<br />

●<br />

●<br />

●<br />

●<br />

IF (expr1, expr2, expr3) Si expr1 es verdadero (ni 0 ni NULL) devuelve expr2, de lo<br />

contrario devuelve expr3.<br />

IFNULL(expr1,expr2) Devuelve expr2 si el valor de expr1 es NULL, de lo contrario<br />

devuelve expr1.<br />

INTERVAL (n, n1, n2, ...) Devuelve 0 si n


● MOD(m,n) Devuelve el resto de la división de m entre n.<br />

●<br />

PI() Devuelve el valor de PI.<br />

● POW(x,y) Devuelve el valor de x elevado a la potencia y.<br />

●<br />

●<br />

POWER(x,y) sinónimo del anterior.<br />

RADIANS(x) Convierte el valor de x de grados a radianes.<br />

● RAND(), RAND(n) Devuelve un valor aleatorio de coma flotante entre 0 y 1, en la<br />

segunda opción hace lo mismo pero utiliza n como valor base para el sistema de<br />

generación de números aleatorios.<br />

●<br />

●<br />

●<br />

ROUND(x), ROUND(x,d) Devuelve el valor de x redondeado al entero más próximo. En el<br />

segundo caso devuelve el valor de x redondeado a d posiciones decimales.<br />

SIGN(x) Devuelve el valor de 1 si x es positivo, 0 si el valor es 0 y -1 si es negativo.<br />

SIN(x) Devuelve el seno de x que debe estar en radianes.<br />

● SQRT(x) Devuelve la raíz cuadrada no negativa de x.<br />

●<br />

●<br />

TAN(x) Devuelve la tangente de x que debe estar en radianes.<br />

TRUNCATE(x,d) Devuelve el valor de x truncado en d posiciones decimales. Si d es 0, el<br />

resultado no tiene parte fraccionaria. Si d es mayor que el número de decimales, x se<br />

rellena de 0 hasta completar la cantidad necesaria.<br />

3.- Funciones de cadenas<br />

La mayoría de las funciones de este tipo devuelven un resultado de tipo cadena, salvo las<br />

referidas a longitud de cadenas y las de conversión de caracteres.<br />

●<br />

ASCII(cad) Devuelve al valor ascii del carácter situado más a la izquierda de la cadena.<br />

● BIN(n) Devuelve el valor binario (carácter) correspondiente al número n.<br />

●<br />

●<br />

●<br />

●<br />

●<br />

●<br />

CHAR(n1, n2,...) Traduce los argumentos a caracteres.<br />

CHAR_LENGTH(cad) Sinónimo de LENGTH.<br />

CHARACTER_ LENGTH(cad) Sinónimo de LENGTH.<br />

COALES(expr1,expr2, ...) Devuelve el primer elemento no NULL de la lista de<br />

expresiones.<br />

CONCAT(cad1, cad2, ...) Devuelve una cadena compuesta por la concatenación de todos<br />

los argumentos, o NULL si el argumento es NULL.<br />

CONV(n, de_base, a_base) Convierte el valor de n (número) de la base especificada en<br />

de_base a la base especificada en a_base, devolviendo una cadena de caracteres. El valor<br />

de n es tomado como un BIGINT y el valor asignado a n debe ser un número valido en la<br />

base de_base. Tanto de_base como a_base deben ser enteros comprendidos entre 2 y<br />

36.


●<br />

ELT(n,cd1,cad2,...) Devuelve una cadena de n elementos de la lista de cadenas; devuelve<br />

NULL si no hay cadena de n elementos, y si la cadena o n son NULL.<br />

●<br />

●<br />

●<br />

●<br />

●<br />

●<br />

●<br />

●<br />

●<br />

●<br />

●<br />

●<br />

●<br />

●<br />

●<br />

●<br />

●<br />

●<br />

●<br />

●<br />

EXPOR_SET(n, on, off, [separador,[bit_cont]]) Devuelve una cadena compuesta de<br />

cadenas on y off separadas por la cadena 'separador', BIT_CONT representa el numero<br />

máximo de bits de n que deben ser analizados.<br />

FIELD(cad, cad1,cad2, ...) Busca cad en la lista de cadenas y devuelve la posición de<br />

inicio de la cadena coincidente. Si no existe ninguna coincidencia o la cadena es NULL<br />

devuelve 0.<br />

FIND_IN_SET(cad, cad_list) Devuelve la posición de cad en cad_list, compuesta esta por<br />

una lista de subcadenas separadas por comas, el resultado será 0 si no se encuentra o la<br />

cadena es NULL.<br />

FORMAT(x.d) Formatea un numero x en una cadena de d posiciones decimales. Los<br />

miles son separados por coma y los decimales por punto.<br />

HEX(n) Devuelve el valor de n en formato hexadecimal.<br />

INSERT(cad, pos, long,nueva_cad) Partiendo del valor de cad devuelve una cadena en<br />

donde se inserta la subcadena nueva_cadena a partir de la posición pos y con los<br />

caracteres especificados en long.<br />

INSTR(cad,subcad) Es el igual que el formato de LOCATE() pero con los argumentos<br />

invertidos.<br />

LCASE(cad) Devuelve la cadena cad con todos los caracteres en minúsculas.<br />

LEFT(cad, long) Devuelve los caracteres expresados por long más a la izquierda de la<br />

cadena cad.<br />

LENGHT(cad) Devuelve el número de caracteres de cad.<br />

LOCATE(subcar,cad) LOCATE(subcad, cad,pos) En el primer caso devuelve la posición<br />

del comienzo de la subcadena subcad dentro de cad. El el segundo caso la subcadena se<br />

empieza a buscar en la posición pos de cad.<br />

LOWER(cad) Sinónimo de LCASE.<br />

LPAD(cad, long,pad_cad) Devuelve una cadena compuesta por valores de la cadena cad,<br />

rellena por la izquierda con los long caracteres de la cadena pad_cad.<br />

LTRIM(cad) Devuelve una cadena sin espacios iniciales en blanco.<br />

MAKE_SET(n,bit0_cad,bit1_cad,...) Construye un valor SET (cadena compuesta de<br />

subcadenas separadas por comas) basado en el valor del entero n y de las cadena<br />

bit1_cad, bit2_cad.<br />

MID(cad,pos,long) Devuelve una subcadena de cadena que comienza en la posición pos<br />

con longitud long.<br />

OCT(n) Devuelve el valor de n expresado en forma octal.<br />

OCTET_LENGTH(cad) Sinónimo de LENGTH.<br />

POSITION(subcad,IN cad) POSITION() Es equivalente al formato de dos argumentos de<br />

LOCATE().<br />

REOEAT(cad,n) Devuelve una cadena compuesta de la cadena cad repetida n voces.


●<br />

REPLACE(cad, from_cad, to_cad) Devuelve una cadena compuesta por la cadena cad en<br />

donde todas las ocurrencias de from_cad se han reemplazado por to_cad.<br />

●<br />

●<br />

●<br />

●<br />

●<br />

●<br />

REVERSE(cad) Devuelve la cadena cad al revés.<br />

RIGHT(cad,long) Devuelve los long caracteres más a la derecha de cad.<br />

RPAD(cad, long,pad_cad) Devuelve una cadena compuesta por el valor de la cadena cad<br />

rellena por la derecha con los long caracteres de la cadena pad_cad.<br />

RTRIM (cad) Devuelve la cadena cad sin espacios vacíos por la derecha.<br />

SOUNDEX(cad) Devuelve una cadena soundex calculada a partir de la cadena cad. Los<br />

caracteres no alfanuméricos son ignorados.<br />

SPACE(n) Devuelve una cadena compuesta de n espacios en blanco.<br />

● SUBSTRING(cad,pos) SUBSTRING(cad,pos,long) SUBSTRING(cad FROM pos)<br />

SUBSTRING(cad FROM pos FOR long) Devuelve una subcadena de cad que comienza en<br />

la posición pos; si se añade long se indicarán el número de caracteres de la subcadena.<br />

●<br />

●<br />

●<br />

●<br />

SUBSTRING_INDEX(cad,delim,n) Devuelve una subcadena de la cadena cad; si n es<br />

positivo busca la n aparición de la cadena delimitada en delim y devuelve todo lo que se<br />

encuentra a la izquierda de la aparición. Si es negativo busca la enésima aparición de la<br />

cadena delim contando hacia atrás desde el extremo derecho de cad y devuelve todo a la<br />

derecha de ese delimitador.<br />

TRIM([LEADING | TRAILING | BOTH] trim_cad FROM cad) Si solamente se especifica<br />

cad devolverá la cadena sin espacios en blanco a derecha e izquierda. Si se especifica<br />

LEADING se eliminarán todas las ocurrencia de trim__cad de la parte delantera de cad.<br />

Con TRAILING se eliminaran todas la ocurrencia de len_cad de la parte trasera de cad. Si<br />

se especifica BOTH eliminara trim_cad al comienzo y final de la cadena.<br />

UCASE(cad) Devuelve cad con todos sus caracteres en mayúsculas.<br />

UPER(cad) Sinónimo de UCASE().<br />

4.- Funciones de fecha y hora<br />

●<br />

●<br />

●<br />

●<br />

●<br />

●<br />

●<br />

ADDDATE(fecha, INTERVAL expr interval) Sinónimo de DATE_ADD()<br />

CURDATE() Devuelve la fecha actual en formato AAAA-MM-DD o como número en<br />

formato AAAAMMDD.<br />

CURRENT_DATE Sinónimo de CURDATE().<br />

CURRENT_TIME Sinónimo de CURTIME().<br />

CURRENT_TIMESTAMP. Sinónimo de NOW().<br />

CURTIME() Devuelve la hora actual en formato hh:mm:ss o como número en formato<br />

hhmmss.<br />

DATE_ADD(echa, INTERVAL expr interval) Toma un valor de fecha o fecha y hora y<br />

devuelve el resultado de incrementar ese valor en un intervalo de tiempo expresado por<br />

expr, siendo inteval la especificación como debe ser interpretado el intervalo. La tabla 5<br />

especifica los valores que puede tomar interval, sus significados y el formato a utilizar.


Tabla 5: Tipos de intervalos admitidos por DATE_ADD<br />

Tipo Significado Formato<br />

SECOND Segundos ss<br />

MINUTE Minutos mm<br />

HOUR Horas hh<br />

DAY Días DD<br />

MONTH Meses MM<br />

YEAR Años AA<br />

MINUTE_SECOND Minutos y segundos “mm:ss”<br />

HOUR_MINUTE Horas y minutos “hh:mm”<br />

HOUR_SECOND Horas, minutos y segundos “hh:mm:ss”<br />

DAY_HOUR Dias y horas “DD hh”<br />

DAY_MINUTE Dias, horas y minutos “DD hh:mm”<br />

DAY_SECOND<br />

Dias, horas, minutos y<br />

segundos<br />

“DD hh:mm:ss”<br />

YEAR_MONTH Años y meses “AA-MM”<br />

● DATE_FORMAT(fecha, formato) Formatea la fecha especificada en uno de los formatos<br />

de la tabla 6.<br />

Tabla 6: Especificaciones de formato para DATE_FORMAT<br />

%S, %s<br />

Especificador<br />

Significado<br />

Segundos en formato numérico de dos dígitos<br />

%i Minutos en formato numérico de dos dígitos<br />

%H Horas en formato numérico de dos dígitos (24 horas)<br />

%h, %l<br />

Horas en formato numérico de dos dígitos (12 horas)<br />

%k Horas en formato numérico (24 horas)<br />

%l Horas en formato numérico (12 horas)<br />

%T Tiempo en formato de 24 horas (hh:mm:ss)<br />

%r Tiempo en formato de 12 horas (hh:mm:ss AM o PM<br />

%p AM o PM<br />

%W Día de la semana<br />

%a Día de la semana en forma abreviada<br />

%d Día del mes en formato de dos dígitos<br />

%e Día del mes en formato numérico.<br />

%D Día de la semana con sufijos<br />

%w Día de la semana en formato numérico<br />

%j Día del año en formato numérico de tres dígitos<br />

%U Semana en la que el domingo es el primer día<br />

%u Semana en la que el lunes es el primer día<br />

%M Nombre del mes<br />

%b Mes en formato abreviado<br />

%m Mes en formato de dos dígitos<br />

%c Mes en formato numérico<br />

%Y Año en formato numérico de cuatro dígitos.


Especificador<br />

Significado<br />

%y Año en formato numérico de dos dígitos<br />

%% El carácter % literal.<br />

●<br />

●<br />

●<br />

●<br />

●<br />

●<br />

DATE_SUB (fecha, INTERVAL expr intervalo) Realiza una aritmética de fechas similar a<br />

DATE_ADD(), salvo que expr se substrae del valor de fecha.<br />

DAYNAME(fecha) Devuelve una cadena formada por el día de la semana para el valor de<br />

la fecha.<br />

DAYOFMONTH(fecha) Devuelve el valor numérico del día del mes para el valor de fecha.<br />

DAYOFWEEK (fecha) Devuelve el valor numérico del día de la semana para para el valor<br />

de fecha.<br />

DAYOFYEAR(fecha) Devuelve el valor numérico del día del año para el valor de fecha.<br />

EXTRACT(intervalo, FROM fechahora) Devuelve del valor de fechahora el indicador de<br />

fecha u hora especificado por intervalo.<br />

● FROM_DAY(n) Dado el valor de n que expresa el número de días desde el año 0<br />

devuelve la fecha correspondiente.<br />

●<br />

●<br />

●<br />

●<br />

●<br />

●<br />

●<br />

●<br />

●<br />

●<br />

●<br />

●<br />

●<br />

●<br />

FROM_UNIXTIME(unix_timestamp) FROM_UNIXTIME(unix_timestamp, formato) Dado<br />

un valor de tiempo UNIX unix_timetamp tal como lo devuelve la función<br />

UNIX_TIMESTAMP(), devuelve un valor de fecha y tiempo con formato “AAAA-MM-DD<br />

hh:mm.ss” o con número en formato “AAAAMMDDhhmmss”, si se facilita un formato se<br />

utilizará ese formato.<br />

HOUR(hora) Devuelve el valor numérico de la hora.<br />

MINUTE(hora) Devuelve el valor numérico de los minutos.<br />

MONTH(fecha) Devuelve el valor numérico del mes del año.<br />

MONTHNAME(fecha) Devuelve una cadena con el nombre del mes.<br />

NOW() Devuelve dependiendo del contexto la fecha y hora actual en formato “AAAA-<br />

MM-DD hh:mm:ss” o AAAAMMDDhhmmss.<br />

PERIOD_ADD (periodo,n) Añade n meses al valor de periodo y devuelve el resultado.<br />

PEDIODO_DIFF (periodo1, perido2) Calcula la diferencia entre ambos argumentos y<br />

devuelve el número de meses de diferencia.<br />

QUARTER (fecha) Devuelve el valor numérico del cuarto del año al que pertenece fecha.<br />

SECOND (hora) Devuelve el valor numérico en segundos.<br />

SEC_TO_TIME (segundos) Dado un número de segundo devuelve el valor de tiempo<br />

correspondiente como una cadena “hh:mm:ss” o como un valor en formato hhmmss.<br />

SUBDATE(fecha, INTERVAL espr intervalo) Sinonimia de DATE_SUB().<br />

SYSDATE() Sinonimia de NOW().<br />

TIME_FORMAT(hora,formato) Formatea el valor de hora según la cadena de formato.


●<br />

TIME_TOSEC(hora) Devuelve el valor de hora en un número que representa los<br />

segundos equivalentes.<br />

●<br />

●<br />

●<br />

●<br />

●<br />

TO_DAY(fecha) Devuelve un valor numérico que representa el valor de la fecha<br />

convertido en el número de días transcurridos desde el año 0.<br />

UNIX_TIMESTAMP() UNIX_TIMESTAMP(fecha) Sin argumento devuelve los segundos<br />

desde la época UNIX. Con argumento da el valor de segundo transcurrido desde la época<br />

UNIX hasta la fecha indicada.<br />

WEEK(fecha) WEEK(fecha,primero) Devuelve el número que representa la semana del<br />

año, considerando el domingo como primer día de la semana. En el segundo caso realiza<br />

la misma operación salvo que primero especificará el día de la semana que se considera<br />

comienzo de la misma.<br />

WEEKDAY(fecha) Devuelve el valor numérico del día de la semana para la fecha<br />

especificada.<br />

YEAR(fecha) Devuelve el valor numérico del año para una fecha dada.<br />

5.- Funciones de sumario<br />

Son funciones que se conocen también con el nombre de funciones de suma. Solamente<br />

realizan los cálculos con valores no NULL, con excepción de la función COUNT(*).<br />

●<br />

●<br />

●<br />

●<br />

●<br />

●<br />

●<br />

●<br />

●<br />

AVG(Expt) Devuelve el valor medio de expr.<br />

BIT_AND(expr) Devuelve los desplazamiento de bit Y(lógico) de expr.<br />

BIT_OR(exp) Devuelve los desplazamientos de bit O(lógico) de expr.<br />

COUNT(expr) Con argumentos distintos de * devuelve el número de valores distintos de<br />

NULL del conjunto resultante. Con * devuelve el numero de filas del conjunto resultante.<br />

MAX(expr) Devuelve el valor máximo del conjunto resultante.<br />

MIN(expr) Devuelve el valor minino no NULL del conjunto resultante.<br />

STD(expr) Devuelve la desviación estándar de expr para los valores no NULL del<br />

conjunto seleccionado.<br />

STDDEV(expr) Sinónimo de STD().<br />

SUM(expr) Devuelve la suma de expr para los valores no NULL.<br />

6.- Funciones varias<br />

●<br />

●<br />

●<br />

BENCHMAR(count,expr) Calcula la expresión expr recursivamente count veces.<br />

BIT_COUNT(n) Devuelve el numero de bits que están a 1 en el argumento y es<br />

considerado como valor BIGINT.<br />

DATABASE() Devuelve una cadena con el nombre de la base de datos actual.


●<br />

DECODE(cad, password) dado una cadena cad codificad con ENCODE() la decodifica<br />

con la palabra contraseña password.<br />

●<br />

ENCODE(cad, password) Devuelve la cadena cad codificada con la palabra clave<br />

password.<br />

● ENCRYPT(cad) EBCRYPT(cad,salt) Codifica la cadena cad y devuelve la cadena<br />

resultante. El argumento salt debe ser una cadena de dos caracteres, en este caso el<br />

resultado de codificación de cad será siempre el mismo.<br />

●<br />

GET_LOCK(cad,timeout) Se suele usar con RELEASE_LOCK() para realizar un bloqueo<br />

con aviso .<br />

● LAST_INSERT_ID() LAST_INSERT_ID(expr) Sin argumento devuelve el valor<br />

AUTO_INCREMENT que se generó mas recientemente.<br />

●<br />

●<br />

●<br />

●<br />

●<br />

●<br />

●<br />

●<br />

LOAD_FILE(file_name) Lee el fichero file_name y devuelve su contenido como una<br />

cadena.<br />

MD5(cad) Calcula la suma de control de la cadena cad basada en el algoritmo MD5. El<br />

valor devuelto es una cadena de 32 dígitos.<br />

PASSWORD(cad) Calcula y devuelve una cadena de contraseña codificada según tabla de<br />

privilegios basada en la cadena cad.<br />

RELEASE_LOCK(cad) RELEASE_LOCK() Se usa en conjunción con GET_LOCK.<br />

SESION_USER Es sinónimo de USER().<br />

SYSTEM_USER() Es sinónimo de USER().<br />

USER() Devuelve una cadena que representa el nombre del usuario del cliente actual.<br />

VERSION() Devuelve una cadena de caracteres que describe la versión del servidor.


Apendice C. Resumen de comandos de Mysql<br />

Comandos principales de MYSQL.<br />

●<br />

Arranque de los servidores.<br />

Servidor Linux:<br />

safe_mysqld –user=mysqladm &<br />

Servidor Windows:<br />

Mysqld<br />

Arranque como usuario:<br />

root &<br />

mysql –u usuario –p clave<br />

En el caso en el que el servidor no se encuentre en el ordenador que estamos trabajando la orden<br />

de uso será:<br />

mysql –h nombre_host –u usuario –p clave<br />

●<br />

Consultas generales sobre las bases de datos<br />

Mostrar las bases de datos:<br />

show databases;<br />

Mostrar las bases de datos seleccionadas:<br />

select databases();<br />

Mostrar las tablas que contiene una base de datos:


show tables;<br />

Seleccionar una base de datos:<br />

use nombre_base;<br />

Describir la estructura de campos de una tabla:<br />

describe nombre_tabla;<br />

●<br />

Creación de bases de datos, tablas y registros<br />

Crear una base de datos:<br />

create database nombre_base;<br />

Creación de una tabla:<br />

create [temporary] table [if no exists] nombre_tabla (<br />

nombre_campo tipo 1 opciones 2 cláusulas 3 ,<br />

“ “ “ ,<br />

“ “ “ ,<br />

[último campo] );<br />

[temporary] --> la tabla existirá mientras exista la conexión con el cliente actual o hasta que se<br />

emita la instrucción drop table.<br />

[if no exist] --> si existe la tabla no se crea una nueva.<br />

(1) Las posibles opciones de tipo de campo son:<br />

tinyint --> 1 byte<br />

smallint --> 2 byte<br />

mediumint --> 3 byte<br />

int --> 4 byte<br />

bigint --> 8 byte<br />

float --> 4 byte<br />

double --> 8 byte<br />

decimal --> variable<br />

char(n) --> cadena de caracteres de longitud fija<br />

varchar(n) --> cadena de caracteres de longitud variables<br />

tinyblob --> objeto binario largo (muy pequeño)<br />

blob --> objeto binario largo (pequeño)<br />

mediumblob --> objeto binario largo (medio)<br />

longblob --> objeto binario largo (grande)


tinytext --> cadena de texto muy pequeña<br />

text --> cadena de texto pequeña<br />

mediumtext --> cadena de texto media<br />

longtext --> cadena de texto larga<br />

enum --> una enumeración<br />

set --> un conjunto<br />

date --> valor fecha (aaaa-mm-dd)<br />

time --> valor de hora (hh-mm-ss)<br />

datetime --> valor de fecha y hora<br />

timestamp --> valor de lapso de tiempo (aaaammddhhmmss)<br />

year --> valor de año<br />

(2) Las posibilidades del apartado opciones son:<br />

Generales:<br />

null --> admite valores nulos<br />

no null --> rechaza dejar el campo en blanco<br />

default --> permite establecer un valor por defecto<br />

Columnas numéricas:<br />

Cadena:<br />

(3) Cláusulas:<br />

auto_increment --> para generar identificadores únicos o valores en serie.<br />

unisgned --> rechazo de valores negativos<br />

binary --> trata los valores como cadenas binarias (campos char y varchar)<br />

primary key --> columna indexada para búsqueda rápida. Clave principal, solo puede haber<br />

una<br />

unique --> crea un índice con valores únicos<br />

index, key --> son sinónimos y crean índices que pueden contener valores repetidos.<br />

Inserción de registros en una base de datos:<br />

insert [low_priority | delayed][ignore][into] nombre_tabla forma_introducción 1<br />

I. LOW_PRIORYTY | DELAYED: la primera de las opciones hace que la inserción sea<br />

postergada hasta que ningún cliente utilice la tabla. La segunda genera una cola de<br />

introducción de registros, que se añadirán a la tabla cuando esta quede libre de usuarios.<br />

II. IGNORE: se desechan las filas que duplican valores para claves únicas.<br />

III. INTO: se requiere en versiones 3.22.5.


(1) Las formas de introducción son:<br />

●<br />

●<br />

(lista_columnas) VALUE (lista_valores_o_expresión)<br />

(lista_columnas) SELECT (opción_de_recuperación)<br />

● SET (nombre_columna=expresion, ....)<br />

Uso de una base de datos<br />

Use database;<br />

Inserción de registro a traves de un fichero de texto.<br />

La forma general del comando es:<br />

Load data [low_prioriti] [local] infile “nombre_archivo” [ignire|replace] into table<br />

nombre_tabla opciones_importacion 1 [ignore n lines] [(lista de columnas)]<br />

La clausula low_priorite retrasa la instrucción hasta que ningun cliente este leyendo la tabla.<br />

La clausula local especifica qu el fichero se leerá del host del cliente y no del host del<br />

servidor, en el caso de no ponerla se deben tener privilegios de FILE par poder realizar la<br />

operación.<br />

La clausula alternativa ignore|replace realiza la función de ignorar la filas repetidos o<br />

reemplazar las existente por las nuevas.<br />

(1) Las opciones de importación indican el formato en el que viene los datos y son similares alas<br />

usadas en la exportación dedatos a ficheros:<br />

[fields<br />

[terminated by “cadena”]<br />

[optionally] enclosed by “carácter”]<br />

[escaped by “carácter”]]<br />

[lines terminated by “caena”]<br />

Los caracteres especiales de escape se encuentran en la tabla 2. Si se establecen FIELDS se debe al<br />

menos especificar una de las clausulas TERMINATED BY, ENCLOSED BY o ESCAPED BY:<br />

TERMINATED BY especifica el carácter o caracteres que delimitan valores de una linea.<br />

ENCLOSED By especifíca un carácter entrecomillado que se quita al final del campo. Si se especifica<br />

OPTIONALLY los carateres solamente se entrecomillan para las columnas CHAR y VARCHAR.<br />

ESCAPED BY se utiliza para especificar el carácter de escape de los caracteres especiales.<br />

El valor de LINEAS TERMINATED BY especifca uno o varios caracteres que significan el final de la<br />

linea, por defecto se toma como terminación de linea “\n”.<br />

●<br />

Consulta de una base de datos:<br />

La forma general del comando de consulta es:<br />

select opciones 1 lista 2 cláusulas 3 ;


(1) Tipos de opciones permitidas:<br />

all --> provoca el regreso de todas las filas<br />

distinct, distinctrow --> especifican que las líneas duplicadas deben ser eliminadas<br />

high_prioruty --> da mayor prioridad a la instrucción en el caso de espera.<br />

sql_byg_result, sql_small_result --> especifican que el conjunto de resultados será mas<br />

largo o más corto<br />

straignt_join --> fuerza a las tablas a unirse en el orden citado en la cláusula from<br />

(2) Lista --> especifica las columnas que deben devolverse, el símbolo “*” especifica que<br />

deben extraerse todas las columnas. La separación entre los diferentes nombres de<br />

columnas se hacen con el símbolo “,”.<br />

(3) Cláusulas (en caso de haber varias cláusulas deben seguir el orden expuesto en la lista):<br />

Intro outfile ‘nombre_fichero’ opciones --> el resultado de la consulta es transferido a un<br />

fichero, paro lo cual debemos tener privilegio de crear el fichero y además este no debe<br />

existir. Las opciones de importanción son las siguientes:<br />

[fields [terminate by ‘cadena’] a [opcionally] [enclosed by ‘carácter’] b [escape by ‘carácter’] c ]<br />

[lines terminated by ‘carácter’] d<br />

a) especifica el carácter o caracteres que delimitan valores dentro de la línea<br />

b) especifica un carácter entrecomillado que se quita del final del campo de<br />

valores. OPTIONALLY establece que los valores solamente se entrecomillan<br />

para las columnas char y varchar<br />

c) Se utiliza para especificar el carácter de escape especial<br />

d) Especifica un carácter o caracteres que determinan el final de la línea.<br />

Los caracteres especiales son los siguientes:<br />

­ \0 ascii 0<br />

­ \b retroceso<br />

­ \n línea nueva<br />

­ \r retorno de carro<br />

­ \s espacio<br />

­ \t tabulación<br />

­ \’ comilla simple<br />

­ \” comilla doble<br />

­ \\ barra inversa<br />

from tabla-tablas --> especifica una o varias tablas desde las que se obtendrán las filas.<br />

Existen varias posibilidades de unión de tablas (mirar libro de mysql).<br />

where expresión --> establece una expresión que se aplica a las filas seleccionadas<br />

group by lista_columnas --> agrupa filas del conjunto de resultados de acuerdo con las<br />

columnas citadas.<br />

having expresión --> especifica una expresión secundaria para limitar filas después de<br />

satisfechas las condiciones expuestas en la cláusula where.<br />

order by entero_unsigne|nombrecoluma|fórmula --> indica como se va a clasificar el<br />

conjunto de resultados. Las posibilidades son:


asc – ascendente<br />

desc – descendente<br />

rand() – orden aleatorio<br />

procedure nombre_procedimiento --> indica un nombre de procedimiento al que serán<br />

enviados los datos antes de su salida.<br />

●<br />

Alteración de una tabla de datos y registros:<br />

Modificación de la estructura de las tablas: permite renombrar la tabla o variar la estructura de<br />

la tabla de datos. La sintaxis base es:<br />

alter [ignore] table nombre 1 lista_de_acción 2<br />

La cláusula [ignore] se utiliza si existen datos duplicados en los valores de las claves de los<br />

índices, de esta forma no se eliminaran una vez introducido el primero.<br />

(1) Nombre: establece el nombre de la tabla sobre la que deseamos actuar.<br />

(2) Lista_de_acción: establece una o varias acciones a realizar, las posibilidades son:<br />

a) ADD INDEX [nombre _ índice][columna _ índice]: añade un índice a la tabla basado<br />

en la columna especificada. Si se especifican varias columnas deben ir separadas<br />

por comas.<br />

b) ADD PRIMARY KEY [columna _ índice]: añade una clave principal siguiendo la<br />

columna establecida.<br />

c) ADD UNIQUE [nombre _ índice][columna _ índice]: añade un índice de valor único<br />

a la tabla en función de la columna especificada.<br />

d) ALTER [column] nombre _ columna (set default valor | drop default): modifica el<br />

valor dedo de una columna o reduce su valor predeterminado actual.<br />

e) CHANGE [column] nombre _ columna declaración _ columna: cambia el nombre y<br />

la definición de una columna; nombre _ columna -> nombre de la columna a<br />

modificar, declaración _ columna -> es el valor de definición por el cual se debe<br />

regir la columna, sus opciones son las mismas que las señaladas para la creación<br />

de los campos de las tablas.<br />

f) DROP [column] nombre _ columna: elimina la columna especificada.<br />

g) DROP INDEX nombre_index: elimina el índice de la tabla.<br />

h) DROP PRIMARY KEY: elimina la clave principal de la tabla. Si no existe clave<br />

principal y si índices con especificación UNIQUE se elimina el primero existente.<br />

i) MODIFY [column] declaración _ columna: cambia la declaración de una columna.<br />

j) RENAME [AS] nombre_tabla_nueva: cambia el nombre de la tabla.<br />

Borrado de registros: para borrar filas de una tabla se utiliza la expresión:<br />

delete [low_priory] from nombre_tabla [where expresión][limit n]<br />

●<br />

●<br />

LOW_PRIORY: posterga la petición hasta que ningún usuario este utilizando la tabla.<br />

WHERE expresión: especifica una condición que deben cumplir los registros a borrar, si<br />

se omite en la petición se eliminan todos los registros de la tabla.


●<br />

LIMIT n: estable un número máximo de registros a borrar.<br />

Sustitución de registro: permite modificar registros existentes.<br />

remplace (sigue la misma sintaxis que INSERT).<br />

La salvedad se refiere a los valores correspondientes a índices unique, si el valor existe en la tabla<br />

previamente a la inserción de la modificación se eliminara.<br />

Mitificación de registros en bloque:<br />

Updates [low_priority] nombre_tabla set nombre_col=expresion, ....[where<br />

expresión_where][limit n]<br />

Borrado de tablas: elimina una o varias tablas:<br />

DROP TABLE [if exists] (lista_tablas_separadas_po_comas)<br />

Borrado de una base de datos. Elimina la base de datos y todas las tablas que contiene.<br />

DROP DATABASE [if exist] nombre_database<br />

Optimización de tablas: optimiza el espacio asignado a la tabla.<br />

OPTIMIZE TABLE nombre_tabla<br />

●<br />

Índices, creación, modificación y eliminación<br />

Un índice corresponde a un método de ordenación de una o varias columnas que permite a los<br />

motores de búsqueda de bases de datos trabajar de forma eficiente y rápida.<br />

Los índices se pueden crear al crear las tablas con la instrucción create table o bien con<br />

posterioridad a través del comando alter table o el comando:<br />

create [UNIQUE] index nombre _ índice ON nombre_tabla (columna _ índice)<br />

La eliminación de un índice se realiza por el comando:<br />

drop index nombre_index on nombre_tabla<br />

●<br />

Instrucciones para mostrar información<br />

Para mostrar las bases de datos disponibles:<br />

show databases [like patrón _ búsqueda]<br />

Para mostrar las tablas de una base de datos:<br />

show tables [from nombre_base_datos][like patrón _ búsqueda]<br />

Para mostrar información descriptiva de una tabla:<br />

show table status [from nombre_base-datos][like patrón _ búsqueda]<br />

El resultado obtenido muestra:<br />

<br />

<br />

<br />

Name: nombre de la tabla.<br />

Tipe: tipo de tablas<br />

Row format: formato de almacenamiento de la fila


Rows: número de filas<br />

Avg_row_length: promedio de bytes usados por las filas de la tabla<br />

Data_length: tamaño actual en bytes de fichero de tabla<br />

Max_data_length: tamaño máximo en bytes que puede alcanzar el archivo.<br />

Index_length: tamaño actual en bytes del archivo de índice.<br />

Data_free: número de bytes en el archivo de datos que no se utilizan.<br />

Auto_increment: el siguiente valor generado por una columna con la propiedad.<br />

Create_time: hora que se creo la tabla.<br />

Update_time: hora de la última modificación<br />

Check_time: última vez que la tabla fue reparada o revisada por myisamchk<br />

Create_options: opciones adicionales especificadas.<br />

Comment: comentarios aparecidos en la creación de la tabla.<br />

Para mostrar las diferentes columnas de una tabla:<br />

show columns from nombre_tabla [from nombre_base-datos][like patrón-búsqueda]<br />

El resultado de la petición muestra:<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

Field: nombre de la columna.<br />

Type: el tipo de columna.<br />

Null: si la columna puede contener valores nulos.<br />

Key: si la columna está indexada.<br />

Default: el valor por defecto.<br />

Extra: información extra de la columna:<br />

Privileges: los privilegios de la columna.<br />

Para mostrar los índices que contiene una tabla se utiliza las instrucciones:<br />

show index from nombre_tabla<br />

show keys from nombre_tabla<br />

El resultado de la petición se muestra en:<br />

<br />

<br />

<br />

<br />

<br />

Table: el nombre de la tabla que contiene el índice.<br />

Nom_unique: 1 si puede contener valores duplicados.<br />

Key_name: El nombre del índice.<br />

Seq_in_index: el número de columnas en el índice.<br />

Column_name: el nombre de la columna.


Collation: Orden de clasificación de la columna dentro del índice.<br />

Cardinality: El número de valores únicos en el índice.<br />

Sub_part: La longitud del prefijo.<br />

Packed: si toda la clave está empaquetada.<br />

Comment: Reservado para comentarios internos sobre los índices.<br />

Las siguientes variantes de la orden show están relacionadas con la administración del<br />

entorno:<br />

Información sobre usuarios:<br />

show grants for nombre_usuario<br />

Información sobre los procesos del servidor:<br />

show processlist<br />

La salida de la información se estructura en los campos:<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

Id: el nº id del hilo para el cliente:<br />

User: el nombre del cliente asociado al hilo.<br />

Host: el host desde el que se conecta.<br />

Db: la base de datos predeterminada para el hilo.<br />

Command: el comando que se ejecuta en el hilo<br />

Time: el tiempo en segundos que utiliza el comando.<br />

State: Información de lo que hace Mysql mientras se ejecuta una instrucción SQL<br />

Info: ejecuta la consulta.<br />

Información sobre las variables de estado del servidor:<br />

show status<br />

La información dada por el servidor es muy alta:<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

Aborted_clients: número de conexiones de un cliente canceladas<br />

Aborted_connects: número de intentos fallidos de conexión al servidores.<br />

Connectios: número de intentos realizados para conectarse al servidor.<br />

Created_tmp_tables: número de tablas temporales creadas mientras se procesan las<br />

consultas.<br />

Delayed_errors: nº de errores ocurridos mientras se procesan filas insert delayed.<br />

Delayed_insert_threads: nº de errores actuales del mensaje insert delayed.<br />

Delayed_writes: nº de filas insert delayed introducidas.<br />

Flush_commands: nº de columnas flush que se han ejecutado.


Hendler_delete: nº de solicitudes necesarias para suprimir una fila de una tabla.<br />

Hendler_read_first: nº de solicitudes para leer la primera fila de la tabla.<br />

Handler_read_key: nº de solicitudes para leer una fila basada en un valor<br />

Handler_read_next: nº de solicitudes para leer la siguiente fila basada en un valor de<br />

índice.<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

Handler_read_md: nº de solicitudes para leer una fila basada en su posición.<br />

Handler_update: nº de solicitudes para actualizar una fila.<br />

Handler_write: nº de solicitudes para insertar una fila.<br />

Key_blocks_use: nº de bloques en uso en la cache de índice.<br />

Key_read_request: nº de solicitudes para leer un bloque desde la cache.<br />

Key_reads: nº de lecturas físicas de los bloques de índice desde el disco.<br />

Key_write_requests: nº de requisitos para escribir un bloque en la cache de índice.<br />

Key_writes: nº de escrituras físicas de los bloques de índices de disco.<br />

Max_used_connections: nº máximo de conexiones que se han abierto simultáneamente.<br />

Not_flushed_delayed_rows: nº de filas a la espera de ser escritas por las consultas insert<br />

delayed.<br />

Not_flushed_key_blocks: nº de bloques en la cache de clave que han sido modificados<br />

pero aun no han sido vaciados del disco.<br />

Open_files: nº de archivos abiertos.<br />

Open_streams: nº de flujos abiertos.<br />

Open_tables: nº de tablas abiertas.<br />

Opened_tables: total de tablas que han sido abiertas.<br />

Questions: nº de consultas que ha recibido el servidor.<br />

Slow_queries: nº de consultas que tardan más segundos en ejecutarse que<br />

long_query_time.<br />

Threads_connected: nº de conexiones abiertas en ese momento.<br />

Threads_running: nº de hilos que están latentes.<br />

Uptime: Segundos desde que el servidor comenzó a ejecutarse.<br />

Para ver las variables en el servidor se utiliza la forma:<br />

show variables<br />

●<br />

Bloqueo de tablas.<br />

Lock tables lista_bloqueo<br />

Bloquea el acceso a las tablas indicadas en la lista_bloqueo. Lista_bloqueo consiste en una<br />

serie de uno o mas elementos, separados por comas con la siguiente sintaxis:


nombre_tabla [as nombre_alias] {read|[low_priority]write}<br />

READ indica un bloqueo de solo lectura, es decir , bloque la escritura de la tabla pero permite<br />

leerla. WRITE es un bloqueo completo tanto de escritura como de lectura. LOW_PRIORIT esperara a<br />

que los clientes no utilicen la tabla.<br />

La forma de desbloquear una tabla es con la sentencia.<br />

Unlock tables<br />

●<br />

Creación y eliminacion de funciones<br />

CREATE[AGGREGATE] FUNCTION nombre_funcion RETURS{STRING|REAL|INTEGER}<br />

SONAME nombre_libreria_compartida<br />

Especifica una función definida por el usuario, nombre_funcion es el nombre por el cual se quiere<br />

referir, RETURS indica el tipo de dato que devuelve la función y nombre_libreria_compartida.es la<br />

ruta de acceso que contien el código ejecutable de la función. Para eliminar una función creada por<br />

el usuario se usadas:<br />

DROP FUNCTION nombre_funcion<br />

●<br />

Especificación de conjunto de opciones<br />

La sentencia set se utiliza para especificar conjuntos de opciones y su forma básica es:<br />

set opcion_conf, ...<br />

Donde opcion_conf puede ser una de los siguientes terminos de ls lista:<br />

CHARACTER SET [conjunto_caracteres_nombre|default] Especifica el conjunto de caracteres<br />

usado por el cliente.<br />

INSERT_ID=n Especifica el valor que se usa en la columna AUTO_INCREMENT en la proxima<br />

instrucción INSERT.<br />

LAST_INSERT_ID=n Especifica el valor que será devuelto por LAST_INSERT_ID()<br />

PASSWORD [FOR usuario]=PASSWORD (“contraseña”) Sin la cluasula FOR establece la<br />

contraseña para el usuario actual, con ella establece la contraseña para el usuario dado.<br />

SQL_AUTO:IS_NULL={0|1} Si se establece en 1 la ultima fila insertada que contenia un valor<br />

auto_increment puede seleccionarse usando la clausula where dela forma: auto_inc_col IS<br />

NULL.<br />

SQL_BIG_SELECTS={0|1} Si se establece en 1 se admiten las instrucciones select que<br />

aparezcan más que las filas max_join_size.<br />

SQL_BIG_TABLES={0|1} Si se establece en 1 todas las tablas temporales guardarán en disco<br />

en vez de en memoria.<br />

SQL_LOG_OFF={0|1} Si esta en 1 las ordenes sql del cliente actual no aparecerán en el<br />

registro de archivos generales.<br />

SQL_LOG_UPDATE={0|1} Es similar a la anterior solvo que afecta al registro para la<br />

actualizacion y no al general,<br />

SQL_LOW_PRIORITY:_UPDATES={0|1} Si esta en 1 las instrucciones que modifican las tablas<br />

de contenidos se ejecutan según llegan sin esperar a que se realicen las modificaciones.<br />

SQL_SELECT_LIMIT={n|default} Especifica el numero máximo de registros que se pueden<br />

devolver desde una instrucción select.


SQL_WARNINGS={0|1} Si se establece como 1, mysql informará de los errores de tipo aviso.<br />

TIMESTAMP= {timestamp_value|dafault} Especifica un valor TIMESTAMP.


Administración:<br />

• Mysqladmin:<br />

* mysqladmin [opciones] comando<br />

opciones generales:<br />

--compres, -C -> activa la compresión para el protocolo utilizado en el protocolo clienteservidor.<br />

--debug=opcion_depuración, -# opciones _ depurador -> activa la salida del depurador.<br />

--host =nombre_depurador, -h nombre_host -> especifica a que host debemos<br />

conectarnos.<br />

--port=número_puerto -P número _ puerto -> para los programas clientes este el número<br />

de puerto del servidor al que deben conectarse.<br />

--user=nombre_usuario, -u nombre _ usuario -> nombre del usuario que conecta con el<br />

servidor.<br />

--password , -p ->clave de usuario para acceder al servidor.<br />

--silent, -s -> especifica modo silencioso, es decir el programa produce menos mensajes<br />

de lo habitual.<br />

--version, -V -> muestra la versión del programa.<br />

--help, -¿ -> nuestra mensajes de ayuda.<br />

--pipe, -W ->utiliza una tubería con nombre para conectarse al servidor (solamente se<br />

utiliza por programas clientes funcionando bajo Windows).<br />

--socket=nombre_ruta, -S nombre_ruta -> para los programas clientes indica el fichero de<br />

socket que deben usar cuando se conectan al servidor.<br />

opciones específicas:<br />

Comandos:<br />

--force, -f -> hace que no se pida confirmación cuando se ejecuta drop db_nombre y<br />

cuando se ejecutan múltiples comando intenta ejecutar todos los comandos aunque se<br />

produzcan errores.<br />

--relative ->muestra la diferencia de los valores anterior y posterior cuando se ejecuta –<br />

sleep.<br />

----sleep=n, -i n -> ejecuta los comandos dados en la línea de comandos repetidamente<br />

cada n segundos.<br />

--wait[=n], -w [n] -> establece el número de veces a esperar y reintentar si no puede<br />

establecer conexión con el servidor.<br />

create db_name -> crea una base de datos con el nombre dado.<br />

drop db_name -> borra la base de datos con el nombre dadoy cualquier tabla que exista en<br />

ella.<br />

flush_host -> vacía el fichero log del servidor.<br />

flush_status -> limpia las variables de estado.


flush_tables ->vacia la cache de tablas.<br />

kill id, id .. -> mata los procesos del servidor.<br />

password new -> cambia la contraseña de usuario.<br />

ping -> comprueba si el servidor se está ejecutando.<br />

process list -> muestra una lista de datos.<br />

refresk -> vacia la cache de las tablas.<br />

reload -> recarga la tabla de permisos.<br />

shutdown -> desconecta el servidor.<br />

status -> muestra el estado del servidor.<br />

variables -> muestra los valores y nombres de la variable.<br />

version -> version del servidor.<br />

• Creación de privilegios de usuarios:<br />

* grant [privilegio] [columna] on [nivel] to [usuario] identified by “contraseña” with<br />

grant option<br />

privilegios -> si hay varios privilegios se separan por comas.<br />

alter ->alterar tablas e índices.<br />

create -> crear bases de datos y tablas.<br />

delete -> borrar de las tablas registros.<br />

drop -> eliminar bases de datos y tablas.<br />

index -> crear o eliminar índices.<br />

insert -> insertar nuevos registros en las tablas.<br />

references -> no se utiliza.<br />

select -> recuperar registros de tablas.<br />

update -> modificar registros de las tablas.<br />

file -> leer o escribir archivos del servidor.<br />

proces -> ver información sobre los hilos en ejecución dentro del servidor y poder<br />

matarlos.<br />

reload -> recargar tablas de concesión.<br />

shutdouwn -> cerrar el servidor.<br />

all -> cualquier cosa.<br />

usage -> un privilegio especial “sin privilegios”.<br />

Columna: indica las columnas a las que se aplicarán los privilegios y es opcional.


Nivel: especifica a que se otorgan los privilegios, que pueden ser globales, de bases de<br />

datos o de tablas. Si se especifica *.* indica todas las tablas de todas las bases de datos;<br />

nombre_base.* indica todas las tablas de la base de datos; nombre_base.nombre_tabla<br />

especifica una tabla de una determinada base de datos.<br />

Usuario: el usuario al que se le otorgan los privilegios y consiste en un usuario y un host<br />

(usuario@host); si no se especifica host se entiende que puede ser desde cualquiera y si no<br />

se especifica usuario puede ser cualquiera (anónimo).<br />

Contraseña: la clave de acceso del usuario.<br />

With grant option: se le permite al usuario dar privilegios a otros usuarios. Es una cláusula<br />

opcional.<br />

Revocar privilegios:<br />

revoke [privilegios] [columna] on [nivel] from [usuario]<br />

Eliminar usuarios:<br />

delete from user where user=[usuario] and host=”nombre_host”<br />

Después de eliminar un usuario es necesario recargar la tabla de usuarios<br />

flush privileges;<br />

• Copias de seguridad<br />

mysqldump [nombre de la base] > [fichero de salida]<br />

Es una orden externa del programa que genera una copia en texto plano de las tablas de la base de<br />

datos con todo el conjunto de instrucciones para volver a crearlas e incluir los registros existentes.<br />

La recuperación de la base de datos se realiza de forma simple:<br />

mysql < [nombre fichero de copia de seguridad]<br />

Para obtener una recuperación rápida sin necesidad de operaciones previas debemos introducir en<br />

la cabecera del fichero las líneas:<br />

CREATE DATABASE [nombre de la base de datos];<br />

USE [nombre base de datos];<br />

●<br />

Operaciones diversas:<br />

EXPLAIN<br />

explain nombre_tabla 1<br />

explain sentencia_select 2<br />

(1) equivale a la orden que informa sobre las columnas de una tabla.<br />

(2) Da información de como se va ha ejecutar la sentencia select.<br />

FLUSH vacía varias caches usadas por el servidor.<br />

flush opcion_flush, ..


opciones_flush pueden ser:<br />

●<br />

●<br />

●<br />

●<br />

●<br />

Hosts: vaciar la cache del servidor.<br />

Logs: vacia las caches de registros cerrándolos y volviéndolos a abrir<br />

Privileges: recarga las tablas cedidas.<br />

Status: vuelve a iniciar los estatus variables.<br />

Tables: cierra cualquier tabla abierta en la tabla cache.<br />

KILL elimina hilos del servidor.<br />

Kill id_hilo<br />

LOCK TABLES bloqueo de tablas:<br />

lock tables lista_bloqueo<br />

Las opciones de lista _ bloqueo son los nombre de las tablas separadas por comas; las tablas<br />

deben tener el formato.<br />

nombre_tabla [as nombre_alias](read | [low_priority] write)<br />

●<br />

●<br />

●<br />

Read: bloqueo de solo lectura.<br />

Write: bloqueo de escritura, bloquea la tabla completamente.<br />

Low_priority: pide permiso para leer la tabla.<br />

UNLOCK TABLES: desbloqueo de las tablas.<br />

Unlock tables<br />

SET: se utiliza para especificar un conjunto de caracteres usando por el cliente.<br />

Set (option) opción_configuración<br />

Las opciones _ configuración pueden ser:<br />

●<br />

●<br />

Carácter set (conjcar_nombre | default) especifica el conjunto de caracteres usado por el<br />

cliente.<br />

Insert_id=n:especifica el valor que se utilizara en la columna auto_incrementen la<br />

próxima instrucción insert.<br />

● Last_insert Id=n: especifica el valor que será devuelto por last_insert_id() -><br />

actualización de procedimiento de registro.<br />

●<br />

●<br />

●<br />

●<br />

Password [for usuario] = password(“contraseña”):sin la cláusula for se establece<br />

contraseña para el usuario actual, si se indica se establece para el usuario dado. Hay que<br />

tener privilegios de establecimiento de contraseñas.<br />

Sql_auto_is_null=[0|1]: si se establece en 1, la última fila insert que contiene el valor<br />

auto_increment puede seleccionarse usando la cláusula where auto_inc_coll is null.<br />

Sql_big_tables [1|0]: si se establece a 1; se admiten las instrucciones select que<br />

aparezcan más que la filas max_join_size.<br />

Sql_log_off=[0|1]: Si esta opción se establece en 1 las ordenes sql del cliente actual no<br />

aparecerán en el registro del archivo general.


●<br />

Sql:log_update=[1|0]: es igual que la anterior pero afecta al registro de actualización y<br />

no al general.<br />

●<br />

●<br />

●<br />

●<br />

Sql_low_priority_updates=[0|1]: si se establece en 1, las instrucciones que modifican la<br />

tabla de contenidos esperaran hasta que las instrucciones select terminen.<br />

Sql_select_limit=(n|default): especifica el nº máximo de registros que se podrán devolver<br />

desde una instrucción select.<br />

Sql_warnings=(1|0): si se establece en 1 mysql informa de los errores tipo 'aviso'.<br />

Timestamp=(timestamp_value|default): especifica un valor timestamp de actualización<br />

del registro actual.


BIBLIOGRAFÍA<br />

●<br />

●<br />

●<br />

●<br />

Paul Dubois (2001) “Edición especial Mysql” Edit Prentice Hall – Perason Educación S.A.,<br />

832 pg, Madrid<br />

J. D. Gutiérrez Gallardo (2004) “ Guía Práctica para usuarios de Mysql” Edit. Anaya<br />

Multimedia 304 pg, Madrid.<br />

Apuntes Lobocom: http://www.lobocom.es/~claudio/<br />

Diseño de bases de datos relacionales. Servicio de apoyo al puesto de trabajo,<br />

Microinformática, Área de informática y comunicaciones, UCM.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!