MySQL

MySQL es uno de los sistemas de gestión de bases de datos más populares del mercado. Se trata de un SGBD basado en el modelo relacional, con licencia dual GPL y propietaria, desarrollado por MySQL AB, una compañía propiedad de Sun Microsystems, creadores de Java, desde Enero de 2008.

En esta entrada veremos algunos de los comandos básicos utilizados a la hora de trabajar con MySQL. Si programas en Java también 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 contraseña:

mysql -u root -p

Para especificar la máquina (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 añadir el nombre al final. Es equivalente a utilizar más 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:

source archivo.sql

Para crear una base de datos:

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 añadir el texto IF NOT EXISTS:

CREATE DATABASE IF NOT EXISTS base_datos;

A la hora de crear la base de datos también se puede especificar el juego de caracteres y la colación (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 colación por defecto para la base de datos, las tablas usarán estos valores por defecto, a menos que se indiquen otros al crear la tabla.

CREATE DATABASE IF NOT EXISTS base_datos
    DEFAULT CHARACTER SET utf8
    DEFAULT COLLATE utf8_general_ci;

También se puede especificar un juego de caracteres y colación 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.

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 comúnmente utilizados son:

  • ascii, de American Standard Code for Information Interchange; también conocido como US-ASCII. Es una codificación de caracteres de 7 bits basado en el alfabeto inglés con 95 caracteres imprimibles.
  • latin1, el juego de caracteres por defecto en MySQL. Contrariamente a lo que cabría esperar se trata de la codificación ANSI / CP1252 / WinLatin1 / Windows-1252 y no del estándar de la ISO 8859-1 o del estándar de la IANA ISO-8859-1 (nótese el guión 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 erróneamente, y son causa de confusión habitual (de hecho el propio MySQL tenía un bug relacionado). En concreto CP1252 se diferencia de ISO-8859-1 en que se utiliza el rango 0×80-0x9F para representar distintos caracteres imprimibles, como el símbolo 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, alemán, aragonés, asturiano, catalán, danés, escocés, español, feroés, finés, francés, gaélico, gallego, inglés, islandés, italiano, neerlandés, noruego, portugués, sueco y vasco.
  • utf8, de 8-bit Unicode Transformation Format. Unicode es un acrónimo de “Universal Code” (código universal) y es, como su nombre indica, un juego de caracteres con el que podemos representar textos escritos en la mayoría de los alfabetos del planeta: latino, árabe, hebreo, griego, japonés, chino, coreano, cirílico, … UTF-8 en concreto utiliza de 1 a 4 bytes para representar los caracteres, dependiendo del símbolo.

Para ascii la colación 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 comparación no tiene en cuenta mayúsculas y minúsculas, _cs (case sensitive) en caso contrario y _bin si es binaria (también case sensitive). Por tanto se pueden consultar las distintas colaciones disponibles para un juego de caracteres con un comando similar a

SHOW COLLATION LIKE "utf8%";

Para ver las distintas bases de datos disponibles en nuestro servidor MySQL:

SHOW DATABASES;

Para borrar una base de datos:

DROP DATABASE base_datos;

Para seleccionar la base de datos con la que queremos trabajar:

USE base_datos;

Para ver las tablas de la base de datos:

SHOW TABLES;

Para ver las columnas de la tabla:

SHOW COLUMNS FROM tabla;

o bien el atajo:

DESCRIBE tabla;

e incluso:

DESC tabla;

Si necesitamos ver también la colación, los privilegios que tenemos o los comentarios de las columnas añadiremos la palabra clave FULL a SHOW COLUMNS:

SHOW FULL COLUMNS FROM tabla;

Para crear una tabla nueva se usa el comando CREATE TABLE tabla al que se le pasa la definición de las columnas, las posibles restricciones (constraints) y las opciones de la tabla y de partición.

CREATE TABLE usuario (
    id_usuario INT PRIMARY KEY AUTO_INCREMENT,
    nombre VARCHAR(50) NOT NULL,
    direccion VARCHAR(50) NOT NULL,
    ciudad VARCHAR(20) NOT NULL,
    edad TINYINT NOT NULL
);
CREATE TABLE blog (
    id_blog INT PRIMARY KEY AUTO_INCREMENT,
    id_usuario INT REFERENCES usuario(id_usuario),
    titulo VARCHAR(30) NOT NULL
);

Los tipos de las columnas pueden ser números enteros, números decimales, fechas, horas, cadenas y los tipos espaciales del Open Geospatial Consortium, que se omitirán en esta explicación.

Veamos primero los tipos numéricos:

  • BIT: Representación en binario de un número. Por defecto es un número binario de 1 bit por lo que su valor puede ser 0 o 1. Se puede utilizar un número distinto de bits, de 1 a 64, pasando el valor entre paréntesis, por ejemplo BIT(8).
  • TINYINT: Para representar enteros muy pequeños, de -128 a 127. Se puede utilizar la palabra clave UNSIGNED para que almacene solo números positivos, en cuyo caso el rango va de 0 a 255. También se puede indicar el número mínimo de dígitos que queremos utilizar para mostrar el valor encerrando esta cantidad entre paréntesis; si se utiliza la palabra clave ZEROFILL el valor se rellenará con ceros a la izquierda hasta completar el número de dígitos indicado. Esto es así para el resto de tipos enteros, pero se obviará por considerarse de poca utilidad.
  • BOOL: Sinónimo de TINYINT(1). El valor 0 se considera falso, el resto verdadero.
  • BOOLEAN: Sinónimo de TINYINT(1). El valor 0 se considera falso, el resto verdadero.
  • SMALLINT: Un entero pequeño, de -32768 a 32767. Si se utiliza UNSIGNED el rango va de 0 a 65535.
  • MEDIUMINT: Un entero de tamaño 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: Sinónimo 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 número 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 máquina y el sistema operativo utilizado. También podemos encontrarnos con algo como FLOAT(3, 2) que indicaría que queremos 3 dígitos, 2 de ellos para los decimales. En este caso UNSIGNED solo sirve para indicar que no permitimos números negativos. Es importante tener en cuenta que los valores FLOAT no son exactos, solo es preciso hasta, aproximadamente, 7 decimales. Si se necesita más precisión hay que utilizar el tipo DECIMAL.
  • DOUBLE: Un número en coma flotante de precisión doble. Los valores permitidos van de -1.7976931348623157E+308 a -2.2250738585072014E-308 y de 2.2250738585072014E-308 a 1.7976931348623157E+308, además del 0, aunque el rango puede ser menor dependiendo de la máquina y el sistema operativo utilizado. Como FLOAT, los valores DOUBLE no son exactos. Es preciso hasta, aproximadamente, 15 decimales. Si se necesita mayor precisión hay que utilizar el tipo DECIMAL.
  • REAL: Sinónimo de DOUBLE, a menos que esté activado el modo REAL_AS_FLOAT, en cuyo caso funciona como sinónimo de FLOAT.
  • DOUBLE PRECISION: Sinónimo de DOUBLE.
  • DECIMAL: Para representar números decimales de forma más precisa que FLOAT y DOUBLE.
  • DEC: Sinónimo de DECIMAL
  • NUMERIC: Sinónimo 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 combinación 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 cuándo se realizó la última insección o actualización.
  • 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 año en formato YYYY. Los valores admitidos son 0000 y los valores de 1901 a 2155. También 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 años de 1970 a 2069.

Por último, los tipos de texto son los siguiente:

  • CHAR: Cadenas de longitud fija cuyo número de caracteres se especifica entre paréntesis (si no se especifica es 1 por defecto). Este mecanismo de indicar el tamaño entre paréntesis es común para el resto de los tipos, por lo que no se obviará.
  • VARCHAR: Cadena de longitud variable. Opcionalmente se puede indicar el tamaño máximo de la cadena con un número entre paréntesis.
  • 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 imágenes. El tamaño máximo es de 65.535 bytes.
  • TINYBLOB: Un BLOB de pequeño tamaño (un máximo de 255 bytes).
  • MEDIUMBLOB: Un BLOB de tamaño medio (un máximo de 16.777.215 bytes; cerca de 16MB)
  • LONGBLOB: Un BLOB de gran tamaño (un máximo de 4GB bytes)
  • TEXT: Un texto con un máximo de 65.535 caracteres (menos si se utilizan caracteres multi-byte, evidentemente).
  • TINYTEXT: Un texto pequeño, con un máximo de 255 caracteres.
  • MEDIUMTEXT: Un texto de longitud media, con un máximo de 16.777.215 caracteres.
  • LONGTEXT: Un texto largo, con un máximo de 4.294.967.295 caracteres.
  • ENUM: Enumerado, un tipo cuyo valor puede ser una cadena de entre las indicadas entre paréntesis.
  • SET: Similar a ENUM, pero en este caso el campo puede tener cero o más valores de entre los indicados entre paréntesis.

Para cada columna, además 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 añadida 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 relación. Los valores deben ser únicos y no nulos. Una tabla, como es lógico, sólo puede tener una clave primaria. Si necesitamos crear una clave primaria compuesta por varios campos no podemos usar este método 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 foránea o ajena. De esta forma indicamos este valor toma valores de claves de otra tabla, implementando así una relación 1:N. En esta clausula también 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 actualización o borrado; CASCADE, con la que la actualización o borrado se propaga; SET NULL, que establece las claves foráneas 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, ...): Sinónimo de KEY.
  • FOREIGN KEY (campo1, campo2, ...) REFERENCES tabla (campo3, campo4, ...): Para crear una clave foránea o ajena. Sigue el mismo formato que REFERENCES para las columnas.
  • CHECK (expresion): En teoría, para definir otras restricciones. En realidad esta opción se admite por el parser, pero se ignora. Tenemos que recurrir a triggers o disparadores.

Para eliminar una tabla:

DROP TABLE tabla;

Para que no produzca un error si la tabla no existe:

DROP TABLE IF EXISTS tabla;

Para modificar una tabla se utiliza ALTER TABLE que permite cosas como añadir columnas:

ALTER TABLE tabla ADD COLUMN valor INT;

Eliminar columnas:

ALTER TABLE tabla DROP COLUMN valor;

Cambiar la definición de las columnas:

ALTER TABLE tabla MODIFY COLUMN valor TINYINT;

O renombrar la tabla:

ALTER TABLE tabla RENAME TO tabla2;

Para insertar valores en una tabla, si vamos a dar valores a todas las columnas:

INSERT INTO usuario VALUES (1, "Pablo Santander", "Calle Bolivia 18", "Madrid", 17);

Si sólo vamos a dar valores solo a algunas columnas hay que indicar a cuáles especificamente:

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:

INSERT INTO usuario VALUES
    (3, "Marta Marsopa", "Calle Italia 4", "Madrid", 58),
    (4, "Jaime Torres", "Avenida de Barcelona 12", "Valladolid" , 37),
    (10, "Juan Martero", "Calle Madrid 12", "Barcelona", 26);
INSERT INTO blog VALUES
    (1, 1, "El emo blog"),
    (2, 2, "El ego blog"),
    (4, 4, "Mis fotos"),
    (5, 5, "En Groenlandia");

Para actualizar las tuplas:

UPDATE usuario
    SET nombre = "Marta Marsupial", direccion = "Calle Italia 14"
    WHERE id = 3;

Para borrar tuplas:

DELETE FROM usuario
    WHERE id = 2;

Para borrar todas las tuplas de una tabla:

DELETE FROM usuario;

o bien:

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:

SELECT nombre, direccion
    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 ;:

SELECT nombre, direccion
    FROM usuario\G

Si queremos seleccionar todos los campos podemos usar el caracter * como atajo:

SELECT *
    FROM usuario;

También podemos usar funciones en las expresiones que determinan lo que estamos seleccionando. En este caso se usa LOWER, que transforma una cadena en minúsculas:

SELECT LOWER(nombre), LOWER(direccion)
    FROM usuario;

Para seleccionar sólo las tuplas que cumplan una determinada condición:

SELECT *
    FROM usuario
    WHERE edad < 18;

Para agrupar las tuplas por un determinado campo:

SELECT ciudad, COUNT(ciudad)
    FROM usuario
    GROUP BY ciudad;

La salida de un GROUP BY está ordenada según los valores del campo sobre el que se agrupa. La ordenación se realiza por defecto en orden ascendente (ASC) para hacerlo en orden descendente se añade la palabra clave DESC:

SELECT ciudad, COUNT(ciudad)
    FROM usuario
    GROUP BY ciudad DESC;

Para seleccionar solo algunas tuplas de entre el resultado de un GROUP BY se puede utilizar la cláusula HAVING:

SELECT ciudad, COUNT(ciudad)
    FROM usuario
    GROUP BY ciudad DESC
    HAVING COUNT(ciudad) < 1;

Para ordenar las tuplas según los valores de un campo:

SELECT *
    FROM usuario
    ORDER BY nombre;

Como GROUP BY, se ordena de forma ascendente, a menos que se utilice la palabra clave DESC:

SELECT *
    FROM usuario
    ORDER BY nombre DESC;

Para limitar el número de tuplas que queremos que devuelva SELECT se utiliza LIMIT:

SELECT *
    FROM usuario
    LIMIT 2;

A LIMIT se le pueden pasar dos números separados por comas, en cuyo caso el primer número indica la tupla desde la que se empieza a contar (el índice comienza en 0, no en 1) y el segundo el número de tuplas a devolver. Esto puede ser útil, por ejemplo, para paginar los resultados:

SELECT *
    FROM usuario
    LIMIT 2,2;

Para crear una selección de tuplas combinadas de varias tablas se utiliza la sentencia JOIN. Un JOIN, sin nada más, no hace más 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 combinación cruzada).

SELECT *
    FROM usuario JOIN blog;

Esto no suele ser muy útil. Suele ser más común el utilizar la cláusula ON para añadir una condición que especifique cuándo combinar las tablas (WHERE debería reservarse para condiciones que restrinjan las tuplas que queremos obtener). Esto es lo que se conoce como combinación interna o INNER JOIN.

En esta sentencia, por ejemplo, nos aprovechamos de que hay una relación 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.

SELECT nombre, titulo
    FROM usuario JOIN blog ON usuario.id_usuario = blog.id_usuario;

Un INNER JOIN cuya expresión para la sentencia ON es una condición de igualdad, como el caso anterior, se conoce como equi-join.

El NATURAL JOIN, o combinación 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 obtendríamos el mismo resultado que con la anterior, ya que estábamos 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.

SELECT  nombre, titulo
    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.

SELECT nombre, titulo
    FROM usuario JOIN blog USING (id_usuario);

Además de los INNER JOIN también tenemos otro tipo de JOIN llamado OUTER JOIN o combinación externa. Este puede ser de tres tipos: el LEFT OUTER JOIN, LEFT JOIN o combinación externa izquierda; el RIGHT OUTER JOIN, RIGHT JOIN o combinación externa derecha y el FULL OUTER JOIN o combinación externa completa.

Si usaramos un LEFT JOIN, a las tuplas del caso anterior se les sumaría un nuevo conjunto de tuplas que consistiría 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:

SELECT nombre, titulo
    FROM usuario LEFT JOIN blog ON usuario.id_usuario = blog.id_usuario;

Si usaramos un RIGHT JOIN ocurriría algo semejante con las tuplas de la tabla derecha, asegurándonos de que se mencionen todos los blogs, aunque no tengan un usuario asociado:

SELECT nombre, titulo
    FROM usuario RIGHT JOIN blog ON usuario.id_usuario = blog.id_usuario;

Buena noticia para los que prefieren escribir poco: para los OUTER JOIN también podemos utilizar NATURAL

SELECT nombre, titulo
    FROM usuario NATURAL LEFT JOIN blog;

Mala noticia para los que conocían o han adivinado la utilidad de FULL OUTER JOIN. En efecto, esta operación añade 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 sería el caso del comportamiento de UNION por defecto).

