13.2.9.1 Оператор SELECT ... INTO
Форма оператора SELECT ...
INTO оператора SELECT позволяет сохранять результаты запроса в переменные или записывать их в файл:
SELECT ... INTOвыбирает значения столбцов и сохраняет их в переменные.var_listSELECT ... INTO OUTFILEзаписывает выбранные строки в файл. Можно указать разделители столбцов и строк для получения определенного формата вывода.SELECT ... INTO DUMPFILEзаписывает одну строку в файл без форматирования.
В данном операторе SELECT может содержаться не более одного условия INTO, хотя, как показано в описании синтаксиса SELECT (см. Раздел 13.2.9, «Оператор SELECT»), условие INTO может располагаться в разных позициях:
-
До
FROM. Пример:SELECT * INTO @myvar FROM t1;
-
Перед заключительным условием блокировки. Пример:
SELECT * FROM t1 INTO @myvar FOR UPDATE;
Условие INTO не должно использоваться во вложенном операторе SELECT, так как такой оператор SELECT должен возвращать свой результат во внешний контекст. Также существуют ограничения на использование INTO в операторах UNION; см. Раздел 13.2.9.3, «Оператор UNION».
Для варианта INTO
:var_list
var_listуказывает список одной или нескольких переменных, каждая из которых может быть пользователем переменной, параметром хранимой процедуры или функции, или локальной переменной хранимой программы. (В подготовленном оператореSELECT ... INTOразрешены только переменные пользователя; см. Раздел 13.6.4.2, «Область видимости и разрешение локальных переменных».)var_list-
Выбранные значения присваиваются переменным. Количество переменных должно совпадать с количеством столбцов. Запрос должен возвращать одну строку. Если запрос не возвращает строк, возникает предупреждение с кодом ошибки 1329 (
No data), и значения переменных остаются неизменными. Если запрос возвращает несколько строк, возникает ошибка 1172 (Result consisted of more than one row). Если существует возможность, что оператор может извлечь несколько строк, можно использоватьLIMIT 1для ограничения набора результатов до одной строки.SELECT id, data INTO @x, @y FROM test.t1 LIMIT 1;
Имена переменных пользователя не чувствительны к регистру. См. Раздел 9.4, «Пользовательские переменные».
Форма оператора SELECT ... INTO
OUTFILE ' оператора file_name'SELECT записывает выбранные строки в файл. Файл создается на хосте сервера, поэтому для использования этого синтаксиса требуется FILE разрешение. file_name не может быть существующим файлом, что, помимо прочего, предотвращает изменение файлов, таких как /etc/passwd, и таблиц базы данных. Переменная character_set_filesystem системы управления сервером контролирует интерпретацию имени файла.
Оператор SELECT ... INTO
OUTFILE предназначен для выгрузки таблицы в текстовый файл на хосте сервера. Чтобы создать результирующий файл на другом хосте, оператор SELECT ... INTO
OUTFILE обычно не подходит, так как нет возможности указать путь к файлу относительно файловой системы хоста сервера, если только местоположение файла на удаленном хосте не может быть доступно с помощью сетевого пути на файловой системе хоста сервера.
В качестве альтернативы, если программное обеспечение клиента MySQL установлено на удаленном хосте, вы можете использовать команду клиента, такую как mysql
-e "SELECT ..." >
, для создания файла на этом хосте.file_name
SELECT ... INTO
OUTFILE является дополнением к оператору LOAD
DATA. Значения столбцов записываются, преобразуясь в кодировку, указанную в условии CHARACTER SET. Если такое условие отсутствует, значения выгружаются с использованием кодировки binary. По сути, преобразования кодировки не происходит. Если набор результатов содержит столбцы в нескольких кодировках, то и выходной файл данных также содержит эти кодировки, и возможно, что файл не удастся правильно загрузить повторно.
Синтаксис части export_options оператора состоит из тех же условий FIELDS и LINES, что и в операторе LOAD DATA. Для более подробной информации об условиях FIELDS и LINES, включая их значения по умолчанию и допустимые значения, см. Раздел 13.2.6, «Оператор LOAD DATA».
FIELDS ESCAPED BY контролирует запись специальных символов. Если символ FIELDS ESCAPED BY не пустой, он используется при необходимости для предотвращения неоднозначности в качестве префикса, предшествующего последующим символам на выходе:
Символ
FIELDS ESCAPED BYСимвол
FIELDS [OPTIONALLY] ENCLOSED BYПервый символ значений
FIELDS TERMINATED BYиLINES TERMINATED BYASCII
NUL(байт со значением ноль; на самом деле после escape-символа записывается ASCII0, а не байт со значением ноль)
Символы FIELDS TERMINATED BY, ENCLOSED
BY, ESCAPED BY или LINES
TERMINATED BY обязательно нужно экранировать, чтобы надежно считать файл обратно. ASCII NUL экранируется, чтобы упростить просмотр с помощью некоторых отображателей.
Результирующий файл не должен соответствовать синтаксису SQL, поэтому ничего больше не нужно экранировать.
Если символ FIELDS ESCAPED BY пустой, никакие символы не экранируются, и NULL выводится как NULL, а не как \N. Вероятно, не рекомендуется указывать пустой escape-символ, особенно если значения полей в ваших данных содержат какие-либо из указанных символов.
Вот пример, который генерирует файл в формате CSV (разделенных запятыми), используемом многими программами:
SELECT a,b,a+b INTO OUTFILE '/tmp/result.txt'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM test_table;
Если вы используете INTO DUMPFILE вместо INTO OUTFILE, MySQL записывает только одну строку в файл без разделителей столбцов и строк и без обработки экранирования. Это полезно для выбора значения BLOB и сохранения его в файле.
Любой файл, созданный с помощью INTO OUTFILE или INTO DUMPFILE, доступен для записи всем пользователям на хосте сервера. Причина в том, что сервер MySQL не может создать файл, который принадлежит кому-либо другому, кроме пользователя, под учетной записью которого он работает. (Вы никогда не должны запускать mysqld как root по этим и другим причинам.) Таким образом, файл должен быть доступен для записи всеми пользователями, чтобы вы могли изменять его содержимое.
Если переменная системы secure_file_priv установлена в непустое имя каталога, файл, который нужно записать, должен находиться в этом каталоге.
В контексте операторов SELECT ...
INTO, которые выполняются в рамках событий, выполняемых Планировщиком событий, сообщения диагностики (не только ошибки, но и предупреждения) записываются в журнал ошибок и, в Windows, в журнал событий приложения. Дополнительную информацию см. в Разделе 23.4.5, «Статус Планировщика событий».
© 2025 Oracle
Licensed under the GPLv2 License.