選択する

SELECTステートメントは、TiDB からデータを読み取るために使用されます。

あらすじ

選択Stmt:

SelectStmt

デュアルから:

FromDual

StmtOpts を選択:

SelectStmtOpts

選択StmtFieldList:

SelectStmtFieldList

TableRefsClause:

TableRefsClause
TableRefAsOfClause,TableRefAsOfClause
AsOfClause
ASOFTIMESTAMPExpression

WhereClauseオプション:

WhereClauseOptional

選択StmtGroup:

SelectStmtGroup

所有条項:

HavingClause

OrderByオプション:

OrderByOptional

選択StmtLimit:

SelectStmtLimit

最初または次:

FirstOrNext

FetchFirstOpt:

FetchFirstOpt

行または行:

RowOrRows

ロックオプションを選択:

SelectLockOpt
FORUPDATEOFTableListNOWAITLOCKINSHAREMODE
TableList
TableName,

WindowClauseオプション

WindowClauseOptional

テーブルサンプルオプション

TableSampleOpt
TABLESAMPLEREGIONS()

構文要素の説明

構文要素説明
TableOptimizerHintsこれは、TiDB のオプティマイザーの動作を制御するためのヒントです。詳細については、 オプティマイザーのヒントを参照してください。
ALL DISTINCT DISTINCTROWALLDISTINCT / DISTINCTROW修飾子は、重複した行を返すかどうかを指定します。 ALL (デフォルト) は、一致するすべての行が返されることを指定します。
HIGH_PRIORITYHIGH_PRIORITY指定すると、現在のステートメントに他のステートメントよりも高い優先順位が与えられます。
SQL_CALC_FOUND_ROWSTiDB はこの機能をサポートしていないため、 tidb_enable_noop_functions=1が設定されていない場合はエラーを返します。
SQL_CACHE SQL_NO_CACHESQL_CACHESQL_NO_CACHE 、リクエスト結果を TiKV (RocksDB) のBlockCacheにキャッシュするかどうかを制御するために使用されます。 count(*)クエリなどの大量のデータに対する 1 回限りのクエリの場合は、 BlockCacheのホット ユーザー データがフラッシュされるのを避けるためにSQL_NO_CACHEを入力することをお勧めします。
STRAIGHT_JOINSTRAIGHT_JOINを指定すると、オプティマイザはFROM句で使用されるテーブルの順序でユニオン クエリを実行します。オプティマイザが不適切な結合順序を選択した場合、この構文を使用してクエリの実行を高速化できます。
select_exprselect_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句を指定した場合、行が選択されるために満たさなければならない条件を示します。結果には、条件を満たすデータのみが含まれます。
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 がオプティミスティックトランザクションモード使用する場合、トランザクションの競合はステートメントの実行フェーズでは検出されません。したがって、PostgreSQL などの他のデータベースのように、現在のトランザクションは他のトランザクションの実行をブロックしませんUPDATEDELETE 、またはSELECT FOR UPDATE 。コミット フェーズでは、 SELECT FOR UPDATEによって読み取られた行は 2 つのフェーズでコミットされます。これは、これらの行も競合検出に参加できることを意味します。書き込み競合が発生した場合、 SELECT FOR UPDATE句を含むすべてのトランザクションのコミットは失敗します。競合が検出されなかった場合、コミットは成功します。また、ロックされた行に対して新しいバージョンが生成されるため、コミットされていない他のトランザクションが後でコミットされるときに書き込み競合を検出できます。 TiDB が悲観的トランザクションモードを使用する場合、動作は基本的に他のデータベースと同じです。詳細はMySQL InnoDBとの違いを参照してください。 TiDB は、 FOR UPDATENOWAIT修飾子をサポートしています。詳細はTiDB ペシミスティックトランザクションモード参照してください。
LOCK IN SHARE MODE互換性を保証するために、TiDB はこれら 3 つの修飾子を解析しますが、無視します。
TABLESAMPLEテーブルから行のサンプルを取得します。

