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 を使用する際は、以下の動作に留意してください。
JOIN、CROSS 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 > 10USING(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.c2JOIN 演算子は、カンマ演算子よりも高い優先順位を持ちます。
t1, t2 JOIN t3という式は、(t1, (t2 JOIN t3))として解釈され、((t1, t2) JOIN t3)としては解釈されません。LEFT JOINおよびRIGHT JOINは、ON条件を必要とします。インデックスヒント (
USE INDEX、IGNORE INDEX、FORCE INDEX) は、基盤となる MySQL インスタンスにプッシュダウンされます。
UNION
PolarDB-X 1.0 は、以下の UNION 構文をサポートしています。
SELECT ...
UNION [ALL | DISTINCT] SELECT ...
[UNION [ALL | DISTINCT] SELECT ...]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 BY:
ASCまたは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 句は、一意の列名を使用する必要があります。