Tutorial Básico de MySQL
Tutorial Básico de MySQL
MySQL
Primeros Pasos para crear y usar una sencilla Base de Datos
Aprende en sencillos pasos como crear una base de datos, crear tablas, cargar datos, ejecutar
algunas consultas y ver los resultados….
El objetivo de este tutorial es mostrar el uso del programa cliente mysql para crear y
usar una sencilla base de datos. mysql (algunas veces referido como "monitor mysql")
es un programa interactivo que permite conectarnos a un servidor MySQL, ejecutar
algunas consultas, y ver los resultados. mysql puede ser usado también en modo
batch: es decir, se pueden colocar toda una serie de consultas en un archivo, y
posteriormente decirle a mysql que ejecute dichas consultas.
Este tutorial asume que mysql está instalado en alguna máquina y que disponemos de
un servidor MySQL al cual podemos conectarnos. Si este no es el caso, tenemos que
contactar con nuestro administrador MySQL. (Si nosotros somos los administradores,
es necesario consultar la documentación de MySQL que se refieren a la instalación y
configuración del servidor MySQL).
Para ver la lista de opciones proporcionadas por mysql, lo invocamos con la opción --
help:
Puesto que es imposible que se describan a detalle muchos de los tópicos cubiertos
aquí, se recomienda que se consulte el manual de MySQL para obtener más
información al respecto.
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
Este prompt nos indica que mysql está listo para recibir comandos.
shell> mysql
mysql>
Un comando normalmente consiste de una sentencia SQL seguida por un punto y coma.
Cuando emitimos un comando, mysql lo manda al servidor para que lo ejecute, nos muestra los
resultados y regresa el prompt indicando que está listo para recibir más consultas.
mysql muestra los resultados de la consulta como una tabla (filas y columnas). La primera fila
contiene etiquetas para las columnas. Las filas siguientes muestran los resultados de la
consulta. Normalmente las etiquetas de las columnas son los nombres de los campos de las
tablas que estamos usando en alguna consulta. Si lo que estamos recuperando es el valor de
una expresión (como en el ejemplo anterior) las etiquetas en las columnas son la expresión en
sí.
mysql muestra cuántas filas fueron regresadas y cuánto tiempo tardó en ejecutarse la consulta,
lo cual puede darnos una idea de la eficiencia del servidor, aunque estos valores pueden ser un
tanto imprecisos ya que no se muestra la hora del CPU, y porque pueden verse afectados por
otros factores, tales como la carga del servidor y la velocidad de comunicación en una red.
Las palabras clave pueden ser escritas usando mayúsculas y minúsculas.
Aquí está otra consulta que demuestra cómo se pueden escribir algunas expresiones
matemáticas y trigonométricas:
Aunque hasta este momento se han escrito sentencias sencillas de una sola línea, es
posible escribir más de una sentencia por línea, siempre y cuando estén separadas por
punto y coma:
+---------------------+
| NOW() |
+---------------------+
| 2002-10-28 14:26:04 |
+---------------------+
1 row in set (0.01 sec)
Un comando no necesita ser escrito en una sola línea, así que los comandos que
requieran de varias líneas no son un problema. mysql determinará en donde finaliza la
sentencia cuando encuentre el punto y coma, no cuando encuentre el fin de línea.
Aquí está un ejemplo que muestra una consulta simple escrita en varias líneas:
mysql> SELECT
-> USER(),
-> CURRENT_DATE;
+----------------+--------------+
| USER() | CURRENT_DATE |
+----------------+--------------+
| root@localhost | 2002-09-14 |
+----------------+--------------+
1 row in set (0.00 sec)
mysql>
En este ejemplo debe notarse como cambia el prompt (de mysql> a ->) cuando se
escribe una consulta en varias líneas. Esta es la manera en cómo mysql indica que está
esperando a que finalice la consulta. Sin embargo si deseamos no terminar de escribir
la consulta, podemos hacerlo al escribir \c como se muestra en el siguiente ejemplo:
mysql> SELECT
-> USER(),
-> \c
mysql>
De nuevo, se nos regresa el comando el prompt mysql> que nos indica que mysql está
listo para una nueva consulta.
En la siguiente tabla se muestran cada uno de los prompts que podemos obtener y una
breve descripción de su significado para mysql:
Prompt Significado
mysql> Listo para una nueva consulta.
-> Esperando la línea siguiente de una consulta multi-línea.
Esperando la siguiente línea para completar una cadena que comienza con
'>
una comilla sencilla (').
Esperando la siguiente línea para completar una cadena que comienza con
">
una comilla doble (").
Si esto llega a suceder, muy probablemente mysql estará esperando por un punto y
coma, de manera que si escribimos el punto y coma podremos completar la consulta y
mysql podrá ejecutarla:
mysql>
Los prompts '> y "> ocurren durante la escritura de cadenas. En mysql podemos
escribir cadenas utilizando comillas sencillas o comillas dobles (por ejemplo, 'hola' y
"hola"), y mysql nos permite escribir cadenas que ocupen múltiple líneas. De manera
que cuando veamos el prompt '> o "> , mysql nos indica que hemos empezado a
escribir una cadena, pero no la hemos finalizado con la comilla correspondiente.
Aunque esto puede suceder si estamos escribiendo una cadena muy grande, es más
frecuente que obtengamos alguno de estos prompts si inadvertidamente escribimos
alguna de estas comillas.
Por ejemplo:
mysql> SELECT * FROM mi_tabla WHERE nombre = "Lupita AND edad < 30;
">
En este caso, ¿qué es lo que debemos hacer? . La cosa más simple es cancelar la
consulta. Sin embargo, no basta con escribir \c, ya que mysql interpreta esto como
parte de la cadena que estamos escribiendo. En lugar de esto, debemos escribir antes
la comilla correspondiente y después \c :
mysql> SELECT * FROM mi_tabla WHERE nombre = "Lupita AND edad < 30;
"> " \c
mysql>
Es sumamente importante conocer lo que significan los prompts '> y ">, ya que si en
algún momento nos aparece alguno de ellos, todas la líneas que escribamos a
continuación serán consideradas como parte de la cadena, inclusive cuando escribimos
QUIT. Esto puede ser confuso, especialmente si no sabemos que es necesario escribir
la comilla correspondiente para finalizar la cadena, para que podamos escribir después
algún otro comando, o terminar la consulta que deseamos ejecutar.
Ahora que conocemos como escribir y ejecutar sentencias, es tiempo de accesar a una
base de datos.
Primeramente usaremos la sentencia SHOW para ver cuáles son las bases de datos
existentes en el servidor al que estamos conectados:
mysql>
Es probable que la lista de bases de datos que veamos sea diferente en nuestro caso,
pero seguramente las bases de datos "mysql" y "test" estarán entre ellas. En
particular, la base de datos "mysql" es requerida, ya que ésta tiene la información de
los privilegios de los usuarios de MySQL. La base de datos "test" es creada durante la
instalación de MySQL con el propósito de servir como área de trabajo para los usuarios
que inician en el aprendizaje de MySQL.
Se debe anotar también que es posible que no veamos todas las bases de datos si no
tenemos el privilegio SHOW DATABASES. Se recomienda revisar la sección del manual
de MySQL dedicada a los comandos GRANT y REVOKE.
Observar que USE, al igual que QUIT, no requieren el uso del punto y coma, aunque si
se usa éste, no hay ningún problema. El comando USE es especial también de otra
manera: éste debe ser usado en una sola línea.
Podríamos usar la base de datos "test" (si tenemos acceso a ella) para los ejemplos
que vienen a continuación, pero cualquier cosa que hagamos puede ser eliminada por
cualquier otro usuario que tenga acceso a esta base de datos. Por esta razón, es
recomendable que preguntemos al administrador MySQL acerca de la base de datos
que podemos usar. Supongamos que deseamos tener una base de datos llamada
"zoológico" (nótese que no se está acentuando la palabra) a la cual sólo nosotros
tengamos acceso, para ello el administrador necesita ejecutar un comando como el
siguiente:
El mensaje anterior indica que la base de datos no ha sido creada, por lo tanto
necesitamos crearla.
Bajo el sistema operativo Unix, los nombres de las bases de datos son sensibles al uso
de mayúsculas y minúsculas (no como las palabras clave de SQL), por lo tanto
debemos de tener cuidado de escribir correctamente el nombre de la base de datos.
Esto es cierto también para los nombres de las tablas.
La base de datos se crea sólo una vez, pero nosotros debemos seleccionarla cada vez
que iniciamos una sesión con mysql. Por ello es recomendable que se indique la base
de datos sobre la que vamos a trabajar al momento de invocar al monitor de MySQL.
Por ejemplo:
Type 'help;' or '\h' for help. Type '\c' to clear the buffer
mysql>
Crear la base de datos es la parte más fácil, pero en este momento la base de datos
está vacía, como lo indica el comando SHOW TABLES:
La parte un tanto complicada es decidir la estructura que debe tener nuestra base de
datos: qué tablas se necesitan y qué columnas estarán en cada tabla.
En principio, necesitamos una tabla que contenga un registro para cada una de
nuestras mascotas. Ésta puede ser una tabla llamada mascotas, y debe contener por lo
menos el nombre de cada uno de nuestros animalitos. Ya que el nombre en sí no es
muy interesante, la tabla debe contener alguna otra información. Por ejemplo, si más
de una persona en nuestra familia tiene una mascota, es probable que tengamos que
guardar la información acerca de quién es el dueño de cada mascota. Así mismo,
también sería interesante contar con alguna información más descriptiva tal como la
especie, y el sexo de cada mascota.
¿Y qué sucede con la edad?. Esto puede ser también de interés, pero no es una buena
idea almacenar este dato en la base de datos. La edad cambia conforme pasa el
tiempo, lo cual significa que debemos de actualizar los registros frecuentemente. En
vez de esto, es una mejor idea guardar un valor fijo, tal como la fecha de nacimiento.
Entonces, cuando necesitemos la edad, la podemos calcular como la diferencia entre la
fecha actual y la fecha de nacimiento. MySQL proporciona funciones para hacer
operaciones entre fechas, así que no hay ningún problema.
Podemos usar la base de datos para tareas tales como generar recordatorios para cada
cumpleaños próximo de nuestras mascotas. Podemos calcular la edad en relación a
otras fechas que la fecha actual. Por ejemplo, si almacenamos la fecha en que murió
nuestra mascota en la base de datos, es fácil calcular que edad tenía nuestro animalito
cuando falleció. Es probable que estemos pensando en otro tipo de información que
sería igualmente útil en la tabla "mascotas", pero para nosotros será suficiente por
ahora contar con información de nombre, propietario, especie, nacimiento y
fallecimiento.
Usaremos la sentencia CREATE TABLE para indicar como estarán conformados los
registros de nuestras mascotas.
mysql>
VARCHAR es una buena elección para los campos nombre, propietario, y especie, ya
que los valores que almacenarán son de longitud variable. No es necesario que la
longitud de estas columnas sea la misma, ni tampoco que sea de 20. Se puede
especificar cualquier longitud entre 1 y 255, lo que se considere más adecuado. Si
resulta que la elección de la longitud de los campos que hemos hecho no resultó
adecuada, MySQL proporciona una sentencia ALTER TABLE que nos puede ayudar a
solventar este problema.
El campo sexo puede ser representado en una variedad de formas, por ejemplo, "m" y
"f", o tal vez "masculino" y "femenino", aunque resulta más simple la primera opción.
El uso del tipo de dato DATE para los campos nacimiento y fallecimiento debe de
resultar obvio.
Ahora que hemos creado la tabla, la sentencia SHOW TABLES debe producir algo
como:
mysql>
Para verificar que la tabla fue creada como nosotros esperábamos, usaremos la
sentencia DESCRIBE:
mysql>
Después de haber creado la tabla, ahora podemos incorporar algunos datos en ella,
para lo cual haremos uso de las sentencias INSERT y LOAD DATA.
Supongamos que los registros de nuestras mascotas pueden ser descritos por los datos
mostrados en la siguiente tabla.
Debemos observar que MySQL espera recibir fechas en el formato YYYY-MM-DD, que
puede ser diferente a lo que nosotros estamos acostumbrados.
Ya que estamos iniciando con una tabla vacía, la manera más fácil de poblarla es crear
un archivo de texto que contenga un registro por línea para cada uno de nuestros
animalitos para que posteriormente carguemos el contenido del archivo en la tabla
únicamente con una sentencia.
De este ejemplo, debemos ser capaces de ver que es un poco más la tarea que se
tiene que realizar si inicialmente cargamos los registros con varias sentencias INSERT
en lugar de una única sentencia LOAD DATA.
La manera más simple de la sentencia SELECT es cuando se recuperan todos los datos
de una tabla:
Esta forma del SELECT es útil si deseamos ver los datos completos de la tabla, por
ejemplo, para asegurarnos de que están todos los registros después de la carga de un
archivo.
Por ejemplo, en este caso que estamos tratando, al consultar los registros de la tabla,
nos damos cuenta de que hay un error en el archivo de datos (mascotas.txt): parece
que Kaiser ha nacido después de que ha fallecido!. Al revisar un poco el pedigree de
Kaiser encontramos que la fecha correcta de nacimiento es el año 1989, no 1998.
Hay por lo menos un par de maneras de solucionar este problema:
Editar el archivo "mascotas.txt" para corregir el error, eliminar los datos de la tabla
mascotas con la sentencia DELETE, y cargar los datos nuevamente con el comando
LOAD DATA:
Sin embargo, si hacemos esto, debemos ingresar los datos de Pelusa, la mascota de
nuestra hermana Diana.
La segunda opción consiste en corregir sólo el registro erróneo con una sentencia
UPDATE:
Como se mostró anteriormente, es muy fácil recuperar los datos de una tabla
completa. Pero típicamente no deseamos hacer esto, particularmente cuando las tablas
son demasiado grandes. En vez de ello, estaremos más interesados en responder
preguntas particulares, en cuyo caso debemos especificar algunas restricciones para la
información que deseamos ver.
Podemos seleccionar sólo registros particulares de una tabla. Por ejemplo, si deseamos
verificar el cambio que hicimos a la fecha de nacimiento de Kaiser, seleccionamos sólo
el registro de Kaiser de la siguiente manera:
Podemos también combinar condiciones, por ejemplo, para localizar a los perros
hembras:
La consulta anterior usa el operador lógico AND. Hay también un operador lógico OR:
mysql> SELECT * FROM mascotas WHERE (especie = "Gato" AND sexo = "m")
-> OR (especie = "Perro" AND sexo = "f");
+--------+-------------+---------+------+------------+---------------+
| nombre | propietario | especie | sexo | nacimiento | fallecimiento |
+--------+-------------+---------+------+------------+---------------+
| Mau | Juan | Gato | m | 1998-03-17 | NULL |
| Buffy | Arnoldo | Perro | f | 1999-05-13 | NULL |
+--------+-------------+---------+------+------------+---------------+
2 rows in set (0.00 sec)
Si no deseamos ver los registros completos de una tabla, entonces tenemos que usar
los nombres de las columnas en las que estamos interesados separándolas por coma.
Por ejemplo, si deseamos conocer la fecha de nacimiento de nuestras mascotas,
debemos seleccionar la columna "nombre" y "nacimiento":
Sin embargo, debemos notar que la consulta recupera el nombre del propietario de
cada mascota, y algunos de ellos aparecen más de una vez. Para minimizar la salida,
agregaremos la palabra clave DISTINCT:
Se puede usar también una cláusula WHERE para combinar selección de filas con
selección de columnas. Por ejemplo, para obtener la fecha de nacimiento de los
perritos y los gatitos, usaremos la siguiente consulta:
Ordenando registros
Se debe notar en los ejemplos anteriores que las filas regresadas son mostradas sin
ningún orden en particular. Sin embargo, frecuentemente es más fácil examinar la
salida de una consulta cuando las filas son ordenadas en alguna forma útil. Para
ordenar los resultados, tenemos que usar una cláusula ORDER BY.
Para ordenar en orden inverso, debemos agregar la palabra clave DESC al nombre de
la columna que estamos usando en el ordenamiento:
Podemos ordenar múltiples columnas. Por ejemplo, para ordenar por tipo de animal, y
poner al inicio los animalitos más pequeños de edad, usaremos la siguiente consulta:
Notar que la palabra clave DESC aplica sólo a la columna nombrada que le precede.
MySQL proporciona diversas funciones que se pueden usar para efectuar cálculos sobre
fechas, por ejemplo, para calcular edades o extraer partes de una fecha (día, mes,
año, etc).
Para determinar la edad de cada una de nuestras mascotas, tenemos que calcular la
diferencia de años de la fecha actual y la fecha de nacimiento, y entonces substraer
uno si la fecha actual ocurre antes en el calendario que la fecha de nacimiento. Las
siguientes consultas muestran la fecha actual, la fecha de nacimiento y la edad para
cada mascota.
Aquí, YEAR( ) obtiene únicamente el año y RIGHT( ) obtiene los cinco caracteres más a
la derecha de cada una de las fechas, que representan el mes y el día (MM-DD). La
parte de la expresión que compara los valores MM-DD se evalúa a 1 o 0, y permite
ajustar el valor de la edad en el caso de que el valor MM-DD de la fecha actual ocurra
antes del valor MM-DD de la fecha de nacimiento.
Dado que la expresión en sí es bastante fea, se ha usado un alias (edad) que es el que
aparece como etiqueta en la columna que muestra el resultado de la consulta.
Esta consulta debe trabajar bien, pero el resultado puede ser de alguna manera más
útil si las filas son presentadas en algún orden. Para ello haremos uso de la cláusula
ORDER BY.
Para ordenar por edad en lugar de nombre, únicamente tenemos que usar una cláusula
ORDER BY diferente:
Una consulta similar puede ser usada para determinar la edad que tenía una mascota
cuando falleció. Para determinar que animalitos ya fallecieron, la condición es que el
valor en el campo fallecimiento no sea nulo (NULL). Entonces, para los registros con
valor no-nulo, calculamos la diferencia entre los valores fallecimiento y nacimiento.
La consulta usa fallecimiento IS NOT NULL, en vez de fallecimiento < > NULL porque
NULL es una valor especial. Esto será explicando más a detalle posteriormente.
Aquí habrá por supuesto una complicación si el mes actual es Diciembre. No podemos
simplemente agregar uno al número del mes (12) y buscar los registros cuyo mes de
nacimiento sea 13 porque dicho mes no existe. En vez de esto, tenemos que buscar los
animalitos que nacieron en Enero (mes 1).
Sin embargo, lo mejor es que podemos escribir una consulta que funcione no
importando cuál sea el mes actual. La función DATE_ADD( ) nos permite agregar un
intervalo de tiempo a una fecha dada. Si agregamos un mes al valor regresado por la
función NOW( ), y entonces extraemos el valor del mes con la función MONTH( ), el
resultado es que siempre obtendremos el mes siguiente.
Claramente observamos que no obtenemos resultados con algún significado con estos
operadores. Es por ello que tenemos que usar los operadores IS NULL e IS NOT NULL:
En MySQL, 0 o NULL significan falso y cualquier otro valor significa verdadero. El valor
que se considera verdadero por default es 1.
Cuando se usa un ORDER BY, los valores NULL son siempre ordenados primero, aun
cuando se use la cláusula DESC.
Coincidencia de patrones
La coincidencia de patrones basada en SQL nos permite usar _ (guión bajo) para un
solo carácter y % para un arbitrario número de caracteres. En MySQL, los patrones
SQL no son sensibles al uso de mayúsculas y minúsculas.
Es importante notar que no se usan los operadores =, < o > cuando se usan los
patrones SQL; en su lugar se usan los operadores LIKE y NOT LIKE.
Para demostrar cómo se usan las expresiones regulares, se van a mostrar los ejemplos
presentados anteriormente con el operador LIKE, ahora con el operador REGEXP.
Desde la versión 3.23.4, para forzar que el operador REGEXP sea sensible al uso de
mayúsculas y minúsculas, se tiene que usar la palabra clave BINARY para hacer de una
de las cadenas, una cadena binaria. Observar los resultados de las siguientes
consultas.
Para encontrar los nombres que finalizan con la palabra fy, haremos uso del carácter
$.
Para encontrar los nombres que contienen una letra s, la consulta sería:
Conteo de filas
Las bases de datos son usadas frecuentemente para responder una pregunta, "¿Con
qué frecuencia ocurre un cierto tipo de dato en una tabla?". Por ejemplo, tal vez
queremos conocer cuántas mascotas tenemos, o cuántas mascotas tiene cada uno de
los propietarios.
Contar el número total de animalitos que tenemos es lo mismo que hacer la siguiente
pregunta "¿Cuántas filas hay en la tabla mascotas?" ya que hay un registro por
mascota. La función COUNT( ) es la que nos ayuda en esta situación.
Si deseamos conocer cuántas mascotas tiene cada uno de los propietarios, la consulta
es la siguiente:
mysql> SELECT propietario, COUNT(*) FROM mascotas GROUP BY propietario ;
+-------------+----------+
| propietario | COUNT(*) |
+-------------+----------+
| Arnoldo | 2 |
| Benito | 2 |
| Diana | 2 |
| Juan | 1 |
| Omar | 1 |
| Tomás | 1 |
+-------------+----------+
6 rows in set (0.00 sec)
Se debe notar que se ha usado una cláusula GROUP BY para agrupar todos los
registros de cada propietario. Si no hacemos esto, obtendremos un mensaje de error:
No es necesario que se obtengan todos los datos de una tabla cuando se usa la función
COUNT( ). Por ejemplo, en la consulta anterior, para ver únicamente los datos de
perritos y gatitos, la consulta queda de la siguiente manera:
La tabla mascotas nos ha servido hasta este momento para tener guardados los datos
acerca de los animalitos que tenemos. Si deseamos guardar algún otro tipo de
información acerca de ellos, tal como los eventos en sus vidas -visitas al veterinario,
nacimientos de una camada, etc- necesitaremos de otra tabla. ¿Cómo deberá estar
conformada esta tabla?. Lo que necesitamos es:
El nombre de la mascota para saber a cuál de ellas se refiere el evento.
Una fecha para saber cuándo ocurrió el evento.
Una descripción del evento.
Un campo que indique el tipo de evento, si deseamos categorizarlos.
Dadas estas condiciones, la sentencia para crear la tabla eventos queda de la siguiente
manera:
De manera similar a la tabla mascotas, es más fácil cargar los datos de los registros
iniciales al crear un archivo de texto delimitado por tabuladores en el que se tenga la
siguiente información: nombre fecha tipo descripción
Supongamos que deseemos conocer la edad de cada mascota cuando tuvieron una
camada. La tabla eventos indica cuando ocurrió dicho evento, pero para calcular la
edad de la madre, necesitamos sin duda su fecha de nacimiento. Dado que este dato
está almacenado en la tabla mascotas, necesitamos de ambas tablas para realizar esta
consulta.
La cláusula FROM lista dos tablas dado que la consulta necesita información que se encuentra
en ambas tablas.
Cuando se combina (junta) información de múltiples tablas, es necesario especificar los
registros de una tabla que pueden coincidir con los registros en la otra tabla. En nuestro caso,
ambas columnas tienen una columna "nombre". La consulta usa la cláusula WHERE para
obtener los registros cuyo valor en dicha columna es el mismo en ambas tablas.
Dado que la columna "nombre" ocurre en ambas tablas, debemos de especificar a cuál de las
columnas nos referimos. Esto se hace al anteponer el nombre de la tabla al nombre de la
columna.
No es necesario que se tengan dos tablas diferentes para que se puedan juntar.
Algunas veces es útil juntar una tabla consigo misma si se desean comparar registros
de la misma tabla. Por ejemplo, para encontrar las posibles parejas entre nuestras
mascotas de acuerdo a la especie, la consulta sería la siguiente:
Se pueden distribuir los scripts a otras personas para que puedan ejecutar también nuestros
comandos y sentencias.
En algunas situaciones no se permite el uso interactivo de mysql. Por ejemplo cuando se
ejecuta un cron. En este caso, es indispensable usar el modo batch.