Копирование данных из одной SQL таблицы в другую. Несколько частых примеров

Для копирования таблиц с одинаковыми столбцами можно использовать SELECT INTO:

// Самое простое копирование
SELECT * INTO tableName1 FROM tableName2

// Копирование с условием
SELECT columnName1, columnName2 INTO tableName1 FROM tableName2 WHERE columnName1 IS NOT NULL

Если у таблиц разные столбцы, то для для добавления данных в таблицу можно использовать команду INSERT INTO:

INSERT INTO tableName (columnName1, columnName2)

А для выборки данных из другой таблицы SELECT и FROM:

SELECT columnName3, columnName4
FROM tableName2

Соответственно, чтобы выбрать и вставить значения из одной таблицы в другую пишем:

INSERT INTO tableName (columnName1, columnName2)
SELECT columnName3, columnName4
FROM tableName2

Если надо добавить дополнительное значение при выборке используем WHERE:

INSERT INTO tableName (columnName1, columnName2)
SELECT columnName3, columnName4
FROM tableName2
WHERE columnName4 != 0

Если при выборке из второй таблицы, надо отсечь часть символов в начале или в конце строки, используем SUBSTRING, LEFT или RHIGHT.

Пример с SUBSTRING:

// короткая запись
SUBSTRING( string, start_position, [ length ] )

// запись с FROM FOR
SUBSTRING( string FROM start_position [ FOR length ] )

Параметры или аргументы

  • string — исходная строка.
  • start_position — позиция начала извлечения подстроки. Первая позиция в строке всегда равна 1.
  • length — необязательный. Определяет количество символов для извлечения. Если этот параметр опущен, функция SUBSTRING возвращает всю оставшуюся строку.

Примечание

  • Первая позиция в строке — 1.
  • Если start_position — положительное число, функция SUBSTRING начинается с начала строки.
  • Если start_position — отрицательное число, функция SUBSTRING начинается с конца строки и отсчитывает в обратном направлении. Отрицательные значения для start_position были введены в MySQL 4.1.
  • Функция SUBSTRING и функция MID являются синонимами функции SUBSTR.
INSERT INTO tableName (columnName1, columnName2)
SELECT SELECT SUBSTRING(columnName3, 2), columnName4
FROM tableName2
WHERE columnName4 != 0

// Примеры заполнения SUBSTRING
SELECT SUBSTRING('Function SUBSTRING', 9);
#Результат:  SUBSTRING                         
 
SELECT SUBSTRING('Function SUBSTRING' FROM 9);
#Результат:  SUBSTRING                             
 
SELECT SUBSTRING('Function SUBSTRING', 1, 8);
#Результат:   Function                              
 
SELECT SUBSTRING('Function SUBSTRING' FROM 1 FOR 4);
#Результат:   Func                                         
 
SELECT SUBSTRING('Function SUBSTRING', -3, 3);
#Результат:  ING                                    
 
SELECT SUBSTRING('Function SUBSTRING' FROM -3 FOR 3);
#Результат:  ING

Пример с LEFT:

LEFT( string, number_of_characters )

Параметры или аргументы

  • string — строка, которую вы хотите извлечь.
  • number_of_characters — количество символов, которое вы хотите извлечь из строки, начиная с самого левого символа.

Если number_of_characters превышает длину строки, функция LEFT возвращает строку.

INSERT INTO tableName (columnName1, columnName2)
SELECT SELECT LEFT(columnName3, 2), columnName4
FROM tableName2
WHERE columnName4 != 0

// Примеры заполнения LEFT
SELECT LEFT('Function LEFT', 2);
#Результат:  Fu                   
 
SELECT LEFT('Function LEFT', 8);
#Результат:  Function
 
SELECT LEFT('Function LEFT', 25);
#Результат:  Function LEFT     

Пример с RHIGHT:

RIGHT( string, number_of_characters )

Параметры или аргументы

  • string — строка, из которой вы хотите извлечь.
  • number_of_characters — количество символов, которое вы хотите извлечь из строки, начиная с самого правого символа.

Если number_of_characters превышает длину строки, функция RIGHT вернет строку.

INSERT INTO tableName (columnName1, columnName2)
SELECT SELECT RIGHT(columnName3, 2), columnName4
FROM tableName2
WHERE columnName4 != 0

// Примеры заполнения RIGHT
SELECT RIGHT('Function RIGHT', 1);
#Результат:  T                   
 
SELECT RIGHT('Function RIGHT', 4);
#Результат:  IGHT
 
SELECT RIGHT('Function RIGHT', 100);
#Результат:  Function RIGHT

Если надо отсечь часть строки ориентируясь на разделитель, используем SUBSTRING_INDEX:

SUBSTRING_INDEX( string, delimiter, number )

Параметры или аргументы

  • string — исходная строка.
  • delimiter — разделитель для поиска в строке.
  • number — номер вхождения разделителя.

Примечание

  • Если number принимает отрицательное значение, все, что находится слева от разделителя, возвращается функцией SUBSTRING_INDEX.
  • Если number принимает положительное значение, все, что находится справа от разделителя, возвращается функцией SUBSTRING_INDEX.
INSERT INTO tableName (columnName1, columnName2)
SELECT SELECT SUBSTRING_INDEX(columnName3, '::', 2), columnName4
FROM tableName2
WHERE columnName4 != 0

// Примеры заполнения SUBSTRING_INDEX
SELECT SUBSTRING_INDEX('Function SUBSTRING_INDEX', ' ', 1);
#Результат:  Function                                            
 
SELECT SUBSTRING_INDEX('Function SUBSTRING_INDEX', ' ', 2);
#Результат:  Function SUBSTRING_INDEX                            
 
SELECT SUBSTRING_INDEX('Function SUBSTRING_INDEX', ' ', -1);
#Результат:  SUBSTRING_INDEX                                      
 
SELECT SUBSTRING_INDEX('Function SUBSTRING_INDEX', ' ', -2);
#Результат:  Function SUBSTRING_INDEX          

Если надо использовать часть строки которая находиться между разделителями, используем SUBSTRING_INDEX дважды:

INSERT INTO tableName (columnName1, columnName2)
SELECT SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(columnName3, '::', 2), '::', -1), columnName4
FROM tableName2
WHERE columnName4 != 0

Рабочие примеры

Значения можно копировать в ту же самую таблицу. Например, для переноса значений из одного TV в MODX, в другое можно использовать такой запрос:

INSERT into `edu_site_tmplvar_contentvalues` (tmplvarid,contentid,value)
SELECT 88,contentid,value FROM `edu_site_tmplvar_contentvalues` WHERE `tmplvarid` = 18
  • 88 — id поля в которое копируют
  • 18 — id поля из которого копируют