選択する

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 AVG(s_quantity), COUNT(s_quantity) FROM stock TABLESAMPLE REGIONS(); +-----------------+-------------------+ | AVG(s_quantity) | COUNT(s_quantity) | +-----------------+-------------------+ | 59.5000 | 4 | +-----------------+-------------------+ 1 row in set (0.00 sec) mysql> SELECT AVG(s_quantity), COUNT(s_quantity) FROM stock; +-----------------+-------------------+ | AVG(s_quantity) | COUNT(s_quantity) | +-----------------+-------------------+ | 54.9729 | 1000000 | +-----------------+-------------------+ 1 row in set (0.52 sec)

上の例では、 tiup bench tpcc prepareで生成されたデータを使用しています。最初のクエリはTABLESAMPLEの使用を示しています。

...をOUTFILEに選択してください

SELECT ... INTO OUTFILEステートメントは、クエリの結果をファイルに書き込むために使用されます。

注記:

  • このステートメントは TiDB セルフホスト型にのみ適用され、 TiDB Cloudでは使用できません。
  • このステートメントは、Amazon S3 や GCS などへの外部ストレージ結果の書き込みをサポートしていません。

ステートメントでは、次の句を使用して出力ファイルの形式を指定できます。

  • FIELDS TERMINATED BY : ファイル内のフィールド区切り文字を指定します。たとえば、カンマ区切り値 (CSV) を出力する場合は','と指定し、タブ区切り値 (TSV) を出力する場合は'\t'と指定できます。
  • FIELDS ENCLOSED BY : ファイル内の各フィールドを囲む囲み文字を指定します。
  • LINES TERMINATED BY : 特定の文字で行を終了する場合は、ファイル内の行終端文字を指定します。

次のような 3 つの列を持つテーブルtがあるとします。

mysql> CREATE TABLE t (a INT, b VARCHAR(10), c DECIMAL(10,2)); Query OK, 0 rows affected (0.02 sec) mysql> INSERT INTO t VALUES (1, 'a', 1.1), (2, 'b', 2.2), (3, 'c', 3.3); Query OK, 3 rows affected (0.01 sec)

次の例は、 SELECT ... INTO OUTFILEステートメントを使用してクエリ結果をファイルに書き込む方法を示しています。

例 1:

mysql> SELECT * FROM t INTO OUTFILE '/tmp/tmp_file1'; Query OK, 3 rows affected (0.00 sec)

この例では、次のように/tmp/tmp_file1でクエリ結果を見つけることができます。

1 a 1.10 2 b 2.20 3 c 3.30

例 2:

mysql> SELECT * FROM t INTO OUTFILE '/tmp/tmp_file2' FIELDS TERMINATED BY ',' ENCLOSED BY '"'; Query OK, 3 rows affected (0.00 sec)

この例では、次のように/tmp/tmp_file2でクエリ結果を見つけることができます。

"1","a","1.10" "2","b","2.20" "3","c","3.30"

例 3:

mysql> SELECT * FROM t INTO OUTFILE '/tmp/tmp_file3' -> FIELDS TERMINATED BY ',' ENCLOSED BY '\'' LINES TERMINATED BY '<<<\n'; Query OK, 3 rows affected (0.00 sec)

この例では、次のように/tmp/tmp_file3でクエリ結果を見つけることができます。

'1','a','1.10'<<< '2','b','2.20'<<< '3','c','3.30'<<<

MySQLの互換性

  • 構文SELECT ... INTO @variableはサポートされていません。
  • 構文SELECT ... GROUP BY ... WITH ROLLUPはサポートされていません。
  • 構文SELECT ... INTO DUMPFILEはサポートされていません。
  • MySQL 5.7のように、構文SELECT .. GROUP BY expr GROUP BY expr ORDER BY exprを意味しません。 TiDB は MySQL 8.0 の動作に一致し、デフォルトの順序を意味しません。
  • 構文SELECT ... TABLESAMPLE ...は、他のデータベース システムおよびISO/IEC 9075-2標準との互換性を目的として設計された TiDB 拡張機能ですが、現在 MySQL ではサポートされていません。

こちらも参照

このページは役に立ちましたか?