🗄️ Bases de Datos en Linux

Aprende MySQL y PostgreSQL desde cero

Introducción a las Bases de Datos

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?

🐬 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.

MySQL en Linux

1. Instalación en Linux

Ubuntu/Debian:
sudo apt update
sudo apt install mysql-server
CentOS/RHEL:
sudo yum install mysql-server
sudo systemctl start mysqld

2. Configuración Inicial

sudo mysql_secure_installation

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;

PostgreSQL en Linux

1. Instalación en Linux

Ubuntu/Debian:
sudo apt update
sudo apt install postgresql postgresql-contrib
CentOS/RHEL:
sudo yum install postgresql-server postgresql-contrib
sudo postgresql-setup initdb
sudo systemctl start postgresql

2. Acceder a PostgreSQL

sudo -u postgres psql

O cambiar al usuario postgres:

sudo -i -u postgres
psql

3. Comandos Básicos de PostgreSQL

Comandos Meta de psql

\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
);

-- Ver estructura
\d productos

-- Eliminar tabla
DROP TABLE productos;

Operaciones CRUD

-- INSERT
INSERT INTO productos (nombre, precio, stock)
VALUES ('Laptop', 899.99, 15);

-- SELECT
SELECT * FROM productos;
SELECT nombre, precio FROM productos WHERE precio > 500;

-- UPDATE
UPDATE productos SET precio = 799.99 WHERE id = 1;

-- DELETE
DELETE FROM productos WHERE id = 1;

4. Comandos del Sistema

-- Ver estado del servicio
sudo systemctl status postgresql

-- Reiniciar PostgreSQL
sudo systemctl restart postgresql

-- Ver logs
sudo tail -f /var/log/postgresql/postgresql-*.log

5. Gestión de Usuarios y Roles

-- Crear usuario
CREATE USER usuario WITH PASSWORD 'contraseña';

-- Crear usuario con permisos
CREATE USER admin WITH SUPERUSER PASSWORD 'contraseña';

-- Dar permisos sobre base de datos
GRANT ALL PRIVILEGES ON DATABASE mi_tienda TO usuario;

-- Ver usuarios
\du

6. Backup y Restauración

-- Hacer backup
pg_dump mi_tienda > backup.sql

-- Restaurar backup
psql mi_tienda < backup.sql

-- Backup en formato comprimido
pg_dump -Fc mi_tienda > backup.dump

-- Restaurar formato comprimido
pg_restore -d mi_tienda backup.dump

Comparación MySQL vs PostgreSQL

Característica MySQL PostgreSQL
Tipo de Licencia GPL (Dual) PostgreSQL License (similar a BSD)
Cumplimiento SQL Bueno Excelente (más estricto)
Rendimiento Excelente para lectura Excelente para operaciones complejas
Tipos de Datos Básicos Avanzados (JSON, Arrays, etc.)
Índices B-Tree, Hash B-Tree, Hash, GiST, GIN, BRIN
Replicación Master-Slave Streaming, Logical
Procedimientos Almacenados Sí (múltiples lenguajes)

Diferencias en Sintaxis Común

MySQL

-- Auto-incremento
INT AUTO_INCREMENT

-- Límite de resultados
LIMIT 10

-- Concatenar
CONCAT(col1, col2)

-- Fecha actual
NOW()

PostgreSQL

-- Auto-incremento
SERIAL

-- Límite de resultados
LIMIT 10

-- Concatenar
col1 || col2

-- Fecha actual
NOW() o CURRENT_TIMESTAMP

Ejercicios Prácticos

Ejercicio 1: Crear Base de Datos de Biblioteca

Crea una base de datos llamada "biblioteca" con las siguientes tablas:

-- 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
);

-- Crear tabla prestamos
CREATE TABLE prestamos (
  id INT AUTO_INCREMENT PRIMARY KEY,
  libro_id INT,
  usuario_id INT,
  fecha_prestamo DATE,
  fecha_devolucion DATE,
  FOREIGN KEY (libro_id) REFERENCES libros(id),
  FOREIGN KEY (usuario_id) REFERENCES usuarios(id)
);

Ejercicio 2: Insertar y Consultar Datos

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');

-- Insertar usuarios
INSERT INTO usuarios (nombre, email) VALUES
('Juan Pérez', 'juan@email.com'),
('María García', 'maria@email.com');

-- Insertar préstamos
INSERT INTO prestamos (libro_id, usuario_id, fecha_prestamo, fecha_devolucion) VALUES
(1, 1, '2024-01-15', '2024-02-15'),
(2, 2, '2024-01-20', NULL);

-- 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.

1. Instalación de Docker y Docker Compose

-- Instalar Docker en Ubuntu
sudo apt update
sudo apt install docker.io docker-compose
sudo systemctl enable docker --now
docker --version
docker-compose --version

2. Crear archivo docker-compose.yml

version: '3.8'
services:
  mysql:
    image: mysql:8.0
    container_name: mysql_lab
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: mi_tienda
    ports:
      - "3306:3306"

  postgres:
    image: postgres:15
    container_name: postgres_lab
    environment:
      POSTGRES_PASSWORD: rootpass
      POSTGRES_DB: mi_tienda
    ports:
      - "5432:5432"

3. Levantar los contenedores

docker-compose up -d

4. Conectar a las Bases de Datos

-- Conectar a MySQL
mysql -h 127.0.0.1 -P 3306 -u root -p

-- Conectar a PostgreSQL
psql -h 127.0.0.1 -p 5432 -U postgres -d mi_tienda

5. Buenas Prácticas