Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
1
%$6(6'('$726
2. Creación de tablas
3. Motor de almacenamiento
4. Verificaciones
5. Eliminación de tablas
La sintaxis del comando SQL que nos permite crear una base de datos es:
SHOW DATABASES;
Una vez creada la base de datos, y para evitar tener que nombrar la base de datos
en cada comando SQL que ejecutemos, podemos poner la base de datos por defecto.
Para ello usaremos el comando USE:
Use no es en realidad un comando SQL, sino más bien una opción de MySQL.
Hay que tener cuidado a la hora de ejecutar USE en la consola de MySQL pues es la
única sentencia que no lleva punto y coma al final.
2. Creación de tablas
Para crear tablas usamos la sentencia CREATE TABLE.
En su forma más simple, la sentencia CREATE TABLE creará una tabla con las
columnas quele indiquemos.
Con este comando hemos creado una tabla llamada "gente" con dos columnas:
"nombre" que puede contener cadenas dehasta 40 caracteres y "fecha" de tipo fecha.
Podemos consultar cuántas tablas y qué nombres tienen en una base de datos,
usando la sentenciaSHOW TABLES.
MySQL distingue una serie de tipos de datos que podremos utilizar a la hora de
crear los campos queformarán nuestras tablas. Veamos a continuación estos tipos:
Int: Este es un tipo de datos numéricos de tipo entero. Este tipo de datos guarda
valores enteros (no decimales) entre -2.147.483.648 y 2.147.483.647.
TinyiInt, SmallInt, MediumInt, BigInt: Son tipos de datos numéricos enteros
(no decimal). TinyiInt agrupa un rango de números entre -128 y 127. SmallInt
alcanza desde -32.768 hasta 32.767. MediumInt tiene un rango comprendido
entre -8.388.608 y 8.388.607. Finalmente el tipo de datos BigInt ocupa un rango
numérico entre -9.223.372.036.854.775.808 hasta 9.223.372.036.854.775.807.
Float (M,D): Número de coma flotante de precisión simple. El valor del
argumento M nos indica el número de dígitos decimales que se van a utilizar
para representar el número. Así, un valor de 5 nos permitirá representar números
comprendidos entre -99 y 99 (Números expresados en binario con 5 dígitos y
signo). El valor del argumento D nos indica el número de posiciones decimales
que se van a utilizar en la representación del número. Así, una representación
tipo Float (5,2) nos permitirá incluir números entre -99,99 y 99,99. El rango de
'(6$552//2'($3/,&$&,21(6:(%
%$6(6'('$726
4
Tenemos muchas más opciones a la hora de definir columnas. Además del tipo y
del nombre,podemos definir valores por defecto, permitir o no que contengan valores
nulos, crear una claveprimaria, indexar...
'(6$552//2'($3/,&$&,21(6:(%
%$6(6'('$726
5
Valores nulos
Al definir cada columna podemos decidir si podrá o no contener valores nulos.
Es importante esta opción ya que, en el modelo relacional, las columnas que son
o forman parte de una clave primaria no pueden contener valores nulos.
Un poco más adelante veremos que, si definimos una columna como clave
primaria, automáticamente se impide que puedacontener valores nulos, pero este no es
el único caso en que puede ser interesante impedir laasignación de valores nulos para
una columna.
La opción por defecto es que se permitan valores nulos, NULL, y para que no se
permitan, se usa NOTNULL. Por ejemplo:
Por ejemplo, si queremos que el valor por defecto para poblacion sea 5000,
podemos crear la tablacomo:
Claves primarias
También se puede definir una clave primaria sobre una columna, usando la
palabra clave KEY oPRIMARY KEY.
'(6$552//2'($3/,&$&,21(6:(%
%$6(6'('$726
6
Sólo puede existir una clave primaria en cada tabla, y la columna sobre la que se
define una claveprimaria no puede tener valores NULL. Si esto no se especifica de
forma explícita, MySQL lo hará deforma automática.
Existe una sintaxis alternativa para crear claves primarias, que en general es
preferible, ya que es máspotente. De hecho, la que hemos explicado es un alias para la
forma general, que no admite todas lasfunciones (como por ejemplo, crear claves
primarias sobre varias columnas). Veremos esta otraalternativa un poco más abajo.
Columnas autoincrementadas
En MySQL tenemos la posibilidad de crear una columna autoincrementada,
aunque esta columna sólopuede ser de tipo entero.
Comentarios
Definición de creación
A continuación de las definiciones de las columnas podemos añadir otras
definiciones. La sintaxis másgeneral es:
Índices
Un índice es un grupo de datos que MySQL asocia con una o varias columnas de
la tabla. En este grupo de datos aparece la relación entre el contenido y el número de fila
donde está ubicado.
Los índices sirven para optimizar las consultas y las búsquedas de datos en las
tablas, evitando que MySQL tenga que revisar todos los datos disponibles para devolver
el resultado. Mediante su uso es mucho más rápido localizar filas con determinados
valores de columnas, o seguir un determinado orden. La alternativa es hacer búsquedas
secuenciales, que en tablas grandes requieren mucho tiempo.
Se deben crear índices sobre aquellas columnas que vayan a ser usadas en una
cláusula WHERE.
Son mejores candidatas a indexar aquellas columnas que presentan muchos
valores distintos, mientras que no son buenas candidatas las que tienen muchos
valores idénticos, como por ejemplo sexo (masculino y femenino) porque cada
consulta implicará siempre recorrer prácticamente la mitad del índice.
Si necesitamos un select del tipo SELECT ... WHERE columna_1 = X AND
columna_2 = Y y ya tenemos un índice con la columna_1, podemos crear un
segundo índice con la columna 2 o, mejor todavía, crear un único índice
combinado con las columnas 1 y 2. Estos son los índices multicolumna, o
compuestos. No obstante los índices multicolumna en las claúsulas WHERE
deben incluir siempre de izquierda a derecha las columnas indexadas o el índice
no se usará. No obstante si tienes índices multicolumna y los utilizas en las
clausulas WHERE, debes incluir siempre de izquierda a derecha las columnas
indexadas o el indice no se usará. Por ejemplo, supongamos que tenemos un
índice USUARIO (ID, NOMBRE, DIRECCION), y una cláusula SELECT ...
WHERE NOMBRE = x. Este select no aprovechará el índice. Tampoco lo haría
'(6$552//2'($3/,&$&,21(6:(%
%$6(6'('$726
8
Los índices se actualizan cada vez que se modifica la columna o columnas que
utiliza. Por ello no es aconsejable usar como índices columnas en las que serán
frecuentes operaciones de escritura (INSERT, UPDATE, DELETE).
Tampoco tendría sentido crear índices sobre columnas cuando cualquier select
sobre ellos va a devolver una gran cantidad de resultados; por ejemplo una
columna booleana que admita los valores Y/N.
Tampoco es necesario usar índices en tablas demasiado pequeñas, ya que en
estos casos no hay ganancia de rapidez frente a una consulta normal.
Claves primarias
El ejemplo anterior que vimos para crear claves primarias, usando esta sintaxis,
quedaría así:
Pero esta forma tiene más opciones, por ejemplo, entre los paréntesis podemos
especificar varios nombres de columnas, para construir claves primarias compuestas por
varias columnas:
Índices
El segundo tipo de índice permite definir índices sobre una columna, sobre
varias, o sobre partes de columnas. Para definir estos índices se usan indistintamente las
opciones KEY o INDEX.
'(6$552//2'($3/,&$&,21(6:(%
%$6(6'('$726
9
O su equivalente:
Este ejemplo usará sólo los cuatro primeros caracteres de la columna 'nombre'
para crear el índice.
Se pueden añadir índices a una tabla después de creada con la sentencia ALTER
TABLE:
Índices únicos
El tercero permite definir índices con claves únicas, también sobre una columna,
sobre varias o sobre partes de columnas. Para definir índices con claves únicas se usa la
opción UNIQUE. La diferencia entre un índice único y uno normal es que en los únicos
no se permite la inserción de filas con claves repetidas. La excepción es el valor NULL,
que sí se puede repetir.
Índices fulltext
'(6$552//2'($3/,&$&,21(6:(%
%$6(6'('$726
10
Se usan en tablas del tipo MyISAM, que veremos un poco más adelante qué tipo
de tablas son, y pueden contener uno o más campos del tipo CHAR, VARCHAR y TEXT.
Las búsquedas de texto completo son ejecutadas con la función MATCH( ). Esta
función ejecuta la búsqueda de una cadena en una colección de texto (un conjunto de
una o más columnas incluídas en un índice FULLTEXT). La cadena que se busca es
dada como un argumento en la función AGAINST( ), y es ejecutada en modo no
sensitivo, es decir, no importa el uso de mayúsculas y minúsculas.
INSERT INTO articulos VALUES (0,'MySQL con Java en Linux', 'Conozca como
utilizar estas dos herramientas ...');
Devuelve las filas que contengan „Java‟ en las columnas del índice FullText (2
filas).
Igual que la anterior, pero no devuelve nada. La razón es que las palabras que
aparecen en más de un 50% de los casos se consideran palabras que “hacen ruido” y no
se tienen en cuenta.
Se puede incluir en la búsqueda más de una palabra. En este caso buscamos filas
que contengan las palabras Java o Visual. Al invertir el orden de las palabras de
búsqueda se obtiene el mismo resultado.
Buscamos PHP, pero no se devuelve nada, ya que las palabras de menos de tres
caracteres se excluyen de los índices.
Claves foráneas
En MySQL sólo existe soporte para claves foráneas en tablas de tipo InnoDB.
Sin embargo, esto noimpide usarlas en otros tipos de tablas.
tabla 'personas' (1). Sin embargo, aunque lasintaxis se comprueba, esta definición no
implica ningún comportamiento por parte de MySQL.
La otra forma es mucho más útil, aunque sólo se aplica a tablas InnoDB.
Esta forma define una clave foránea en la columna 'id', que hace referencia a la
columna 'id' de la tabla'personas' (3). La definición incluye las tareas a realizar en el
caso de que se elimine una fila en la tabla'personas'.
Existen cinco opciones diferentes. Veamos lo que hace cada una de ellas:
RESTRICT: esta opción impide eliminar o modificar filas en la tabla
referenciada si existenfilas con el mismo valor de clave foránea.
CASCADE: borrar o modificar una clave en una fila en la tabla
referenciada con un valordeterminado de clave, implica borrar las filas
con el mismo valor de clave foránea o modificar losvalores de esas
claves foráneas.
SET NULL: borrar o modificar una clave en una fila en la tabla
referenciada con un valordeterminado de clave, implica asignar el valor
NULL a las claves foráneas con el mismo valor.
'(6$552//2'($3/,&$&,21(6:(%
%$6(6'('$726
13
Veamos un ejemplo más práctico. En la tabla personas, que tiene las columnas
id, nombre y fecha, nos encontramos los siguientes valores:
1 Fulanito 1998/04/14
2 Menganito 1975/06/18
3 Tulanito 1984/07/05
En la tabla telefonos, que tiene las columnas numero e id, nos encontramos los
siguientes valores:
12322132 1
12332221 1
55546545 3
55565445 3
personas:
1 Fulanito 1998/04/14
2 Menganito 1975/06/18
'(6$552//2'($3/,&$&,21(6:(%
%$6(6'('$726
14
4 Tulanito 1984/07/05
telefonos:
12322132 1
12332221 1
55546545 4
55565445 4
3. Motor de almacenamiento
Al diseñar una base de datos con MySQL será necesario decidir qué motores
dealmacenamiento vamos a utilizar.
La sintaxis es:
{ENGINE} = {BDB|HEAP|ISAM|InnoDB|MERGE|MRG_MYISAM|MYISAM }
Ejemplo:
4. Verificaciones
También podemos ver la instrucción usada para crear una tabla, mediante la
sentencia SHOW CREATE TABLE:
5. Eliminación de tablas
A veces es necesario eliminar una tabla, ya sea porque es más sencillo crearla de
nuevo que modificarla,o porque ya no es necesaria.
Para eliminar una tabla se usa la sentencia DROP TABLE. La sintaxis es simple:
Por ejemplo:
Se pueden añadir las palabras IF EXISTS para evitar errores si la tabla a eliminar
no existe.
La sintaxis también es muy simple. Hay que tener cuidado, ya que al borrar
cualquier base de datos se elimina también cualquier tabla quecontenga.
EJERCICIOS
Estacion:
'(6$552//2'($3/,&$&,21(6:(%
%$6(6'('$726
17
Muestra:
IdentificadorEstacion MEDIUMINT UNSIGNED
Fecha DATE
TemperaturaMinimaTINYINT
TemperaturaMaxima TINYINT
Precipitaciones SMALLINT UNSIGNED
HumedadMinimaTINYINT UNSIGNED
HumedadMaximaTINYINT UNSIGNED
VelocidadVientoMinimaSMALLINT UNSIGNED
VelocidadVientoMaximaSMALLINT UNSIGNED
Usar para ambas tablas el motor de almacenamiento InnoDB para que MySQL
permita el uso de claves ajenas.
Tema(ClaveTema, Nombre)
Autor(ClaveAutor, Nombre)
TrataSobre(ClaveLibro, ClaveTema)
EscritoPor(ClaveLibro, ClaveAutor)
ClaveLibro INT
Titulo VARCHAR(60)
Idioma VARCHAR(15)
Formato VARCHAR(15)
Categoria(libro) CHAR
ClaveEditorial SMALLINT
ClaveTema SMALLINT
Nombre(tema) VARCHAR(40)
ClaveAutor INT
Nombre(autor) VARCHAR(60)
ClaveEditorial SMALLINT
Nombre(editorial) VARCHAR(60)
Direccion(editorial) VARCHAR(60)
Telefono(editorial) VARCHAR(15)
ClaveLibro INT
NumeroOrden SMALLINT
Edicion SMALLINT
Ubicacion VARCHAR(15)
'(6$552//2'($3/,&$&,21(6:(%
%$6(6'('$726
19
ClaveSocio INT
Nombre(socio) VARCHAR(60)
Direccion(socio) VARCHAR(60)
Telefono(socio) VARCHAR(15)
Categoria(socio) CHAR
ClaveSocio INT
ClaveLibro INT
NumeroOrden SMALLINT
FechaPrestamo DATE
FechaDevolucion DATE
Notas BLOB
ClaveLibro INT
ClaveTema SMALLINT
ClaveLibro INT
ClaveAutor INT