MySQL 互換の DQL 構文を使用して、マッピングテーブル内のデータをクエリします。SELECT ステートメント、集計関数、JOIN 操作、全文検索、ベクトル検索、および検索インデックス用の JSON 関数がサポートされています。
前提条件
SELECT ステートメントを実行する前に、マッピング関係を作成する必要があります。詳細については、「DDL 操作」をご参照ください。
データのクエリ
SELECT ステートメントは、マッピングテーブルから行を取得します。オプションでフィルタリング、グループ化、ソート、ページネーションを実行できます。
検索インデックスのマッピングテーブルでは、全文検索、配列クエリ、ネストされたクエリ、ベクトル検索、JSON 関数などの追加機能がサポートされています。詳細については、「検索インデックス操作」をご参照ください。
データテーブルにセカンダリインデックスと検索インデックスの両方が存在する場合、SQL エンジンは最適なインデックスを自動的に選択します。詳細については、「クエリ最適化」をご参照ください。
句の実行順序:WHERE > GROUP BY > HAVING > ORDER BY > LIMIT/OFFSET
構文
SELECT
[ALL | DISTINCT | DISTINCTROW]
select_expr [, select_expr] ...
[FROM table_references | join_expr]
[WHERE where_condition]
[GROUP BY groupby_condition]
[HAVING having_condition]
[ORDER BY order_condition]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]パラメータ
パラメータ | 必須 | 説明 |
ALL | DISTINCT | DISTINCTROW | いいえ | 重複排除モード。ALL (デフォルト) はすべての行を返します。DISTINCT は結果セットから重複行を削除します。DISTINCTROW は DISTINCT と同じです。 |
select_expr | はい | 列名または式。形式は |
table_references | はい | 対象テーブル。テーブル名または SELECT サブクエリを指定します。形式は |
where_condition | いいえ | WHERE 句。プライマリキーの等価条件と範囲条件、論理演算子 (AND/OR/NOT)、比較演算子 (=, >, <, >=, <=, !=)、IN、LIKE、IS NULL、BETWEEN がサポートされています。 |
groupby_condition | いいえ | GROUP BY 句。指定された列で行をグループ化します。通常、集計関数と組み合わせて使用されます。 |
having_condition | いいえ | HAVING 句。GROUP BY によって生成されたグループをフィルタリングします。 |
order_condition | いいえ | ORDER BY 句。指定された列で結果をソートします。ASC (昇順、デフォルト) と DESC (降順) がサポートされています。 |
LIMIT / OFFSET | いいえ | 返される行数を制限します。 |
例
exampletable からすべてのデータをクエリし、最大 20 行を返します。
SELECT * FROM exampletable LIMIT 20;条件とソートを使用したクエリ:
SELECT pk, col_long, col_keyword FROM exampletable WHERE col_long > 100 ORDER BY col_long DESC LIMIT 10;結果の重複排除:
SELECT DISTINCT col_keyword FROM exampletable;グループ化とカウント:
SELECT col_keyword, COUNT(*) AS cnt FROM exampletable GROUP BY col_keyword HAVING cnt > 1;結果のページネーション (最初の 10 行をスキップして 5 行を返す):
SELECT * FROM exampletable LIMIT 10, 5;集計関数
集計関数は、複数の行から単一の結果を計算します。GROUP BY と組み合わせて使用することで、グループ化された統計を生成できます。
関数 | 戻り値の型 | 説明 |
COUNT() | BIGINT | 指定された条件に一致する行数を返します。 |
COUNT(DISTINCT) | BIGINT | 指定された列の一意の値の数を返します。 |
SUM() | DOUBLE | 数値列の合計を返します。 |
AVG() | DOUBLE | 数値列の平均を返します。 |
MAX() | 列の型と同じ | 列の最大値を返します。 |
MIN() | 列の型と同じ | 列の最小値を返します。 |
例
SELECT COUNT(*) FROM exampletable;
SELECT SUM(col_long), AVG(col_long) FROM exampletable;
SELECT col_keyword, COUNT(*) AS cnt, MAX(col_long) FROM exampletable GROUP BY col_keyword;結合
2 つ以上のテーブルを結合し、指定された列が一致する行を組み合わせて返します。
構文
table_references join_type table_references [ ON join_condition | USING ( join_column [, ...] ) ]
table_references : {
table_name [ [ AS ] alias_name ]
| select_statement
}
join_type : {
[ INNER ] JOIN
| LEFT [ OUTER ] JOIN
| RIGHT [ OUTER ] JOIN
| CROSS JOIN
}パラメータ
パラメータ | 必須 | 説明 |
table_references | はい | 結合するテーブル。テーブル名 (任意でエイリアスを指定可能)、または SELECT サブクエリを指定します。JOIN キーワードの左側にあるテーブルが左テーブル、右側にあるテーブルが右テーブルです。 |
join_type | はい | 結合タイプ:
|
join_condition | はい | 結合列を指定します。 |
結合アルゴリズム
Tablestore はデフォルトでインデックス結合を使用し、右テーブルの結合列がインデックス条件を満たさない場合はハッシュ結合に切り替えます。
アルゴリズム | 適用条件 | 説明 |
インデックス結合 | 右テーブルの結合列がインデックス条件を満たす場合 | 左テーブルからデータを読み取り、右テーブルのインデックスまたはプライマリキーを使用して一致する行を検索します。右テーブルの結合列は、次のいずれかの条件を満たす必要があります。
|
ハッシュ結合 | 結合列がインデックス結合の条件を満たさない場合 | 左テーブルからデータを読み取ってハッシュテーブルを構築し、右テーブルの行を使ってハッシュテーブルを探索し、一致を見つけます。インデックス要件はありません。 |
右テーブルに適切なインデックスがない場合、インデックス結合はフルテーブルスキャンに劣化します。クエリパフォーマンスを向上させるには、結合列とフィルタ列にインデックスを追加してください。
内部結合は結果セットが小さい場合に、ハッシュ結合は結果セットが大きい場合により高いパフォーマンスを発揮します。パフォーマンス向上のため、小さいテーブルを左側に配置してください。
例
orders と customers という 2 つのテーブルがあるとします。
-- orders テーブル
+----------+-------------+------------+--------------+
| order_id | customer_id | order_date | order_amount |
+----------+-------------+------------+--------------+
| 1001 | 1 | 2023-01-01 | 50 |
| 1002 | 2 | 2023-01-02 | 80 |
| 1003 | 3 | 2023-01-03 | 180 |
| 1004 | 4 | 2023-01-04 | 220 |
| 1005 | 6 | 2023-01-05 | 250 |
+----------+-------------+------------+--------------+
-- customers テーブル
+-------------+---------------+----------------+
| customer_id | customer_name | customer_phone |
+-------------+---------------+----------------+
| 1 | 田中太郎 | 11111111111 |
| 2 | 佐藤花子 | 22222222222 |
| 3 | 鈴木一郎 | 33333333333 |
| 4 | 高橋次郎 | 44444444444 |
| 5 | 渡辺三郎 | 55555555555 |
+-------------+---------------+----------------+内部結合は、両方のテーブルで customer_id が一致する行のみを返します。注文 1005 (customer_id=6) は、右テーブルに一致する行が存在しないため除外されます。
SELECT * FROM orders JOIN customers ON orders.customer_id = customers.customer_id;
-- 同等:
SELECT * FROM orders JOIN customers USING(customer_id);左外部結合は左テーブル (orders) のすべての行を返します。一致する行が存在しない場合、右テーブルの列は NULL になります。
SELECT * FROM orders LEFT JOIN customers ON orders.customer_id = customers.customer_id;クロス結合は両方のテーブルのデカルト積を返します。
SELECT * FROM orders CROSS JOIN customers;