すべてのプロダクト
Search
ドキュメントセンター

Tablestore:DQL ステートメント

最終更新日:Jun 06, 2026

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

はい

列名または式。形式は column_name | expression [AS alias] です。すべての列を返すには * を使用します。

table_references

はい

対象テーブル。テーブル名または SELECT サブクエリを指定します。形式は table_name | select_statement です。複数テーブルのクエリについては、「結合」のセクションをご参照ください。

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

いいえ

返される行数を制限します。LIMIT row_count は最初の N 行を返します。LIMIT offset, row_count または LIMIT row_count OFFSET offset は offset 行をスキップしてから N 行を返します。

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(*) はすべての行をカウントします。COUNT(column) は NULL 以外の行をカウントします。

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

はい

結合タイプ:

  • INNER JOIN (デフォルト):両方のテーブルで結合条件を満たす行のみを返します。

  • LEFT OUTER JOIN:左テーブルのすべての行を返します。右テーブルに一致する行が存在しない場合、列は NULL になります。

  • RIGHT OUTER JOIN:右テーブルのすべての行を返します。左テーブルに一致する行が存在しない場合、列は NULL になります。

  • CROSS JOIN:両方のテーブルのデカルト積を返します。

join_condition

はい

結合列を指定します。ON を使用して条件を指定するか、USING(column) を使用して同じ名前の列を基準に結合する場合の記述を簡略化します。以下の 2 つのステートメントは等価です。

SELECT * FROM t1 JOIN t2 ON t1.col_a = t2.col_a AND t1.col_b = t2.col_b;
        SELECT * FROM t1 JOIN t2 USING (col_a, col_b);

結合アルゴリズム

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;