DBA Junior Ciberecus MX
Temas · Capítulo 1 · PF-005

Tema 5: PostgreSQL: el motor de crecimiento profesional

Identificador: PF-005
XP: 200
Insignia: 🥇 Oro — "Postgresista"
Tier: Aprendiz
Tiempo estimado: 90-120 minutos
Pre-requisitos: PF-004 (tener MySQL funcionando)
Materiales: computadora con 2 GB libres de disco
---

🖼️ Imagen de inicio del tema

Imagen de inicio del tema - PF-005_postgresql_segundo_motor.png [Imagen de inicio del tema: ilustración cartoon alusiva al tema. Generada con IA. Estilo Head First + For Dummies, paleta azul-verde-naranja-rojo-amarillo.]
Pie de imagen: "MySQL fue tu primera cita. PostgreSQL es el compromiso. Más serio, más profundo, más poderoso. Y lo vas a usar toda tu carrera."

🏛️ Visión mexica — Por Citlalli

Citlalli aporta: "PostgreSQL es el imperio, MySQL es Tlatelolco. Esa es la forma rápida de entender por qué los dos coexisten en el mercado y cuándo usar cada uno. El imperio mexica (PostgreSQL) era un sistema COMPLEJO:
  • Manejaba tributos de 371 altépetl (entidades)
  • Procesaba información en múltiples formatos: tributos en grano, mantas, plumas, trabajo personal, servicio militar
  • Tenía reglas estrictas de auditoría: cada entrega firmada por el calpixqui, validada por el huey calpixqui del imperio
  • Almacenaba en el calmécac con redundancia en varios puntos del imperio
  • Procesaba consultas complejas: 'dame todos los pueblos que no cumplieron su cuota de cacao en el último año calendario'
Tlatelolco (MySQL) era el sistema COMERCIAL: rápido, transaccional, con menos reglas estrictas de auditoría, optimizado para muchas operaciones pequeñas y simultáneas. En 2026, las empresas eligen PostgreSQL cuando su problema es complejo (datos variados, consultas analíticas, alta concurrencia con transacciones robustas). Eligen MySQL cuando su problema es comercial, rápido, con consultas simples y volumen alto. Las dos filosofías coexisten en la mayoría de las empresas modernas. Tu trabajo como DBA será saber cuál usar y cuándo migrar de uno a otro. Citlalli dice: 'no te cases con ninguno; aprende los dos'." --- ---

🎯 En este tema aprenderás

    Instalar PostgreSQL 17 en Windows, Mac o Linux. Usar `psql` (la línea de comandos de PostgreSQL). Cargar el dataset "Tienda Tlalli" versión PostgreSQL. Comparar la sintaxis MySQL vs PostgreSQL en queries básicas. Decidir cuándo usar MySQL y cuándo PostgreSQL.
---

📚 Bloque 1: Por qué PostgreSQL importa más que nunca

Don Carlos: Sofía, te voy a dar un dato que te va a sorprender. En 2025, PostgreSQL es la base de datos más usada por developers profesionales en el mundo, con 55.6% de adopción (Stack Overflow Developer Survey 2025). MySQL está en segundo lugar con 39.4%. La tendencia es clara: PostgreSQL crece, MySQL se estanca. Sofía pregunta: ¿Por qué? ¿MySQL no es bueno? Don Carlos: MySQL es muy bueno. Pero PostgreSQL tiene ventajas técnicas que lo hacen mejor para muchas situaciones modernas:
  • Tipos de datos avanzados: PostgreSQL tiene JSON nativo (no es texto), tipos geométricos, arrays, full-text search integrado. MySQL tiene JSON, pero es más limitado.
  • MVCC más sofisticado: el sistema de control de concurrencia de PostgreSQL es más maduro y permite más aislamiento sin bloqueos.
  • Extensibilidad: puedes crear tus propios tipos de datos, funciones, e incluso lenguajes procedurales (PL/pgSQL, Python, Perl).
  • Cumplimiento SQL más estricto: PostgreSQL es conocido por seguir el estándar SQL más de cerca que MySQL.
  • Comunidad open source: PostgreSQL no es de una empresa (Oracle), es de una comunidad global. Su desarrollo es completamente abierto.
