Conceptos básicos avanzados de SQL
9 ejemplos para empezar con SQL avanzado: 6 básicos y 3 intermedios.
Busca en todas las páginas de la documentación
9 ejemplos para empezar con SQL avanzado: 6 básicos y 3 intermedios.
Comodidad con JOIN y GROUP BY de la sección Consulta SQL.
# Desarrollo local con Docker (PostgreSQL 18)
docker run -d --name pg18 -e POSTGRES_PASSWORD=dev -p 5432:5432 postgres:18
psql postgres://postgres:dev@localhost:5432/postgresNombra los pasos intermedios.
WITH recent AS (
SELECT * FROM app.orders WHERE created_at > now() - interval '7 days'
)
SELECT account_id, count(*) FROM recent GROUP BY 1;Clasifica sin colapsar GROUP BY.
SELECT id, account_id,
row_number() OVER (PARTITION BY account_id ORDER BY created_at DESC) AS rn
FROM app.orders;Compara con el evento anterior por partición.
SELECT id, total,
lag(total) OVER (PARTITION BY account_id ORDER BY id) AS prev_total
FROM app.orders;Recuentos condicionales en una pasada.
SELECT account_id,
count(*) FILTER (WHERE total > 100) AS big_orders
FROM app.orders GROUP BY 1;Alinea CTEs y JOINs.
WITH open_orders AS (
SELECT * FROM app.orders WHERE status = 'open'
)
SELECT a.name, o.total
FROM open_orders o
JOIN app.accounts a ON a.id = o.account_id;Comentarios SQL para reglas de negocio no obvias.
-- Los ingresos se reconocen solo para los pedidos enviados
SELECT sum(total) FROM app.orders WHERE status = 'shipped';Línea base antes de la optimización.
EXPLAIN (ANALYZE, BUFFERS)
WITH x AS (SELECT account_id, sum(total) s FROM app.orders GROUP BY 1)
SELECT * FROM x WHERE s > 1000;Subconsulta correlacionada por fila.
SELECT a.id, latest.total
FROM app.accounts a
JOIN LATERAL (
SELECT total FROM app.orders o
WHERE o.account_id = a.id ORDER BY created_at DESC LIMIT 1
) latest ON true;Pivotar con agregación condicional.
SELECT account_id,
sum(total) FILTER (WHERE status='open') AS open_total,
sum(total) FILTER (WHERE status='closed') AS closed_total
FROM app.orders GROUP BY 1;Versiones de la pila: Esta página fue escrita para PostgreSQL 18.4 (estable 18, mantenimiento 17), pgvector 0.8+, PgBouncer 1.x, Patroni 3.x y PostGIS 3.5+.
Revisado por Chris St. John·Última actualización: 16 jul 2026