📣
TiDB Cloud Essential はパブリックプレビュー中です。このページは自動翻訳されたものです。原文はこちらからご覧ください。

選択



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

あらすじ

SelectStmt
SelectStmtBasicSelectStmtFromDualTableSelectStmtFromTableOrderBySelectStmtLimitSelectLockOptSelectStmtIntoOption
SelectStmtBasic
SELECTSelectStmtOptsField,HAVINGExpression
SelectStmtFromDualTable
SELECTSelectStmtOptsField,FROMDUALWhereClause
SelectStmtFromTable
SELECTSelectStmtOptsField,FROMTableRefsClauseWhereClauseGroupByClauseHAVINGExpressionWindowClause
SelectStmtOpts
TableOptimizerHintsDefaultFalseDistictOptPriorityOptSelectStmtSQLSmallResultSelectStmtSQLBigResultSelectStmtSQLBufferResultSelectStmtSQLCacheSelectStmtCalcFoundRowsSelectStmtStraightJoin
TableRefsClause
TableRef,
TableRef
TableFactorJoinTable
TableFactor
TableNamePARTITION(Identifier,)ASTableAliasAsOfClauseTableSample
JoinTable
TableRefINNERCROSSJOINTableRefJoinClauseSTRAIGHT_JOINTableRefONExpressionLEFTRIGHTOUTERJOINTableRefJoinClauseNATURALLEFTRIGHTOUTERJOINTableFactor
JoinClause
ONExpressionUSING(ColumnNameList)
AsOfClause
ASOFTIMESTAMPExpression
SelectStmtLimit
LIMITLimitOption,OFFSETLimitOptionFETCHFIRSTNEXTLimitOptionROWROWSONLY
SelectLockOpt
FORUPDATEOFTableListNOWAITLOCKINSHAREMODE
TableList
TableName,
WhereClause
WHEREExpression
GroupByClause
GROUPBYExpression
OrderBy
ORDERBYExpression
WindowClause
WINDOWWindowDefinition,
TableSample
TABLESAMPLEREGIONS()

構文要素の説明

構文要素説明
TableOptimizerHintsこれは、TiDB のオプティマイザーの動作を制御するためのヒントです。詳細については、オプティマイザのヒントを参照してください。
ALLDISTINCTDISTINCTROWALLDISTINCT / DISTINCTROW修飾子は、重複する行を返すかどうかを指定します。ALL(デフォルト)を指定すると、一致するすべての行が返されます。
HIGH_PRIORITYHIGH_PRIORITYは、現在のステートメントに他のステートメントよりも高い優先順位を与えます。
SQL_CALC_FOUND_ROWSTiDBはこの機能をサポートしておらず、 tidb_enable_noop_functions=1が設定されていない限りエラーを返します。
SQL_CACHESQL_NO_CACHESQL_CACHESQL_NO_CACHEは、リクエストの結果を TiKV (RocksDB) のBlockCacheにキャッシュするかどうかを制御するために使用されます。 count(*)クエリのように、大量のデータに対して一度だけクエリを実行する場合は、 SQL_NO_CACHE BlockCacheに値を入力することを推奨します。
STRAIGHT_JOINSTRAIGHT_JOINFROM句で使用されているテーブルの順序で UNION クエリを実行するようにオプティマイザを強制します。オプティマイザが適切な結合順序を選択しない場合、この構文を使用してクエリの実行速度を向上させることができます。
select_exprselect_exprは、取得する列を示します。列名と式が含まれます。 \*すべての列を表します。
FROM table_referencesFROM table_references句は、行を取得するテーブル ( select * from t;など)、複数のテーブル ( select * from t1 join t2;など)、または 0 個のテーブル ( select 1+1 from dual;など、 select 1+1;と同等) を指定します。
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 はNOWAITFOR UPDATE修飾子をサポートしています。詳細についてはTiDB悲観的トランザクションモードを参照してください。
LOCK IN SHARE MODE互換性を保証するため、TiDBはこれら3つの修飾子を解析しますが、無視します。
TABLESAMPLEテーブルから行のサンプルを取得する。

注記:

  • バージョン 8.5.6 以降、TiDB はFOR UPDATE OF句でテーブル エイリアスの使用をサポートしています。下位互換性を維持するために、エイリアスが定義されている場合でもベース テーブル名を参照できますが、明示的なエイリアスの使用を推奨する警告が表示されます。クエリが異なるデータベースにまたがる同じ名前の複数のテーブル (たとえばFROM db1.t, db2.t FOR UPDATE OF t ) に関係する場合、TiDB は現在のデータベース コンテキストではなく、 FROM句の順序に基づいて、対象テーブルを左から右に照合するようになりました。曖昧さを避けるため、 FOR UPDATE OF句でデータベース名を指定するか、エイリアスを使用することをお勧めします。
  • v6.6.0以降、TiDBはリソース制御サポートしています。この機能を使用すると、異なるリソースグループで異なる優先度のSQLステートメントを実行できます。これらのリソースグループに適切なクォータと優先度を設定することで、異なる優先度のSQLステートメントのスケジューリングをより適切に制御できます。リソース制御が有効になっている場合、ステートメントの優先度( HIGH_PRIORITY )は適用されなくなります。 を使用して、異なるSQLステートメントのリソース制御使用量を管理することをお勧めします。

選択

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の使用例を示しています。

SELECT ... INTO OUTFILE

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

注記:

  • この記述はTiDB Self-Managedにのみ適用され、 TiDB Cloudでは利用できません。
  • このステートメントは、Amazon S3 や GCS などの外部ストレージへのクエリ結果の書き込みをサポートしていません。

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

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

tテーブルがあり、以下の3つの列があると仮定します。

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 ... INTO DUMPFILEはサポートされていません。
  • 構文SELECT .. GROUP BY exprは、 MySQL 5.7のようにGROUP BY expr ORDER BY exprを暗示しません。TiDB は代わりに MySQL 8.0 の動作に一致し、デフォルトの順序を暗示しません。
  • SELECT ... TABLESAMPLE ...という構文は、他のデータベースシステムやISO/IEC 9075-2規格との互換性のために設計された TiDB 拡張機能ですが、現在 MySQL ではサポートされていません。

関連項目

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