選択
SELECTステートメントは、TiDB からデータを読み取るために使用されます。
あらすじ
- SelectStmt
- SelectStmtBasic
- SelectStmtFromDualTable
- SelectStmtFromTable
- SelectStmtOpts
- TableRefsClause
- TableRef
- TableFactor
- JoinTable
- JoinClause
- AsOfClause
- SelectStmtLimit
- SelectLockOpt
- TableList
- WhereClause
- GroupByClause
- OrderBy
- WindowClause
- TableSample
SelectStmt ::=
( SelectStmtBasic | SelectStmtFromDualTable | SelectStmtFromTable )
OrderBy? SelectStmtLimit? SelectLockOpt? SelectStmtIntoOption
SelectStmtBasic ::=
"SELECT" SelectStmtOpts Field ("," Field)* ( "HAVING" Expression)?
SelectStmtFromDualTable ::=
"SELECT" SelectStmtOpts Field ("," Field)* "FROM" "DUAL" WhereClause?
SelectStmtFromTable ::=
"SELECT" SelectStmtOpts Field ("," Field)* "FROM" TableRefsClause
WhereClause? GroupByClause? ( "HAVING" Expression)? WindowClause?
SelectStmtOpts ::=
TableOptimizerHints DefaultFalseDistictOpt PriorityOpt SelectStmtSQLSmallResult
SelectStmtSQLBigResult SelectStmtSQLBufferResult SelectStmtSQLCache SelectStmtCalcFoundRows
SelectStmtStraightJoin
TableRefsClause ::=
TableRef ( ',' TableRef )*
TableRef ::=
TableFactor
| JoinTable
TableFactor ::=
TableName ( "PARTITION" "(" Identifier ("," Identifier)* ")" )? ("AS" TableAlias)? AsOfClause? TableSample?
JoinTable ::=
TableRef
(
("INNER" | "CROSS")? "JOIN" TableRef JoinClause?
| "STRAIGHT_JOIN" TableRef "ON" Expression
| ("LEFT" | "RIGHT") "OUTER"? "JOIN" TableRef JoinClause
| "NATURAL" ("LEFT" | "RIGHT") "OUTER"? "JOIN" TableFactor
)
JoinClause ::=
("ON" Expression
| "USING" "(" ColumnNameList ")" )
AsOfClause ::=
'AS' 'OF' 'TIMESTAMP' Expression
SelectStmtLimit ::=
("LIMIT" LimitOption ( ("," | "OFFSET") LimitOption )?
| "FETCH" ("FIRST" | "NEXT") LimitOption? ("ROW" | "ROWS") "ONLY" )
SelectLockOpt ::=
( 'FOR' 'UPDATE' ( 'OF' TableList )? 'NOWAIT'?
| 'LOCK' 'IN' 'SHARE' 'MODE' )
TableList ::=
TableName ( ',' TableName )*
WhereClause ::=
"WHERE" Expression
GroupByClause ::=
"GROUP" "BY" Expression
OrderBy ::=
"ORDER" "BY" Expression
WindowClause ::=
"WINDOW" WindowDefinition ("," WindowDefinition)*
TableSample ::=
'TABLESAMPLE' 'REGIONS' '(' ')'
構文要素の説明
注記:
- バージョン 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 ではサポートされていません。