SELECT nombre, titulo
    FROM usuario LEFT JOIN blog ON usuario.id_usuario = blog.id_usuario
UNION
SELECT nombre, titulo
    FROM usuario RIGHT JOIN blog ON usuario.id_usuario = blog.id_usuario
    WHERE usuario.id_usuario IS NULL;


Comentarios
  1. Si veis algún fallo o pensáis que falta algo importante, ya sabéis, comentario ;)

    Responder

  2. gustavo

    Un digno tutorial para tener en los marcadores/estrella de Google Reader, etc, etc… Gracias!

    Responder

  3. Ejemplar artículo. La paciencia que habrás invertido no me la quiero ni imaginar.

    Responder

  4. Gracias gustavo, Escribano, me alegra que os guste :)

    Responder

  5. Maki

    ¿Sacarás también versión PDF? xD

    No, en serio, quizás esto me anime a usarla… cuando haya terminado el tutorial

    Responder

  6. Esto me hubiera venido de lujo cuando estaba viendo bases de datos en la U.
    De todas formas un exelente trabajo de recopilacion.

    Aunque Mysql es muy sencillo, a mi siempre me dio problemas el manejo de claves foraneas, jejeje

    Responder

  7. @Escribano
    +1!! hehe, madre mia.. yo tp quiero imaginarlo!! jejej

    Responder

  8. @Escribano
    Descuida, ya lo aprovecho yo por ti xD

    Responder

  9. Excelente tutorial!!!…. gracias por tu tiempo!!!

    Responder

  10. Muy bueno de verdad, gracias zootropo!

    Responder

  11. ElleDriver

    @Zootropo Si sigues así voy a tener que pagarte, esto también me viene muuuuy bien!! He leído .pdf por ahí? sería muy buena idea…jjejjjje

    Responder

  12. Juancar

    Muchas gracias por este estupendo tutorial.
    Si lo sacas en PDF (para poder tenerlo descargado y consultarlo a cada momento), nos será utilísimo.

    Responder

  13. Oscar

    si quieren pdf apliquen copy/paste y con cualquier software (samba xD) que genere una impresora PDF lo generan como PDF, por lo demas esta muy bueno el tutorial

    Responder

  14. Creo que está interesante, demasiado extenso en la descripción de los datos y tal, pero bueno. Yo habría metido un pequeño epígrafe sobre subconsultas explicando un poco el EXISTS, IN y tal.

    Responder

  15. Ferk

    Muchas gracias!!
    Además no podrías haberlo posteado en mejor momento :P …justamente estoy ahora trabajando con mysql.

    Una aclaración.. no es cierto que use una licencia GPL que no permita aplicaciones comerciales. Puede distribuirse como GPL si se usa en aplicaciones comerciales siempre y cuando sean aplicaciones o bien GPL (de acuerdo a la GPLv2), o bien bajo otras licencias consideradas abiertas por Sun aunque no sean la GPL (y esa es la excepcion particular que hace la licencia de SQL especial)

    fuente: http://www.mysql.com/about/legal/licensing/foss-exception/

    Responder

  16. eVeR

    Lindo trabajo Raúl, digno de una página para marcar como favorita. A mi me llegó medio tarde por que el año pasado me tocó trabajar bastante con MySQL, pero no importa. No sabía que era tan nuevo.
    Para una mas fácil administración, recomiendo PHPMyAdmin, para los que prefieran lo gráfico antes que la consola. Aunque los DBA bien machos usen la consola a muerte ;-)
    En Windows pueden utilizar WAMP para montar un servidor de pruebas, que incluye Apache, MySQL y PHPMyAdmin. En Linux van a tener que utilizar el administrador de paquetes para instalar estos mismos componentes y los paquetes que manejan la interoperatividad entre ellos. Sin lugar a dudas, una herramienta cada vez mas poderosa y accesible para crear excelentes sitios web.

    Responder

  17. Danilo Juvinao

    Usé mysql hasta la version 4.1 hasta que conocí postgresql… ahí todo cambió y en seguridad, funcionalidad, escalabilidad y performance, desde mi punto de vista personal(se que choca con muchos) postgresql es supremamente mejor que mysql.

    Responder

  18. @Ferk cierto, tienes razón.

    Responder

  19. fede

    Excelente articulo! Bastante completo.
    Muchas gracias, también por el excelente libro de python.

    Saludos!

    Responder

  20. Fantástica entrada!! muy práctica y útil.
    :-)

    Responder

  21. MAU

    muy bn el articulo me ayudo mucho pero no encontre el comando de tinyint sale grax bye

    Responder

  22. Godofredo

    Muy buen tutorial para trabajar en consola, felicitaciones al editor de esta pagina.

    Responder

  23. Hello,

    por si alguien necesita un full join en mysql, he escrito un query,

    http://disemq21.blogspot.com/2009/08/another-mysql-full-join.html

    saludos,
    edward

    Responder

  24. [...] Si necesitas más información sobre MySQL en sí, puedes consultar nuestro Tutorial de MySQL. [...]

    Responder

  25. [...] MySQL: sistema de gestión de bases de datos relacionales GPL creado originalmente por MySQL AB. A principios del año pasado fue comprada por Sun, pero pasó a manos de Oracle cuando el gigante de las bases de datos adquirió la empresa de los creadores de Java. Para interesados, hace un tiempo publicamos un tutorial rápido sobre este SGDB (Tutorial rápido de MySQL). [...]

    Responder

  26. [...] Si necesitas más información sobre MySQL en sí, puedes consultar nuestro Tutorial de MySQL. [...]

    Responder

  27. Creo que más completo y fácil de entender que he leído. Muy buen trabajo :)

    Responder

  28. teban

    me sirvio mucho aunque aun tengo dudas sobre algunos comandos. se lo agradezco mucho.

    Responder

  29. nancy

    xido tu tutorioal

    Responder

  30. Benjamin

    Excelente compadre… muchas gracias por darse el tiempo para gente como nosotros que no nos manejamos tanto en esto…
    un aplauso..!!!! (clap)

    Responder

  31. Facundo

    Muy bueno la verdad, con el tiempo que te tomaste en hacerlo y lo que nos ayudaste, vale la pena tomarse el tiempo de comentar para agradecer =)

    Responder

  32. [...] MySQL: sistema de gestión de bases de datos relacionales GPL creado originalmente por MySQL AB. A principios del año pasado fue comprada por Sun, pero pasó a manos de Oracle cuando el gigante de las bases de datos adquirió la empresa de los creadores de Java. Para interesados, hace un tiempo publicamos un tutorial rápido sobre este SGDB (Tutorial rápido de MySQL). [...]

    Responder

  33. JDA

    GRACIAS ME SIRVIO MUCHO

    Responder

  34. Anónimo

    aaii muchisisimaszz graciazz me sirvio mucho sta informacio… de vdd graciazz

    Responder

  35. Jhony

    Que buen trabajo,de verdad muy util

    Responder

  36. Muchísimas gracias por la información.

    Muy completo el tutorial y bien fácil de entender.

    Me sirvió para codificar correctamente una base de datos que tiene textos en español y en japonés.

    Saludos.

    Responder

  37. Gracias por esta excelente información, no mucho domino el sql, por eso pregunte a un programador y me dijo que no se podía renomabrar una tabla, para eso debía crear una tabla nueva y copiar toda la info de la tabla vieja a la nueva, sin embargo con la info aquí lo he logrado.

    Gracias nuevamente.

    Responder

  38. [...] conocer. Una característica algo menos conocida, aunque se introdujo en la versión 5.1 de MySQL, son las [...]

    Responder

  39. [...] conocer. Una característica algo menos conocida, aunque se introdujo en la versión 5.1 de MySQL, son las [...]

    Responder

  40. esta salvaje

    Responder

  41. daniel

    excelente tutorial …bien explicado

    Responder

  42. Gabriel Molina

    Felicidades por el tutorial.. excelente. :)

    Responder

  43. Liliana

    Oye Disculpa como se pueden poner las llaves foráneas en un doc de php con conexión a base de datos

    Responder

  44. Jose Raul

    me gustaria saber como importar datos de un libro de excel hacia una tabla de mysql, la hoja ocupa 66 mb, ya intente con phpmyadmin y no lo permite por ser demasiado grande, como le puedo hacer para importar los datos desde la consola de mysql, alguien me puede ayudar??

    de antemano gracias…..

    Responder

  45. el buzz

    ¿Qué paso con los triggers, las vistas y las transacciones?

    Responder

  46. Javi

    pero que excelente territoriales como los tuyos si que se aprende , te felicito he aprendido demasiado espero hagas mas y me suscribiré en tu pagina solo espero saber mas,,,

    Responder

Deja un comentario