重要
古いバージョンの TiDB データベース (TiDB {{ curdocVersion }}) のドキュメントを表示しています。TiDBデータベースの最新の安定バージョン を使用することをお勧めします。
選択する SELECTステートメントは、TiDBからデータを読み取るために使用されます。
あらすじ SelectStmt:
FromDual:
WhereClauseOptional:
SelectStmtOpts:
SelectStmtFieldList:
TableRefsClause:
TableRefsClause TableRef AsOfClause , TableRef AsOfClause AsOfClause AS OF TIMESTAMP Expression TableRefsClause ::=
TableRef AsOfClause? ( ',' TableRef AsOfClause? )*
AsOfClause ::=
'AS' 'OF' 'TIMESTAMP' Expression
WhereClauseOptional:
SelectStmtGroup:
HaveClause:
OrderByOptional:
SelectStmtLimit:
FirstOrNext:
FetchFirstOpt:
RowOrRows:
SelectLockOpt:
SelectLockOpt FOR UPDATE OF TableList NOWAIT LOCK IN SHARE MODE TableList TableName , SelectLockOpt ::=
( ( 'FOR' 'UPDATE' ( 'OF' TableList )? 'NOWAIT'? )
| ( 'LOCK' 'IN' 'SHARE' 'MODE' ) )?
TableList ::=
TableName ( ',' TableName )*
WindowClauseOptional
構文要素の説明 構文要素 説明 TableOptimizerHintsこれは、TiDBのオプティマイザの動作を制御するためのヒントです。詳細については、 オプティマイザーのヒント を参照してください。 ALL DISTINCT DISTINCTROWALL DISTINCTROW DISTINCTは、重複する行を返すかどうかを指定します。 ALL(デフォルト)は、一致するすべての行を返す必要があることを指定します。HIGH_PRIORITYHIGH_PRIORITYは、現在のステートメントに他のステートメントよりも高い優先順位を与えます。SQL_CALC_FOUND_ROWSTiDBはこの機能をサポートしておらず、 tidb_enable_noop_functions=1 が設定されていない限りエラーを返します。 SQL_CACHE SQL_NO_CACHESQL_CACHEとSQL_NO_CACHEは、リクエスト結果をTiKVのBlockCache (RocksDB)にキャッシュするかどうかを制御するために使用されます。 count(*)クエリなど、大量のデータに対する1回限りのクエリの場合、ホットユーザーデータがBlockCacheでフラッシュされないように、 SQL_NO_CACHEを入力することをお勧めします。STRAIGHT_JOINSTRAIGHT_JOINは、オプティマイザにFROM節で使用されているテーブルの順序でユニオンクエリを実行するように強制します。オプティマイザが適切でない結合順序を選択した場合、この構文を使用してクエリの実行を高速化できます。select_expr各select_exprは、取得する列を示します。列名と式を含みます。 \*はすべての列を表します。 FROM table_referencesFROM table_references句は、行を取得するテーブル( select * from t;など)、テーブル( select * from t1 join t2;など)、または0テーブル( select 1+1;に相当するselect 1+1 from dual;など)を示します。WHERE where_conditionWHERE節は、指定されている場合、行が選択されるために満たす必要のある1つまたは複数の条件を示します。結果には、条件を満たすデータのみが含まれます。GROUP BYGROUP BYステートメントは、結果セットをグループ化するために使用されます。HAVING where_conditionHAVING句とWHERE句はどちらも、結果をフィルタリングするために使用されます。 HAVING句はGROUP BYの結果をフィルタリングし、 WHERE句は集計前に結果をフィルタリングします。ORDER BYORDER BY句は、 select_exprリストの列、式、または項目に基づいて、データを昇順または降順で並べ替えるために使用されます。LIMITLIMIT句を使用して、行数を制限できます。 LIMITは1つまたは2つの数値引数を取ります。引数が1つの場合、引数は返される行の最大数を指定します。返される最初の行は、デフォルトではテーブルの最初の行です。 2つの引数を使用すると、最初の引数は返される最初の行のオフセットを指定し、2番目の引数は返される行の最大数を指定します。 TiDBはFETCH FIRST/NEXT n ROW/ROWS ONLY構文もサポートしており、 LIMIT nと同じ効果があります。この構文ではnを省略でき、その効果はLIMIT 1と同じです。Window window_definitionこれはウィンドウ関数の構文であり、通常、分析計算を行うために使用されます。詳細については、 ウィンドウ関数 を参照してください。 FOR UPDATESELECT FOR UPDATE句は、結果セット内のすべてのデータをロックして、他のトランザクションからの同時更新を検出します。現在のトランザクションの開始後に他のトランザクションによって書き込まれた行データなど、クエリ条件に一致するが結果セットに存在しないデータは読み取りロックされません。 TiDBは楽観的なトランザクションモデル を使用します。ステートメント実行フェーズでは、トランザクションの競合は検出されません。したがって、現在のトランザクションは、 SELECT FOR UPDATE UPDATE DELETEすることをブロックしません。コミットフェーズでは、 SELECT FOR UPDATEによって読み取られた行は、2つのフェーズでコミットされます。つまり、競合検出に参加することもできます。書き込みの競合が発生した場合、 SELECT FOR UPDATE句を含むすべてのトランザクションでコミットが失敗します。競合が検出されない場合、コミットは成功します。また、ロックされた行に対して新しいバージョンが生成されるため、他のコミットされていないトランザクションが後でコミットされたときに書き込みの競合を検出できます。悲観的トランザクションモードを使用する場合、動作は基本的に他のデータベースと同じです。詳細については、 MySQLInnoDBとの違い を参照してください。 TiDBは、 FOR UPDATEのNOWAIT修飾子をサポートします。詳細はTiDB悲観的トランザクションモード を参照してください。LOCK IN SHARE MODE互換性を保証するために、TiDBはこれらの3つの修飾子を解析しますが、それらを無視します。
例 mysql> CREATE TABLE t1 (id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, c1 INT NOT NULL );
Query OK, 0 rows affected (0.11 sec)
mysql> INSERT INTO t1 (c1) VALUES (1 ),(2 ),(3 ),(4 ),(5 );
Query OK, 5 rows affected (0.03 sec)
Records: 5 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM t1;
+
| id | c1 |
+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
| 5 | 5 |
+
5 rows in set (0.00 sec)
MySQLの互換性 構文SELECT ... INTO @variableはサポートされていません。 構文SELECT ... GROUP BY ... WITH ROLLUPはサポートされていません。 構文SELECT .. GROUP BY exprは、MySQL5.7のようにGROUP BY expr ORDER BY exprを意味しません。代わりに、TiDBはMySQL 8.0の動作と一致し、デフォルトの順序を意味しません。 も参照してください