You are on page 1of 12

Tutorial de MySQL

MySQL es uno de los sistemas de gestin de bases de datos ms populares del mercado.
Se trata de un SGBD basado en el modelo relacional, con licencia dual GPL y propietaria,
desarrollado por MySQL AB, una compaa propiedad de Sun Microsystems, creadores de
Java, desde Enero de 2008.
En esta entrada veremos algunos de los comandos bsicos utilizados a la hora de trabajar
con MySQL. Si programas en Java tambin te puede interesar nuestra entrada sobre JDBC;
si programas en Python, nuestra entrada sobre DB-API.

Para iniciar el cliente indicando el nombre de usuario (en este caso root):
mysql -u root
Para que nos pida la contrasea:
mysql -u root -p
Para especificar la mquina (el host) en el que se aloja el servidor MySQL:
mysql -u root -p -h localhost
Para especificar la base de datos a utilizar por defecto basta aadir el nombre al final. Es
equivalente a utilizar ms tarde el comando USE.
mysql -u root -p -h localhost base_datos
Para ejecutar un script SQL:
mysql < archivo.sql
o desde la consola de MySQL:
1. source archivo.sql
Para crear una base de datos:
1. CREATE DATABASE base_datos;
Si ya existe una base de datos con ese nombre, MySQL devolver un error. Si queremos
crear una base de datos solo cuando no exista ya una del mismo nombre (y por lo tanto no
obtener este error) podemos aadir el texto IF NOT EXISTS:
1. CREATE DATABASE IF NOT EXISTS base_datos;
A la hora de crear la base de datos tambin se puede especificar el juego de caracteres y
la colacin (conjunto de reglas utilizadas para comparar los caracteres) a utilizar por
defecto. Esto se logra con DEFAULT CHARACTER SET y DEFAULT COLLATE respectivamente. Al
definir un juego de caracteres y una colacin por defecto para la base de datos, las tablas
usarn estos valores por defecto, a menos que se indiquen otros al crear la tabla.
1. CREATE DATABASE IF NOT EXISTS base_datos
2. DEFAULT CHARACTER SET utf8
3. DEFAULT COLLATE utf8_general_ci;
Tambin se puede especificar un juego de caracteres y colacin a utilizar por defecto para
el servidor mediante las opciones --character-set-server y --collation-server.
Para comunicarnos con el servidor usando un cierto juego de caracteres se puede usar el
comando SET NAMES.
1. SET NAMES "utf8";
Podemos ver una lista de los juegos de caracteres admitidos por MySQL mediante el
comando SHOW CHARACTER SET;. Algunos juegos de caracteres comnmente utilizados son:
ascii, de American Standard Code for Information Interchange; tambin conocido
como US-ASCII. Es una codificacin de caracteres de 7 bits basado en el alfabeto
ingls con 95 caracteres imprimibles.
latin1, el juego de caracteres por defecto en MySQL. Contrariamente a lo que cabra
esperar se trata de la codificacin ANSI / CP1252 / WinLatin1 / Windows-1252 y no
del estndar de la ISO 8859-1 o del estndar de la IANA ISO-8859-1 (ntese el
guin extra; se trata de un super conjunto de ISO 8859-1), que son los que se
suelen conocer como Latin-1. Los tres son bastante parecidos, por lo que a
menudo se consideran equivalentes errneamente, y son causa de confusin
habitual (de hecho el propio MySQL tena un bug relacionado). En concreto CP1252
se diferencia de ISO-8859-1 en que se utiliza el rango 080-0x9F para representar
distintos caracteres imprimibles, como el smbolo del euro o el de la libra, en lugar
de caracteres de control. A diferencia de ASCII, CP1252, y por lo tanto ISO 8859-1 e
ISO-8859-1, son juegos de caracteres de 8 bits, por lo que permiten representar
256 caracteres distintos. Los tres incluyen los caracteres necesarios para
representar textos en las lenguas de Europa occidental: afrikaans, alemn,
aragons, asturiano, cataln, dans, escocs, espaol, feros, fins, francs,
galico, gallego, ingls, islands, italiano, neerlands, noruego, portugus, sueco y
vasco.
utf8, de 8-bit Unicode Transformation Format. Unicode es un acrnimo de
Universal Code (cdigo universal) y es, como su nombre indica, un juego de
caracteres con el que podemos representar textos escritos en la mayora de los
alfabetos del planeta: latino, rabe, hebreo, griego, japons, chino, coreano,
cirlico, UTF-8 en concreto utiliza de 1 a 4 bytes para representar los caracteres,
dependiendo del smbolo.
Para ascii la colacin por defecto es ascii_general_ci, para latin1 latin1_swedish_ci y para utf8
utf8_general_ci.
Los nombres de las colaciones comienzan con el nombre del juego de caracteres asociado
y terminan con _ci (case insensitive) si la comparacin no tiene en cuenta maysculas y
minsculas, _cs (case sensitive) en caso contrario y _bin si es binaria (tambin case
sensitive). Por tanto se pueden consultar las distintas colaciones disponibles para un juego
de caracteres con un comando similar a
1. SHOW COLLATION LIKE "utf8%";
Para ver las distintas bases de datos disponibles en nuestro servidor MySQL:
1. SHOW DATABASES;
Para borrar una base de datos:
1. DROP DATABASE base_datos;
Para seleccionar la base de datos con la que queremos trabajar:
1. USE base_datos;
Para ver las tablas de la base de datos:
1. SHOW TABLES;
Para ver las columnas de la tabla:
1. SHOW COLUMNS FROM tabla;
o bien el atajo:
1. DESCRIBE tabla;
e incluso:
1. DESC tabla;
Si necesitamos ver tambin la colacin, los privilegios que tenemos o los comentarios de
las columnas aadiremos la palabra clave FULL a SHOW COLUMNS:
1. SHOW FULL COLUMNS FROM tabla;
Para crear una tabla nueva se usa el comando CREATE TABLE tabla al que se le pasa la
definicin de las columnas, las posibles restricciones (constraints) y las opciones de la
tabla y de particin.
1. CREATE TABLE usuario (
2. id_usuario INT PRIMARY KEY AUTO_INCREMENT,
3. nombre VARCHAR(50) NOT NULL,
4. direccion VARCHAR(50) NOT NULL,
5. ciudad VARCHAR(20) NOT NULL,
6. edad TINYINT NOT NULL
7. );
1. CREATE TABLE blog (
2. id_blog INT PRIMARY KEY AUTO_INCREMENT,
3. id_usuario INT REFERENCES usuario(id_usuario),
4. titulo VARCHAR(30) NOT NULL
5. );
Los tipos de las columnas pueden ser nmeros enteros, nmeros decimales, fechas, horas,
cadenas y los tipos espaciales del Open Geospatial Consortium, que se omitirn en esta
explicacin.
Veamos primero los tipos numricos:
BIT: Representacin en binario de un nmero. Por defecto es un nmero binario de
1 bit por lo que su valor puede ser 0 o 1. Se puede utilizar un nmero distinto de
bits, de 1 a 64, pasando el valor entre parntesis, por ejemplo BIT(8).
TINYINT: Para representar enteros muy pequeos, de -128 a 127. Se puede utilizar la
palabra clave UNSIGNED para que almacene solo nmeros positivos, en cuyo caso el
rango va de 0 a 255. Tambin se puede indicar el nmero mnimo de dgitos que
queremos utilizar para mostrar el valor encerrando esta cantidad entre parntesis;
si se utiliza la palabra clave ZEROFILL el valor se rellenar con ceros a la izquierda
hasta completar el nmero de dgitos indicado. Esto es as para el resto de tipos
enteros, pero se obviar por considerarse de poca utilidad.
BOOL: Sinnimo de TINYINT(1). El valor 0 se considera falso, el resto verdadero.
BOOLEAN: Sinnimo de TINYINT(1). El valor 0 se considera falso, el resto verdadero.
SMALLINT: Un entero pequeo, de -32768 a 32767. Si se utiliza UNSIGNED el rango va
de 0 a 65535.
MEDIUMINT: Un entero de tamao medio, de -8388608 a 8388607. Si se usa
UNSIGNED, de 0 a 16777215.
INT: Un entero, con rango de -2147483648 a 2147483647 y de 0 a 4294967295 si es
UNSIGNED.
INTEGER: Sinnimo de INT.
BIGINT: Un entero grande, de -9223372036854775808 a 9223372036854775807 y
de 0 a 18446744073709551615 para los UNSIGNED
SERIAL: Alias para BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE.
FLOAT: Un nmero decimal en coma flotante. Los valores permitidos son el 0 y los
valores de -3.402823466E+38 a -1.175494351E-38 y de 1.175494351E-38 a
3.402823466E+38 aunque el rango puede ser menor dependiendo de la mquina y
el sistema operativo utilizado. Tambin podemos encontrarnos con algo como
FLOAT(3, 2) que indicara que queremos 3 dgitos, 2 de ellos para los decimales. En
este caso UNSIGNED solo sirve para indicar que no permitimos nmeros negativos.
Es importante tener en cuenta que los valores FLOAT no son exactos, solo es preciso
hasta, aproximadamente, 7 decimales. Si se necesita ms precisin hay que utilizar
el tipo DECIMAL.
DOUBLE: Un nmero en coma flotante de precisin doble. Los valores permitidos
van de -1.7976931348623157E+308 a -2.2250738585072014E-308 y de
2.2250738585072014E-308 a 1.7976931348623157E+308, adems del 0, aunque
el rango puede ser menor dependiendo de la mquina y el sistema operativo
utilizado. Como FLOAT, los valores DOUBLE no son exactos. Es preciso hasta,
aproximadamente, 15 decimales. Si se necesita mayor precisin hay que utilizar el
tipo DECIMAL.
REAL: Sinnimo de DOUBLE, a menos que est activado el modo REAL_AS_FLOAT, en
cuyo caso funciona como sinnimo de FLOAT.
DOUBLE PRECISION: Sinnimo de DOUBLE.
DECIMAL: Para representar nmeros decimales de forma ms precisa que FLOAT y
DOUBLE.
DEC: Sinnimo de DECIMAL
NUMERIC: Sinnimo de DECIMAL.
Los tipos relativos a fechas y horas son los siguientes:
DATE: Para representar una fecha en formato YYYY-MM-DD. El rango soportado va
desde 1000-01-01 a 9999-12-31.
DATETIME: Una combinacin de fecha y hora en formato YYYY-MM-DD HH:MM:SS.
El rango soportado va desde 1000-01-01 00:00:00 a 9999-12-31 23:59:59.
TIMESTAMP: Un timestamp. El rango va desde 1970-01-01 00:00:01 UTC a 2038-01-
09 03:14:07 UTC. Si se asigna el valor NULL a un TIMESTAMP se almacenar la fecha y
hora actual, por lo que puede ser til para saber cundo se realiz la ltima
inseccin o actualizacin.
TIME: Una hora. El valor se muestra en formato HH:MM:SS. El rango va de -
838:59:59 a 838:59:59.
YEAR: Un ao en formato YYYY. Los valores admitidos son 0000 y los valores de
1901 a 2155. Tambin se puede usar formato YY si se utiliza YEAR(2) en cuyo caso el
rango de valores admitidos va de 70 a 69, representando los aos de 1970 a 2069.
Por ltimo, los tipos de texto son los siguiente:
CHAR: Cadenas de longitud fija cuyo nmero de caracteres se especifica entre
parntesis (si no se especifica es 1 por defecto). Este mecanismo de indicar el
tamao entre parntesis es comn para el resto de los tipos, por lo que no se
obviar.
VARCHAR: Cadena de longitud variable. Opcionalmente se puede indicar el tamao
mximo de la cadena con un nmero entre parntesis.
BINARY: Similar a CHAR pero en este caso las cadenas se almacenan como binarias.
VARBINARY: Similar a VARCHAR pero en este caso las cadenas se almacenan como
binarias.
BLOB: Un Binary Large OBject (gran objeto binario), para almacenar datos binarios
como imgenes. El tamao mximo es de 65.535 bytes.
TINYBLOB: Un BLOB de pequeo tamao (un mximo de 255 bytes).
MEDIUMBLOB: Un BLOB de tamao medio (un mximo de 16.777.215 bytes; cerca de
16MB)
LONGBLOB: Un BLOB de gran tamao (un mximo de 4GB bytes)
TEXT: Un texto con un mximo de 65.535 caracteres (menos si se utilizan caracteres
multi-byte, evidentemente).
TINYTEXT: Un texto pequeo, con un mximo de 255 caracteres.
MEDIUMTEXT: Un texto de longitud media, con un mximo de 16.777.215 caracteres.
LONGTEXT: Un texto largo, con un mximo de 4.294.967.295 caracteres.
ENUM: Enumerado, un tipo cuyo valor puede ser una cadena de entre las indicadas
entre parntesis.
SET: Similar a ENUM, pero en este caso el campo puede tener cero o ms valores de
entre los indicados entre parntesis.
Para cada columna, adems del tipo, podemos definir otras propiedades
NOT NULL: No se puede introducir valores nulos.
DEFAULT valor: Para definir un valor por defecto
AUTO_INCREMENT: Para cada tupla aadida a la tabla el valor del campo crecer en
una unidad. Solo puede existir una columna con AUTO_INCREMENT en cada tabla, y
debe tratarse de una clave.
UNIQUE KEY: Los valores no se pueden repetir. Si puede existir varias tuplas con
valor NULL para la columna.
PRIMARY KEY: La clave primaria de la relacin. Los valores deben ser nicos y no
nulos. Una tabla, como es lgico, slo puede tener una clave primaria. Si
necesitamos crear una clave primaria compuesta por varios campos no podemos
usar este mtodo en el que definimos las propiedades de un solo campo, sino que
tendremos que utilizar una clausula PRIMARY KEY
COMMENT "comentario": Comentarios varios sobre el campo.
REFERENCES tabla (campo): Para crear una clave fornea o ajena. De esta forma
indicamos este valor toma valores de claves de otra tabla, implementando as una
relacin 1:N. En esta clausula tambin podemos indicar las reglas de integridad
referencial, es decir, qu ocurrir cuando se borre (ON DELETE) o se actualice (ON
UPDATE) la tupla referenciada. Los valores posibles son RESTRICT, que indica que no
se permite la actualizacin o borrado; CASCADE, con la que la actualizacin o
borrado se propaga; SET NULL, que establece las claves forneas a NULL y NO ACTION,
que en MySQL es similar a RESTRICT.
Las restricciones posibles para la tabla son:
PRIMARY KEY (campo1, campo2, ...): Para indicar el campo o campos que conforman la
clave primaria.
KEY (campo1, campo2, ...): Para crear una clave no primaria ni nica. Esto crear un
ndice para el campo.
INDEX (campo1, campo2, ...): Sinnimo de KEY.
FOREIGN KEY (campo1, campo2, ...) REFERENCES tabla (campo3, campo4, ...): Para crear una
clave fornea o ajena. Sigue el mismo formato que REFERENCES para las columnas.
CHECK (expresion): En teora, para definir otras restricciones. En realidad esta opcin
se admite por el parser, pero se ignora. Tenemos que recurrir a triggers o
disparadores.
Para eliminar una tabla:
1. DROP TABLE tabla;
Para que no produzca un error si la tabla no existe:
1. DROP TABLE IF EXISTS tabla;
Para modificar una tabla se utiliza ALTER TABLE que permite cosas como aadir columnas:
1. ALTER TABLE tabla ADD COLUMN valor INT;
Eliminar columnas:
1. ALTER TABLE tabla DROP COLUMN valor;
Cambiar la definicin de las columnas:
1. ALTER TABLE tabla MODIFY COLUMN valor TINYINT;
O renombrar la tabla:
1. ALTER TABLE tabla RENAME TO tabla2;
Para insertar valores en una tabla, si vamos a dar valores a todas las columnas:
1. INSERT INTO usuario VALUES (1, "Pablo Santander", "Calle Bolivia 18", "Madrid", 1
7);
Si slo vamos a dar valores solo a algunas columnas hay que indicar a cules
especificamente:
1. INSERT INTO usuario(nombre, direccion, ciudad, edad) VALUES ("Juan Marmota", "
Calle Santiago 23", "Sevilla", 21);
Para insertar varias tuplas con un solo INSERT solo hay que separarlas con comas:
1. INSERT INTO usuario VALUES
2. (3, "Marta Marsopa", "Calle Italia 4", "Madrid", 58),
3. (4, "Jaime Torres", "Avenida de Barcelona 12", "Valladolid" , 37),
4. (10, "Juan Martero", "Calle Madrid 12", "Barcelona", 26);
1. INSERT INTO blog VALUES
2. (1, 1, "El emo blog"),
3. (2, 2, "El ego blog"),
4. (4, 4, "Mis fotos"),
5. (5, 5, "En Groenlandia");
Para actualizar las tuplas:
1. UPDATE usuario
2. SET nombre = "Marta Marsupial", direccion = "Calle Italia 14"
3. WHERE id = 3;
Para borrar tuplas:
1. DELETE FROM usuario
2. WHERE id = 2;
Para borrar todas las tuplas de una tabla:
1. DELETE FROM usuario;
o bien:
1. TRUNCATE usuario;
Para seleccionar tuplas se utiliza SELECT. Basta con especificar qu columnas queremos
seleccionar de las tuplas y la tabla en la que se encuentran:
1. SELECT nombre, direccion
2. FROM usuario;
Un truco para que se muestren los resultados en vertical en lugar de en tablas, que puede
ser til, por ejemplo, si tenemos poco espacio horizontal, es terminar la consulta con \G en
lugar de ;:
1. SELECT nombre, direccion
2. FROM usuario\G
Si queremos seleccionar todos los campos podemos usar el caracter * como atajo:
1. SELECT *
2. FROM usuario;
Tambin podemos usar funciones en las expresiones que determinan lo que estamos
seleccionando. En este caso se usa LOWER, que transforma una cadena en minsculas:
1. SELECT LOWER(nombre), LOWER(direccion)
2. FROM usuario;
Para seleccionar slo las tuplas que cumplan una determinada condicin:
1. SELECT *
2. FROM usuario
3. WHERE edad < 18;
Para agrupar las tuplas por un determinado campo:
1. SELECT ciudad, COUNT(ciudad)
2. FROM usuario
3. GROUP BY ciudad;
La salida de un GROUP BY est ordenada segn los valores del campo sobre el que se
agrupa. La ordenacin se realiza por defecto en orden ascendente (ASC) para hacerlo en
orden descendente se aade la palabra clave DESC:
1. SELECT ciudad, COUNT(ciudad)
2. FROM usuario
3. GROUP BY ciudad DESC;
Para seleccionar solo algunas tuplas de entre el resultado de un GROUP BY se puede utilizar
la clusula HAVING:
1. SELECT ciudad, COUNT(ciudad)
2. FROM usuario
3. GROUP BY ciudad DESC
4. HAVING COUNT(ciudad) < 1;
Para ordenar las tuplas segn los valores de un campo:
1. SELECT *
2. FROM usuario
3. ORDER BY nombre;
Como GROUP BY, se ordena de forma ascendente, a menos que se utilice la palabra clave
DESC:
1. SELECT *
2. FROM usuario
3. ORDER BY nombre DESC;
Para limitar el nmero de tuplas que queremos que devuelva SELECT se utiliza LIMIT:
1. SELECT *
2. FROM usuario
3. LIMIT 2;
A LIMIT se le pueden pasar dos nmeros separados por comas, en cuyo caso el primer
nmero indica la tupla desde la que se empieza a contar (el ndice comienza en 0, no en 1)
y el segundo el nmero de tuplas a devolver. Esto puede ser til, por ejemplo, para
paginar los resultados:
1. SELECT *
2. FROM usuario
3. LIMIT 2,2;
Para crear una seleccin de tuplas combinadas de varias tablas se utiliza la sentencia JOIN.
Un JOIN, sin nada ms, no hace ms que combinar todas las tuplas de la primera tabla con
todas tuplas de la segunda tabla (esto es lo que se conoce como CROSS JOIN o combinacin
cruzada).
1. SELECT *
2. FROM usuario JOIN blog;
Esto no suele ser muy til. Suele ser ms comn el utilizar la clusula ON para aadir una
condicin que especifique cundo combinar las tablas (WHERE debera reservarse para
condiciones que restrinjan las tuplas que queremos obtener). Esto es lo que se conoce
como combinacin interna o INNER JOIN.
En esta sentencia, por ejemplo, nos aprovechamos de que hay una relacin entre las
tablas usuario y blog implementada mediante una clave ajena. Las tuplas que no cumplen
el ON para combinarse con ninguna otra tupla de la otra tabla, simplemente se ignoran.
1. SELECT nombre, titulo
2. FROM usuario JOIN blog ON usuario.id_usuario = blog.id_usuario;
Un INNER JOIN cuya expresin para la sentencia ON es una condicin de igualdad, como el
caso anterior, se conoce como equi-join.
El NATURAL JOIN, o combinacin natural, es un tipo especializado de equi-join en el que no
hace falta especificar la sentencia ON, sino que se combinan las tuplas para las que las
columnas del mismo nombre de ambas tablas tengan el mismo valor. En la sentencia
siguiente obtendramos el mismo resultado que con la anterior, ya que estbamos
comparando la columna id_usuario de usuario e id_usuario de blog, que como vemos tienen el
mismo nombre. Al usar NATURAL JOIN, eso si, hay que tener mucho cuidado si
renombramos las columnas de las tablas.
1. SELECT nombre, titulo
2. FROM usuario NATURAL JOIN blog;
Si queremos especificar qu campo o campos de igual nombre en ambas tablas queremos
comparar, podemos usar USING en lugar de NATURAL JOIN.
1. SELECT nombre, titulo
2. FROM usuario JOIN blog USING (id_usuario);
Adems de los INNER JOIN tambin tenemos otro tipo de JOIN llamado OUTER JOIN o
combinacin externa. Este puede ser de tres tipos: el LEFT OUTER JOIN, LEFT JOIN o
combinacin externa izquierda; el RIGHT OUTER JOIN, RIGHT JOIN o combinacin externa
derecha y el FULL OUTER JOIN o combinacin externa completa.
Si usaramos un LEFT JOIN, a las tuplas del caso anterior se les sumara un nuevo conjunto de
tuplas que consistira en las tuplas de la tabla izquierda (de ah el LEFT) que no combinaban
con ninguna tupla de la tabla derecha, teniendo estas nuevas tuplas valores NULL para las
columnas de la tabla derecha. De esta forma nos aseguramos de que se mencionen todos
los usuarios, aunque no tengan blog asociado:
1. SELECT nombre, titulo
2. FROM usuario LEFT JOIN blog ON usuario.id_usuario = blog.id_usuario;
Si usaramos un RIGHT JOIN ocurrira algo semejante con las tuplas de la tabla derecha,
asegurndonos de que se mencionen todos los blogs, aunque no tengan un usuario
asociado:
1. SELECT nombre, titulo
2. FROM usuario RIGHT JOIN blog ON usuario.id_usuario = blog.id_usuario;
Buena noticia para los que prefieren escribir poco: para los OUTER JOIN tambin podemos
utilizar NATURAL
1. SELECT nombre, titulo
2. FROM usuario NATURAL LEFT JOIN blog;
Mala noticia para los que conocan o han adivinado la utilidad de FULL OUTER JOIN. En
efecto, esta operacin aade tanto las tuplas de la tabla izquierda como las de la derecha
que no tengan correspondencia con la otra tabla. Sin embargo no est implementada en
MySQL, aunque podemos simularla con UNION ALL (UNION se utiliza para combinar los
resultados de varios SELECT; la palabra clave ALL tiene el efecto de que no se eliminen las
tuplas duplicadas, como sera el caso del comportamiento de UNION por defecto).
1. SELECT nombre, titulo
2. FROM usuario LEFT JOIN blog ON usuario.id_usuario = blog.id_usuario
3. UNION
4. SELECT nombre, titulo
5. FROM usuario RIGHT JOIN blog ON usuario.id_usuario = blog.id_usuario
6. WHERE usuario.id_usuario IS NULL;

You might also like