Estructura · materializar una consulta

CREATE TABLE AS SELECT

Crea una tabla nueva y la llena con el resultado de un SELECT en una sola operación, sin confundir una copia de datos con una vista o con la clonación completa del esquema.

Lectura: 9–11 minEjemplo comprobadoPráctica con pistas
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.

Patrón básico
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.

Qué crea cada opción
OpciónDestinoCuándo encaja
CREATE TABLE ... AS SELECTUna tabla nueva con una copia del resultadoEl destino todavía no existe y quieres materializar datos
INSERT INTO ... SELECTFilas nuevas en una tabla existenteYa definiste el esquema y sus restricciones
CREATE VIEW ... AS SELECTUna consulta guardada, no una copia independiente de las filasQuieres 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.

Expresiones con alias
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.

SQL comprobado en SQLite
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:

Comprobación
SELECT cliente_id, pedidos, importe_total
FROM resumen_clientes
ORDER BY importe_total DESC, cliente_id
LIMIT 6;
Primeras seis filas comprobadas
cliente_idpedidosimporte_total
521112,0
12377,4
82268,0
22253,4
32215,9
71148,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/CHECK ni í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.

Comprobación de datos
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

Intermedia · estructura + SELECT

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.

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 ... SELECT en 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.

Conceptos relacionados

Fuentes técnicas consultadas