SELECT [STRAIGHT_JOIN]
       [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
       [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS] [HIGH_PRIORITY]
       [DISTINCT | DISTINCTROW | ALL]
    select_expression,...
    [INTO {OUTFILE | DUMPFILE} 'file_name' export_options]
    [FROM table_references
      [WHERE where_definition]
      [GROUP BY {unsigned_integer | col_name | formula} [ASC | DESC], ...
        [WITH ROLLUP]]
      [HAVING where_definition]
      [ORDER BY {unsigned_integer | col_name | formula} [ASC | DESC] ,...]
      [LIMIT [offset,] row_count | row_count OFFSET offset]
      [PROCEDURE procedure_name(argument_list)]
      [FOR UPDATE | LOCK IN SHARE MODE]]
        SELECT は1
        つ以上のテーブルからレコードを選択して取り出すときに使用します。
        各 select_expression
        は、取り出すカラムを表します。
        SELECT
        は、どのテーブルも参照することなく、計算によって求められたレコードを取り出すときにも使用できます。
      
次に例を示します。
mysql> SELECT 1 + 1;
         -> 2
        使用する節はいずれも、構文の説明で示している順序とまったく同じ順序で記述する必要があります。たとえば、HAVING
        節はあらゆる GROUP BY
        節の後に、またあらゆる ORDER BY
        節の前に配置しなければなりません。
      
            
            
            SELECT 式には、AS
            alias_name
            を使用してエイリアスを指定することができる。
            このエイリアスは式のカラム名として使用されるもので、ORDER
            BY 節または HAVING
            節とともに使用できる。次に例を示す。
          
mysql> SELECT CONCAT(last_name,', ',first_name) AS full_name
    FROM mytable ORDER BY full_name;
            SELECT
            式のエイリアスの指定時、AS
            キーワードは省略できる。
            前の例は、次のように記述することも可能。
          
mysql> SELECT CONCAT(last_name,', ',first_name) full_name
    FROM mytable ORDER BY full_name;
            AS は省略できるため、2 つの
            SELECT
            式の間にカンマを付け忘れると微妙な問題が生じることがある。この場合、2
            番目の式は MySQL
            によってエイリアス名として解釈される。たとえば、次のステートメントで、columnb
            はエイリアス名とみなされる。
          
mysql> SELECT columna columnb FROM mytable;
            WHERE
            節ではカラム名のエイリアスは使用できない。これは、WHERE
            節の実行時点でカラム値がまだ判別されないことがあるため。
            See 項A.5.4. 「alias の問題」。
          
            
            
            
            
            
            
            
            FROM table_references
            節は、レコードの取り出し元のテーブルを表す。複数のテーブルを指定する場合は、結合操作を実行する。結合構文については、項6.4.1.1. 「JOIN 構文」
            を参照。
            指定する各テーブルについて、必要に応じて、そのテーブルのエイリアスを指定することができる。
table_name [[AS] alias] [[USE INDEX (key_list)] | [IGNORE INDEX (key_list)] | FORCE INDEX (key_list)]]
            MySQL バージョン 3.23.12
            以降では、テーブルからのデータの取り出し時に、どのインデックスを使用すべきか
            MySQL
            に知らせるためのヒントを指定することができる。これは、EXPLAIN
            で MySQL
            が使用可能なインデックスのリストの中から誤ったインデックスを使用していることが明らかになったときに役立つ。USE
            INDEX (key_list)
            と指定することによって、使用可能なインデックスの中から特定のインデックスを使ってテーブル内のレコードを検索するよう
            MySQL に指示できる。もう 1 つの IGNORE
            INDEX (key_list)
            構文は、特定のインデックスを使用しないよう
            MySQL に指示するときに使用する。
          
            MySQL 4.0.9 では、FORCE INDEX
            も使用できる。これは USE INDEX
            (key_list)
            と同じように動作するが、異なる点として、この構文の場合、テーブルのスキャンは非常にコストがかかるという前提に立つ。つまり、テーブルのスキャンが実行されるのは、どのインデックスを使用してもテーブル内のレコードを検索できない場合に限られる。
          
            USE/IGNORE/FORCE KEY は
            USE/IGNORE/FORCE INDEX のシノニム。
          
            注意:
            USE/IGNORE/FORCE INDEX は、MySQL
            でテーブル内のレコードの検索方法と結合の実行方法を決めるときにどのインデックスを使用するか、という点にのみ影響する。ORDER
            BY や GROUP BY
            の解決時にインデックスを使用するかどうかには影響しない。
          
            MySQL 4.0.14 では、MySQL
            にテーブルのスキャンよりもキーのスキャンを優先させるための代替方法として、SET
            MAX_SEEKS_FOR_KEY=value も使用できる。
          
            テーブルは(カレントデータベース内のものなら)tbl_name
            として参照できる。データベースを明示的に指定する場合は、dbname.tbl_name
            として参照する。
            カラムは、col_name、tbl_name.col_name、または
            db_name.tbl_name.col_name
            として参照できる。SELECT
            ステートメントでカラムを参照するときには、その参照があいまいにならない限り、カラム名の前に
            tbl_name や
            db_name.tbl_name
            を付ける必要はない。より明示的なカラム参照形式が必要となるあいまいな例については、項6.1.2. 「データベース名、テーブル名、インデックス名、カラム名、エイリアス名」を参照。
          
            バージョン 4.1.0
            以降では、どのテーブルも参照されない状況において、ダミーテーブル名として
            DUAL
            を指定することができる。これはもっぱら互換性を考慮した機能である。一部の他のサーバではこの構文が必要となる。
          
