Spec-Zone.ru › MySQL 9.2

15.2.13.1 Оператор SELECT ... INTO

Форма SELECT ... INTO оператора SELECT позволяет сохранять результаты запроса в переменные или записывать их в файл:

  • SELECT ... INTO var_list выбирает значения столбцов и сохраняет их в переменные.

  • SELECT ... INTO OUTFILE записывает выбранные строки в файл. Можно указать разделители столбцов и строк для получения определенного формата вывода.

  • SELECT ... INTO DUMPFILE записывает одну строку в файл без форматирования.

В операторе SELECT может присутствовать только один клауз INTO, хотя, как показано в описании синтаксиса SELECT (см. Раздел 15.2.13, «Оператор SELECT»), клауз INTO может располагаться в разных позициях:

  • Перед FROM. Пример:

    SELECT * INTO @myvar FROM t1;
    
  • Перед заключительным клаузом блокировки. Пример:

    SELECT * FROM t1 INTO @myvar FOR UPDATE;
    
  • В конце оператора SELECT. Пример:

    SELECT * FROM t1 FOR UPDATE INTO @myvar;
    

Предпочтительным является расположение INTO в конце оператора. Позиция перед клаузом блокировки устарела; ожидается, что поддержка её будет удалена в будущих версиях MySQL. Другими словами, INTO после FROM, но не в конце оператора SELECT, вызовет предупреждение.

Клауза INTO не должна использоваться в вложенном операторе SELECT, так как такой SELECT должен возвращать результат во внешний контекст. Также существуют ограничения на использование INTO в операторах UNION; см. Раздел 15.2.18, «Оператор UNION».

Для варианта INTO var_list:

  • var_list задаёт список одной или нескольких переменных, каждая из которых может быть пользовательской переменной, параметром хранимой процедуры или функции, или локальной переменной хранимой программы. (В подготовленных SELECT ... INTO var_list операторах допускаются только пользовательские переменные; см. Раздел 15.6.4.2, «Область видимости и разрешение локальных переменных».)

  • Выбранные значения присваиваются переменным. Количество переменных должно совпадать с количеством столбцов. Запрос должен возвращать одну строку. Если запрос не возвращает строк, возникает предупреждение с кодом ошибки 1329 (No data), и значения переменных остаются неизменными. Если запрос возвращает несколько строк, возникает ошибка 1172 (Result consisted of more than one row). Если существует возможность, что запрос может вернуть несколько строк, можно использовать LIMIT 1 для ограничения результата до одной строки.

    SELECT id, data INTO @x, @y FROM test.t1 LIMIT 1;
    

INTO var_list также можно использовать с оператором TABLE, с такими ограничениями:

  • Количество переменных должно совпадать с количеством столбцов в таблице.

  • Если таблица содержит более одной строки, необходимо использовать LIMIT 1 для ограничения результата до одной строки. LIMIT 1 должно предшествовать ключевому слову INTO.

Пример такого оператора показан здесь:

TABLE employees ORDER BY lname DESC LIMIT 1
    INTO @id, @fname, @lname, @hired, @separated, @job_code, @store_id;

Также можно выбрать значения из оператора VALUES, который генерирует одну строку в набор пользовательских переменных. В этом случае необходимо использовать псевдоним таблицы, и присваивать каждое значение из списка значений переменной. Каждый из двух показанных операторов эквивалентен SET @x=2, @y=4, @z=8:

SELECT * FROM (VALUES ROW(2,4,8)) AS t INTO @x,@y,@z;

SELECT * FROM (VALUES ROW(2,4,8)) AS t(a,b,c) INTO @x,@y,@z;

Имена пользовательских переменных не чувствительны к регистру. См. Раздел 11.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, включая их значения по умолчанию и допустимые значения, см. в Разделе 15.2.9, «Оператор LOAD DATA».