Moka: "¿Sabías que Netflix, Instagram, Uber, Spotify, Reddit y otras empresas gigantes usan PostgreSQL como base principal? No es巧合. Hay una razón." El dato del mercado (refuerza por qué aprenderlo):
  • Salario promedio DBA PostgreSQL en México: $70K-$95K MXN/mes [1].
  • Certificación EDB PostgreSQL Associate cuesta ~$200 USD y abre puertas [2].
  • En vacantes de LinkedIn México, PostgreSQL aparece en el 70% de ofertas de DBA [3].
---

📚 Bloque 2: Instalación de PostgreSQL 17

Opción A — Windows (instalador oficial de EDB):
    Entra a https://www.enterprisedb.com/download-postgresql-binaries (o al instalador gráfico). Descarga PostgreSQL 17.x para Windows x64. Ejecuta el instalador. Te preguntará:
- Directorio de instalación: `C:\Program Files\PostgreSQL\17\` (por defecto). - Contraseña del superusuario `postgres`: ESTO ES LO MÁS IMPORTANTE. Anota la contraseña que pongas. La vas a necesitar para conectarte. - Puerto: 5432 (déjalo por defecto). - Locale: déjala en "Default locale".
    Selecciona los componentes: PostgreSQL Server, pgAdmin 4 (herramienta gráfica), Stack Builder (opcional), Command Line Tools. Espera a que instale. Al final, te preguntará si quieres abrir Stack Builder. Di que no. El instalador crea un servicio llamado "postgresql-x64-17" que se inicia automáticamente con Windows.
Opción B — Mac (con Homebrew): ```bash brew install postgresql@17 brew services start postgresql@17 ``` Opción C — Linux (Ubuntu/Debian): ```bash sudo apt update sudo apt install postgresql-17 sudo systemctl start postgresql ``` Sofía pregunta: ¿Y si ya tengo MySQL corriendo en XAMPP, puedo tener PostgreSQL también? Don Carlos: Sí, no hay conflicto. MySQL usa el puerto 3306, PostgreSQL usa el 5432. Son puertos diferentes, así que pueden convivir en la misma máquina sin problemas. ---

📚 Bloque 3: Conectarse a PostgreSQL

Don Carlos: "Hay 4 caminos principales: Camino 1 — `psql` (línea de comandos, la navaja suiza del DBA PostgreSQL):
    Abre PowerShell. Conéctate:
```powershell psql -U postgres -h localhost ``` Te pedirá la contraseña que pusiste durante la instalación.
    Si todo va bien, verás:
``` psql (17.x) Type "help" for help. postgres=# ```
    Comandos útiles:
- `\l` — lista las bases de datos. - `\c nombre_base` — se conecta a una base. - `\dt` — lista las tablas. - `\d nombre_tabla` — describe una tabla. - `\q` — sale de psql. Camino 2 — pgAdmin 4 (interfaz gráfica oficial, viene con el instalador):
    Abre pgAdmin 4 desde el menú de inicio. La primera vez te pide configurar una contraseña maestra para guardar tus conexiones. En el panel izquierdo, expande "Servers" → "PostgreSQL 17" → "Databases". Verás las bases por defecto: `postgres` (la principal), `template0` y `template1` (plantillas). Para crear una base nueva: clic derecho en "Databases" → "Create" → "Database...".
Camino 3 — DBeaver (lo verás en el Tema 6, la mejor opción para trabajar día a día). Camino 4 — La terminal de XAMPP (NO sirve para PostgreSQL, solo MySQL). ---

📚 Bloque 4: Cargar el dataset Tienda Tlalli versión PostgreSQL

