Saltar al contenido principal
MySQL29 de julio de 202610 min de lectura
Principiante10 min Full Stack Developer Backend Developer

MySQL: instalación y primeros pasos

Guía completa de MySQL: instalación, tipos de datos, CREATE TABLE, ENGINEs, herramientas visuales y ejercicios prácticos con esquema e-commerce.

MySQLInstalaciónSQLBase de datosWorkbench

Requisitos previos

Lo que aprenderás

  • Instalar MySQL en macOS, Docker y Linux
  • Crear bases de datos, usuarios y tablas
  • Conocer los tipos de datos específicos de MySQL
  • Usar herramientas como Workbench y TablePlus
  • Resolver ejercicios con un schema completo
Tutorial10 min

MySQL: instalación y primeros pasos

Guía completa de instalación, configuración y primeros pasos con MySQL. Aprende a crear bases de datos, tablas, usuarios y a ejecutar consultas desde cero.


Introducción

MySQL es el sistema gestor de bases de datos relacional (SGBD) open-source más popular del mundo. Creado por MySQL AB en 1995 y adquirido posteriormente por Sun Microsystems (hoy Oracle), es el motor de datos detrás de millones de aplicaciones web. MySQL forma parte del stack LAMP (Linux, Apache, MySQL, PHP/Python/Perl), el estándar de facto para el desarrollo web durante décadas.

Aunque PostgreSQL ha ganado terreno en los últimos años, MySQL sigue siendo la opción predilecta para proyectos que priorizan velocidad de lectura, replicación sencilla y un ecosistema maduro de herramientas. Es usado por empresas como Meta, Netflix y Airbnb.

MySQL vs PostgreSQL: MySQL históricamente ha sido más rápido en lecturas simples y tiene una configuración más sencilla. PostgreSQL ofrece más funcionalidades avanzadas (JSONB, full-text search nativo, CTEs recursivas). La elección depende del proyecto.

Instalación

MySQL está disponible en todos los sistemas operativos principales. Aquí tienes las formas más comunes de instalarlo:

macOS (Homebrew)

brew install mysql
brew services start mysql

Docker

La forma más limpia y aislada de ejecutar MySQL, ideal para desarrollo:

docker run --name mysql \
  -e MYSQL_ROOT_PASSWORD=root \
  -p 3306:3306 \
  -d mysql:8

Linux (Ubuntu/Debian)

sudo apt update
sudo apt install mysql-server
sudo systemctl start mysql

Verificar la instalación

Una vez instalado, comprueba que todo funciona correctamente:

mysql --version
# mysql  Ver 8.0.36 for macos14 on x86_64 (Homebrew)

Primeros comandos

Conéctate al servidor MySQL como usuario root y empieza a explorar:

mysql -u root -p
-- Te pedirá la contraseña que configuraste

CREATE DATABASE mi_proyecto;
USE mi_proyecto;

CREATE USER 'dev'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON mi_proyecto.* TO 'dev'@'localhost';
FLUSH PRIVILEGES;

-- Ver bases de datos y tablas
SHOW DATABASES;
SHOW TABLES;
DESCRIBE nombre_tabla;
Nunca uses root en producción. Crea siempre un usuario específico con los permisos mínimos necesarios para cada aplicación.

Tipos de datos en MySQL

MySQL ofrece una amplia variedad de tipos de datos. Conocerlos es clave para diseñar esquemas eficientes:

  • Numéricos: INT, BIGINT, DECIMAL(10,2), FLOAT, BOOLEAN (en realidad TINYINT(1))
  • Cadenas: VARCHAR(255), TEXT, CHAR(n), ENUM('a','b')
  • Fecha/Hora: DATETIME, TIMESTAMP, DATE, TIME, YEAR
  • Especiales: JSON (validado pero no tan potente como JSONB de PostgreSQL), SET, BLOB
Diferencias clave con PostgreSQL: MySQL no tiene un tipo SERIAL nativo (usa AUTO_INCREMENT), no soporta arrays nativos, y aunque soporta JSON, no tiene un equivalente a JSONB con índices GIN. Sin embargo, MySQL es generalmente más rápido en operaciones simples de lectura.

CREATE TABLE con detalles MySQL

La creación de tablas en MySQL incluye opciones específicas del motor de almacenamiento. Aquí un ejemplo completo:

