MySQLのSELECT文で使用できる構文について説明します。
なお、基本程度の構文については説明していません(DISTINCTなど)。
FROM句で指定するテーブル名に、いくつかのオプションを付ける事が出来ます。
テーブルに別名を付けます。なお、ASは省略できます。
SELECT T1.name FROM table_a T1;
Select時に使用するインデックスを指定します。
SELECT * FROM table_a USE INDEX (use_index_name);
Select時に使用しないインデックスを指定します。
SELECT * FROM table_a IGNORE INDEX (ignore_index_name);
USE INDEX と似たような動作をするらしいですが、詳細は不明です。
ORDER BY節とGROUP BY節において、
カラム名の代わりにカラム位置による指定をする事が出来ます。
SELECT col1, col2, col3 FROM table_a ORDER BY 1, 2
上の文は、以下の文と同じです。
SELECT col1, col2, col3 FROM table_a ORDER BY col1, col2
カラム位置は1から始まります。
GROUP BY句を使用すると、ORDER BY句で指定したのと同じように
出力レコードがソートされます。
MySQLでは、GROUP BY句にもDESCを使用する事が可能となっています。
SELECT a, COUNT(b) FROM table_a GROUP BY a DESC;
テーブル結合の順番を指定します。
SELECT STRAIGHT_JOIN * FROM T1,T2,T3;
この場合、T1,T2,T3の順でテーブル結合します。
STRAIGHT_JOINキーワードを指定しない場合、結合順はオプティマイザによって決定されます。
実行するSELECT文の優先順位を、テーブル更新ステートメントよりも優先させます。
SELECT HIGH_PRIORITY * FROM table_a;
この場合、たとえテーブル更新のためにロック解除を待っているステートメントがあっても
直ちにSELECT文が実行されます。
GROUP BYまたはDISTINCTと共に使用します。
結果セットが非常に大きくなる事をオプティマイザに通知します。
SELECT SQL_BIG_RESULT * FROM table_a GROUP BY col1;
結果セットを一時テーブルに強制的に格納します。
SELECT SQL_BUFFER_RESULT * FROM table_a;
SELECT文を実行してから結果セットを開放するまでに時間が掛かる場合、
このオプションを指定する事によって
SELECT文実行後すぐにテーブルロックを開放することが出来ます。
GROUP BYまたはDISTINCTと共に使用します。
結果セットが小さくなる事をオプティマイザに通知します。
SELECT SQL_SMALL_RESULT * FROM table_a GROUP BY col1;
バージョン4.0.0以降。
LIMIT節と共に使用します。
SELECT SQL_CALC_FOUND_ROWS * FROM table_a LIMIT 100;
この場合、返されるレコードは最大100件に制限されます。
しかし、「LIMIT節を使用しなかった場合に何件のレコードが存在したか」
という情報を知りたいときがあります。
例えば、Webページによる検索画面などで「max件中n件表示」
のような表示をしたい場合に役立ちます。
先程のSELECT文の後に、以下の文を実行します。
SELECT FOUND_ROWS();
これにより、LIMIT節を使用しなかった場合の全レコード数が取得できます。
結果をクエリキャッシュに格納するように指示します。
query_cache_type が 2(DEMAND) のときに有効です。
結果をクエリキャッシュに格納しないように指示します。
query_cache_type が 1(ON) のときに有効です。
取得するレコードの件数を制限します。
SELECT * FROM table_a LIMIT 100; SELECT * FROM table_a LIMIT 50, 200;
前者の場合、先頭から最大100件を取得します。
後者の場合、51件目のレコードから最大200件を取得します。
取得結果をサーバ上のファイルに出力します。
SELECT * FROM table_a INTO OUTFILE 'file_path';
ファイルパスを相対パスで指定した場合、基準ディレクトリは
「$MYSQL_DIR/var/データベース名」(Unix)
または「$MYSQL_DIR/data/データベース名」(Windows)になります。
既存のファイル名を指定する事は出来ません。上書き指定もありません。
デフォルトの出力結果は、タブ区切りのテキストになります。
区切り文字やエスケープ処理の動作をカスタマイズする事も出来ます。
取得結果を、区切り文字やエスケープ処理をせずにファイルに出力します。
SELECT image FROM table_a INTO DUMPFILE 'file_path' LIMIT 1;
SELECT文の結果は1行(1レコード)以下にしなければなりません。
この構文は、バイナリデータを出力したい時に役立ちます。
SELECTするレコードが他の更新トランザクションによってロックされている場合、
ロックが開放されるまでウェイトを掛けるように指示します。
このキーワードを使わない場合、ウェイトは掛からずに
トランザクション以前の(もしくはトランザクション中の)レコードが取得されます。
SELECT * FROM table_a FOR UPDATE;