Копирование данных из одной SQL таблицы в другую. Несколько частых примеров
Отредактировано: 10 Апреля 2024
Для копирования таблиц с одинаковыми столбцами можно использовать 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
- length
Примечание
- Первая позиция в строке — 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 поля из которого копируют