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

PolarDB:SELECT

最終更新日:Mar 29, 2026

PolarDB-X 1.0 では、1つ以上のテーブルからデータをクエリするために SELECT 文を使用します。

構文

SELECT
    [ALL | DISTINCT]
    select_expr [, select_expr ...]
    [FROM table_references]
    [WHERE where_condition]
    [GROUP BY {col_name | expr | position}]
    [HAVING where_condition]
    [ORDER BY {col_name | expr | position} [ASC | DESC], ...]
    [LIMIT {[offset,] row_count | row_count OFFSET offset}]
    [FOR UPDATE]

句のリファレンス

説明
select_exprクエリする列を指定します。すべての SELECT 文には、少なくとも1つの select_expr を含める必要があります。
FROM table_referencesデータを取得するテーブルを指定します。
WHERE where_condition条件で行をフィルターします。where_condition を満たす行のみが返されます。省略された場合、すべての行が返されます。
GROUP BY列名、式、または出力列の位置で行をグループ化します。
HAVING where_conditionグループ化された結果をフィルターします。WHERE とは異なり、HAVING は集計関数をサポートしています。
ORDER BY列名、式、または出力列の位置で結果をソートします。昇順 (デフォルト) には ASC を、降順には DESC を使用します。
LIMIT返される行数を制限し、オプションで行オフセットを設定します。両方のパラメーターは整数定数である必要があります。パラメーターが1つの場合、行数 (オフセットはデフォルトで0) を指定します。パラメーターが2つの場合、最初のパラメーターは返される最初の行のオフセット (0から開始し、1ではない) であり、2番目のパラメーターは最大行数です。LIMIT row_count OFFSET offset 構文は、PostgreSQL 互換性のためにもサポートされています。
FOR UPDATE結果セット内のすべての行に排他ロックを適用します。これにより、他のトランザクションがこれらの行を同時に更新するのを防ぎ、特定のトランザクション分離レベルでの同時読み取りも防ぎます。

JOIN

PolarDB-X 1.0 は、table_references で以下の JOIN 構文をサポートしています。

table_references:
    escaped_table_reference [, escaped_table_reference] ...

escaped_table_reference:
    table_reference
  | { OJ table_reference }

table_reference:
    table_factor
  | join_table

table_factor:
    [schema_name.]tbl_name [[AS] alias] [index_hint_list]
  | table_subquery [AS] alias
  | ( table_references )

join_table:
    table_reference [INNER | CROSS] JOIN table_factor [join_condition]
  | table_reference {LEFT|RIGHT} [OUTER] JOIN table_reference join_condition

join_condition:
    ON conditional_expr
  | USING (column_list)

index_hint_list:
    index_hint [, index_hint] ...

index_hint:
    USE {INDEX|KEY}
      [FOR {JOIN|ORDER BY|GROUP BY}] ([index_list])
  | IGNORE {INDEX|KEY}
      [FOR {JOIN|ORDER BY|GROUP BY}] (index_list)
  | FORCE {INDEX|KEY}
      [FOR {JOIN|ORDER BY|GROUP BY}] (index_list)

index_list:
    index_name [, index_name] ...

JOIN を使用する際は、以下の動作に留意してください。

  • JOINCROSS JOIN、および INNER JOIN は、MySQL の動作に一致する構文的に同等なものです。

  • ON 句のない INNER JOIN は、カンマ (,) と同等です。どちらも CROSS JOIN を生成します。例えば、以下の2つの文は同等です。

    SELECT * FROM t1 INNER JOIN t2 WHERE t1.id > 10
    SELECT * FROM t1, t2 WHERE t1.id > 10
  • USING(column_list) は、両方のテーブルに存在する列を指定します。PolarDB-X 1.0 は、同等の ON 条件を自動的に構築します。例えば、以下の2つのフラグメントは同等です。

    a LEFT JOIN b USING(c1, c2)
    a LEFT JOIN b ON a.c1 = b.c1 AND a.c2 = b.c2
  • JOIN 演算子は、カンマ演算子よりも高い優先順位を持ちます。t1, t2 JOIN t3 という式は、(t1, (t2 JOIN t3)) として解釈され、((t1, t2) JOIN t3) としては解釈されません。

  • LEFT JOIN および RIGHT JOIN は、ON 条件を必要とします。

  • インデックスヒント (USE INDEXIGNORE INDEXFORCE INDEX) は、基盤となる MySQL インスタンスにプッシュダウンされます。

UNION

PolarDB-X 1.0 は、以下の UNION 構文をサポートしています。

SELECT ...
UNION [ALL | DISTINCT] SELECT ...
[UNION [ALL | DISTINCT] SELECT ...]
説明 UNION の各 SELECT 句では、PolarDB-X 1.0 は重複する列名をサポートしていません。以下の文はサポートされていません。
SELECT id, id, name FROM t1 UNION SELECT pk, pk, name FROM t2;

MySQL 互換性

PolarDB-X 1.0 は MySQL 互換ですが、以下の相違点と制約があります。

  • WHERE と HAVING:WHERE 句で使用される式は、HAVING 句では使用できません。生の行をフィルターするには WHERE を使用し、集計された結果をフィルターするには HAVING を使用します。例えば、次のように記述します。

    SELECT col_name FROM tbl_name WHERE col_name > 0;

    次のように記述しないでください。

    SELECT col_name FROM tbl_name HAVING col_name > 0;
  • HAVING 句の集計関数:集計関数は HAVING 句では許可されますが、WHERE 句では許可されません。例えば、

    SELECT user, MAX(salary) FROM users
      GROUP BY user HAVING MAX(salary) > 10;
  • GROUP BYASC または DESC をサポートしていません。

  • ORDER BY 句を伴う GROUP BY 句:両方が使用される場合、ORDER BY 句のすべての式は、SELECT 句または GROUP BY 句にも現れる必要があります。以下の文はサポートされていません。

    SELECT user FROM users GROUP BY age ORDER BY salary;
  • ORDER BY 句の集計関数:集計関数および集計関数を含む式は、ORDER BY 句で直接使用できません。式を select_expr として定義し、エイリアスを割り当てて、代わりに ORDER BY 句でエイリアスを参照します。

  • エイリアス:空の文字列はエイリアスとして使用できません。

  • STRAIGHT_JOIN および NATURAL JOIN:サポートされていません。

  • 重複する列名を持つ UNION:サポートされていません。UNION の各 SELECT 句は、一意の列名を使用する必要があります。

参照