Contenido de esta guía
Respuesta rápida
CREATE TABLE ... AS SELECT —también abreviado como CTAS— crea una tabla nueva a partir de las columnas y filas que devuelve una consulta.
CREATE TABLE tabla_nueva AS
SELECT columna_a, columna_b
FROM tabla_origen
WHERE condicion;Es útil para materializar un subconjunto o un resultado derivado. No debes asumir que copia automáticamente las claves, restricciones, índices o relaciones de las tablas de origen.
CTAS, INSERT ... SELECT o VIEW
Las tres técnicas reutilizan una consulta, pero resuelven problemas distintos.
| Opción | Destino | Cuándo encaja |
|---|---|---|
CREATE TABLE ... AS SELECT | Una tabla nueva con una copia del resultado | El destino todavía no existe y quieres materializar datos |
INSERT INTO ... SELECT | Filas nuevas en una tabla existente | Ya definiste el esquema y sus restricciones |
CREATE VIEW ... AS SELECT | Una consulta guardada, no una copia independiente de las filas | Quieres consultar siempre los datos actuales de las tablas base |
Si necesitas controlar de antemano PRIMARY KEY, FOREIGN KEY, CHECK, tipos exactos o índices, suele ser más explícito crear primero la tabla y después cargarla con INSERT ... SELECT.
Sintaxis y nombres de columnas
La tabla recibe tantas columnas como devuelva el SELECT. Usa alias cuando una expresión calculada necesite un nombre claro.
CREATE TABLE resumen AS
SELECT cliente_id,
COUNT(*) AS pedidos,
SUM(total) AS importe_total
FROM pedidos
GROUP BY cliente_id;Los alias pedidos e importe_total se convierten en nombres útiles para las columnas calculadas de la nueva tabla.
Ejemplo: materializar un resumen de clientes
En SQLite podemos crear una tabla temporal con el número de pedidos no cancelados y el importe acumulado por cliente. Usar TEMP mantiene el ejemplo dentro de la sesión de práctica.
CREATE TEMP TABLE resumen_clientes AS
SELECT cliente_id,
COUNT(*) AS pedidos,
ROUND(SUM(total), 2) AS importe_total
FROM pedidos
WHERE estado <> 'cancelado'
GROUP BY cliente_id;Después puedes consultar la tabla como cualquier otra tabla de la sesión:
SELECT cliente_id, pedidos, importe_total
FROM resumen_clientes
ORDER BY importe_total DESC, cliente_id
LIMIT 6;| cliente_id | pedidos | importe_total |
|---|---|---|
| 5 | 2 | 1112,0 |
| 1 | 2 | 377,4 |
| 8 | 2 | 268,0 |
| 2 | 2 | 253,4 |
| 3 | 2 | 215,9 |
| 7 | 1 | 148,9 |
La tabla temporal contiene diez clientes con pedidos no cancelados. A diferencia de una vista, esos valores quedan materializados en la tabla creada y no se recalculan automáticamente cuando cambian las tablas de origen.
Qué se copia y qué no
CTAS parte de la salida de la consulta. Esto es distinto de clonar la definición completa de una tabla existente.
- Se crean columnas a partir de las expresiones devueltas por el
SELECT. - Se insertan las filas producidas por esa consulta.
- Los alias de salida ayudan a definir nombres comprensibles.
- No des por copiadas las claves primarias, claves foráneas, restricciones
UNIQUE/CHECKni índices de las tablas fuente. - El orden usado para producir la consulta no convierte la tabla en una colección persistentemente ordenada.
Si la nueva tabla debe convertirse en parte estable del modelo, define y verifica su esquema explícitamente. Una copia rápida para análisis y una tabla de producción tienen necesidades distintas.
Comprueba la tabla después de crearla
Una operación de estructura no termina cuando la sentencia deja de dar error. Verifica al menos la cantidad de filas, los nombres y tipos de columnas relevantes y algunas filas límite.
SELECT COUNT(*) AS filas
FROM resumen_clientes;
SELECT *
FROM resumen_clientes
ORDER BY cliente_id
LIMIT 5;Para inspeccionar tipos, restricciones o índices, utiliza las herramientas de catálogo propias del motor. No existe una consulta de metadatos completamente portable entre PostgreSQL, SQLite, MySQL y SQL Server.
Errores frecuentes
Creer que CTAS clona la tabla original
CTAS construye una tabla a partir de un resultado. Si necesitas conservar reglas de integridad e índices, compruébalos y defínelos explícitamente.
Usar SELECT * sin revisar el contrato
Una columna añadida o reordenada en la fuente puede cambiar el resultado que materializas. Selecciona de forma explícita las columnas que forman la nueva tabla.
Esperar que la copia se actualice sola
Una tabla creada con CTAS contiene una fotografía del resultado en ese momento. Si necesitas que una consulta refleje los datos actuales de las tablas base, considera una VIEW.
Confundir orden de consulta con orden de almacenamiento
Cuando leas la tabla más tarde, usa ORDER BY si necesitas un orden concreto. No dependas del orden físico de inserción.
Práctica guiada
Crea una tabla temporal de clientes activos
Crea clientes_activos con id, nombre y ciudad para los clientes cuyo activo = 1. Usa una tabla temporal y comprueba después cuántas filas contiene.
Criterio de éxito: la nueva tabla contiene 11 filas.
CREATE TEMP TABLE clientes_activos AS.id, nombre y ciudad.WHERE activo = 1.Solución razonada
CREATE TEMP TABLE clientes_activos AS
SELECT id, nombre, ciudad
FROM clientes
WHERE activo = 1;
SELECT COUNT(*) AS filas
FROM clientes_activos;| filas |
|---|
| 11 |
La consulta selecciona once clientes activos y CTAS materializa exactamente esas once filas en la tabla temporal.
Compatibilidad entre motores
PostgreSQL y SQLite documentan CREATE TABLE ... AS SELECT. La idea común es crear y poblar una tabla con el resultado de una consulta, pero los detalles sobre tablas temporales, tipos derivados, opciones de almacenamiento y creación sin datos varían entre motores.
SQLite documenta específicamente que una tabla creada con CREATE TABLE ... AS SELECT deriva sus columnas del resultado y no adquiere automáticamente restricciones de clave primaria u otras restricciones del esquema fuente. En cualquier motor, trata CTAS como materialización de una consulta y verifica la definición resultante antes de depender de ella.
Qué debes recordar
- CTAS crea una tabla nueva y la llena con el resultado de un
SELECT. - Si la tabla ya existe, utiliza
INSERT ... SELECTen lugar de CTAS. - Una VIEW guarda la consulta; CTAS materializa sus filas.
- No supongas que claves, restricciones e índices de las fuentes se copian.
- Selecciona columnas explícitamente y comprueba el esquema y el número de filas después.