Este cheatsheet cubre los comandos y conceptos más importantes de PostgreSQL, el potente sistema de gestión de bases de datos relacionales de código abierto (RDBMS).
- Base de Datos (Database): 🗄️ Colección organizada de datos.
- Tabla (Table): 📊 Estructura que almacena datos en filas y columnas.
- Columna (Column): 📏 Atributo de una tabla (ej. nombre, edad, email). Tiene un tipo de dato específico.
- Fila (Row):
↔️ Registro individual en una tabla. - Clave Primaria (Primary Key): 🔑 Columna (o combinación de columnas) que identifica de forma única cada fila en una tabla.
- Clave Foránea (Foreign Key): 🗝️ Columna en una tabla que hace referencia a la clave primaria de otra tabla. Establece una relación entre tablas.
- Índice (Index): 🔎 Estructura que acelera la búsqueda de datos en una tabla.
- Consulta (Query): ❓ Petición para obtener, insertar, actualizar o eliminar datos.
- Transacción (Transaction): 묶음 Operación o conjunto de operaciones que se ejecutan como una unidad atómica (todo o nada).
- Vista (View): 👀 Tabla virtual basada en el resultado de una consulta.
- Función (Function): ⚙️ Bloque de código reutilizable que puede recibir parámetros y devolver un valor.
- Trigger (Disparador): ⏰ Procedimiento que se ejecuta automáticamente en respuesta a un evento (INSERT, UPDATE, DELETE) en una tabla.
- Usuario (User): 👤 Cuenta con permisos para acceder a la base de datos. En PostgreSQL, los usuarios también se llaman roles.
- Rol (Role): 👤 Grupo de privilegios que se pueden asignar a usuarios.
- Privilegio (Privilege): ✅ Permiso específico (SELECT, INSERT, UPDATE, DELETE, etc.) otorgado a un usuario o rol.
- Esquema (Schema): 🏘️ Espacio de nombres que contiene objetos de base de datos (tablas, vistas, funciones, etc.). El esquema por defecto es
public. - Secuencia (Sequence): Objeto que genera una secuencia de números enteros.
-
Conectar a PostgreSQL (línea de comandos
psql):psql -U usuario -d base_de_datos -h host -p puerto # -U: usuario, -d: base de datos, -h: host, -p: puerto (5432 por defecto) psql -U postgres #Conectar como superusuario
-
Mostrar bases de datos:
\l -- (letra ele) -- o SELECT datname FROM pg_database;
-
Seleccionar una base de datos:
\c nombre_base_de_datos
-
Mostrar tablas:
\dt -- o SELECT tablename FROM pg_tables WHERE schemaname = 'public'; -- Tablas del esquema public
-
Mostrar esquemas
\dn -- o SELECT nspname FROM pg_namespace;
-
Describir una tabla (estructura):
\d nombre_tabla -- o SELECT column_name, data_type, character_maximum_length FROM information_schema.columns WHERE table_name = 'nombre_tabla';
-
Mostrar funciones:
\df
-
Mostrar triggers:
\dy
-
Mostrar vistas:
\dv
-
Mostrar usuarios/roles:
\du -- o SELECT rolname FROM pg_roles;
-
Mostrar la versión de PostgreSQL:
SELECT version(); -
Mostrar la base de datos actual:
SELECT current_database(); -
Mostrar el usuario actual
SELECT current_user;
-
Mostrar la configuración actual
SHOW ALL; SHOW <parámetro>; --Ej: SHOW TIMEZONE -
Ejecutar un script SQL:
\i ruta/al/archivo.sql
-
Salir de
psql:\q
-
Crear una base de datos:
CREATE DATABASE nombre_base_de_datos; CREATE DATABASE testdb WITH OWNER = testuser TEMPLATE = template0 ENCODING = 'UTF8' LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8' CONNECTION LIMIT = -1; -- Opciones
-
Eliminar una base de datos:
DROP DATABASE nombre_base_de_datos; DROP DATABASE IF EXISTS nombre_base_de_datos;
-
Crear una tabla:
CREATE TABLE nombre_tabla ( columna1 tipo_dato [NOT NULL] [DEFAULT valor] [PRIMARY KEY], columna2 tipo_dato [NOT NULL], columna3 tipo_dato, ... PRIMARY KEY (columna1), -- Clave primaria (opcional si ya se definió en una columna) FOREIGN KEY (columna2) REFERENCES otra_tabla(otra_columna) -- Clave foránea (opcional) CONSTRAINT nombre_restriccion UNIQUE (columna3) --Restricción UNIQUE ); CREATE TABLE IF NOT EXISTS public.mi_tabla(...); --Con IF NOT EXISTS
-
Eliminar una tabla:
DROP TABLE nombre_tabla; DROP TABLE IF EXISTS nombre_tabla CASCADE; -- Elimina también objetos dependientes
-
Modificar una tabla (ALTER TABLE):
ALTER TABLE nombre_tabla ADD COLUMN nueva_columna tipo_dato; -- Agregar columna ALTER TABLE nombre_tabla DROP COLUMN nombre_columna; -- Eliminar columna ALTER TABLE nombre_tabla ALTER COLUMN nombre_columna TYPE nuevo_tipo_dato; -- Modificar tipo de dato ALTER TABLE nombre_tabla RENAME COLUMN nombre_columna TO nuevo_nombre; -- Renombrar columna ALTER TABLE nombre_tabla ADD PRIMARY KEY (columna); -- Añadir clave primaria ALTER TABLE nombre_tabla DROP CONSTRAINT nombre_restriccion_pk; -- Eliminar clave primaria (nombre de la restricción) ALTER TABLE nombre_tabla ADD FOREIGN KEY (columna) REFERENCES otra_tabla(otra_columna); ALTER TABLE nombre_tabla DROP CONSTRAINT nombre_restriccion_fk; -- Eliminar clave foránea ALTER TABLE nombre_tabla ADD CONSTRAINT nombre_indice UNIQUE (columna); -- Clave única. ALTER TABLE nombre_tabla RENAME TO nuevo_nombre; -- Renombrar tabla
-
Truncar una tabla:
TRUNCATE TABLE nombre_tabla;
- Numéricos:
SMALLINT: Entero pequeño.INTEGER/INT: Entero.BIGINT: Entero grande.DECIMAL(M, D)/NUMERIC(M, D): Número decimal exacto (M: dígitos totales, D: decimales).REAL: Número de punto flotante (precisión simple).DOUBLE PRECISION: Número de punto flotante (doble precisión).SERIAL: Entero autoincremental (equivalente aINTEGERcon una secuencia).BIGSERIAL: Entero grande autoincremental.
- Cadenas de texto:
CHARACTER(N)/CHAR(N): Cadena de longitud fija (N caracteres).CHARACTER VARYING(N)/VARCHAR(N): Cadena de longitud variable (hasta N caracteres).TEXT: Cadena de longitud variable ilimitada.
- Fechas y horas:
DATE: Fecha (YYYY-MM-DD).TIME: Hora (HH:MI:SS).TIMESTAMP: Fecha y hora (YYYY-MM-DD HH:MI:SS).TIMESTAMP WITH TIME ZONE: Fecha y hora con zona horaria.INTERVAL: Representa un intervalo de tiempo.
- Booleanos:
BOOLEAN:TRUE,FALSE, oNULL.
- Otros:
UUID: Identificador único universal.JSON/JSONB: Datos en formato JSON (JSONB es binario, más eficiente).XML: Datos en formato XMLINET: Dirección IPv4 o IPv6.CIDR: Bloque de red CIDR.MACADDR: Dirección MAC.ARRAY: Arrays (ej.INTEGER[],TEXT[]).ENUM: Tipos enumerados.TSVECTORyTSQUERY: Para búsqueda de texto completo.- Geométricos:
POINT,LINE,LSEG,BOX,PATH,POLYGON,CIRCLE - Rangos:
INT4RANGE,INT8RANGE,NUMRANGE,TSRANGE,TSTZRANGE,DATERANGE
SELECT [DISTINCT] columna1, columna2, ...
FROM nombre_tabla
[WHERE condicion]
[GROUP BY columna]
[HAVING condicion_agrupada]
[ORDER BY columna [ASC | DESC]]
[LIMIT numero_filas [OFFSET desplazamiento]]
[FOR UPDATE]; -- Bloqueo de filas para actualización (dentro de una transacción)SELECT *: Selecciona todas las columnas.DISTINCT: Devuelve valores únicos.WHERE: Filtra los resultados según una condición.GROUP BY: Agrupa los resultados por una o más columnas.HAVING: Filtra los resultados agrupados.ORDER BY: Ordena los resultados.LIMIT: Limita el número de filas devueltas.OFFSET: Especifica el desplazamiento.FOR UPDATE: Bloquea las filas seleccionadas para actualización (dentro de una transacción). Evita que otras transacciones las modifiquen hasta que la transacción actual termine.
Ejemplos:
SELECT * FROM empleados;
SELECT nombre, edad FROM empleados WHERE edad > 30;
SELECT ciudad, COUNT(*) AS total FROM clientes GROUP BY ciudad HAVING total > 10;
SELECT * FROM productos ORDER BY precio DESC LIMIT 5;
SELECT * FROM pedidos LIMIT 10 OFFSET 5;
SELECT DISTINCT ciudad FROM clientes;- Aritméticos:
+,-,*,/,%,^(exponenciación). - De comparación:
=,<>,!=,>,<,>=,<=,BETWEEN,IN,NOT IN,LIKE,ILIKE(LIKE insensible a mayúsculas/minúsculas),NOT LIKE,IS NULL,IS NOT NULL,IS DISTINCT FROM,IS NOT DISTINCT FROM. - Lógicos:
AND,OR,NOT. - De concatenación:
||
Ejemplos:
SELECT * FROM productos WHERE precio BETWEEN 10 AND 20;
SELECT * FROM clientes WHERE ciudad IN ('Madrid', 'Barcelona');
SELECT * FROM empleados WHERE nombre LIKE 'J%';
SELECT * FROM empleados WHERE nombre ILIKE 'j%'; -- Insensible a mayúsculas/minúsculas
SELECT * FROM empleados WHERE apellido NOT LIKE '%ez';
SELECT * FROM productos WHERE stock IS NULL;
SELECT * FROM empleados WHERE nombre IS NOT DISTINCT FROM 'Juan'; -- Considera NULLs
SELECT 'Hola' || ' ' || 'Mundo'; -- Concatenación-
INSERT (insertar):
INSERT INTO nombre_tabla (columna1, columna2, ...) VALUES (valor1, valor2, ...); INSERT INTO productos (nombre, precio) VALUES ('Teclado', 50), ('Ratón', 25); INSERT INTO tabla_destino (col1, col2) SELECT col1,col2 FROM tabla_origen;
-
UPDATE (actualizar):
UPDATE nombre_tabla SET columna1 = valor1, columna2 = valor2, ... WHERE condicion; UPDATE empleados SET salario = salario * 1.10 WHERE departamento = 'Ventas';
¡Cuidado! Si no usas
WHERE, se actualizarán todas las filas. -
DELETE (eliminar):
DELETE FROM nombre_tabla WHERE condicion; DELETE FROM clientes WHERE ciudad = 'Valencia';
¡Cuidado! Si no usas
WHERE, se eliminarán todas las filas. -
UPSERT (Insertar o Actualizar):
INSERT INTO productos (id, nombre, precio) VALUES (1, 'Teclado', 50) ON CONFLICT (id) DO UPDATE SET nombre = EXCLUDED.nombre, precio = EXCLUDED.precio; -- EXCLUDED se refiere a los valores que se intentaron insertar
INNER JOIN:LEFT [OUTER] JOIN:RIGHT [OUTER] JOIN:FULL [OUTER] JOIN:CROSS JOIN: Producto cartesiano.NATURAL JOIN: Join implícito, basado en columnas con el mismo nombre.
-- INNER JOIN
SELECT p.nombre AS producto, c.nombre AS categoria
FROM productos p
INNER JOIN categorias c ON p.categoria_id = c.id;
-- LEFT JOIN
SELECT c.nombre AS cliente, p.fecha AS fecha_pedido
FROM clientes c
LEFT JOIN pedidos p ON c.id = p.cliente_id;-
Funciones de agregación:
COUNT()SUM()AVG()MIN()MAX()
SELECT COUNT(*) FROM empleados; SELECT AVG(salario) FROM empleados;
-
Funciones de cadena:
CONCAT()/||LENGTH()/CHAR_LENGTH()/CHARACTER_LENGTH()UPPER()LOWER()SUBSTRING(cadena, inicio, longitud)TRIM()REPLACE()INITCAP(): Convierte la primera letra de cada palabra a mayúscula.POSITION(subcadena IN cadena): Posición de una subcadenaLPAD()yRPAD(): Rellenan una cadena
SELECT CONCAT(nombre, ' ', apellido) AS nombre_completo FROM empleados; SELECT nombre || ' ' || apellido AS nombre_completo FROM empleados; -- Concatenación
-
Funciones de fecha y hora:
NOW()CURRENT_DATECURRENT_TIMECURRENT_TIMESTAMPEXTRACT(parte FROM fecha)(ej.EXTRACT(YEAR FROM fecha_nacimiento))DATE_TRUNC(parte, fecha)AGE(fecha1, fecha2)TO_CHAR(fecha, formato)
SELECT TO_CHAR(fecha_nacimiento, 'DD/MM/YYYY') AS fecha_formateada FROM empleados;
-
Funciones de control de flujo:
CASE WHEN condicion1 THEN valor1 WHEN condicion2 THEN valor2 ... ELSE valor_else ENDCOALESCE(valor1, valor2, ...): Devuelve el primer valor no nulo.NULLIF(valor1, valor2): Devuelve NULL si valor1 = valor2, de lo contrario devuelve valor1.
SELECT nombre, CASE WHEN edad > 18 THEN 'Mayor de edad' ELSE 'Menor de edad' END AS estado FROM personas;
-
Funciones matemáticas:
ABS()ROUND()FLOOR()CEIL()/CEILING()MOD()POWER()SQRT()RANDOM()GREATEST()LEAST()TRUNC()
-
Funciones de conversión de tipo:
CAST(expresión AS tipo)expresión::tipo(sintaxis abreviada de PostgreSQL)
SELECT CAST('123' AS INTEGER); SELECT '123'::INTEGER;
-
Funciones de arrays:
array_append(),array_prepend(),array_cat(),array_remove(),array_replace(),array_length(),array_position(),array_positions(),unnest()
-
Funciones de JSON:
->,->>,#>,#>>,json_array_length(),json_each(),json_each_text(),json_extract_path(),json_extract_path_text(),json_object_keys(),json_populate_record(),json_array_elements(),jsonb_set(),jsonb_insert(),jsonb_pretty()
-- CASE
SELECT
producto,
CASE
WHEN precio < 10 THEN 'Barato'
WHEN precio < 50 THEN 'Medio'
ELSE 'Caro'
END AS rango_precio
FROM productos;BEGIN; -- Iniciar transacción (o START TRANSACTION)
-- Instrucciones SQL
COMMIT; -- Confirmar los cambios
ROLLBACK; -- Deshacer los cambios- Niveles de aislamiento:
READ UNCOMMITTED,READ COMMITTED,REPEATABLE READ,SERIALIZABLE. (Por defecto:READ COMMITTED).
CREATE VIEW vista_empleados_ventas AS
SELECT e.nombre, e.apellido, d.nombre AS departamento
FROM empleados e
JOIN departamentos d ON e.departamento_id = d.id
WHERE d.nombre = 'Ventas';
SELECT * FROM vista_empleados_ventas;
DROP VIEW vista_empleados_ventas;
CREATE OR REPLACE VIEW vista_empleados_ventas AS ... ; --ModificarCREATE FUNCTION sumar(a INTEGER, b INTEGER)
RETURNS INTEGER
AS $$
BEGIN
RETURN a + b;
END;
$$ LANGUAGE plpgsql;
SELECT sumar(5, 3);
DROP FUNCTION sumar;CREATE [OR REPLACE] FUNCTION: Crea o reemplaza una función.RETURNS: Especifica el tipo de dato de retorno.$$: Delimitador de la función (se puede usar cualquier cadena, pero$$es común).LANGUAGE: Lenguaje de la función (ej.plpgsql,sql,plpython3u, etc.).IMMUTABLE,STABLE,VOLATILE: Indican el comportamiento de la función con respecto a la optimización de consultas.
-- 1. Crear la función trigger
CREATE FUNCTION actualizar_fecha_modificacion()
RETURNS TRIGGER
AS $$
BEGIN
NEW.fecha_modificacion = NOW(); -- NEW se refiere a la nueva fila
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
-- 2. Crear el trigger
CREATE TRIGGER actualizar_fecha_modificacion_trigger
BEFORE UPDATE ON productos
FOR EACH ROW
EXECUTE FUNCTION actualizar_fecha_modificacion();
DROP TRIGGER actualizar_fecha_modificacion_trigger ON productos;BEFORE/AFTER: Cuándo se ejecuta el trigger.INSERT,UPDATE,DELETE: El evento.FOR EACH ROW/FOR EACH STATEMENT: Nivel de ejecución.NEW: Nuevos valores de la fila.OLD: Valores antiguos de la fila.EXECUTE FUNCTION: La función que se ejecuta.WHEN: Se puede añadir una condición.
CREATE ROLE nuevo_usuario WITH LOGIN PASSWORD 'contraseña'; -- Crear usuario (rol con LOGIN)
CREATE ROLE grupo; -- Crear rol
GRANT SELECT, INSERT ON mi_tabla TO nuevo_usuario; -- Otorgar privilegios
REVOKE DELETE ON mi_tabla FROM nuevo_usuario; -- Revocar privilegios
GRANT grupo TO nuevo_usuario; -- Asignar rol a usuario
ALTER ROLE nuevo_usuario WITH CREATEDB; --Dar permisos de creación de base de datos.
ALTER ROLE nuevo_usuario WITH SUPERUSER; -- Hacerlo superusuario (cuidado)
ALTER USER nuevo_usuario WITH PASSWORD 'nueva_clave'; -- Cambiar clave
DROP ROLE nuevo_usuario; -- Eliminar usuario/rolCREATE ROLE: Crea un usuario o un rol.LOGIN: Permite al rol iniciar sesión (es decir, es un usuario).PASSWORD: Establece la contraseña.GRANT: Otorga privilegios.REVOKE: Revoca privilegios.ALTER ROLE: Modifica un rol.
- Un esquema es un espacio de nombres que contiene objetos de base de datos (tablas, vistas, funciones, etc.).
- El esquema por defecto es
public.
CREATE SCHEMA mi_esquema;
SET search_path TO mi_esquema, public; -- Establecer el orden de búsqueda de esquemas
SELECT * FROM mi_esquema.mi_tabla; --Acceder a la tabla en un esquema específico.
DROP SCHEMA mi_esquema; CREATE INDEX idx_nombre ON empleados (nombre);
CREATE UNIQUE INDEX idx_email ON clientes (email);
CREATE INDEX idx_compuesto ON tabla (col1, col2); -- Indice compuesto
DROP INDEX idx_nombre;
-- Tipos de índices: B-tree (por defecto), Hash, GiST, SP-GiST, GIN, BRIN
CREATE INDEX idx_gin ON tabla USING GIN (columna);EXPLAIN [ANALYZE] SELECT ...: Muestra el plan de ejecución de una consulta.VACUUM [FULL] [ANALYZE] tabla: Recupera espacio y actualiza estadísticas.ANALYZE tabla: Actualiza estadísticas para el optimizador de consultas.COPY: Importa/exporta datos desde/hacia archivos.\copy: Lo mismo queCOPY, pero desde el clientepsql.pg_dumpypg_restore: Herramientas para copias de seguridad y restauración.- Extensiones: Amplían la funcionalidad de PostgreSQL (ej.
pg_trgm,hstore,uuid-ossp,postgis). CREATE EXTENSION nombre_extension;
Este cheatsheet de PostgreSQL es muy completo, y abarca una gran cantidad de comandos, conceptos y características. ¡Cópialo, pégalo y úsalo como referencia!