Don Carlos: "Como prometimos, el dataset viene en dos versiones. La de PostgreSQL tiene la misma estructura y los mismos datos, pero con sintaxis adaptada." Paso 1. Crea la base de datos `tienda_tlalli` en PostgreSQL. Desde `psql`: ```sql CREATE DATABASE tienda_tlalli ENCODING 'UTF8'; ``` O desde pgAdmin: clic derecho en "Databases" → Create → Database. Paso 2. Conéctate a esa base: ```sql \c tienda_tlalli ``` Paso 3. Carga el script SQL. Desde `psql`: ```sql \i 'C:\ruta\a\02_schema_tienda_tlalli_pg.sql' ``` (Las comillas simples son necesarias si la ruta tiene espacios). Paso 4. Verifica: ```sql \dt ``` Deberías ver 6 tablas. Paso 5. Primera query: ```sql SELECT COUNT() AS total_clientes FROM clientes; ``` Debería devolver 50. Moka: "Si te da error de tipo 'permission denied' al cargar, es porque el usuario postgres no tiene permisos sobre la base. La solución es: cargar el script como superusuario (que es lo que estamos haciendo), o dar permisos explícitos. Por ahora, todo con postgres está bien para desarrollo." ---

📚 Bloque 5: MySQL vs PostgreSQL — Las 7 diferencias que importan al empezar

Don Carlos:
"Esta es la parte más útil del tema. Cuando trabajes con los dos motores, estas son las diferencias que más vas a notar: | Aspecto | MySQL | PostgreSQL | |---|---|---| | Auto-increment | `AUTO_INCREMENT` | `SERIAL` o `GENERATED BY DEFAULT AS IDENTITY` | | Tipo booleano | `TINYINT(1)` (convención) | `BOOLEAN` nativo | | Strings | `VARCHAR(n)`, comillas simples | `VARCHAR(n)`, comillas simples (idéntico) | | ENUM | `ENUM('a','b','c')` nativo | Hay que crear un `TYPE ... AS ENUM` o usar `VARCHAR` + CHECK | | Comillas para identificadores | Backticks `` ` `` | Dobles comillas `""` | | Comando para tiempo actual | `NOW()`, `CURRENT_TIMESTAMP` | `NOW()`, `CURRENT_TIMESTAMP` (idéntico) | | Límite de filas en SELECT | `LIMIT n` | `LIMIT n` (idéntico) | Las queries que SÍ son idénticas (el 80% del SQL cotidiano): ```sql -- Estas funcionan IGUAL en ambos motores: SELECT FROM clientes WHERE ciudad = 'Monterrey'; SELECT nombre, precio FROM productos ORDER BY precio DESC LIMIT 10; SELECT COUNT() FROM pedidos WHERE estado = 'entregado'; SELECT cliente_id, SUM(total) FROM pedidos GROUP BY cliente_id; INSERT INTO clientes (nombre, email) VALUES ('Juan', 'juan@example.com'); UPDATE productos SET precio = 1500 WHERE id = 5; DELETE FROM clientes WHERE id = 100; ``` Don Carlos: "Como ves, el 80% del SQL es idéntico. Las diferencias son menores y se aprenden en una tarde. Si ya sabes MySQL, aprender PostgreSQL te toma una semana. Y al revés también." Moka: "Los drivers de conexión (los archivos que permiten a tu app hablar con la BD) son diferentes: MySQL usa `mysql-connector`, PostgreSQL usa `libpq` o `psycopg2`. Pero eso es problema del programador, no tuyo como DBA." ---

📚 Bloque 6: ¿Cuándo usar MySQL vs PostgreSQL en tu carrera?

Don Carlos:
"Sofía, te voy a dar el cheat sheet que yo uso: Usa MySQL cuando:
  • Estás en hosting compartido (cPanel, WordPress, sitios web básicos).
  • Tu app es 100% PHP y el proveedor solo soporta MySQL.
  • Necesitas replicación simple (master-slave) y no quieres complicarte.
  • El equipo de desarrollo ya lo domina y no hay tiempo para aprender otra cosa.
Usa PostgreSQL cuando:
  • Estás en una startup moderna o empresa de tecnología.
  • Necesitas JSON nativo, full-text search, o tipos de datos avanzados.
  • El equipo tiene experiencia o disposición para aprender.
  • La app va a escalar a millones de usuarios.
  • Estás en una empresa enterprise seria (bancos, fintechs).