CREATE TABLE productos (
  id INT AUTO_INCREMENT PRIMARY KEY,
  nombre VARCHAR(150) NOT NULL,
  precio DECIMAL(10,2) NOT NULL,
  categoria ENUM('electronica', 'ropa', 'hogar') DEFAULT 'electronica',
  stock INT DEFAULT 0 CHECK (stock >= 0),
  creado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

La cláusula ENGINE define el motor de almacenamiento:

  • InnoDB — el motor por defecto desde MySQL 5.5. Soporta transacciones (ACID), claves foráneas, row-level locking y recuperación ante fallos. Es la opción recomendada para la mayoría de los casos.
  • MyISAM — más antiguo, no soporta transacciones ni FKs, pero ofrece búsquedas full-text nativas (sin necesidad de motores externos). Fue el motor por defecto antes de MySQL 5.5.
  • MEMORY — almacena los datos en RAM, ideal para tablas temporales o cachés. Los datos se pierden al reiniciar el servidor.

El charset utf8mb4 es el estándar actual. Soporta caracteres Unicode completos, incluyendo emojis. Usa siempre utf8mb4 en lugar del obsoleto utf8 (que solo soporta 3 bytes).

Buenas prácticas al crear tablas: usa siempre InnoDB + utf8mb4. Define explícitamente NOT NULL en campos obligatorios y valores por defecto donde tenga sentido. Esto evita sorpresas y mejora el rendimiento de las consultas.

Schema completo de ejemplo

Un sistema real de e-commerce con cuatro tablas relacionadas mediante claves foráneas:

CREATE TABLE usuarios (
  id INT AUTO_INCREMENT PRIMARY KEY,
  nombre VARCHAR(100) NOT NULL,
  email VARCHAR(255) UNIQUE NOT NULL,
  creado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE productos (
  id INT AUTO_INCREMENT PRIMARY KEY,
  nombre VARCHAR(150) NOT NULL,
  precio DECIMAL(10,2) NOT NULL,
  categoria ENUM('electronica', 'ropa', 'hogar') DEFAULT 'electronica',
  stock INT DEFAULT 0,
  creado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE pedidos (
  id INT AUTO_INCREMENT PRIMARY KEY,
  usuario_id INT NOT NULL,
  total DECIMAL(12,2) NOT NULL,
  estado ENUM('pendiente', 'enviado', 'entregado') DEFAULT 'pendiente',
  creado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (usuario_id) REFERENCES usuarios(id)
    ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE detalle_pedidos (
  id INT AUTO_INCREMENT PRIMARY KEY,
  pedido_id INT NOT NULL,
  producto_id INT NOT NULL,
  cantidad INT NOT NULL CHECK (cantidad > 0),
  precio_unitario DECIMAL(10,2) NOT NULL,
  FOREIGN KEY (pedido_id) REFERENCES pedidos(id)
    ON DELETE CASCADE ON UPDATE CASCADE,
  FOREIGN KEY (producto_id) REFERENCES productos(id)
    ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

Consultas útiles con el schema

-- Total gastado por cada usuario
SELECT u.nombre, SUM(p.total) AS total_gastado
FROM usuarios u
JOIN pedidos p ON u.id = p.usuario_id
GROUP BY u.id, u.nombre
ORDER BY total_gastado DESC;

-- Productos más vendidos
SELECT pr.nombre, SUM(dp.cantidad) AS unidades_vendidas
FROM detalle_pedidos dp
JOIN productos pr ON dp.producto_id = pr.id
GROUP BY pr.id, pr.nombre
ORDER BY unidades_vendidas DESC
LIMIT 10;

Herramientas para MySQL

Más allá de la terminal, existen herramientas gráficas que facilitan el trabajo diario:

  • MySQL Workbench — la herramienta oficial de Oracle. Incluye modelado ER, administración de servidores y editor de consultas. Gratuita y multiplataforma.
  • TablePlus — cliente moderno con interfaz limpia. Soporta MySQL, PostgreSQL, Redis y más. Rápido, con atajos de teclado y multi-pestaña. De pago, pero con prueba gratuita.
  • DBeaver — cliente universal open-source. Soporta decenas de bases de datos, incluyendo MySQL. Ideal si trabajas con múltiples motores.
  • phpMyAdmin — interfaz web clásica, preinstalada en muchos entornos de hosting compartido. Sencilla pero funcional.

Ejercicios prácticos

Pon a prueba lo aprendido con estos ejercicios. Intenta resolverlos por tu cuenta antes de mirar la solución.

Práctica constante: la mejor forma de aprender SQL es escribir consultas a diario. Crea tus propios datasets de prueba y experimenta con diferentes tipos de JOIN, subconsultas y funciones de agregación.