Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 26.8Mb
PDF (A4) - 26.9Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


13.2.9.1 SELECT ... INTO 構文

SELECTSELECT ... 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「ユーザー定義変数」を参照してください。

SELECTSELECT ... 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 BYENCLOSED BYESCAPED 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 サーバーが、それを実行しているアカウントを持つユーザー以外のどのユーザーによって所有されるファイルも作成できないためです。(これらの理由のために、mysqldroot としては決して実行しないでください。) したがって、このファイルは、その内容を操作できるようにすべてのユーザーから書き込み可能である必要があります。

secure_file_priv システム変数が空以外のディレクトリ名に設定されている場合、書き込まれるファイルはそのディレクトリ内に存在する必要があります。

イベントスケジューラによって実行されるイベントの一部として実行された SELECT ... INTO ステートメントのコンテキストでは、診断メッセージ (エラーだけでなく、警告も含みます) がエラーログに (Windows ではアプリケーションイベントログにも) 書き込まれます。詳細は、セクション20.4.5「イベントスケジューラのステータス」を参照してください。