Modelo relacional y SQL
Tablas, claves y sentencias básicas
Tablas y claves
El modelo relacional organiza los datos en tablas (filas y columnas). Las relaciones entre tablas se expresan mediante claves foráneas (foreign keys): una columna que referencia la clave primaria de otra tabla. JDBC opera directamente sobre este modelo — no hay ORM que lo abstraiga.
-- Tabla con clave primaria y foreign key
CREATE TABLE clientes (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
nombre VARCHAR(100) NOT NULL,
email VARCHAR(150) UNIQUE NOT NULL,
activo BOOLEAN DEFAULT TRUE
);
CREATE TABLE pedidos (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
cliente_id BIGINT NOT NULL,
total DECIMAL(10,2) NOT NULL,
fecha DATE NOT NULL,
FOREIGN KEY (cliente_id) REFERENCES clientes(id)
); CRUD básico
Las cuatro operaciones fundamentales: INSERT, SELECT,
UPDATE, DELETE. Con JDBC se ejecutan como cadenas de texto que la base de datos
parsea y ejecuta.
-- CREATE
INSERT INTO clientes (nombre, email) VALUES ('Ana García', 'ana@ejemplo.com');
-- READ
SELECT id, nombre, email FROM clientes WHERE activo = TRUE;
SELECT c.nombre, p.total FROM clientes c JOIN pedidos p ON c.id = p.cliente_id;
-- UPDATE
UPDATE clientes SET email = 'nuevo@ejemplo.com' WHERE id = 1;
-- DELETE
DELETE FROM pedidos WHERE cliente_id = 1;
DELETE FROM clientes WHERE id = 1; Filtrado, ordenación y agregación
-- Filtrado y ordenación
SELECT * FROM pedidos
WHERE total > 100
AND fecha >= '2024-01-01'
ORDER BY fecha DESC
LIMIT 10 OFFSET 20;
-- Agregación
SELECT cliente_id, COUNT(*) AS num_pedidos, SUM(total) AS total_gastado
FROM pedidos
GROUP BY cliente_id
HAVING SUM(total) > 500;
-- Subconsulta
SELECT nombre FROM clientes
WHERE id IN (
SELECT DISTINCT cliente_id FROM pedidos WHERE total > 1000
); Tipos SQL ↔ Java
JDBC mapea los tipos SQL a tipos Java al leer datos del ResultSet. Conocer la correspondencia
es esencial para elegir el método correcto (getString, getLong, getBigDecimal...).
-- Tipos de datos más comunes en SQL y su equivalente en Java
-- SQL Java
-- VARCHAR(n) → String
-- TEXT → String
-- INT → int / Integer
-- BIGINT → long / Long
-- DECIMAL(p,s) → BigDecimal (nunca double para dinero)
-- BOOLEAN → boolean / Boolean
-- DATE → java.sql.Date / java.time.LocalDate
-- TIMESTAMP → java.sql.Timestamp / java.time.LocalDateTime
-- BLOB → byte[]
-- Importante: usar BigDecimal para cantidades monetarias
-- double/float tienen errores de redondeo inaceptables en operaciones financieras