mysql> SELECT 1 + 1 FROM DUAL;
         -> 2
            
            
            テーブル参照には、tbl_name [AS]
            alias_name
            を使用してエイリアスを指定することができる。
          
mysql>SELECT t1.name, t2.salary FROM employee AS t1, info AS t2->WHERE t1.name = t2.name;mysql>SELECT t1.name, t2.salary FROM employee t1, info t2->WHERE t1.name = t2.name;
            出力用に選択されるカラムは、ORDER
            BY 節と GROUP BY
            節において、カラム名、カラムエイリアス、またはカラム位置を使用して参照することができる。カラム位置は
            1 から始まる。
          
mysql>SELECT college, region, seed FROM tournament->ORDER BY region, seed;mysql>SELECT college, region AS r, seed AS s FROM tournament->ORDER BY r, s;mysql>SELECT college, region, seed FROM tournament->ORDER BY 2, 3;
            逆の順序でソートするには、ORDER
            BY
            節においてソートキーとするカラムの名前に
            DESC(降順)キーワードを付ける。
            デフォルトは昇順だが、昇順を明示的に指定するには、ASC
            キーワードを指定する。
          
            WHERE 節では、MySQL
            でサポートしている任意の機能を使用できるが、例外として集約(集計)機能だけは使用できない。
            See 項6.3. 「SELECT 節と WHERE
      節で使用する関数」。
          
            HAVING
            節では、select_expression
            で指定した任意のカラムまたはエイリアスを参照することができる。この節は、処理の終わり近くになって(項目がクライアントに送られる直前)、最適化されることなく適用される(LIMIT
            は HAVING
            の後に適用)。WHERE
            節に組み込むべき項目に対しては、HAVING
            を使用してはならない。たとえば、次のように記述しないようにする。
          
