このトピックでは、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として指定されている場合、システムはwhere_conditionの要件を満たす行を返します。 この句を指定しない場合、すべての行が返されます。
- GROUP BY句は、列名、式、および出力列内の位置への参照をサポートします。
- HAVING句は、WHERE句に似ています。 違いは、HAVING句で集計関数を使用できることです。
- ORDER BY句は、データがソートされる順序を指定します。 この句は、出力列内の列名、式、および位置への参照をサポートします。 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 1.0は、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は構文上の同等物です。 これはMySQLにも当てはまります。
- ON句のないINNER 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 1.0は、これらの列に基づいて等価条件を構築する。 たとえば、次のSQLフラグメントは同等です。LEFT JOIN b USING(c1, c2) a a 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 1.0は、ヒントを基になるMySQLデータベースにプッシュします。
- STRAIGHT_JOINとNATURAL JOINはサポートされていません。
UNION
PolarDB-X 1.0は、次のUNION構文をサポートしています。
SELECT...
UNION [ALL | DISTINCT] SELECT...
[UNION [ALL | DISTINCT] SELECT ...]
説明 UNIONの各SELECT句では、PolarDB-X 1.0は同じ名前の複数の列をサポートしていません。 SELECT句の列名が重複しているため、次のSQL文はサポートされていません。
SELECT id, id, name FROM t1 UNION SELECT pk, pk, name FROM t2;