Taller de MySQL
Taller de MySQL
Taller de MySQL
Expositor:
Manuel Ferral
Guzmn.
Taller de MySQL
Diapositiva 1 de
24.
I. Introduccin.
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 tambin 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.
Para ver la lista de opciones proporcionadas por mysql, lo invocamos con la opcin --help:
shell> mysql --help
Taller de MySQL
Diapositiva 2 de
24.
Taller de MySQL
Diapositiva 3 de
24.
Este prompt nos indica que mysql est listo para recibir comandos.
Algunas instalaciones permiten que los usuarios se conecten de manera annima al servidor
corriendo en la mquina local. Si es el caso de nuestra mquina, debemos de ser capaces de
conectarnos al servidor invocando a mysql sin ninguna opcin:
shell> mysql
Despus de que nos hemos conectado de manera satisfactoria, podemos desconectarnos en
cualquier momento al escribir "quit", "exit", o presionar CONTROL+D.
La mayora de los ejemplos siguientes asume que estamos conectados al servidor, lo cual se
indica con el prompt de mysql.
Taller de MySQL
Diapositiva 4 de
24.
Taller de MySQL
Diapositiva 5 de
24.
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 expresin (como en el ejemplo anterior) las etiquetas en las columnas son la
expresin en s.
mysql muestra cuntas filas fueron regresadas y cuanto 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
comunicacin en una red.
Las palabras clave pueden ser escritas usando maysculas y minsculas.
Taller de MySQL
Diapositiva 6 de
24.
Taller de MySQL
Diapositiva 7 de
24.
Aunque hasta este momento se han escrito sentencias sencillas de una sla lnea, es posible
escribir ms de una sentencia por lnea, siempre y cuando estn separadas por punto y coma:
mysql> SELECT VERSION(); SELECT NOW();
+----------------+
| VERSION( ) |
+----------------+
| 3.23.41
|
+----------------+
1 row in set (0.01 sec)
+----------------------------+
| NOW( )
|
+----------------------------+
|2002-10-28 14:26:04 |
+----------------------------+
1 row in set (0.01 sec)
Un comando no necesita ser escrito en una sola lnea, as que los comandos que requieran de
varias lneas no son un problema. mysql determinar en donde finaliza la sentencia cuando
encuentre el punto y coma, no cuando encuentre el fin de lnea.
Taller de MySQL
Diapositiva 8 de
24.
Aqu est un ejemplo que muestra un consulta simple escrita en varias lneas:
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 lneas. Esta es la manera en cmo 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>
Conalep Manuel Maples Arce, Papantla de Olarte Ver.
Taller de MySQL
Diapositiva 9 de
24.
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
descripcin de su significado para mysql:
Prompt
Significado
mysql>
->
'>
">
Taller de MySQL
Diapositiva 10 de
24.
De nuevo, se nos regresa el comando el prompt mysql> que nos indica que mysql est listo
para una nueva consulta.
Los comandos multi-lnea comnmente 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:
mysql> SELECT USER( )
->
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> SELECT USER( )
-> ;
+---------------------+
| USER( )
|
+---------------------+
| root@localhost |
+---------------------+
1 row in set (0.00 sec)
mysql>
Conalep Manuel Maples Arce, Papantla de Olarte Ver.
Taller de MySQL
Diapositiva 11 de
24.
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 multiple lneas. 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 ms 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;
">
Si escribimos esta consulta SELECT y entonces presionamos ENTER para ver el resultado, no
suceder nada. En lugar de preocuparnos porque la consulta ha tomado mucho tiempo, debemos
notar la pista que nos da mysql cambiando el prompt. Esto nos indica que mysql est esperando
que finalicemos la cadena iniciada ("Lupita).
Taller de MySQL
Diapositiva 12 de
24.
Taller de MySQL
Diapositiva 13 de
24.
Ahora que conocemos como escribir y ejecutar sentencias, es tiempo de accesar a una base de
datos.
Supongamos que tenemos diversas mascotas en casa (nuestro pequeo zoolgico) y
deseamos tener registros de los datos acerca de ellas. Podemos hacer esto al crear tablas que
guarden esta informacin, para que posteriormente la consulta de estos datos sea bastante fcil y
de manera muy prctica. Esta seccin muestra como crear una base de datos, crear una tabla,
incorporar datos en una tabla, y recuperar datos de las tablas de diversas maneras.
La base de datos "zoolgico" ser muy simple (deliveradamente), pero no es difcil pensar de
situaciones del mundo real en la cual una base de datos similar puede ser usada.
Primeramente usaremos la sentencia SHOW para ver cules son las bases de datos existentes
en el servidor al que estamos conectados:
mysql> SHOW DATABASES;
+-------------+
| Database |
+-------------+
| mysql
|
| test
|
+-------------+
2 rows in set (0.00 sec)
mysql>
Conalep Manuel Maples Arce, Papantla de Olarte Ver.
Taller de MySQL
Diapositiva 14 de
24.
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" estarn entre ellas. En particular, la base de
datos "mysql" es requerida, ya que sta tiene la informacin de los privilegios de los usuarios de
MySQL. La base de datos "test" es creada durante la instalacin de MySQL con el propsito de
servir como rea de trabajo para los usuarios que inician en el aprendizaje de MySQL.
Se debe anotar tambin que es posible que no veamos todas las bases de datos si no tenemos
el privilegio SHOW DATABASES. Se recomienda revisar la seccin del manual de MySQL
dedicada a los comandos GRANT y REVOKE.
Si la base de datos "test" existe, hay que intentar accesar a ella:
mysql> USE test
Database changed
mysql>
Observar que USE, al igual que QUIT, no requieren el uso del punto y coma, aunque si se usa
ste, no hay ningn problema. El comando USE es especial tambin de otra manera: ste debe
ser usado en una sola lnea.
Taller de MySQL
Diapositiva 15 de
24.
Podramos usar la base de datos "test" (si tenemos acceso a ella) para los ejemplos que vienen
a continuacin, pero cualquier cosa que hagamos puede ser eliminada por cualquier otro usuario
que tenga acceso a esta base de datos. Por esta razn, 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" (ntese que no se est acentuando la palabra) a la
cual slo nosotros tengamos acceso, para ello el administrador necesita ejecutar un comando
como el siguiente:
mysql> GRANT ALL on zoologico.* TO MiNombreUsuario@MiComputadora
-> IDENTIFIED BY 'MiContrasea';
En donde MiNombreUsuario es el nombre de usuario asignado dentro del contexto de MySQL,
MiComputadora es el nombre o la direccin IP de la computadora desde la que nos conectamos al
servidor MySQL, y MiContrasea es la contrasea que se nos ha asignado, igualmente, dentro del
ambiente de MySQL exclusivamente. Ambos, nombre de usuario y contrasea no tienen nada que
ver con el nombre de usuario y contrasea manejados por el sistema operativo (si es el caso).
Taller de MySQL
Diapositiva 16 de
24.
Si el administrador cre la base de datos al momento de asignar los permisos, podemos hacer
uso de ella. De otro modo, nosotros debemos crearla:
mysql> USE zoologico
ERROR 1049: Unknown database 'zoologico
mysql>
El mensaje anterior indica que la base de datos no ha sido creada, por lo tanto necesitamos
crearla.
mysql> CREATE DATABASE zoologico;
Query OK, 1 row affected (0.00 sec)
mysql> USE zoologico
Database changed
mysql>
Bajo el sistema operativo Unix, los nombres de las bases de datos son sensibles al uso de
maysculas y minsculas (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 tambin para los
nombres de las tablas.
Al crear una base de datos no se selecciona sta de manera automtica; debemos hacerlo de
manera explcita, por ello usamos el comando USE en el ejemplo anterior.
Conalep Manuel Maples Arce, Papantla de Olarte Ver.
Taller de MySQL
Diapositiva 17 de
24.
La base de datos se crea slo una vez, pero nosotros debemos seleccionarla cada vez que
iniciamos una sesin 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:
shell>mysql -h casita -u blueman -p zoologico
Enter password: ******
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 17 to server version: 3.23.38-nt
Type 'help;' or '\h' for help. Type '\c' to clear the buffer
mysql>
Observar que "zoologico" no es la contrasea que se est proporcionando desde la lnea de
comandos, sino el nombre de la base de datos a la que deseamos acceder. Si deseamos
proporcionar la contrasea en la lnea de comandos despus de la opcin "-p", debemos de
hacerlo sin dejar espacios (por ejemplo, -phola123, no como -p hola123). Sin embargo, escribir
nuestra contrasea desde la lnea de comandos no es recomendado, ya que es bastante inseguro.
Taller de MySQL
Diapositiva 18 de
14.
Crear la base de datos es la parte ms fcil, pero en este momento la base de datos est vaca,
como lo indica el comando SHOW TABLES:
mysql> SHOW TABLES;
Empty set (0.00 sec)
La parte un tanto complicada es decidir la estructura que debe tener nuestra base de datos: qu
tablas se necesitan y qu columnas estarn 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 informacin. Por ejemplo, si ms de una persona en nuestra familia tiene una
mascota, es probable que tengamos que guardar la informacin acerca de quien es el dueo de
cada mascota. As mismo, tambin sera interesante contar con alguna informacin ms
descriptiva tal como la especie, y el sexo de cada mascota.
Y que sucede con la edad?. Esto puede ser tambin de inters, 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 ningn
problema.
Conalep Manuel Maples Arce, Papantla de Olarte Ver.
Taller de MySQL
Diapositiva 19 de
14.
Taller de MySQL
Diapositiva 20 de
14.
Taller de MySQL
Diapositiva 21 de
14.
Para verificar que la tabla fue creada como nosotros esperbamos, usaremos la sentencia
DESCRIBE:
mysql> DESCRIBE mascotas;
+----------------+----------------+-------+-----+---------+---------+
| Field
| Type
| Null | Key | Default | Extra |
+----------------+----------------+-------+-----+---------+---------+
| nombre
| varchar(20) | YES | | NULL |
|
| propietario | varchar(20) | YES | | NULL |
|
| especie
| varchar(20) | YES | | NULL |
|
| sexo
| char(1)
| YES |
| NULL |
|
| nacimiento | date
| YES | | NULL |
|
| fallecimento | date
| YES | | NULL |
|
+----------------+----------------+-------+-----+---------+---------+
6 rows in set (0.01 sec)
mysql>
Podemos hacer uso de la sentencia DESCRIBE en cualquier momento, por ejempo, si
olvidamos los nombres el tipo de las columnas en la tabla.
Taller de MySQL
Diapositiva 21 de
14.
Despus 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.
Nombre
Propietario
Especie
Sexo
Nacimiento
Fluffy
Arnoldo
Gato
1999-02-04
Mau
Juan
Gato
1998-03-17
Buffy
Arnoldo
Perro
1999-05-13
FanFan
Benito
Perro
2000-08-27
Kaiser
Diana
Perro
1998-08-31
Chispa
Omar
Ave
1998-09-11
Wicho
Toms
Ave
Skim
Benito
Serpiente
Fallecimiento
1997-07-29
2000-02-09
m
2001-04-29
Debemos observar que MySQL espera recibir fechas en el formato YYYY-MM-DD, que puede
ser diferente a lo que nosotros estamos acostumbrados.
Conalep Manuel Maples Arce, Papantla de Olarte Ver.
Taller de MySQL
Diapositiva 6 de
14.
Ya que estamos iniciando con una tabla vaca, la manera ms fcil de poblarla es crear un
archivo de texto que contenga un registro por lnea para cada uno de nuestros animalitos para que
posteriormente carguemos el contenido del archivo en la tabla nicamente con una sentencia.
Por tanto, debemos de crear un archivo de texto "mascotas.txt" que contenga un registro por
lnea con valores separados por tabuladores, cuidando que el orden de las columnas sea el mismo
que utilizamos en la sentencia CREATE TABLE. Para valores que no conozcamos podemos usar
valores nulos (NULL). Para representar estos valores en nuestro archivo debemos usar \N.
Para cargar el contenido del archivo en la tabla mascotas, usaremos el siguiente comando:
mysql> LOAD DATA LOCAL INFILE "mascotas.txt" INTO TABLE mascotas;
La sentencia LOAD DATA nos permite especificar cul es el separador de columnas, y el
separador de registros, por default el tabulador es el separador de columnas (campos), y el salto
de lnea es el separador de registros, que en este caso son suficientes para que la sentencia
LOAD DATA lea correctamente el archivo "mascotas.txt".
Si lo que deseamos es aadir un registro a la vez, entonces debemos hacer uso de la sentencia
INSERT. En la manera ms simple, debemos proporcionar un valor para cada columna en el orden
en el cual fueron listados en la sentencia CREATE TABLE. Supongamos que nuestra hermana
Diana compra un nuevo hamster nombrado Pelusa.
Conalep Manuel Maples Arce, Papantla de Olarte Ver.
Taller de MySQL
Diapositiva 6 de
14.
Podemos usar la sentencia INSERT para agregar su registro en nuestra base de datos.
mysql> INSERT INTO mascotas
-> VALUES('Pelusa','Diana','Hamster','f','2000-03-30',NULL);
Notar que los valores de cadenas y fechas deben estar encerrados entre comillas. Tambin, 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 ms la tarea que se tiene que
realizar si inicialmente cargamos los registros con varias sentencias INSERT en lugar de una
nica sentencia LOAD DATA.
Taller de MySQL
Diapositiva 6 de
14.
La sentencia SELECT es usada para obtener la informacin guardada en una tabla. La forma
general de esta sentencia es:
SELECT
CondicinASatisfacer
LaInformacinQueDeseamos
FROM
DeQueTabla
WHERE
Aqu, LaInformacinQueDeseamos es la informacin que queremos ver. Esta puede ser una
lista de columnas, o un * para indicar "todas las columnas". DeQueTabla indica el nombre de la
tabla de la cual vamos a obtener los datos. La clasula WHERE es opcional. Si est presente, la
CondicinASatisfacer especifica las condiciones que los registros deben satisfacer para que
puedan ser mostrados.
Seleccionando todos los datos.
La manera ms simple de la sentencia SELECT es cuando se recuperan todos los datos de una
tabla:
mysql> SELECT * FROM mascotas;
+----------+---------------+--------------+-------+-----------------+-----------------+
| nombre | propietario | especie | sexo | nacimiento | fallecimiento |
+----------+---------------+--------------+-------+-----------------+-----------------+
| Fluffy | Arnoldo
| Gato
|f
| 1999-02-04 | NULL
|
| Mau
| Juan
| Gato
|m
| 1998-03-17 | NULL
|
| Buffy | Arnoldo | Perro
|f
| 1999-05-13 | NULL
|
| FanFan | Benito
| Perro
|m
| 2000-08-27 | NULL
|
Conalep Manuel Maples Arce, Papantla de Olarte Ver.
Taller de MySQL
Diapositiva 6 de
14.
| FanFan | Benito
| Perro
|m
| 2000-08-27 | NULL
|
| Kaiser | Diana
| Perro
|m
| 1998-08-31 | 1997-07-29 |
| Chispa | Omar
| Ave
|f
| 1998-09-11 | NULL
|
| Wicho | Toms
| Ave
| NULL | 2000-02-09 | NULL
|
| Skim | Benito
| Serpiente | m
| 2001-04-29 | NULL
|
| Pelusa | Diana
| Hamster | f
| 2000-03-30 | NULL
|
+----------+---------------+--------------+-------+-----------------+-----------------+
9 rows in set (0.00 sec).
Esta forma del SELECT es til si deseamos ver los datos completos de la tabla, por ejemplo,
para asegurarnos de que estn todos los registros despus 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 despus de que ha fallecido!. Al revisar un poco el pedigree de Kaiser encontramos que la
fecha correcta de nacimiento es el ao 1989, no 1998.
Hay por lo menos un par de maneras de solucionar este problema:
Taller de MySQL
Diapositiva 6 de
14.
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:
mysql> DELETE FROM mascotas;
mysql> LOAD DATA LOCAL INFILE "mascotas.txt" INTO TABLE mascotas;
Sin embargo, si hacemos esto, debemos ingresar los datos de Pelusa, la mascota de nuestra
hermana Diana.
La segunda opcin consiste en corregir slo el registro errneo con una sentencia UPDATE:
mysql> UPDATE mascotas SET nacimiento="1989-08-31" WHERE nombre="Kaiser";
Como se mostr anteriormente, es muy fcil recuperar los datos de una tabla completa. Pero
tpicamente no deseamos hacer esto, particularmente cuando las tablas son demasiado grandes.
En vez de ello, estaremos ms interesados en responder preguntas particulares, en cuyo caso
debemos especificar algunas restricciones para la informacin que deseamos ver.
Taller de MySQL
Diapositiva 6 de
14.
Taller de MySQL
Diapositiva 7 de
14.
Taller de MySQL
Diapositiva 7 de
14.
Podemos tambin combinar condiciones, por ejemplo, para localizar a los perros hembras:
mysql> SELECT * FROM mascotas WHERE especie = "Ave" OR especie = "Gato";
+----------+---------------+-----------+---------+-----------------+------------------+
| nombre | propietario | especie | sexo | nacimiento | fallecimiento |
+----------+---------------+-----------+---------+-----------------+------------------+
| Fluffy | Arnoldo
| Gato | f
| 1999-02-04 | NULL
|
| Mau
| Juan
| Gato | m
| 1998-03-17 | NULL
|
| Chispa | Omar
| Ave
|f
| 1998-09-11 | NULL
|
| Wicho | Toms
| Ave
| NULL | 2000-02-09 | NULL
|
+----------+---------------+-----------+---------+-----------------+------------------+
4 rows in set (0.00 sec)
El operador AND y el operador OR pueden ser intercambiados. Si hacemos esto, es buena idea
usar parntesis para indicar como deben ser agrupadas las condiciones:
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)
Conalep Manuel Maples Arce, Papantla de Olarte Ver.
Taller de MySQL
Diapositiva 7 de
14.
Taller de MySQL
Diapositiva 7 de
14.
Taller de MySQL
Diapositiva 7 de
14.
Taller de MySQL
14.
Diapositiva 7 de