minimize

事業拡大のため、新しい仲間を募集しています。
→詳しくはこちら

MySQLのSELECT文で使用できる構文について説明します。
なお、基本程度の構文については説明していません(DISTINCTなど)。

table references

FROM句で指定するテーブル名に、いくつかのオプションを付ける事が出来ます。

AS

テーブルに別名を付けます。なお、ASは省略できます。

SELECT T1.name FROM table_a T1;

USE INDEX

Select時に使用するインデックスを指定します。

SELECT * FROM table_a USE INDEX (use_index_name);

IGNORE INDEX

Select時に使用しないインデックスを指定します。

SELECT * FROM table_a IGNORE INDEX (ignore_index_name);

FORCE INDEX

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句でのDESC

GROUP BY句を使用すると、ORDER BY句で指定したのと同じように
出力レコードがソートされます。
MySQLでは、GROUP BY句にもDESCを使用する事が可能となっています。

SELECT a, COUNT(b) FROM table_a GROUP BY a DESC;

各種ヒント

STRAIGHT_JOIN

テーブル結合の順番を指定します。

SELECT STRAIGHT_JOIN * FROM T1,T2,T3;

この場合、T1,T2,T3の順でテーブル結合します。
STRAIGHT_JOINキーワードを指定しない場合、結合順はオプティマイザによって決定されます。

HIGH_PRIORITY

実行するSELECT文の優先順位を、テーブル更新ステートメントよりも優先させます。

SELECT HIGH_PRIORITY * FROM table_a;

この場合、たとえテーブル更新のためにロック解除を待っているステートメントがあっても
直ちにSELECT文が実行されます。

SQL_BIG_RESULT

GROUP BYまたはDISTINCTと共に使用します。
結果セットが非常に大きくなる事をオプティマイザに通知します。

SELECT SQL_BIG_RESULT * FROM table_a GROUP BY col1;

SQL_BUFFER_RESULT

結果セットを一時テーブルに強制的に格納します。

SELECT SQL_BUFFER_RESULT * FROM table_a;

SELECT文を実行してから結果セットを開放するまでに時間が掛かる場合、
このオプションを指定する事によって
SELECT文実行後すぐにテーブルロックを開放することが出来ます。

SQL_SMALL_RESULT

GROUP BYまたはDISTINCTと共に使用します。
結果セットが小さくなる事をオプティマイザに通知します。

SELECT SQL_SMALL_RESULT * FROM table_a GROUP BY col1;

SQL_CALC_FOUND_ROWS

バージョン4.0.0以降。
LIMIT節と共に使用します。

SELECT SQL_CALC_FOUND_ROWS * FROM table_a LIMIT 100;

この場合、返されるレコードは最大100件に制限されます。
しかし、「LIMIT節を使用しなかった場合に何件のレコードが存在したか」
という情報を知りたいときがあります。

例えば、Webページによる検索画面などで「max件中n件表示」
のような表示をしたい場合に役立ちます。
先程のSELECT文の後に、以下の文を実行します。

SELECT FOUND_ROWS();

これにより、LIMIT節を使用しなかった場合の全レコード数が取得できます。

SQL_CACHE

結果をクエリキャッシュに格納するように指示します。
query_cache_type が 2(DEMAND) のときに有効です。

SQL_NO_CACHE

結果をクエリキャッシュに格納しないように指示します。
query_cache_type が 1(ON) のときに有効です。

LIMIT

取得するレコードの件数を制限します。

SELECT * FROM table_a LIMIT 100;
SELECT * FROM table_a LIMIT 50, 200;

前者の場合、先頭から最大100件を取得します。
後者の場合、51件目のレコードから最大200件を取得します。

INTO OUTFILE

取得結果をサーバ上のファイルに出力します。

SELECT * FROM table_a INTO OUTFILE 'file_path';

ファイルパスを相対パスで指定した場合、基準ディレクトリは
「$MYSQL_DIR/var/データベース名」(Unix)
または「$MYSQL_DIR/data/データベース名」(Windows)になります。
既存のファイル名を指定する事は出来ません。上書き指定もありません。

デフォルトの出力結果は、タブ区切りのテキストになります。
区切り文字やエスケープ処理の動作をカスタマイズする事も出来ます。

INTO DUMPFILE

取得結果を、区切り文字やエスケープ処理をせずにファイルに出力します。

SELECT image FROM table_a INTO DUMPFILE 'file_path' LIMIT 1;

SELECT文の結果は1行(1レコード)以下にしなければなりません。
この構文は、バイナリデータを出力したい時に役立ちます。

FOR UPDATE

SELECTするレコードが他の更新トランザクションによってロックされている場合、
ロックが開放されるまでウェイトを掛けるように指示します。
このキーワードを使わない場合、ウェイトは掛からずに
トランザクション以前の(もしくはトランザクション中の)レコードが取得されます。

SELECT * FROM table_a FOR UPDATE;