SQL (Structured Query Language) es el lenguaje estándar para interactuar con bases de datos relacionales. Nació en los laboratorios de IBM en 1974 con el nombre SEQUEL, se estandarizó por el ANSI en 1986 y hoy es el único lenguaje que hablan prácticamente todos los motores de bases de datos: MySQL, PostgreSQL, SQL Server, Oracle y SQLite, entre muchos otros.
Este curso cubre SQL desde cero, con ejemplos sobre un esquema real de tienda online que se mantiene a lo largo de todos los capítulos. Los conceptos son válidos para cualquier motor; cuando hay diferencias de sintaxis entre MySQL, PostgreSQL y SQLite, se indica explícitamente.
El modelo relacional
Una base de datos relacional organiza la información en tablas (también llamadas relaciones). Cada tabla tiene:
- Columnas (campos): definen el tipo de dato de cada atributo.
- Filas (registros): cada fila es una instancia concreta del objeto que representa la tabla.
- Clave primaria (PRIMARY KEY): identificador único de cada fila, nunca NULL ni repetido.
- Clave foránea (FOREIGN KEY): columna que apunta a la clave primaria de otra tabla, manteniendo la integridad referencial.
Las cuatro categorías de instrucciones SQL
Categoría | Siglas | Instrucciones principales |
Lenguaje de definición de datos | DDL | CREATE, ALTER, DROP, TRUNCATE |
Lenguaje de manipulación de datos | DML | SELECT, INSERT, UPDATE, DELETE |
Lenguaje de control de datos | DCL | GRANT, REVOKE |
Lenguaje de control de transacciones | TCL | BEGIN, COMMIT, ROLLBACK, SAVEPOINT |
Breve historia del estándar
IBM publicó SEQUEL en 1974. En 1979, Oracle (entonces Relational Software) lanzó el primer motor SQL comercial. El estándar ANSI SQL-86 llegó en 1986, seguido de SQL-89, SQL-92 (la versión que más motores implementan hoy como base), SQL:1999, SQL:2003, SQL:2008, SQL:2011, SQL:2016 y SQL:2019. Cada revisión añade características como CTEs, funciones de ventana, tipos JSON o soporte para datos temporales.
El esquema de este curso: tienda online
Todos los ejemplos del curso usan el siguiente esquema, que puedes crear en MySQL o PostgreSQL:
CREATE TABLE clientes (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(100) NOT NULL,
email VARCHAR(150) NOT NULL UNIQUE,
ciudad VARCHAR(80),
fecha_alta DATE NOT NULL
);
CREATE TABLE categorias (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(80) NOT NULL UNIQUE
);
CREATE TABLE productos (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(200) NOT NULL,
precio DECIMAL(10,2) NOT NULL,
stock INT NOT NULL DEFAULT 0,
id_categoria INT UNSIGNED,
FOREIGN KEY (id_categoria) REFERENCES categorias(id)
);
CREATE TABLE pedidos (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_cliente INT UNSIGNED NOT NULL,
fecha DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
estado ENUM('pendiente','pagado','enviado','cancelado') NOT NULL DEFAULT 'pendiente',
total DECIMAL(10,2),
FOREIGN KEY (id_cliente) REFERENCES clientes(id)
);
CREATE TABLE lineas_pedido (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
id_pedido INT UNSIGNED NOT NULL,
id_producto INT UNSIGNED NOT NULL,
cantidad INT NOT NULL,
precio_ud DECIMAL(10,2) NOT NULL,
FOREIGN KEY (id_pedido) REFERENCES pedidos(id),
FOREIGN KEY (id_producto) REFERENCES productos(id)
);
Con estos datos de muestra puedes probar todos los ejemplos:
INSERT INTO categorias (nombre) VALUES ('Electrónica'), ('Ropa'), ('Hogar');
INSERT INTO clientes (nombre, email, ciudad, fecha_alta) VALUES
('Ana García', '[email protected]', 'Madrid', '2023-01-15'),
('Luis Martín', '[email protected]', 'Barcelona', '2023-03-22'),
('Marta López', '[email protected]', 'Valencia', '2024-02-01'),
('Carlos Ruiz', '[email protected]','Sevilla', '2024-05-10');
INSERT INTO productos (nombre, precio, stock, id_categoria) VALUES
('Auriculares Bluetooth', 59.99, 120, 1),
('Cable USB-C 2m', 8.99, 500, 1),
('Camiseta algodón M', 12.50, 80, 2),
('Lámpara de escritorio', 34.95, 45, 3);
