En este artículo vamos a explicar cómo insertar registros a partir de una consulta select en una base de datos MySQL. En ocasiones, necesitamos insertar datos en una tabla basándonos en los resultados de una consulta SELECT
. Esto es un escenario común cuando queremos transferir datos específicos de una tabla a otra o cuando necesitamos realizar alguna manipulación de datos antes de la inserción. Veamos cómo realizar este tipo de inserciones mediante ejemplos de código prácticos.
Sintaxis para insertar registros de un select
La sintaxis completa para insertar registros desde un select en MySQL es la siguiente:
INSERT INTO tabla_destino (nombre_columna1, nombre_columna2, ...)
SELECT valor_columna1, valor_columna2, ...
FROM tabla_origen
WHERE condicion;
Esta consulta insertará registros en la tabla_destino
seleccionando datos específicos de la tabla_origen
basándose en una condición. El desglose del código es el siguiente:
INSERT INTO tabla_destino (nombre_columna1, nombre_columna2, ...)
Especifica la tabla de destino y las columnas en las que se insertarán los datos.SELECT valor_columna1, valor_columna2, ... FROM tabla_origen
Selecciona los valores de las columnas en la tabla de origen que se insertarán en la tabla de destino.WHERE condicion
Especifica la condición que debe cumplirse para que los datos de la tabla de origen se seleccionen e inserten en la tabla de destino. Solo se seleccionarán los registros que cumplen con esta condición.
Este es el código básico para insertar datos específicos desde una tabla origen a una tabla destino, aplicando una condición para seleccionar los registros deseados. Esta es una forma común de realizar operaciones de inserción condicional en MySQL. En este ejemplo, es importante destacar que las columnas en la tabla de destino deben coincidir en número y tipo de dato con las columnas seleccionadas en la tabla de origen.
También podemos realizar la inserción omitiendo las columnas:
INSERT INTO tabla_destino
SELECT valor_columna1, valor_columna2, ...
FROM tabla_origen
WHERE condicion;
En este caso, asumimos que el número de columnas y valores en el select coincide con el número y tipo de datos de las columnas en la tabla destino. O dicho de otra forma, que la estructura del select es compatible para la operación de inserción.
Ejemplo para insertar registros desde un select
Ahora vamos a ver cómo insertar registros de un select en MySQL con un ejemplo práctico. Supongamos que tenemos dos tablas: clientes
y clientes_nuevos
. Pero queremos insertar en la tabla clientes_nuevos
sólo los clientes que sean de un país específico, por ejemplo, ‘España’.
INSERT INTO clientes_nuevos (nombre, email, pais)
SELECT nombre, email, pais
FROM clientes
WHERE pais = 'España';
En este ejemplo MySQL se realiza la inserción de los registros obtenidos de un select de la siguiente manera:
INSERT INTO clientes_nuevos (nombre, email, pais)
Indica que se realizará una operación de inserción en la tablaclientes_nuevos
. Se especifican las columnas (nombre
,email
,pais
) a las que se insertarán datos.SELECT nombre, email, pais FROM clientes
Realiza una selección de datos de las columnasnombre
,email
ypais
desde la tablaclientes
. Especifica qué datos se copiarán en las columnas correspondientes de la tablaclientes_nuevos
.WHERE pais = 'España'
Es una condición que filtra los registros de la tablaclientes
para seleccionar solo aquellos cuyo valor en la columnapais
sea ‘España’. Sólo los registros que cumplan con esta condición se incluirán en la operación de inserción en la tablaclientes_nuevos
.
Índices al insertar registros de un select en MySQL
Una pregunta que nos puede asaltar a la mente es qué pasa con los índices ID ? En este caso la respuesta es muy sencilla, los podemos omitir y MySQL se encarga de crearlos y añadirlos, como en cualquier otro INSERT.
Cuando se realizan operaciones de inserción de datos en una tabla que tiene una columna de índice automático (como un ID autoincremental), los sistemas de gestión de bases de datos generalmente se encargan de gestionar automáticamente el valor de esa columna. De esta forma tenemos que la base de datos se encargará de:
- Índice Automático: No se necesita proporcionar un valor explícito para la columna
id
en la sentenciaINSERT
, ya que el sistema generará automáticamente un nuevo valor. - Preservación de la Unicidad: El sistema de gestión de bases de datos garantizará que los valores en la columna
id
sean únicos, lo que es fundamental para la integridad de la tabla. - Incremento Automático: La columna de índice automático se incrementará automáticamente con cada nueva inserción. Este comportamiento asegura que los valores de
id
sean únicos y secuenciales.
Manipular datos al insertar registros de un select
A veces, necesitamos modificar los datos antes de insertarlos, cosa que se puede conseguir manipulando los datos antes de insertar los registros del select. Supongamos que además de copiar datos de la tabla clientes
a clientes_nuevos
, también queremos realizar algunas transformaciones y cálculos antes de la inserción.
En este ejemplo, concatenaremos valores, calcularemos la longitud de una cadena y utilizaremos una subconsulta.
INSERT INTO clientes_nuevos (nombre, email, pais, longitud_email)
SELECT
CONCAT('Nuevo_', nombre) AS nombre_transformado,
CONCAT('nuevo_', email) AS email_transformado,
pais,
LENGTH(email) AS longitud_email
FROM (
SELECT nombre, email, pais
FROM clientes
WHERE pais = 'España'
) AS subconsulta_clientes_espana;
Explicación del código de inserción
INSERT INTO clientes_nuevos (nombre, email, pais, longitud_email)
Indica que se realizará una operación de inserción en la tablaclientes_nuevos
, especificando las columnasnombre
,email
,pais
ylongitud_email
en las que se insertarán datos.SELECT
Este select obtiene sus datos de una subconsulta y realiza algunas transformaciones a ciertas columnas.CONCAT('Nuevo_', nombre) AS nombre_transformado
Crea una nueva columna llamadanombre_transformado
en la salida de la consulta. Esta columna consiste en la concatenación de la cadena ‘Nuevo_’ con el valor existente en la columnanombre
. Por ejemplo, si el valor original en la columnanombre
es ‘Juan’, el valor resultante en la columnanombre_transformado
será ‘Nuevo_Juan’.CONCAT('nuevo_', email) AS email_transformado
Crea una nueva columna llamadaemail_transformado
en la salida de la consulta. Esta columna consiste en la concatenación de la cadena ‘nuevo_’ con el valor existente en la columnaemail
. Similar al caso anterior, si el valor original en la columnaemail
es ‘juan@example.com‘, el valor resultante en la columnaemail_transformado
será ‘nuevo_juan@example.com‘.pais
Incluye la columnapais
sin cambios en la salida de la consulta. Esta columna no se ve afectada por ninguna transformación y conserva los valores originales de la tabla.LENGTH(email) AS longitud_email
Crea una nueva columna llamadalongitud_email
en la salida de la consulta. Esta columna contiene la longitud (en número de caracteres) del valor en la columnaemail
. Por ejemplo, si el valor original en la columnaemail
es ‘juan@example.com‘, el valor resultante en la columnalongitud_email
será la longitud de la cadena, que en este caso sería 16.
FROM (SELECT nombre, email, pais FROM clientes WHERE pais = 'España')
Con una apertura de paréntesis, FROM nos está indicando que comienza una subconsulta o una expresión más compleja. En este caso es una subconsulta que selecciona los registros de la tablaclientes
que cumplen con la condiciónpais = 'España'
. De los datos obtenidos, se realizan varias manipulaciones en la consulta principal. Toda subconsulta debe ser tratada como una tabla temporal, en este caso llamadasubconsulta_clientes_espana
.
Evitar duplicados al insertar registros de un select
Al insertar registros desde un select en MySQL es posible que estemos tratando con una cantidad de datos muy grande. Aunque utilicemos subconsultas y manipulaciones es posible que aparezcan registros duplicados que no queremos insertar. En este sentido, si queremos evitar la inserción de registros duplicados, podemos usar la cláusula IGNORE
.
Supongamos que la tabla clientes_nuevos
ya tiene algunos registros y solo queremos insertar nuevos clientes sin duplicados:
INSERT IGNORE INTO clientes_nuevos (nombre, email, pais)
SELECT nombre, email, pais
FROM clientes
WHERE pais = 'España';
Añadiendo la instrucción IGNORE
a nuestra consulta select
, la inserción de registros continuará incluso si hay conflictos de clave única, omitiendo los registros duplicados.
Conclusiones
Insertar registros desde un select en MySQL es una operación poderosa que nos permite manipular y transferir datos de manera eficiente entre tablas. Al comprender la sintaxis y los ejemplos prácticos de este artículo, podrás realizar estas operaciones de manera efectiva en tu desarrollo de bases de datos con MySQL.
¡ Espero que este artículo sea de vuestro interés !