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
Nota sobre dinero: nunca uses double o float para valores monetarios. 0.1 + 0.2 en punto flotante no es exactamente 0.3. En Java usa BigDecimal; en SQL usa DECIMAL o NUMERIC.

Siguiente apartado → Arquitectura JDBC: drivers y DriverManager

Índice de la sección

Índice del curso