SELECT
の SELECT ... INTO
形式を使用すると、クエリー結果を変数に格納したり、ファイルに書き込んだりできます。
SELECT ... INTO
はカラム値を選択し、それらを変数に格納します。var_list
SELECT ... INTO OUTFILE
は、選択された行をファイルに書き込みます。カラムおよび行ターミネータを指定すると、特定の出力形式を生成できます。SELECT ... INTO DUMPFILE
は、単一行をファイルに形式設定なしで書き込みます。
SELECT
の構文の説明 (セクション13.2.9「SELECT 構文」を参照してください) では、INTO
句がステートメントの最後の近くに示されています。INTO
はまた、select_expr
リストの直後に使用することもできます。
ネストされた SELECT
はその結果を外側のコンテキストに返す必要があるため、このような SELECT
では INTO
句を使用してはいけません。
INTO
句は、1 つ以上の変数のリストを指定できます。この変数には、ユーザー定義変数、ストアドプロシージャーやストアドファンクションのパラメータ、またはストアドプログラムのローカル変数を指定できます。(準備済み SELECT ... INTO OUTFILE
ステートメント内では、ユーザー定義変数のみが許可されます。セクション13.6.4.2「ローカル変数のスコープと解決」を参照してください。)
選択された値は変数に割り当てられます。変数の数がカラム数に一致している必要があります。クエリーは、単一行を返すようにしてください。クエリーが行を返さない場合は、エラーコード 1329 で警告が発生し (No data
)、変数値は変更されないままになります。クエリーが複数の行を返す場合は、エラー 1172 が発生します (結果が 2 行以上です
)。このステートメントが複数の行を取得する可能性がある場合は、LIMIT 1
を使用して結果セットを単一行に制限できます。
SELECT id, data INTO @x, @y FROM test.t1 LIMIT 1;
ユーザー変数名では大文字と小文字を区別しません。セクション9.4「ユーザー定義変数」を参照してください。
SELECT
の SELECT ... INTO OUTFILE '
形式は、選択された行をファイルに書き込みます。このファイルはサーバーホスト上で作成されるため、この構文を使用するには file_name
'FILE
権限が必要です。file_name
を既存のファイルにすることはできません。これにより、特に /etc/passwd
などのファイルやデータベーステーブルが破棄されることが回避されます。character_set_filesystem
システム変数は、ファイル名の解釈を制御します。
SELECT ... INTO OUTFILE
ステートメントは、主に、テーブルをサーバーマシン上のテキストファイルに非常にすばやくダンプできるようにすることを目的にしています。結果として得られるファイルをサーバーホスト以外のホスト上で作成する場合は通常、そのサーバーホストのファイルシステムを基準にしたファイルへのパスを記述する方法が存在しないため、SELECT ... INTO OUTFILE
は使用できません。
ただし、MySQL クライアントソフトウェアがリモートマシンにインストールされている場合は、代わりに mysql -e "SELECT ..." >
などのクライアントコマンドを使用してクライアントホスト上にファイルを生成できます。
file_name
また、サーバーのファイルシステム上でネットワークにマップされたパスを使用してリモートホスト上のファイルの場所にアクセスできる場合も、結果として得られるファイルをサーバーホストとは異なるホスト上に作成できます。この場合は、ターゲットホスト上に mysql (または、その他の何らかの MySQL クライアントプログラム) が存在する必要はありません。
SELECT ... INTO OUTFILE
は、LOAD DATA INFILE
を補完するものです。カラム値は、CHARACTER SET
句で指定されている文字セットに変換されて書き込まれます。このような句が存在しない場合、値は binary
文字セットを使用してダンプされます。事実上、文字セットの変換は実行されません。結果セットにカラムが複数の文字セットで含まれている場合は、出力データファイルにもそのまま含まれるため、そのファイルを正しくリロードできない可能性があります。
このステートメントの export_options
部分の構文は、LOAD DATA INFILE
ステートメントで使用されるのと同じ FIELDS
および LINES
句で構成されています。FIELDS
および LINES
句 (それぞれのデフォルト値と許可される値を含む) については、セクション13.2.6「LOAD DATA INFILE 構文」を参照してください。
FIELDS ESCAPED BY
は、特殊文字を書き込む方法を制御します。FIELDS ESCAPED BY
文字が空でない場合、その文字は、出力上で次の文字の前に付けられるプリフィクスとして、あいまいさを避けるために必要な場合に使用されます。
FIELDS ESCAPED BY
文字FIELDS [OPTIONALLY] ENCLOSED BY
文字FIELDS TERMINATED BY
およびLINES TERMINATED BY
値の最初の文字ASCII
NUL
(0 の値のバイト。エスケープ文字のあとに実際に書き込まれる文字は 0 の値のバイトではなく、ASCII の「0
」です)
FIELDS TERMINATED BY
、ENCLOSED BY
、ESCAPED BY
、または LINES TERMINATED BY
文字は、そのファイルを確実に読み戻すことができるように、エスケープする必要があります。ASCII NUL
は、一部のページャーで見やすくなるようにエスケープされます。
結果として得られるファイルは SQL 構文に準拠する必要はないため、ほかは何もエスケープする必要がありません。
FIELDS ESCAPED BY
文字が空である場合は、どの文字もエスケープされず、NULL
は \N
ではなく、NULL
として出力されます。特に、データ内のフィールド値に今指定したリスト内のいずれかの文字が含まれている場合、空のエスケープ文字を指定することはおそらく適切な方法ではありません。
多くのプログラムで使用されているカンマ区切り値 (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 OUTFILE
の代わりに INTO DUMPFILE
を使用した場合、MySQL はエスケープ処理を実行することなく、カラムや行の終了のない 1 行のみをファイルに書き込みます。これは、ファイルに BLOB
値を格納する場合に役立ちます。
INTO OUTFILE
または INTO DUMPFILE
によって作成されたファイルはすべて、サーバーホスト上のすべてのユーザーから書き込み可能です。これは、MySQL サーバーが、それを実行しているアカウントを持つユーザー以外のどのユーザーによって所有されるファイルも作成できないためです。(これらの理由のために、mysqld を root
としては決して実行しないでください。) したがって、このファイルは、その内容を操作できるようにすべてのユーザーから書き込み可能である必要があります。
secure_file_priv
システム変数が空以外のディレクトリ名に設定されている場合、書き込まれるファイルはそのディレクトリ内に存在する必要があります。
イベントスケジューラによって実行されるイベントの一部として実行された SELECT ... INTO
ステートメントのコンテキストでは、診断メッセージ (エラーだけでなく、警告も含みます) がエラーログに (Windows ではアプリケーションイベントログにも) 書き込まれます。詳細は、セクション20.4.5「イベントスケジューラのステータス」を参照してください。