このトピックでは、SELECTステートメントを実行して1つ以上のテーブルのデータを照会する方法について説明します。
構文
SELECT
[すべて | 距離]
select_expr [, select_expr ...]
[table_referencesから
[WHERE where_condition]
[GROUP BY {col_name | expr | position}
[HAVING where_condition]
[ORDER BY {col_name | expr | position}
[ASC | DESC] 、...]
[LIMIT {[オフセット,] row_count | row_countオフセット}]
[更新のために]
SELECTステートメントの句の説明:
- select_exprは、クエリする列を指定します。 SELECTステートメントには、少なくとも1つのselect_expr式を含める必要があります。
- table_referencesは、データが取得されるテーブルを指定します。
- WHERE句は、クエリ条件を指定します。
where_condition
で指定された条件を満たす行が返されます。 この句を指定しない場合、すべての行が返されます。 - GROUP BY句は、列名、式、および出力列内の位置への参照をサポートします。
- HAVING句は、WHERE句に似ています。 違いは、HAVING句で集計関数を使用できることです。
- ORDER BY句は、データがソートされる順序を指定します。 この句は、出力列内の列名、式、および位置への参照をサポートします。 ASCやDESCなどのソート方向を指定することもできます。 ASCは、昇順を指定する。 DESCは降順を指定します。
- OFFSET句は、出力結果セットのオフセットを指定します。 LIMIT句は、出力結果セットのサイズを指定します。 LIMIT句を使用すると、数値データ型の1つまたは2つのパラメーターを指定できます。 パラメーターは整数定数である必要があります。 2つのパラメーターを指定する場合、最初のパラメーターには、返す最初の行のオフセットを指定し、2番目のパラメーターには、返す行の最大数を指定します。 最初の行の初期オフセットは1ではなく0です。 PostgreSQLと互換性を持つために、MySQLはLIMIT # OFFSET# もサポートしています。
- FOR UPDATE句は、クエリ結果の各行に排他ロックを提供します。 これにより、他のトランザクションが行を同時に更新するのを防ぎます。 これにより、いくつかのトランザクション分離レベルが指定されている行を他のトランザクションが同時に読み取ることもなくなります。
注意
- WHERE句で使用される式は、HAVING句では使用できません。 たとえば、次のSQL文1をSQL文2に書き換える必要があります。 SQL文1:
SELECT col_name FROM tbl_name HAVING col_name > 0;
SQLステートメント2:SELECT col_name FROM tbl_name WHERE col_name > 0;
- HAVING句で集計関数を使用できます。 WHERE句で集計関数を使用することはできません。
SELECTユーザー、MAX (给料) ユーザーから ユーザーによるグループHAVING MAX (サラリー) > 10;
- LIMIT句に2つのパラメーターが含まれている場合、最初のパラメーターは返される最初の行のオフセットを指定し、2番目のパラメーターは返される行の数を指定します。 LIMIT句にパラメーターが1つしか含まれていない場合、このパラメーターは返される行数を指定し、デフォルトのオフセットは0です。
- GROUP BY句はASCまたはDESCをサポートしていません。
- GROUP BYとORDER BYの両方を使用する場合は、ORDER BYの後に指定する式をSELECT句またはGROUP BY句で指定する必要があります。 たとえば、次のSQL文はサポートされていません。
SELECT user FROM users GROUP BY age ORDER BY salary;
- 集合関数を含む集合関数および式は、ORDER BY句では使用できません。 このような式を使用する場合は、式を
select_expr
として定義し、式にエイリアスを割り当ててから、ORDER BY句でエイリアスを参照します。 - 空の文字列はエイリアスとして使用できません。
JOIN
PolarDB-Xは、SELECTステートメントの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] エイリアス] [index_hint_list]
| table_subquery [AS] エイリアス
| ( table_references)
join_table:
table_reference [INNER | CROSS] JOIN table_factor [join_condition]
| table_reference {左 | 右} [外] JOIN table_reference join_condition
join_condition:
ON conditional_expr
| USING (column_list)
index_hint_list:
index_hint [, index_hint] ...
index_hint:
使用 {インデックス | キー}
[FOR {JOIN | ORDER BY | GROUP BY}] ([index_list])
| IGNORE {インデックス | キー}
[FOR {JOIN | ORDER BY | GROUP BY}] (index_list)
| FORCE {インデックス | キー}
[FOR {JOIN | ORDER BY | GROUP BY}] (index_list)
index_list:
index_name [, index_name] ...
JOINステートメントを実行する前に、次の要素に注意してください。
- JOIN、CROSS JOIN、INNER JOINは、PolarDB-XとMySQLの構文に相当します。
- ON句のないINNER JOINステートメントは、コンマ演算子 (,) と同等です。 INNER JOIN文とコンマ演算子 (,) はそれぞれCROSS JOINを示します。 たとえば、次のSQL文は同等です
。SELECT * FROM t1 INNER JOIN t2 WHERE t1.id > 10 SELECT * FROM t1, t2 WHERE t1.id > 10
USING(column_list)
は、両方のテーブルに存在する列の名前を指定します。 PolarDB-Xは、これらの列に基づいて同等の条件を指定します。 たとえば、次のSQL文は同等です。a LEFT JOIN b USING(c1, c2) a LEFT JOIN b ON a.c1 = b.c1およびa.c2 = b.c2
- JOIN演算子の優先順位は、コンマ演算子 (,) よりも高くなります。 JOIN表現t1, t2 JOIN t3は、((t1, t2) JOIN t3) の代わりに (t1, (t2 JOIN t3)) として使用される。
- LEFT JOINおよびRIGHT JOINにはON句を含める必要があります。
- index_hintは、MySQLが使用するインデックスを指定します。 PolarDB-XはヒントをMySQLにプッシュします。
- STRAIGHT_JOINとNATURAL JOINはサポートされていません。
UNION
次のUNION構文をサポートします。SELECT...
UNION [ALL | DISTINCT] SELECT...
[UNION [ALL | DISTINCT] SELECT ...]
説明 UNIONのSELECT句ごとに、PolarDB-Xは名前が同じ複数の列をサポートしません。 SELECT句の列名が重複しているため、次のSQL文はサポートされていません。
SELECT id, id, name FROM t1 UNION SELECT pk, pk, name FROM t2;