Hoy quiero enseñarte SQL paso a paso, desde lo más básico hasta técnicas avanzadas que uso en proyectos reales.
Este tutorial incluye ejemplos prácticos, explicaciones claras y consejos de profesional.
- Conceptos básicos
Crear base de datos y tablas
-- Crear base de datos
CREATE DATABASE empresa;
-- Seleccionar base de datos
USE empresa;
-- Crear tabla de empleados
CREATE TABLE empleados (
id INT AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(50),
apellido VARCHAR(50),
puesto VARCHAR(50)),
salario DECIMAL(10,2),
fecha_ingreso DATE
);
-- Crear tabla de departamentos
CREATE TABLE departamentos (
id INT AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(50),
ubicacion VARCHAR(50)
);
💡 Consejo: Define bien tipos de datos y claves primarias desde el principio, esto evita problemas después.
Insertar datos
-- Insertar empleados
INSERT INTO empleados (nombre, apellido, puesto, salario, fecha_ingreso)
VALUES
('Iván', 'Vázquez', 'Programador', 2500.00, '2025-01-15'),
('María', 'Mateo', 'Diseñadora', 2200.00, '2024-07-10'),
('Iker', 'Osés', 'Manager', 1500.00, '2023-03-20');
-- Insertar departamentos
INSERT INTO departamentos (nombre, ubicacion)
VALUES
('Desarrollo', 'Pamplona'),
('Diseño', 'Madrid'),
('Marketing', 'Barcelona');
Consultar datos
-- Seleccionar todos los empleados
SELECT * FROM empleados;
-- Seleccionar nombre y salario
SELECT nombre, salario FROM empleados;
-- Filtrar empleados con salario mayor a 2200
SELECT * FROM empleados WHERE salario > 2200;
-- Ordenar por salario descendente
SELECT * FROM empleados ORDER BY salario DESC;
-- Contar empleados
SELECT COUNT(*) AS total_empleados FROM empleados;
Actualizar datos
-- Subir salario de Pedro
UPDATE empleados SET salario = 3200.00 WHERE nombre = 'Pedro';
-- Cambiar puesto de María
UPDATE empleados SET puesto = 'Lead Designer' WHERE nombre = 'María';
Borrar datos
-- Borrar un empleado
DELETE FROM empleados WHERE nombre = 'Pedro';
- Nivel Intermedio
Relaciones entre tablas y JOINs
-- Agregar columna departamento_id a empleados
ALTER TABLE empleados ADD COLUMN departamento_id INT;
-- Asignar departamentos
UPDATE empleados SET departamento_id = 1 WHERE nombre = 'Iván';
UPDATE empleados SET departamento_id = 2 WHERE nombre = 'María';
-- Consultar con JOIN
SELECT e.nombre, e.apellido, d.nombre AS departamento
FROM empleados e
JOIN departamentos d ON e.departamento_id = d.id;
💡 Consejo: Los joins son esenciales para combinar información de diferentes tablas.
Subconsultas
-- Empleados con salario mayor al promedio
SELECT nombre, salario
FROM empleados
WHERE salario > (SELECT AVG(salario) FROM empleados);
-- Departamentos con más de un empleado
SELECT nombre
FROM departamentos
WHERE id IN (
SELECT departamento_id
FROM empleados
GROUP BY departamento_id
HAVING COUNT(*) > 1
);
Funciones de agregación y GROUP BY
-- Salario promedio por departamento
SELECT departamento_id, AVG(salario) AS salario_promedio
FROM empleados
GROUP BY departamento_id;
-- Número de empleados por departamento
SELECT departamento_id, COUNT(*) AS total_empleados
FROM empleados
GROUP BY departamento_id;
Vistas
-- Crear una vista con empleados y sus departamentos
CREATE VIEW vista_empleados AS
SELECT e.id, e.nombre, e.apellido, e.salario, d.nombre AS departamento
FROM empleados e
JOIN departamentos d ON e.departamento_id = d.id;
-- Usar la vista
SELECT * FROM vista_empleados WHERE salario > 2500;
💡 Consejo: Las vistas simplifican consultas complejas y ayudan a mantener tu código limpio.
- Nivel Avanzado
Funciones de ventana (Window Functions)
-- Ranking de empleados por salario
SELECT nombre, salario,
RANK() OVER (ORDER BY salario DESC) AS ranking
FROM empleados;
-- Salario acumulado por departamento
SELECT nombre, departamento_id,
SUM(salario) OVER (PARTITION BY departamento_id) AS total_salario_departamento
FROM empleados;
Triggers
-- Crear tabla de log
CREATE TABLE log_empleados (
id INT AUTO_INCREMENT PRIMARY KEY,
empleado_id INT,
accion VARCHAR(50),
fecha TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- Trigger para registrar actualizaciones
DELIMITER $$
CREATE TRIGGER after_empleado_update
AFTER UPDATE ON empleados
FOR EACH ROW
BEGIN
INSERT INTO log_empleados(empleado_id, accion)
VALUES (OLD.id, 'Empleado actualizado');
END$$
DELIMITER ;
💡 Consejo: Los triggers son útiles para auditorías, pero pueden afectar rendimiento si se abusan.
Transacciones
START TRANSACTION;
UPDATE empleados SET salario = salario + 200 WHERE nombre = 'Iván';
UPDATE empleados SET salario = salario + 100 WHERE nombre = 'María';
-- Confirmar cambios
COMMIT;
-- Revertir cambios en caso de error
-- ROLLBACK;
💡 Consejo: Usa transacciones siempre que modifiques varias tablas relacionadas, así evitas inconsistencias.
Conclusión
SQL es un lenguaje potente y versátil que te permite trabajar con bases de datos de forma estructurada, desde operaciones simples como crear tablas o insertar datos, hasta consultas avanzadas con joins, subconsultas, vistas, triggers y transacciones.
En este recorrido hemos visto lo básico, lo intermedio y lo avanzado, siempre con ejemplos prácticos que puedes probar directamente. La clave está en practicar, experimentar con tus propios datos y no tener miedo a equivocarte: cada consulta te enseña algo nuevo.
Como programador, te aseguro que dominar SQL no solo mejora tu perfil técnico, sino que también te da una ventaja enorme a la hora de entender, analizar y optimizar la información en cualquier proyecto.
Mi consejo final: dedica un rato cada semana a crear pequeñas bases de datos de prueba, juega con joins, subconsultas y transacciones, y verás cómo poco a poco SQL se convierte en una herramienta natural en tu día a día.


Deja un comentario