mysql> SELECT col_name FROM tbl_name HAVING col_name > 0;
正しくは次のように記述する。
mysql> SELECT col_name FROM tbl_name WHERE col_name > 0;
MySQL バージョン 3.22.5 以降では、次のようなクエリも使用できる。
mysql>SELECT user,MAX(salary) FROM users->GROUP BY user HAVING MAX(salary)>10;
それより前の MySQL バージョンでは、代わりに次のように記述する。
mysql>SELECT user,MAX(salary) AS sum FROM users->group by user HAVING sum>10;
            DISTINCT、DISTINCTROW、ALL
            の各オプションでは、重複レコードを返すかどうかを指定する。デフォルト(ALL)では、マッチするすべてのレコードが返される。DISTINCT
            と DISTINCTROW
            はシノニムで、これらを指定した場合、結果セットから重複レコードが削除される。
          
            STRAIGHT_JOIN と
            HIGH_PRIORITY、および
            SQL_
            で始まる各オプションは、SQL-99 に対する
            MySQL の拡張。
          
                
                STRAIGHT_JOIN
                では、オプティマイザに、FROM
                節に指定された順序で強制的にテーブルを結合させることができる。オプティマイザが最適でない順序でテーブルを結合するときには、このオプションを使用することによって、クエリを高速化できる。
                See 項5.2.1. 「EXPLAIN 構文(SELECT
        に関する情報の取得)」。
              
                HIGH_PRIORITY
                を指定すると、SELECT
                ステートメントがテーブルを更新するステートメントよりも優先される。このオプションは、非常に迅速に処理され、かつ直ちに実行する必要があるクエリに対してのみ使用するようにする。SELECT
                HIGH_PRIORITY
                クエリは、対象のテーブルが読み取り用にロックされれば、たとえテーブルが解放されるのを待っている更新ステートメントがあっても、実行される。
              
                SQL_BIG_RESULT は、GROUP
                BY または DISTINCT
                とともに使用することができ、それによって、結果セットに多くのレコードが組み込まれることをオプティマイザに通知できる。この場合、MySQL
                で、ディスクベースの一時テーブルが必要に応じて直接使用される。
                また、この場合、GROUP BY
                要素のキーで一時テーブルを処理するよりソートを行うほうが優先される。
              
                SQL_BUFFER_RESULT
                では、結果が一時テーブルに強制的に格納される。結果セットをクライアントに送るのに時間がかかる場合には、このオプションを指定することによって、MySQL
                によるテーブルのロックを早く解放させることができる。
              
                SQL_SMALL_RESULT は MySQL
                固有のオプション。このオプションを
                GROUP BY または
                DISTINCT
                とともに使用することで、結果セットが小さいものになることをオプティマイザに通知できる。この場合、ソートを行う代わりに、迅速な一時テーブルを使用して結果のテーブルが格納される。MySQL
                バージョン 3.23
                では、通常、このオプションを使用する必要はない。
              
                SQL_CALC_FOUND_ROWS(バージョン
                4.0.0 以降)では、LIMIT
                節を無視した場合に結果セットに含まれるすべてのレコード数を計算するよう
                MySQL に指示できる。 その後、SELECT
                FOUND_ROWS()
                を使用して、計算されたレコード数を取り出せる。
                See 項6.3.6.2. 「その他の各種関数」。
              
                注意: 4.1.0
                より前のバージョンでは、LIMIT
                0
                を指定した場合、このオプションは機能しない。この場合、迅速に戻るよう最適化される(その結果、レコードカウントは
                0 になる)。 See
                項5.2.9. 「MySQL による LIMIT の最適化」。
              
                SQL_CACHE
                では、QUERY_CACHE_TYPE=2(DEMAND)を使用した場合に、クエリの結果をクエリキャッシュに格納するよう
                MySQL に指示できる。 See
                項6.9. 「MySQL クエリキャッシュ」。
                UNION
                またはサブクエリを使用したクエリでは、このオプションはクエリのあらゆる
                SELECT
                ステートメントで適用される。
              
                SQL_NO_CACHE
                では、クエリの結果をクエリキャッシュに格納しないよう、MySQL
                に指示することができる。 See
                項6.9. 「MySQL クエリキャッシュ」。
                UNION
                またはサブクエリを使用したクエリでは、このオプションはクエリのあらゆる
                SELECT
                ステートメントで適用される。
              
            
            GROUP BY
            を使用すると、GROUP BY
            のすべてのフィールドに対して ORDER
            BY
            を使用した場合と同じように、出力レコードが
            GROUP BY
            に指定した基準に基づいてソートされる。MySQL
            では、GROUP BY
            節を拡張しており、この節で指定したカラムの後に
            ASC と DESC
            のいずれかを指定することができる。
          
SELECT a,COUNT(b) FROM test_table GROUP BY a DESC
            MySQL では、GROUP BY
            の使用を拡張しており、GROUP BY
            節に指定していないフィールドも選択できる。
            クエリで期待した結果が得られない場合は、GROUP
            BY の説明を参照。 See
            項6.3.7. 「GROUP BY 節で使用する関数と修飾子」。
          
            MySQL 4.1.1 以降、GROUP BY には
            WITH ROLLUP
            修飾子を使用できる。 See
            項6.3.7.2. 「GROUP BY の修飾子」。
          
            LIMIT
            節を使用すると、SELECT
            ステートメントで返されるレコード数を制限することができる。LIMIT
            は 1 つまたは 2
            つの数値引数を取る。これらの引数は整数定数でなければならない。
          