Moka:
"Mi regla: para tu primer trabajo como DBA junior, no te cases con ninguno. Aprende los dos. Cuando te pregunten en una entrevista '¿cuál es tu favorito?', di la verdad: 'depende del problema, pero me defiendo bien en los dos'. Eso te hace más valioso." ---

🤖 AI Mission — "El comparador"

Misión 5.1: Pídele a la IA:
"Tengo una query que funciona en MySQL: 'SELECT FROM productos WHERE precio > 1000'. La quiero correr en PostgreSQL. ¿Hay alguna diferencia? Si sí, ¿cuál es?"
Misión 5.2: Pídele a la IA:
"Soy principiante. Explícame la diferencia entre los tipos de datos SERIAL y BIGSERIAL en PostgreSQL con un ejemplo del mundo real (carros, libros, lo que sea). ¿Cuándo uso uno y cuándo el otro?"
Misión 5.3: Pídele a la IA:
"¿Por qué el comando SHOW TABLES de MySQL no existe en PostgreSQL? ¿Qué comando uso en su lugar y por qué?"
---

⚠️ Errores típicos del principiante

Error 1 — Olvidar la contraseña de `postgres` durante la instalación La contraseña que pusiste al instalar PostgreSQL es la del superusuario. Si se te olvidó, tienes que entrar en modo "single user" y resetearla. NO es trivial. Anótala en un lugar seguro (un password manager, no un post-it pegado al monitor). Error 2 — Confundir `psql` con `mysql` (los clientes de línea de comandos) `psql` es para PostgreSQL. `mysql` es para MySQL. Si ejecutas `psql` cuando no tienes PostgreSQL instalado, te dirá "comando no encontrado". Si ejecutas un script MySQL en `psql`, te va a fallar por la sintaxis. Error 3 — Usar backticks en PostgreSQL Los identificadores en PostgreSQL van con comillas dobles (`"mi_tabla"`), no con backticks (`` `mi_tabla` ``). Es un error clásico viniendo de MySQL. Error 4 — Intentar crear un ENUM directamente en una columna PostgreSQL En MySQL: `estado ENUM('a','b')`. En PostgreSQL hay que crear un TYPE primero. El archivo del dataset ya lo hace; tú no tienes que preocuparte por ahora. Error 5 — Olvidar el `;` al final de las queries en `psql` `psql` necesita el punto y coma para saber que la query terminó. Sin él, espera más input. ---

🧪 LAB 5.1 — "Verificación de instalación de PostgreSQL"

Objetivo: confirmar que PostgreSQL está funcionando. Checklist:
  • [ ] PostgreSQL 17 está instalado.
  • [ ] El servicio "postgresql-x64-17" está corriendo (en Windows: services.msc).
  • [ ] Puedes conectarte con `psql -U postgres -h localhost`.
  • [ ] `\l` lista al menos 3 bases (postgres, template0, template1).
  • [ ] Puedes crear una base: `CREATE DATABASE test_123;` y luego `DROP DATABASE test_123;`.
  • [ ] pgAdmin 4 abre correctamente.
---

🧪 LAB 5.2 — "Cargando Tienda Tlalli en PostgreSQL"

Objetivo: cargar el dataset versión PostgreSQL. Instrucciones: Paso 1. Desde `psql` conectado como `postgres`: ```sql CREATE DATABASE tienda_tlalli ENCODING 'UTF8'; \c tienda_tlalli \i 'C:\ruta\a\02_schema_tienda_tlalli_pg.sql' ``` Paso 2. Verifica: ```sql \dt SELECT COUNT() FROM clientes; SELECT COUNT() FROM productos; SELECT COUNT() FROM pedidos; ``` Deberías ver: 6 tablas, 50 clientes, 30 productos, 110 pedidos. Paso 3. Ejecuta las 5 queries del Bloque 6 del Tema 4 (las mismas que hiciste en MySQL, ahora en PostgreSQL). Compara los resultados. ¿Son idénticos? Verificación: ambas bases (MySQL y PostgreSQL) deberían darte exactamente los mismos resultados en las queries de agregación. Si hay diferencia, es probable que sea de redondeo o formato de fecha. ---

