Tutorial Mysql
Tutorial Mysql
Por MySQL-Hispano.org.
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 refiere 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
en este artículo, 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.
Algunas instalaciones permiten que los usuarios se conecten de manera anónima al
servidor corriendo en la máquina local. Si es el caso de nuestra máquina, debemos de ser
capaces de conectarnos al servidor invocando a mysql sin ninguna opción:
shell> mysql
mysql>
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í.
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)
SINTAXIS MySQL II
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 dónde 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 |
+-------------------+--------------+
| blueman@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 ( " ).
Los comandos multi-línea comúnmente ocurren por accidente cuando tecleamos
ENTER, pero olvidamos escribir el punto y coma. En este caso mysql se queda esperando
para que finalicemos la consulta.
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últiples 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.
USAR UNA BASE DE DATOS
Ahora que conocemos como escribir y ejecutar sentencias, es tiempo de acceder 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.
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 "zoologico"
(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 TABLA
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.
El archivo mascotas.txt
Notar que los valores de cadenas y fechas deben estar encerrados entre comillas.
También, con la sentencia INSERT podemos insertar el valor NULL directamente para
representar un valor nulo, un valor que no conocemos. En este caso no se usa \N como en
el caso de la sentencia LOAD DATA.
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.
RECUPERAR INFORMACIÓN DE UNA TABLA
mysql>
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.
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.
SELECCIONAR REGISTROS PARTICULARES
mysql>
Podemos también combinar condiciones, por ejemplo, para localizar a los perros
hembras:
mysql>
La consulta anterior usa el operador lógico AND. Hay también un operador lógico
OR:
mysql>
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)
mysql>
SELECCIONAR COLUMNAS PARTICULARES
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":
mysql>
mysql>
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:
mysql> SELECT DISTINCT propietario FROM mascotas;
+-------------+
| propietario |
+-------------+
| Arnoldo |
| Juan |
| Benito |
| Diana |
| Omar |
| Tomás |
+-------------+
6 rows in set (0.03 sec)
mysql>
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:
mysql>
ORDENAR 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.
mysql>
Para ordenar en orden inverso, debemos agregar la palabra clave DESC al nombre de
la columna que estamos usando en el ordenamiento:
mysql>
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:
mysql>
Notar que la palabra clave DESC aplica sólo a la columna nombrada que le
precede.