引数が 1 つの場合、その値は、戻り値として返す、結果セットの冒頭からのレコード数を表す。 引数が 2 つの場合、最初の引数は戻り値として返す最初のレコードまでのオフセットを表し、2 つ目の引数は戻り値として返す最大レコード数を表す。最初のレコードのオフセット値は 0(1 ではない)。
            PostgreSQL との互換性を確保するため、MySQL
            では LIMIT row_count OFFSET offset
            構文もサポートしている。
          
mysql> SELECT * FROM table LIMIT 5,10;  # Retrieve rows 6-15
特定のオフセット位置から結果セットの終わりまでのすべてのレコードを取り出すには、2 つ目のパラメータに大きな数値を指定できる。
mysql> SELECT * FROM table LIMIT 95,18446744073709551615; # Retrieve rows 96-last.
引数が 1 つの場合、その値は戻り値として返す最大レコード数を表す。
mysql> SELECT * FROM table LIMIT 5;     # Retrieve first 5 rows
            つまり、LIMIT n は LIMIT
            0,n と指定するのと同じである。
          
            
            SELECT ... INTO OUTFILE 'file_name'
            形式の SELECT では、SELECT
            したレコードがファイルに書き込まれる。ファイルはサーバホスト上に作成される。既存のファイルを指定することはできない(この制限は、特に、/etc/passwd
            などのデータベーステーブルやファイルが破壊されないようにするため)。この形式の
            SELECT
            を使用するには、サーバホストに対する
            FILE 権限が必要となる。
          
            SELECT ... INTO OUTFILE
            ステートメントの用途は、主に、サーバマシン上のテーブルのダンプをきわめて迅速に実行できるようにすることである。サーバホスト以外のホストに結果のファイルを作成する必要があるときには、SELECT
            ... INTO OUTFILE
            は使用できない。この場合、代わりに、mysqldump
            --tab や mysql -e "SELECT ..." >
            outfile
            などのクライアントプログラムを使用してファイルを生成する。
          
            SELECT ... INTO OUTFILE は LOAD
            DATA INFILE
            の逆。このステートメントの
            export_options
            部分の構文は、LOAD DATA INFILE
            ステートメントで使用される
            FIELDS および LINES
            節と同じ構成になっている。 See
            項6.4.8. 「LOAD DATA INFILE 構文」。
          
            結果のテキストファイルでは、以下の文字だけが
            ESCAPED BY
            指定の文字でエスケープされる。
          
                ESCAPED BY 指定文字自体
              
                FIELDS TERMINATED BY
                指定の最初の文字
              
                LINES TERMINATED BY
                指定の最初の文字
              
            また、ASCII 0 は、ESCAPED
            BY の指定文字の後ろに 0(ASCII
            48)を付けたものに変換される。
          
            上記の文字をエスケープする理由は、ファイルを確実に読み返せるようにするには、FIELDS
            TERMINATED BY、ESCAPED
            BY、LINES TERMINATED BY
            指定されている文字をすべてエスケープしなければならないため。ASCII
            0
            は一部のページャーでの表示を容易化するためにエスケープされる。
          
結果のファイルは SQL の構文に従う必要はないため、その他のエスケープ処理は必要ない。
次に、多くの古いプログラムで使用されている形式でファイルを生成する例を示す。
SELECT a,b,a+b INTO OUTFILE "/tmp/result.text" 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
            として実行すべきでない)。
            ファイルの内容を操作できるようにするには、ファイルを全ユーザ書き込み可能にする必要がある。
          
            PROCEDURE
            節には、結果セット内のデータの処理に使用するプロシージャを指定する。例については、項13.3.1. 「プロシージャの分析」を参照。
          
            ページロックまたは行ロック機能があるストレージエンジンに対して
            FOR UPDATE
            を使用すると、現在のトランザクションが終了するまで、検査対象のレコードは書き込みに対してロックされる。
          
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.