🧪 LAB 5.3 — "Tu primer query que difiere entre motores"

Objetivo: ver una diferencia concreta de sintaxis. En MySQL (XAMPP): ```sql -- Crear una tabla con AUTO_INCREMENT CREATE TABLE prueba_mysql ( id INT AUTO_INCREMENT PRIMARY KEY, nombre VARCHAR(50) ); ``` En PostgreSQL (psql): ```sql -- Crear la misma tabla con SERIAL CREATE TABLE prueba_pg ( id SERIAL PRIMARY KEY, nombre VARCHAR(50) ); ``` Paso 1. Ejecuta la versión MySQL en phpMyAdmin o el cliente MySQL. Paso 2. Ejecuta la versión PostgreSQL en psql o pgAdmin. Paso 3. Inserta una fila en cada una:
  • MySQL: `INSERT INTO prueba_mysql (nombre) VALUES ('Sofía');`
  • PG: `INSERT INTO prueba_pg (nombre) VALUES ('Sofía');`
Paso 4. Verifica que el id se generó automáticamente: `SELECT
FROM prueba_mysql;` y `SELECT FROM prueba_pg;`. Paso 5. Borra las tablas de prueba (no las necesitas). Reflexión: ambas tablas hacen lo mismo, con sintaxis diferente. ¿Te das cuenta de que aprender los dos motores no es tan difícil como pensabas? ---

📝 Quest 5 — Preguntas de opción múltiple

Pregunta 1. ¿Cuál es el puerto por defecto de PostgreSQL? A) 3306 B) 5432 C) 1433 D) 80 Pregunta 2. ¿Cómo se llama el cliente de línea de comandos de PostgreSQL? A) mysql B) psql C) pgcli D) pgsql Pregunta 3. ¿Cómo se hace el "auto-increment" en PostgreSQL? A) AUTO_INCREMENT B) SERIAL C) BIGINT D) IDENTITY ONLY Pregunta 4. ¿Qué tipo de dato se usa para booleanos en PostgreSQL? A) TINYINT(1) B) BOOLEAN C) BOOL D) BIT Pregunta 5. ¿Cuál es el usuario superusuario de PostgreSQL? A) admin B) root C) postgres D) dba Pregunta 6. ¿Qué ventaja técnica tiene PostgreSQL sobre MySQL? A) Es más rápido en lecturas simples. B) Tiene JSON nativo más maduro, mejor cumplimiento del estándar SQL, y mayor extensibilidad. C) Es de Microsoft. D) Solo corre en Windows. Pregunta 7. ¿Qué empresa es responsable del desarrollo principal de PostgreSQL? A) Oracle B) Microsoft C) Es open source, mantenido por una comunidad global (PostgreSQL Global Development Group). D) IBM Pregunta 8. ¿Cuál de estas queries funciona IGUAL en MySQL y PostgreSQL? A) `INSERT INTO clientes (id, nombre) VALUES (DEFAULT, 'Juan');` B) `SELECT
FROM clientes WHERE id = 5;` C) `CREATE TABLE t (id SERIAL PRIMARY KEY);` D) `SHOW TABLES;` Pregunta 9. ¿Qué comando se usa en `psql` para listar las tablas de la base actual? A) `SHOW TABLES;` B) `LIST TABLES;` C) `\dt` D) `\tables` Pregunta 10. ¿Por qué MySQL y PostgreSQL pueden convivir en la misma máquina sin conflicto? A) Porque usan el mismo puerto. B) Porque usan puertos diferentes (3306 vs 5432). C) Porque uno se desactiva cuando el otro está activo. D) Porque comparten archivos de configuración. ---

📝 Quest 5 — Preguntas abiertas

