Ya sabes qué es SQL y para qué sirve. Ahora viene la parte buena: ponerse manos a la obra y crear tu primera base de datos real en MySQL. Con datos reales. Con tablas reales. Con consultas reales.
En este artículo vamos paso a paso, desde instalar MySQL en tu computadora hasta tener una base de datos funcional con varias tablas relacionadas y datos dentro. Sin saltar pasos, sin dar nada por sentado.
¿Listo? Empieza el cronómetro. ⏱️
¿Por qué MySQL?
MySQL es una base de datos de código abierto, fiable y escalable que utilizan algunas de las empresas más importantes del espacio tecnológico, como Meta, Netflix y Airbnb. Es gratuita, tiene una comunidad enorme, funciona en Windows, Mac y Linux, y es la más usada en desarrollo web. Si aprendes MySQL, el conocimiento te sirve directamente en el mundo laboral real.
Además, MySQL soporta las webs con mayor tráfico del planeta como Facebook, Twitter y YouTube. No está nada mal para algo que puedes instalar gratis en tu computadora en 10 minutos.
Paso 1: Instala MySQL en tu computadora
Tienes dos opciones para instalar MySQL. Elige la que más se adapte a tu perfil:
Opción A: XAMPP — la más fácil para principiantes
XAMPP es un paquete que incluye MySQL, un servidor web Apache y PHP, todo junto en una sola instalación. Es la opción más popular entre estudiantes y principiantes porque no requiere configuración manual.
- Ve a apachefriends.org y descarga XAMPP para tu sistema operativo.
- Instálalo con las opciones por defecto.
- Abre el Panel de Control de XAMPP y haz clic en Start junto a MySQL.
- Cuando veas el indicador en verde, MySQL está corriendo. ✅
Para acceder a MySQL desde XAMPP, abre tu navegador y ve a http://localhost/phpmyadmin. Verás una interfaz gráfica llamada phpMyAdmin desde donde puedes gestionar todo visualmente.
Opción B: MySQL Community Server — instalación directa
Si prefieres instalar solo MySQL sin paquetes adicionales, descarga el instalador desde dev.mysql.com/downloads/installer. Durante la instalación, el asistente te pedirá que configures una contraseña para el usuario root. Guárdala bien, la vas a necesitar cada vez que te conectes.
💡 Recomendación: Si eres principiante y solo quieres aprender SQL, ve con XAMPP. Si quieres un entorno más profesional, instala MySQL directamente.
Paso 2: Elige tu herramienta de trabajo
Puedes trabajar con MySQL de dos formas: desde la terminal con comandos de texto, o desde una interfaz gráfica. Ambas son válidas y te conviene conocer las dos.
MySQL Workbench — la interfaz gráfica oficial
MySQL Workbench es la herramienta oficial de MySQL. Tiene un editor SQL con autocompletado, un diseñador visual de bases de datos y herramientas de administración. Es lo que usan muchos desarrolladores profesionales.
Descárgala gratis desde dev.mysql.com/downloads/workbench.
Para conectarte, inicia la aplicación Workbench, crea una nueva conexión e ingresa host, puerto, usuario y contraseña. El host por defecto es localhost, el puerto es 3306, el usuario es root y la contraseña es la que configuraste al instalar.
La terminal — el método clásico
También puedes conectarte directamente desde la terminal de tu sistema operativo. Abre CMD (Windows) o Terminal (Mac/Linux) y escribe:
mysql -u root -pPresiona Enter, escribe tu contraseña cuando te la pida, y verás el prompt de MySQL listo para recibir comandos:
mysql>Desde aquí puedes escribir cualquier comando SQL. Para salir, escribe exit;
💡 Consejo: Aprende a usar la terminal aunque luego uses Workbench. Entender los comandos base te hace mejor programador y te salva cuando no tienes interfaz gráfica disponible.
Paso 3: Crea tu primera base de datos
Ya tienes MySQL corriendo y tu herramienta lista. Ahora sí: vamos a crear la base de datos. El proyecto que vamos a construir a lo largo de este tutorial es una base de datos para una tienda online. Simple, realista y con suficiente complejidad para aprender los conceptos que importan.
En MySQL Workbench o en la terminal, ejecuta este comando:
CREATE DATABASE tienda_online;Verifica que se creó correctamente:
SHOW DATABASES;Deberías ver tienda_online en la lista junto a las bases de datos del sistema.
Ahora dile a MySQL que quieres trabajar con esa base de datos:
USE tienda_online;A partir de este punto, todos los comandos que ejecutes afectarán a tienda_online. Así de simple: tres comandos y tu primera base de datos existe.
Paso 4: Diseña la estructura antes de escribir código
Antes de crear tablas, tómate un momento para pensar qué información necesitas guardar. Este paso se llama diseño de la base de datos y es lo que separa una base de datos bien construida de un desastre difícil de mantener.
Para nuestra tienda online necesitamos guardar:
- 👤 Clientes — quiénes compran
- 📦 Productos — qué se vende
- 🛒 Pedidos — quién compró qué y cuándo
- 📋 Detalle de pedidos — los productos específicos de cada pedido
La relación entre ellas es:
clientes ──── pedidos ──── detalle_pedidos ──── productosUn cliente puede tener muchos pedidos. Cada pedido puede tener muchos productos. Cada producto puede aparecer en muchos pedidos. Eso es una base de datos relacional en su esencia.
Paso 5: Crea las tablas
Ahora traducimos ese diseño a código SQL. Ejecuta cada bloque en orden:
Tabla de clientes
CREATE TABLE clientes (
id INT PRIMARY KEY AUTO_INCREMENT,
nombre VARCHAR(100) NOT NULL,
email VARCHAR(150) UNIQUE NOT NULL,
telefono VARCHAR(20),
ciudad VARCHAR(80),
creado_en DATETIME DEFAULT CURRENT_TIMESTAMP
);Tabla de productos
CREATE TABLE productos (
id INT PRIMARY KEY AUTO_INCREMENT,
nombre VARCHAR(150) NOT NULL,
descripcion TEXT,
precio DECIMAL(10, 2) NOT NULL,
stock INT DEFAULT 0,
creado_en DATETIME DEFAULT CURRENT_TIMESTAMP
);Tabla de pedidos
CREATE TABLE pedidos (
id INT PRIMARY KEY AUTO_INCREMENT,
cliente_id INT NOT NULL,
fecha DATETIME DEFAULT CURRENT_TIMESTAMP,
estado ENUM('pendiente', 'enviado', 'entregado', 'cancelado') DEFAULT 'pendiente',
total DECIMAL(10, 2) DEFAULT 0,
FOREIGN KEY (cliente_id) REFERENCES clientes(id)
);Tabla de detalle de pedidos
CREATE TABLE detalle_pedidos (
id INT PRIMARY KEY AUTO_INCREMENT,
pedido_id INT NOT NULL,
producto_id INT NOT NULL,
cantidad INT NOT NULL,
precio_unit DECIMAL(10, 2) NOT NULL,
FOREIGN KEY (pedido_id) REFERENCES pedidos(id),
FOREIGN KEY (producto_id) REFERENCES productos(id)
);Verifica que todas las tablas se crearon correctamente:
SHOW TABLES;Deberías ver las cuatro tablas listadas. Si quieres ver la estructura detallada de una tabla específica:
DESCRIBE clientes;Esto te muestra cada columna, su tipo de dato, si acepta nulos y si tiene alguna restricción. Muy útil cuando no recuerdas cómo dejaste una tabla.
¿Qué significa cada parte del código?
Hay conceptos nuevos en esas tablas que vale la pena entender:
DECIMAL(10, 2)— número con hasta 10 dígitos en total y 2 decimales. Ideal para precios.TEXT— texto largo sin límite fijo. Para descripciones extensas.ENUM— solo acepta uno de los valores listados. Perfecto para estados con opciones fijas.FOREIGN KEY— clave foránea. Le dice a MySQL que ese campo apunta a un registro de otra tabla. Esto garantiza la integridad de los datos: no puedes crear un pedido con uncliente_idque no existe en la tablaclientes.DEFAULT CURRENT_TIMESTAMP— rellena automáticamente la fecha y hora actual al insertar un registro.
Paso 6: Inserta datos de prueba
Una base de datos vacía no sirve de mucho para practicar. Vamos a insertar datos reales para poder hacer consultas interesantes.
Insertar clientes
INSERT INTO clientes (nombre, email, telefono, ciudad) VALUES
('Ana García', 'ana@email.com', '555-1001', 'Ciudad de México'),
('Luis Pérez', 'luis@email.com', '555-1002', 'Bogotá'),
('María López', 'maria@email.com', '555-1003', 'Lima'),
('Carlos Ruiz', 'carlos@email.com', '555-1004', 'Buenos Aires'),
('Sofía Herrera', 'sofia@email.com', '555-1005', 'Santiago');Insertar productos
INSERT INTO productos (nombre, descripcion, precio, stock) VALUES
('Laptop Pro 15"', 'Laptop de alto rendimiento para programadores', 899.99, 20),
('Mouse inalámbrico', 'Mouse ergonómico con batería recargable', 29.99, 150),
('Teclado mecánico', 'Teclado retroiluminado con switches blue', 79.99, 80),
('Monitor 27" 4K', 'Monitor UHD con panel IPS y 144Hz', 399.99, 15),
('Auriculares gaming', 'Auriculares con sonido surround 7.1', 59.99, 60),
('Webcam Full HD', 'Webcam 1080p con micrófono integrado', 45.99, 100),
('Hub USB-C 7 en 1', 'Hub con HDMI, USB 3.0 y carga rápida', 39.99, 200),
('SSD Externo 1TB', 'SSD portátil con velocidad de 1050 MB/s', 89.99, 45);Insertar pedidos
INSERT INTO pedidos (cliente_id, estado, total) VALUES
(1, 'entregado', 959.97),
(2, 'enviado', 439.98),
(3, 'pendiente', 179.97),
(1, 'entregado', 89.99),
(4, 'cancelado', 29.99);Insertar detalle de pedidos
INSERT INTO detalle_pedidos (pedido_id, producto_id, cantidad, precio_unit) VALUES
(1, 1, 1, 899.99), -- Pedido 1: Laptop
(1, 2, 2, 29.99), -- Pedido 1: 2x Mouse
(2, 4, 1, 399.99), -- Pedido 2: Monitor
(2, 3, 1, 79.99), -- Pedido 2: Teclado
(3, 5, 2, 59.99), -- Pedido 3: 2x Auriculares
(3, 6, 1, 45.99), -- Pedido 3: Webcam
(4, 8, 1, 89.99), -- Pedido 4: SSD
(5, 2, 1, 29.99); -- Pedido 5: MousePaso 7: Consulta tus datos
Ya tienes una base de datos poblada con datos reales. Ahora viene la parte más satisfactoria: hacer consultas y ver cómo MySQL devuelve exactamente la información que necesitas.
Ver todos los clientes
SELECT * FROM clientes;Ver productos con stock bajo (menos de 50 unidades)
SELECT nombre, precio, stock
FROM productos
WHERE stock < 50
ORDER BY stock ASC;Ver todos los pedidos con el nombre del cliente
SELECT
pedidos.id AS numero_pedido,
clientes.nombre AS cliente,
pedidos.estado,
pedidos.total,
pedidos.fecha
FROM pedidos
INNER JOIN clientes ON pedidos.cliente_id = clientes.id
ORDER BY pedidos.fecha DESC;Ver el detalle completo de un pedido específico
SELECT
productos.nombre AS producto,
detalle_pedidos.cantidad,
detalle_pedidos.precio_unit,
(detalle_pedidos.cantidad * detalle_pedidos.precio_unit) AS subtotal
FROM detalle_pedidos
INNER JOIN productos ON detalle_pedidos.producto_id = productos.id
WHERE detalle_pedidos.pedido_id = 1;¿Cuánto ha gastado cada cliente en total?
SELECT
clientes.nombre,
COUNT(pedidos.id) AS total_pedidos,
SUM(pedidos.total) AS total_gastado
FROM clientes
LEFT JOIN pedidos ON clientes.id = pedidos.cliente_id
GROUP BY clientes.id, clientes.nombre
ORDER BY total_gastado DESC;Los 3 productos más vendidos
SELECT
productos.nombre,
SUM(detalle_pedidos.cantidad) AS unidades_vendidas
FROM detalle_pedidos
INNER JOIN productos ON detalle_pedidos.producto_id = productos.id
GROUP BY productos.id, productos.nombre
ORDER BY unidades_vendidas DESC
LIMIT 3;¿Ves lo que está pasando? Con estas consultas puedes responder preguntas de negocio reales: qué productos se venden más, cuánto gasta cada cliente, qué pedidos están pendientes. Eso es exactamente lo que hacen los analistas de datos y los desarrolladores backend en sus trabajos todos los días.
Paso 8: Modifica y elimina datos
Actualizar el stock después de una venta
UPDATE productos
SET stock = stock - 1
WHERE id = 1;
-- Verificamos el cambio
SELECT nombre, stock FROM productos WHERE id = 1;Cambiar el estado de un pedido
UPDATE pedidos
SET estado = 'entregado'
WHERE id = 2;Eliminar un pedido cancelado
-- Primero eliminamos el detalle (por la clave foránea)
DELETE FROM detalle_pedidos WHERE pedido_id = 5;
-- Luego eliminamos el pedido
DELETE FROM pedidos WHERE id = 5;⚠️ Nota importante: Como la tabla detalle_pedidos tiene una FOREIGN KEY que apunta a pedidos, MySQL no te deja eliminar un pedido si todavía tiene registros en el detalle. Primero debes borrar los detalles y luego el pedido. Eso es precisamente la integridad referencial funcionando para proteger tus datos.
Errores comunes al crear tu primera base de datos
Olvidar el punto y coma al final
SELECT * FROM clientes -- ❌ MySQL espera más input
SELECT * FROM clientes; -- ✅ El punto y coma indica que el comando terminóNo seleccionar la base de datos antes de operar
-- ❌ Error: no hay base de datos seleccionada
CREATE TABLE productos (...);
-- ✅ Primero selecciona la base de datos
USE tienda_online;
CREATE TABLE productos (...);Intentar eliminar una tabla que tiene dependencias
-- ❌ Error: pedidos tiene una FOREIGN KEY hacia clientes
DROP TABLE clientes;
-- ✅ Elimina primero las tablas dependientes
DROP TABLE detalle_pedidos;
DROP TABLE pedidos;
DROP TABLE productos;
DROP TABLE clientes;Crear una tabla sin PRIMARY KEY
Técnicamente es posible, pero es una mala práctica. Sin PRIMARY KEY, no tienes una forma confiable de identificar y actualizar registros individuales. Siempre define una llave primaria en cada tabla.
Comandos de administración útiles
Antes de terminar, aquí van algunos comandos de administración que te van a salvar más de una vez:
-- Ver todas las bases de datos disponibles
SHOW DATABASES;
-- Ver todas las tablas de la base de datos activa
SHOW TABLES;
-- Ver la estructura de una tabla
DESCRIBE clientes;
-- o también:
SHOW COLUMNS FROM clientes;
-- Ver el comando SQL que creó una tabla
SHOW CREATE TABLE clientes;
-- Contar cuántos registros hay en una tabla
SELECT COUNT(*) FROM productos;
-- Eliminar una base de datos completa (¡con cuidado!)
DROP DATABASE tienda_online;Resumen: lo que construiste hoy
- ✅ Instalaste MySQL usando XAMPP o el instalador oficial
- ✅ Creaste y seleccionaste tu primera base de datos con
CREATE DATABASEyUSE - ✅ Diseñaste 4 tablas relacionadas con tipos de datos apropiados
- ✅ Usaste
FOREIGN KEYpara mantener la integridad entre tablas - ✅ Insertaste datos reales con
INSERT INTO - ✅ Consultaste información con
SELECT,JOIN,GROUP BYyORDER BY - ✅ Modificaste y eliminaste registros con
UPDATEyDELETE - ✅ Aprendiste los errores más comunes y cómo evitarlos
Lo que tienes ahora no es un ejercicio de laboratorio: es una base de datos funcional con estructura real, datos reales y consultas reales. Exactamente lo mismo que encontrarás en proyectos profesionales, solo que más pequeño.
🧪 ¿Listo para poner a prueba tus conocimientos de SQL?
Acabas de construir tu primera base de datos desde cero. Ahora viene el momento de verificar que los fundamentos de SQL que usaste hoy están bien sólidos.
Tenemos un test de SQL Basics con preguntas cortas y directas sobre todo lo que viste en este artículo y en la guía anterior. Sin trampa, sin tiempo límite y con feedback inmediato. En pocos minutos sabrás exactamente en qué nivel estás.
¿Lograste ejecutar todas las consultas sin errores? ¿Tuviste algún problema con las claves foráneas o los JOINs? Cuéntanos en los comentarios 👇 — respondemos todos.
No hay comentarios todavía. Sé el primero en compartir tu opinión.