Fundamentos de Bases de Datos Relacionales y SQL
1. Introducción a las Bases de Datos
Vivimos en la era de la información, donde los datos son uno de los activos más
valiosos de cualquier organización. Pero tener datos no es suficiente; es necesario
almacenarlos, organizarlos y recuperarlos de manera eficiente y segura.
Una Base de Datos (BD) es una colección estructurada de datos almacenados
electrónicamente. Para gestionar estas bases de datos, utilizamos sistemas de
software complejos conocidos como Sistemas Gestores de Bases de Datos
(SGBD) o DBMS por sus siglas en inglés (Database Management System). El SGBD
actúa como un intermediario entre el usuario, las aplicaciones y los datos.
Existen muchos tipos de bases de datos (orientadas a objetos, NoSQL,
jerárquicas), pero las más utilizadas en el mundo empresarial desde hace
décadas son las Bases de Datos Relacionales (RDBMS).
2. El Modelo Relacional
Propuesto por Edgar F. Codd en 1970, el modelo relacional organiza los datos en
tablas bidimensionales (compuestas por filas y columnas) que se relacionan entre
sí.
Shutterstock
Explorar
2.1. Conceptos Clave del Modelo Relacional
• Tabla (Entidad/Relación): Es la estructura principal donde se guardan los
datos. Representa un objeto o concepto del mundo real (ej. Clientes,
Pedidos, Productos).
• Columna (Atributo/Campo): Define una característica específica de la
tabla (ej. Nombre, Fecha_Nacimiento, Precio). Todos los datos de una
columna deben ser del mismo tipo.
• Fila (Registro/Tupla): Es una entrada individual en la tabla. Contiene los
datos concretos de una instancia específica (ej. Los datos del cliente "Juan
Pérez").
2.2. Claves (Keys)
Las claves son fundamentales para garantizar la integridad de los datos y
establecer relaciones.
• Clave Primaria (Primary Key - PK): Es una columna (o conjunto de
columnas) que identifica de manera única e irrepetible cada fila en una
tabla. No puede contener valores nulos ni repetidos. (Ej. DNI o un
ID_Cliente autonumérico).
• Clave Foránea (Foreign Key - FK): Es una columna en una tabla que hace
referencia a la Clave Primaria de otra tabla. Es el vínculo que conecta
ambas tablas y establece la "relación".
3. Diseño y Normalización
Antes de escribir código, una base de datos debe diseñarse correctamente. La
Normalización es un proceso sistemático para organizar los datos, reduciendo la
redundancia (datos repetidos) y mejorando la integridad de los mismos.
Se realiza aplicando "Formas Normales" (NF). Las más comunes son:
1. Primera Forma Normal (1NF): Los datos deben ser atómicos (indivisibles).
Cada celda debe contener un solo valor y no debe haber grupos repetidos
de columnas.
2. Segunda Forma Normal (2NF): Debe cumplir la 1NF y todos los atributos
que no sean clave deben depender completamente de la Clave Primaria
completa.
3. Tercera Forma Normal (3NF): Debe cumplir la 2NF y no debe haber
dependencias transitivas (un atributo no clave no puede depender de otro
atributo no clave; todos deben depender solo de la Clave Primaria).
4. Introducción a SQL
SQL (Structured Query Language o Lenguaje de Consulta Estructurado) es el
lenguaje estándar universal utilizado para comunicarse con las bases de datos
relacionales (como MySQL, PostgreSQL, Oracle, SQL Server, SQLite).
4.1. Sublenguajes de SQL
SQL es muy amplio y se divide en varias categorías según el propósito de los
comandos:
Comandos
Sublenguaje Significado Función
Principales
Define la estructura de la BD
Data Definition CREATE, ALTER,
DDL (crear, modificar o borrar
Language DROP
tablas).
INSERT,
Data Manipulation Manipula los datos (insertar,
DML UPDATE,
Language actualizar o borrar registros).
DELETE
Data Query
DQL Consulta y recupera datos. SELECT
Language
Data Control Controla el acceso y permisos GRANT,
DCL
Language a los datos. REVOKE
Gestiona los cambios
Transaction COMMIT,
TCL realizados por DML
Control Language ROLLBACK
(transacciones).
5. Tipos de Datos Comunes
Al definir las columnas de una tabla, debemos especificar qué tipo de datos
contendrán:
• Numéricos: INT (Enteros), DECIMAL(p,s) o NUMERIC (Números exactos
con decimales), FLOAT (Números de coma flotante).
• Cadenas de texto: VARCHAR(n) (Texto de longitud variable, hasta 'n'
caracteres), CHAR(n) (Texto de longitud fija), TEXT (Textos muy largos).
• Fechas y Horas: DATE (Año, mes, día), TIME (Hora, minutos, segundos),
DATETIME o TIMESTAMP (Fecha y hora juntas).
• Lógicos: BOOLEAN (Verdadero o Falso).
6. Lenguaje de Definición de Datos (DDL)
Vamos a ver cómo crear la estructura de nuestra base de datos con un ejemplo de
una tienda en línea.
6.1. Crear una Base de Datos y Tablas (CREATE)
SQL
-- Crear la base de datos
CREATE DATABASE TiendaOnline;
USE TiendaOnline;
-- Crear la tabla Clientes
CREATE TABLE Clientes (
ID_Cliente INT PRIMARY KEY,
Nombre VARCHAR(50) NOT NULL,
Apellido VARCHAR(50) NOT NULL,
Email VARCHAR(100) UNIQUE,
Fecha_Registro DATE
);
-- Crear la tabla Pedidos (relacionada con Clientes)
CREATE TABLE Pedidos (
ID_Pedido INT PRIMARY KEY,
ID_Cliente INT,
Fecha_Pedido DATE,
Total DECIMAL(10, 2),
-- Definir la clave foránea
FOREIGN KEY (ID_Cliente) REFERENCES Clientes(ID_Cliente)
);
6.2. Modificar y Eliminar Estructuras (ALTER y DROP)
SQL
-- Añadir una nueva columna a Clientes
ALTER TABLE Clientes ADD Telefono VARCHAR(15);
-- Eliminar una tabla (CUIDADO: Esto borra la tabla y todos sus datos)
DROP TABLE Pedidos;
7. Lenguaje de Manipulación de Datos (DML)
Una vez creada la estructura, necesitamos insertar y modificar los datos reales.
7.1. Insertar Datos (INSERT)
SQL
INSERT INTO Clientes (ID_Cliente, Nombre, Apellido, Email, Fecha_Registro)
VALUES (1, 'Ana', 'García', 'ana@[Link]', '2023-10-01');
INSERT INTO Clientes (ID_Cliente, Nombre, Apellido, Email, Fecha_Registro)
VALUES (2, 'Carlos', 'López', 'carlos@[Link]', '2023-10-05');
7.2. Actualizar Datos (UPDATE)
Nota importante: Siempre usa la cláusula WHERE en un UPDATE o modificarás
todos los registros de la tabla.
SQL
-- Cambiar el email del cliente con ID 1
UPDATE Clientes
SET Email = 'ana.garcia_nuevo@[Link]'
WHERE ID_Cliente = 1;
7.3. Borrar Datos (DELETE)
SQL
-- Eliminar al cliente con ID 2
DELETE FROM Clientes
WHERE ID_Cliente = 2;
8. Consultas Básicas (DQL)
El comando SELECT es el más utilizado en SQL. Sirve para extraer la información
que necesitamos.
8.1. Sintaxis Básica
SQL
-- Seleccionar todas las columnas de la tabla Clientes
SELECT * FROM Clientes;
-- Seleccionar solo columnas específicas
SELECT Nombre, Email FROM Clientes;
8.2. Filtrar Resultados (WHERE)
Podemos condicionar qué filas queremos ver utilizando operadores como =, <, >,
<=, >=, <> (distinto).
SQL
SELECT Nombre, Total
FROM Pedidos
WHERE Total > 100.00;
8.3. Operadores Lógicos y Especiales
• AND / OR: Para combinar múltiples condiciones.
• IN: Permite especificar múltiples valores en una cláusula WHERE.
• BETWEEN: Selecciona valores dentro de un rango (inclusivo).
• LIKE: Busca un patrón específico (usando % como comodín para
representar cero o más caracteres).
SQL
-- Clientes que se llamen Ana O Carlos
SELECT * FROM Clientes WHERE Nombre IN ('Ana', 'Carlos');
-- Pedidos entre 50 y 200 euros
SELECT * FROM Pedidos WHERE Total BETWEEN 50 AND 200;
-- Clientes cuyo apellido empiece por 'G'
SELECT * FROM Clientes WHERE Apellido LIKE 'G%';
8.4. Ordenar y Limitar (ORDER BY y LIMIT)
SQL
-- Mostrar clientes ordenados por apellido alfabéticamente (ASC) o inversamente
(DESC)
SELECT * FROM Clientes ORDER BY Apellido ASC;
-- Mostrar solo los 5 pedidos más caros
SELECT * FROM Pedidos ORDER BY Total DESC LIMIT 5;
9. Funciones Agregadas y Agrupación
SQL permite realizar cálculos sobre un conjunto de valores para devolver un único
valor resultante.
9.1. Funciones Agregadas
• COUNT(): Cuenta el número de filas.
• SUM(): Suma los valores numéricos de una columna.
• AVG(): Calcula la media (promedio).
• MIN() y MAX(): Encuentran el valor mínimo y máximo.
SQL
-- Saber cuántos clientes tenemos registrados
SELECT COUNT(ID_Cliente) FROM Clientes;
-- Calcular la suma total de dinero en pedidos
SELECT SUM(Total) FROM Pedidos;
9.2. Agrupar Datos (GROUP BY)
GROUP BY agrupa las filas que tienen los mismos valores en filas de resumen. Se
usa casi siempre con funciones agregadas.
SQL
-- Saber cuánto ha gastado en total CADA cliente
SELECT ID_Cliente, SUM(Total) AS Gasto_Total
FROM Pedidos
GROUP BY ID_Cliente;
9.3. Filtrar Grupos (HAVING)
Mientras que WHERE filtra filas antes de agrupar, HAVING filtra después de usar
GROUP BY.
SQL
-- Clientes que han gastado más de 500 euros en total
SELECT ID_Cliente, SUM(Total) AS Gasto_Total
FROM Pedidos
GROUP BY ID_Cliente
HAVING SUM(Total) > 500;
10. Relacionando Tablas: JOINs
El verdadero poder de las bases de datos relacionales reside en la capacidad de
cruzar información de múltiples tablas en una sola consulta. Esto se logra con la
cláusula JOIN.
Shutterstock
Explorar
10.1. INNER JOIN
Devuelve los registros que tienen valores coincidentes en ambas tablas.
SQL
-- Mostrar el nombre del cliente junto con los datos de sus pedidos
SELECT [Link], Pedidos.Fecha_Pedido, [Link]
FROM Clientes
INNER JOIN Pedidos ON Clientes.ID_Cliente = Pedidos.ID_Cliente;
10.2. LEFT JOIN (o LEFT OUTER JOIN)
Devuelve todos los registros de la tabla de la izquierda (la primera en la consulta),
y los registros coincidentes de la tabla de la derecha. Si no hay coincidencia,
devuelve NULL en el lado derecho.
SQL
-- Mostrar TODOS los clientes, tengan o no tengan pedidos realizados
SELECT [Link], [Link]
FROM Clientes
LEFT JOIN Pedidos ON Clientes.ID_Cliente = Pedidos.ID_Cliente;
10.3. RIGHT JOIN y FULL JOIN
• RIGHT JOIN: Lo opuesto al LEFT JOIN; devuelve todo de la tabla derecha.
• FULL JOIN: Devuelve todos los registros cuando hay una coincidencia en
los registros de la tabla izquierda o derecha (devuelve nulos donde falte
información en cualquier lado).
11. Subconsultas (Subqueries)
Una subconsulta es una consulta anidada dentro de otra consulta mayor. Se
utilizan para operaciones más complejas donde primero necesitas un dato
calculado para poder ejecutar la consulta principal.
SQL
-- Obtener los clientes que han hecho un pedido por encima de la media de todos
los pedidos
SELECT Nombre, Apellido
FROM Clientes
WHERE ID_Cliente IN (
SELECT ID_Cliente
FROM Pedidos
WHERE Total > (SELECT AVG(Total) FROM Pedidos)
);
12. Transacciones (TCL)
En entornos de producción, agrupar múltiples operaciones en una "Transacción"
asegura que los datos sean consistentes (Conceptos ACID: Atomicidad,
Consistencia, Aislamiento, Durabilidad). O se ejecutan todas las operaciones
correctamente, o no se guarda ninguna.
• START TRANSACTION / BEGIN: Inicia la transacción.
• COMMIT: Guarda los cambios permanentemente en la base de datos.
• ROLLBACK: Deshace los cambios de la transacción actual si ocurre un
error.
SQL
BEGIN;
-- Restar saldo a la cuenta A
UPDATE Cuentas SET Saldo = Saldo - 100 WHERE ID_Cuenta = 1;
-- Sumar saldo a la cuenta B
UPDATE Cuentas SET Saldo = Saldo + 100 WHERE ID_Cuenta = 2;
-- Si todo está bien, confirmamos:
COMMIT;
-- Si hubiese fallado algo, ejecutaríamos ROLLBACK en lugar de COMMIT.
Conclusión
Las bases de datos relacionales y el lenguaje SQL conforman una de las
tecnologías más robustas y probadas en el mundo del desarrollo de software y
análisis de datos. Dominar los conceptos de normalización estructural junto con
las consultas (desde simples SELECT hasta complejos JOIN y GROUP BY) te
proporcionará las bases para manipular prácticamente cualquier sistema de
información moderno.