Las bases de datos relacionales son sistemas que permiten almacenar, organizar y recuperar información de manera estructurada. MySQL y PostgreSQL son dos de los sistemas de gestión de bases de datos (SGBD) más populares del mundo.
¿Qué aprenderás?
Instalación y configuración en Linux
Comandos básicos y avanzados
Creación y gestión de bases de datos
Consultas SQL (SELECT, INSERT, UPDATE, DELETE)
Joins, índices y optimización
Usuarios y permisos
🐬 MySQL
Sistema de gestión de bases de datos relacional de código abierto. Es rápido, confiable y fácil de usar. Ideal para aplicaciones web.
🐘 PostgreSQL
Sistema de base de datos objeto-relacional avanzado. Conocido por su robustez, cumplimiento de estándares SQL y características avanzadas.
Este comando te guiará para configurar la contraseña root y mejorar la seguridad.
3. Acceder a MySQL
sudo mysql -u root -p
4. Comandos Básicos de MySQL
Gestión de Bases de Datos
-- Mostrar todas las bases de datos
SHOW DATABASES;
-- Crear una base de datos
CREATE DATABASE mi_tienda;
-- Usar una base de datos
USE mi_tienda;
-- Eliminar una base de datos
DROP DATABASE mi_tienda;
Gestión de Tablas
-- Crear una tabla
CREATE TABLE productos (
id INT AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(100) NOT NULL,
precio DECIMAL(10,2),
stock INT DEFAULT 0,
fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- Mostrar todas las tablas
SHOW TABLES;
-- Ver estructura de una tabla
DESCRIBE productos;
-- Eliminar una tabla
DROP TABLE productos;
Operaciones CRUD
-- INSERT: Insertar datos
INSERT INTO productos (nombre, precio, stock)
VALUES ('Laptop', 899.99, 15);
-- SELECT: Consultar datos
SELECT * FROM productos;
SELECT nombre, precio FROM productos WHERE precio > 500;
-- UPDATE: Actualizar datos
UPDATE productos SET precio = 799.99 WHERE id = 1;
-- DELETE: Eliminar datos
DELETE FROM productos WHERE id = 1;
5. Comandos Útiles del Sistema
-- Ver estado del servidor
sudo systemctl status mysql
-- Reiniciar MySQL
sudo systemctl restart mysql
-- Detener MySQL
sudo systemctl stop mysql
-- Ver logs de errores
sudo tail -f /var/log/mysql/error.log
6. Gestión de Usuarios
-- Crear usuario
CREATE USER 'usuario'@'localhost' IDENTIFIED BY 'contraseña';
-- Dar permisos
GRANT ALL PRIVILEGES ON mi_tienda.* TO 'usuario'@'localhost';
-- Aplicar cambios
FLUSH PRIVILEGES;
-- Ver usuarios
SELECT user, host FROM mysql.user;
\l -- Listar bases de datos
\c nombre_db -- Conectar a una base de datos
\dt -- Listar tablas
\d nombre_tabla -- Describir tabla
\du -- Listar usuarios
\q -- Salir de psql
\h -- Ayuda de comandos SQL
\? -- Ayuda de comandos psql
Gestión de Bases de Datos
-- Crear base de datos
CREATE DATABASE mi_tienda;
-- Conectar a una base de datos
\c mi_tienda
-- Eliminar base de datos
DROP DATABASE mi_tienda;
Gestión de Tablas
-- Crear tabla
CREATE TABLE productos (
id SERIAL PRIMARY KEY,
nombre VARCHAR(100) NOT NULL,
precio NUMERIC(10,2),
stock INTEGER DEFAULT 0,
fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- Crear base de datos
CREATE DATABASE biblioteca;
USE biblioteca; -- MySQL
-- \c biblioteca para PostgreSQL
-- Crear tabla libros
CREATE TABLE libros (
id INT AUTO_INCREMENT PRIMARY KEY, -- SERIAL para PostgreSQL
titulo VARCHAR(200) NOT NULL,
autor VARCHAR(100),
año_publicacion INT,
isbn VARCHAR(20) UNIQUE
);
-- Crear tabla usuarios
CREATE TABLE usuarios (
id INT AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE,
fecha_registro TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Inserta al menos 3 libros, 2 usuarios y 2 préstamos. Luego realiza una consulta que muestre todos los préstamos con el nombre del libro y del usuario.
-- Insertar libros
INSERT INTO libros (titulo, autor, año_publicacion, isbn) VALUES
('Cien Años de Soledad', 'Gabriel García Márquez', 1967, '978-0307474728'),
('El Quijote', 'Miguel de Cervantes', 1605, '978-8424116903'),
('1984', 'George Orwell', 1949, '978-0451524935');
-- Consulta con JOIN
SELECT
u.nombre AS usuario,
l.titulo AS libro,
p.fecha_prestamo,
p.fecha_devolucion
FROM prestamos p
JOIN libros l ON p.libro_id = l.id
JOIN usuarios u ON p.usuario_id = u.id;
Ejercicio 3: Consultas Avanzadas
Encuentra todos los libros que aún no han sido devueltos y el tiempo que llevan prestados.
-- MySQL
SELECT
l.titulo,
u.nombre AS usuario,
p.fecha_prestamo,
DATEDIFF(CURDATE(), p.fecha_prestamo) AS dias_prestado
FROM prestamos p
JOIN libros l ON p.libro_id = l.id
JOIN usuarios u ON p.usuario_id = u.id
WHERE p.fecha_devolucion IS NULL;
-- PostgreSQL
SELECT
l.titulo,
u.nombre AS usuario,
p.fecha_prestamo,
CURRENT_DATE - p.fecha_prestamo AS dias_prestado
FROM prestamos p
JOIN libros l ON p.libro_id = l.id
JOIN usuarios u ON p.usuario_id = u.id
WHERE p.fecha_devolucion IS NULL;
Ejercicio 4: Crear un Usuario y Asignar Permisos
Crea un usuario llamado "bibliotecario" que solo tenga permisos de lectura en la base de datos.
-- MySQL
CREATE USER 'bibliotecario'@'localhost' IDENTIFIED BY 'password123';
GRANT SELECT ON biblioteca.* TO 'bibliotecario'@'localhost';
FLUSH PRIVILEGES;
-- PostgreSQL
CREATE USER bibliotecario WITH PASSWORD 'password123';
GRANT CONNECT ON DATABASE biblioteca TO bibliotecario;
\c biblioteca
GRANT SELECT ON ALL TABLES IN SCHEMA public TO bibliotecario;
Ejercicio 5: Actualizar Datos de Usuarios
Actualiza el correo electrónico de un usuario específico y verifica los cambios.
-- MySQL
UPDATE usuarios SET email = 'nuevo@email.com' WHERE id = 1;
SELECT * FROM usuarios WHERE id = 1;
-- PostgreSQL
UPDATE usuarios SET email = 'nuevo@email.com' WHERE id = 1;
SELECT * FROM usuarios WHERE id = 1;
Ejercicio 6: Eliminar un Préstamo
Elimina un préstamo que ya ha sido devuelto y verifica la tabla de préstamos.
-- MySQL
DELETE FROM prestamos WHERE id = 1;
SELECT * FROM prestamos;
-- PostgreSQL
DELETE FROM prestamos WHERE id = 1;
SELECT * FROM prestamos;
Ejercicio 7: Consultas con JOIN Avanzadas
Muestra todos los libros junto con la información del usuario que los tiene en préstamo, incluyendo los que no han sido prestados.
-- MySQL
SELECT l.titulo, u.nombre AS usuario
FROM libros l
LEFT JOIN prestamos p ON l.id = p.libro_id
LEFT JOIN usuarios u ON p.usuario_id = u.id;
-- PostgreSQL
SELECT l.titulo, u.nombre AS usuario
FROM libros l
LEFT JOIN prestamos p ON l.id = p.libro_id
LEFT JOIN usuarios u ON p.usuario_id = u.id;
💡 Consejo: Practica estos ejercicios en tu entorno local. La mejor forma de aprender bases de datos es experimentando y cometiendo errores.
Laboratorio Docker con Bases de Datos
Este laboratorio permite practicar MySQL y PostgreSQL usando contenedores Docker sin necesidad de instalar las bases directamente en tu sistema.