FIELDS ESCAPED BY управляет способом записи специальных символов. Если символ FIELDS ESCAPED BY не пустой, он используется при необходимости для предотвращения неоднозначности как префикс, предшествующий последующим символам на выходе:

  • Символ FIELDS ESCAPED BY

  • Символ FIELDS [OPTIONALLY] ENCLOSED BY

  • Первый символ значений FIELDS TERMINATED BY и LINES TERMINATED BY

  • ASCII NUL (байт со значением ноль; то, что фактически записывается после символа экранирования, это ASCII 0, а не байт со значением ноль)

Символы FIELDS TERMINATED BY, ENCLOSED BY, ESCAPED BY или LINES TERMINATED BY должны быть экранированы, чтобы вы могли надежно прочитать файл обратно. ASCII NUL экранируется для удобства просмотра с помощью некоторых отобразителей.

Результирующий файл не обязан соответствовать синтаксису SQL, поэтому ничего другого экранировать не нужно.

Если символ FIELDS ESCAPED BY пустой, символы не экранируются, и NULL выводится как NULL, а не \N. Вероятно, не стоит указывать пустой символ экранирования, особенно если значения полей в данных содержат какие-либо из символов, перечисленных выше.

INTO OUTFILE также можно использовать с оператором TABLE, когда нужно экспортировать все столбцы таблицы в текстовый файл. В этом случае порядок и количество строк можно контролировать с помощью ORDER BY и LIMIT; эти клаузы должны предшествовать INTO OUTFILE. TABLE ... INTO OUTFILE поддерживает те же export_options, что и SELECT ... INTO OUTFILE, и подчиняется тем же ограничениям записи в файловую систему. Пример такого оператора показан здесь:

TABLE employees ORDER BY lname LIMIT 1000
    INTO OUTFILE '/tmp/employee_data_1.txt'
    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"', ESCAPED BY '\'
    LINES TERMINATED BY '\n';

Также можно использовать SELECT ... INTO OUTFILE с оператором VALUES для непосредственной записи значений в файл. Пример показан здесь:

SELECT * FROM (VALUES ROW(1,2,3),ROW(4,5,6),ROW(7,8,9)) AS t
    INTO OUTFILE '/tmp/select-values.txt';

Необходимо использовать псевдоним таблицы; также поддерживаются псевдонимы столбцов, которые могут использоваться для записи значений только из нужных столбцов. Также можно использовать любой или все параметры экспорта, поддерживаемые SELECT ... INTO OUTFILE, для форматирования вывода в файл.

Вот пример, который генерирует файл в формате CSV (comma-separated values), используемом многими программами:

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 и сохранения его в файле.

END_OF_DOCUMENT_MARKER

TABLE также поддерживает INTO DUMPFILE. Если таблица содержит более одной строки, вы также должны использовать LIMIT 1, чтобы ограничить вывод одной строкой. INTO DUMPFILE также может использоваться с SELECT * FROM (VALUES ROW()[, ...]) AS table_alias [LIMIT 1]. См. Раздел 15.2.19, «Оператор VALUES».

Примечание

Любой файл, созданный INTO OUTFILE или INTO DUMPFILE, принадлежит пользователю операционной системы, под учетной записью которого выполняется mysqld. (Вы никогда не должны запускать mysqld как root по этой и другим причинам.) Разрешения на создание файлов — 0640; у вас должны быть достаточные права доступа для изменения содержимого файла.

Если системная переменная secure_file_priv установлена в непустое имя каталога, файл, который будет записан, должен находиться в этом каталоге.

В контексте операторов SELECT ... INTO, которые выполняются в рамках событий, запускаемых Планировщиком событий, диагностические сообщения (не только ошибки, но и предупреждения) записываются в журнал ошибок и, в Windows, в журнал событий приложения. Дополнительную информацию см. в Разделе 27.5.5, «Статус Планировщика событий».

Предоставляется поддержка периодической синхронизации выходных файлов, созданных SELECT INTO OUTFILE и SELECT INTO DUMPFILE, включенная установкой системной переменной сервера select_into_disk_sync, введенной в этой версии. Размер буфера вывода и необязательная задержка могут быть установлены соответственно с помощью select_into_buffer_size и select_into_disk_sync_delay. Дополнительную информацию см. в описаниях этих системных переменных.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-9.2-en/select-into.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API