Аналогично тому, как данные импортируются из файла командой LOAD DATA INFILE, можно записи таблицы скопировать обратно в файл. Для этого предназначается конструкция SELECT...INTO OUTFILE. Эта конструкция позволит сделать все, что делается с помощью обычного оператора SELECT, а затем отправить полученный набор записей обратно в файл.

Дилемма ограничителей
Как команда LOAD DATA INFILE, так и команда SELECT...INTO OUTFILE под­держивают использование дополнительных ключевых слов и предложений, предназначенных для определения формата файла данных.
• Предложение LINES TERMINATED BY задает ограничитель конца записи (по умолчанию - это символ перехода на новую строку "n").
• Предложение FIELDS задает ограничитель поля, а за ним может следовать одно (или более) ключевое слово TERMINATED BY, ESCAPED BY или ENCLOSED BY. Эти ключевые слова задают ограничитель конца поля (по умолчанию это символ табуляции "t"), последовательность специальных символов при чтении и записи значений (по умолчанию это символ "") и символ, в который заключаются поля (значение по умолчанию отсутствует), соответственно.
Экспорт записей
Следующая команда копирует все эти записи в текстовый файл accounts.txt, рас­положенный на сервере.
Листинг 9.74.
mysql> SELECT accountName, accountBalance FROM accounts INTO OUTFILE
'accounts.txt';
Query OK, 11 rows affected (0.06 sec) Получаем следующий результат.
Экспорт записей
Sue U 388883.13 Jacob N 18410.00
Очевидно, что здесь можно использовать предложение WHERE (или любое другое предложение или ключевое слово, допустимое по синтаксису оператора SELECT) для еще большей детализации полученной выборки. В следующем примере продемонстрирована выборка в файл /tmp/high-value-accounts.txt только таких записей, в которых остаток на счету превышает 5 тыс. долл.
Листинг 9.76.
mysql> SELECT accountNumber, accountName, accountBalance FROM accounts WHERE accountBalance > 50000 INTO OUTFILE '/tmp/high-value-accounts.txt'
FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY 'rn';
Query OK, 5 rows affected (0.00 sec)
А вот и результат:
Листинг 9.77.
"2147483647", "Timothy J","56347.50"
"5739304575", "Harish K","996 564.88"
"2173467271", "Kingston X", "634238.00"
"2384371001", "Anil V", "72460.00"
"2388282010", "Sue U","388883.13"
Файл, заданный в предложениях INTO OUTFILE и INTO DUMPFILE, будет записан в файловую систему сервера и не должен уже существовать. Так как файл будет записываться пользователем сервера MySQL, этот пользователь должен обладать правом на запись файлов в указанный каталог. Исходя из соображений безопасности, MySQL не разрешает записывать выводной файл в клиентскую файловую систему с применением этого метода. Поэтому клиентское приложение должно выбирать их с сервера с помощью других методов.

Выгружено!
Для выборки двоичных данных (содержимого полей типа BLOB, например) из базы данных в файл, предложение INTO OUTFILE нужно заменить предложением INTO DUMPFILE. Это позволит производить запись данных в файл как одной строки (без символов завершения записей и полей), не допуская тем самым разрушения двоичных данных.

Рядовые
Зарегистрировавшийся пользователь должен обладать привилегией FILE на сервере для того, чтобы иметь возможность выполнения команд SELECT...INTO OUTFILE и LOAD DATA INFILE. В главе 14, "Безопасность, управление доступом и привилегии", подробнее рассказывается о том, как работает система привилегий MySQL.
Как и с командой LOAD DATA INFILE, здесь можно задать ограничители полей и записей выгружаемых данных (см. врезку "Дилемма ограничителей"). Это показано в следующих примерах: 
mysql> SELECT name, phone, email, fax FROM members INTO OUTFILE '/usr/local/data/members.txt' FIELDS TERMINATED BY ■|" ENCLOSED BY '"' ESCAPED BY 'W;
Query OK, 32 rows affected (0.00 sec)
mysql> SELECT title, author, isbn FROM books INTO OUTFILE '/home/me/books.asc' FIELDS TERMINATED BY',' LINES TERMINATED BY ■rn-;
Query OK, 255 rows affected (0.17 sec)
Для выгрузки содержимого всей базы данных или одной таблицы можно воспользоваться возможностями утилиты mysqldump. Подробнее об использовании этой утилиты для резервирования и восстановления ваших баз данных MySQL можно узнать в главе 15, "Обслуживание, резервное копирование и восстановление".

Резюме
В этой главе более подробно описаны команды манипулирования данными, которыми располагает язык SQL (вместе с некоторыми нестандартными командами, присущими только диалекту MySQL). Это такие команды, как:
■ INSERT - используется для добавления записей в таблицы;
■ UPDATE - используется для обновления уже существующих записей;
■ REPLACE - используется для замены существующих записей;
■ DELETE и TRUNCATE - используются для удаления записей;
■ SELECT (и ее различные варианты) -используется для выборки наборов данных, удовлетворяющих определенному критерию;
■ LOAD DATA INFILE - используется для импортирования данных из текстовых файлов в таблицы MySQL.
Итак, у вас уже должно быть сформировано более глубокое понимание того, как взаимодействуют между собой различные команды SQL и как они взаимодействуют с приложениями. Дальнейший процесс ознакомления читателя с новыми и более совершенными возможностями MySQL (включая подзапросы, транзакции и оптимизацию запросов) базируется на материале, изложенном в этой и во всех предыдущих главах.