🙏 Realmente necesitamos su apoyo. Necesitamos financiamiento para continuar nuestra misión: publicar nuevas lecciones y mejorar la plataforma. Si puede, por favor apoye el proyecto con una donación. Ayude al proyecto ahora →
Código SQL copiado al portapapeles

Lección 8.1: La sentencia INSERT INTO

Hasta ahora, nos hemos centrado en recuperar datos de tablas existentes utilizando la sentencia SELECT. Ahora, comenzaremos a explorar el Lenguaje de Manipulación de Datos (DML), comenzando con cómo agregar nuevos datos a tus tablas utilizando la sentencia INSERT INTO.

Ilustración de la lección

La Sintaxis Básica

Hay dos formas principales de usar la sentencia INSERT INTO.

1. Especificando Columnas (Recomendado)

Este es el método más seguro y común. Listas explícitamente las columnas que deseas llenar, seguidas de los valores para esas columnas.

INSERT INTO nombre_tabla (columna1, columna2, columna3)
VALUES (valor1, valor2, valor3);

2. Sin Especificar Columnas

Si estás proporcionando valores para todas las columnas de la tabla en el orden exacto en que fueron definidas, puedes omitir los nombres de las columnas. Sin embargo, esto es menos flexible y puede llevar a errores si la estructura de la tabla cambia.

INSERT INTO nombre_tabla
VALUES (valor1, valor2, valor3, ...);

Reglas Importantes para Insertar Datos

  • Tipos de Datos: Los valores que proporciones deben coincidir con el tipo de dato de la columna correspondiente (por ejemplo, no puedes insertar texto en una columna numérica).
  • Cadenas y Fechas: Al igual que en la cláusula WHERE, los valores de cadena (texto) y fecha deben estar entre comillas simples (').
  • Números: Los valores numéricos no requieren comillas.
  • Valores NULL: Si una columna permite NULL y no proporcionas un valor para ella, se llenará con NULL (o un valor por defecto si se define uno).

Ejemplos

Ejemplo 1: Insertando un Nuevo Actor

Agreguemos un nuevo actor a la tabla actor en la base de datos Sakila.

INSERT INTO actor (first_name, last_name)
VALUES ('JOHNNY', 'DEPP');

Nota: No especificamos el actor_id porque generalmente es auto-generado por la base de datos.

Ejemplo 2: Insertando en Columnas Específicas

Si tenemos una tabla con muchas columnas pero solo queremos llenar algunas:

INSERT INTO customer (first_name, last_name, email, store_id, address_id)
VALUES ('ALICE', 'JOHNSON', 'alice.j@example.com', 1, 5);

Ejemplo 3: Inserción de Múltiples Filas

La mayoría de las bases de datos modernas permiten insertar múltiples filas en una sola sentencia separando los conjuntos de valores con comas.

INSERT INTO actor (first_name, last_name)
VALUES 
    ('TOM', 'HANKS'),
    ('MERYL', 'STREEP'),
    ('LEONARDO', 'DICAPRIO');

Insertando Datos desde Otra Consulta (INSERT INTO ... SELECT)

A veces no necesitas ingresar datos manualmente, sino transferirlos de una tabla a otra (por ejemplo, durante la archivación o generación de informes). Para esto, se utiliza una combinación de INSERT INTO y SELECT.

Sintaxis

INSERT INTO tabla_destino (columna1, columna2, columna3)
SELECT columna_fuente1, columna_fuente2, columna_fuente3
FROM tabla_fuente
WHERE condición;

Flexibilidad en la Formación de Datos

Una característica importante de este comando es que en el bloque SELECT puedes combinar diferentes tipos de valores:

  1. Valores seleccionados: directamente de la tabla fuente (columna_fuente1).
  2. Valores calculados: el resultado de fórmulas o funciones (por ejemplo, amount * 0.1).
  3. Valores constantes: datos fijos que no están en la tabla fuente (por ejemplo, fecha de inserción o un estado como cadena).

Ejemplo: Creando un Archivo de Clientes Inactivos

Supongamos que tenemos una tabla customer_archive, y queremos transferir datos allí desde la tabla principal customer, añadiendo la fecha de archivo y una nota de estado:

INSERT INTO customer_archive (customer_id, full_name, archived_at, status_note)
SELECT 
    customer_id, 
    CONCAT(first_name, ' ', last_name), -- Valor calculado (Nombre Completo)
    CURRENT_DATE,                       -- Constante (fecha actual)
    'Auto-archivado'                     -- Constante (etiqueta de texto)
FROM customer
WHERE active = 0;

Nota: El número y orden de las columnas en INSERT INTO deben coincidir estrictamente con el número y orden de las columnas devueltas en el SELECT.


Trabajando con Valores NULL y Valores por Defecto

Al insertar una fila, no siempre necesitas proporcionar un valor para cada columna. La base de datos maneja los valores faltantes de dos maneras: a través de NULL y a través de valores por defecto de columna.

Insertando NULL Explícitamente

Si una columna permite NULL, puedes pasar la palabra clave NULL directamente como valor:

INSERT INTO customer (first_name, last_name, email, store_id, address_id)
VALUES ('BOB', 'SMITH', NULL, 1, 5);

Aquí la columna email se almacenará como NULL, lo que significa "sin valor conocido".

Confiando en Valores por Defecto de Columna

Si una columna tiene un valor DEFAULT definido en el esquema de la tabla, puedes omitirla completamente de la lista de columnas. La base de datos la llenará automáticamente:

INSERT INTO actor (first_name, last_name)
VALUES ('CATE', 'BLANCHETT');

Columnas como actor_id (auto-incremento) y last_update (marca de tiempo por defecto) son pobladas por la base de datos sin ninguna entrada explícita.

Insertando DEFAULT Explícitamente

También puedes usar la palabra clave DEFAULT para activar el valor por defecto de una columna mientras aún listando la columna:

INSERT INTO actor (actor_id, first_name, last_name, last_update)
VALUES (DEFAULT, 'CATE', 'BLANCHETT', DEFAULT);

Esto es útil cuando tu sentencia de inserción lista todas las columnas pero aún deseas que la base de datos maneje algunas específicas.


Conclusiones Clave de esta Lección:

  • La sentencia INSERT INTO se utiliza para agregar nuevas filas a una tabla.
  • El comando INSERT INTO ... SELECT permite copiar datos de una tabla a otra.
  • En el bloque SELECT, puedes combinar datos reales de la tabla, campos calculados y constantes.
  • Se recomienda listar explícitamente los nombres de las columnas para una mejor confiabilidad y legibilidad del código.
  • Los valores de cadena y fecha deben estar entre comillas simples.
  • Puedes insertar múltiples filas a la vez para mejorar el rendimiento.
  • Las columnas con valores NULL o DEFAULT pueden ser omitidas o pasadas explícitamente utilizando las palabras clave NULL y DEFAULT.

En la próxima lección, veremos cómo modificar registros existentes utilizando la sentencia UPDATE.