Pregunta 11. Haz una tabla en tu cuaderno con 5 diferencias de sintaxis entre MySQL y PostgreSQL. Usa ejemplos concretos de cada una. Pregunta 12. ¿Por qué crees que PostgreSQL ha ganado tanta popularidad en los últimos años? Escribe tu hipótesis (mínimo 5 líneas) y luego busca un artículo que la confirme o la desmienta. Pregunta 13. Dibuja el "ecosistema" de tu máquina: MySQL corriendo en el puerto 3306, PostgreSQL en el 5432, Apache en el 80. ¿Qué otros servicios tienes corriendo? (Abre el Panel de XAMPP y `netstat`). ---

✅ Respuestas modelo — Quest 5

Pregunta 1: B (5432). Pregunta 2: B (psql). `pgcli` es una alternativa moderna con autocompletado, pero el oficial es `psql`. Pregunta 3: B (SERIAL). `AUTO_INCREMENT` es de MySQL. Pregunta 4: B (BOOLEAN). `BOOL` también funciona pero es alias de BOOLEAN. Pregunta 5: C (postgres). En MySQL sería `root`, en PostgreSQL es `postgres`. Pregunta 6: B. JSON nativo maduro, cumplimiento SQL, extensibilidad son las ventajas técnicas reales. (A es falso: MySQL suele ser igual o más rápido en lecturas simples; C es falso: PostgreSQL no es de Microsoft; D es falso: corre en Windows, Mac, Linux). Pregunta 7: C — comunidad open source. (Oracle es MySQL, Microsoft es SQL Server). Pregunta 8: B — el SELECT básico es idéntico. (A usa DEFAULT en VALUES, que difiere; C es solo PostgreSQL; D es solo MySQL). Pregunta 9: C — `\dt`. Los otros son distractores o de MySQL. Pregunta 10: B — puertos diferentes. Por eso pueden correr simultáneamente. ---

🏛️ Tras las huellas — Por Citlalli

"PostgreSQL: el imperio que sabe hacer de todo" PostgreSQL tiene una característica que ningún otro motor SQL tiene tan marcada: la EXTENSIBILIDAD. Puedes crear tus propios tipos de datos, tus propios lenguajes procedurales, tus propios operadores. Es como el imperio mexica: tenía una estructura básica (el tlatoani, los calpixqui, los tlacuilos) pero cada altépetl podía tener sus propias reglas y procedimientos. Ejemplos concretos de la 'extensibilidad' de PostgreSQL que se parecen al imperio:
  • PostGIS: extensión para datos geográficos. Los mexicas no lo necesitaban, pero hubieran apreciado poder preguntar 'qué pueblos están a menos de 20 km de un río'.
  • pgvector: extensión para búsqueda por similitud. Como un tlacuilo experto que podía decir 'este glifo se parece a este otro, probablemente significan lo mismo'.
  • PL/pgSQL: lenguaje procedural embebido. Como un tlacuilo que sabe no solo escribir glifos sino también aplicar reglas complejas a los registros.
La lección: cuando un motor SQL se vuelve 'un imperio' de funciones, es porque creció resolviendo problemas reales durante décadas. PostgreSQL tiene 35 años. MySQL tiene 30. La diferencia de 5 años se nota en la profundidad de las features. Cuando tu empresa te pida un sistema para 10 años de crecimiento, PostgreSQL es la apuesta más segura. En tu cuaderno, anota: ¿qué extensión de PostgreSQL te llama más la atención (PostGIS, pgvector, PL/pgSQL, otra)? ¿Por qué? Esa pista te dice hacia dónde orientar tu carrera como DBA. ---

📓 Cierre del cuaderno — 4 líneas

1. La diferencia entre MySQL y PostgreSQL que más me impactó fue:
>
2. Un momento "ajá" del LAB 5.3:
>
3. Lo que creo que voy a usar más en mi carrera:
>
4. Una pregunta sobre psql o pgAdmin:
---

🚀 ¿Qué sigue?

En el Tema 6 — DBeaver: la herramienta universal del DBA vamos a instalar la herramienta que vas a usar el 90% del tiempo como profesional. DBeaver es gratuita, open source, y se conecta a prácticamente cualquier base de datos del mercado (MySQL, PostgreSQL, SQL Server, Oracle, MongoDB, Redis, etc.). Una sola herramienta, todas tus bases.