集合演算子UNION、UNION ALL、INTERSECT、およびMINUSを使用して複数のクエリを組み合わせることができます。これを複合クエリと呼びます。すべての集合演算子は同じ優先順位を持ちます。SQL文に複数の集合演算子が含まれる場合、OceanBaseデータベースは、括弧で明示的に順序を指定しない限り、左から右の順に評価します。
集合演算子のルールと制限
OceanBaseデータベースでは、集合演算において ORDER BY および LIMIT 句を指定できますが、他の句の使用は許可されません。
集合演算に参加する各クエリ結果の列数と対応する式の数は同じでなければならず、対応するデータ型も互換性がある必要があります(例:数値または文字)。
集合演算子のルール
複合クエリで文字データを選択した場合、戻り値のデータ型は以下のとおりです:
長さが同じ
CHAR型の値を2つ照会する場合、返される値は同じ長さのCHAR型になります。長さが異なるCHAR型の値を照会する場合、返される値は、長い方のCHAR値の長さを持つVARCHAR2型になります。1つまたは2つのクエリが
VARCHAR2型の値を選択している場合、返される値はVARCHAR2型になります。
複合クエリで数値データを選択した場合、戻り値のデータ型は数値の優先順位によって決定されます:
BINARY_DOUBLE型の値を照会する場合、返される値はBINARY_DOUBLE型になります。どのクエリも
BINARY_DOUBLE型の値を選択していないが、BINARY_FLOAT型の値を選択している場合、返される値はBINARY_FLOAT型になります。すべてのクエリが
NUMBER型の値を選択している場合、返される値はNUMBER型になります。
集合演算子を使用するクエリでは、OceanBaseデータベースはデータ型グループ間で暗黙的な変換を実行しません。コンポーネントクエリの対応する式が文字データと数値データの両方として解釈される場合、OceanBaseデータベースはエラーを返します。
集合演算子の制限
集合演算子には以下の制限があります:
集合演算子は
BLOBおよびCLOB列には使用できません。集合演算子の前の
SELECTリストに式が含まれている場合、その式に列エイリアスを指定する必要があります。これはORDER BY句で参照するためです。設定した演算子を
UPDATEステートメントで指定することはできません。これらの演算子のサブクエリで
ORDER BYステートメントを指定することはできません。テーブル集合式を含む
SELECTステートメントでこれらの演算子を使用することはできません。
UNIONとUNION ALL演算子
UNION 演算子は、2つ以上の SELECT ステートメントの結果セットを結合するために使用されます。UNION 内部の SELECT ステートメントは、列数が同じでなければなりません。また、列のデータ型も互換性がある必要があります。さらに、各 SELECT ステートメント内の列の順序も同じでなければなりません。UNION の属性として UNION ALL および UNION DISTINCT を指定できます(または UNIQUE のみを使用することもできます)。これらはそれぞれ、集合値が重複可能かどうかを表します。他の集合演算では ALL 属性を指定することはできません(それらには DISTINCT 属性のみがあります)。すべての集合演算のデフォルト属性は DISTINCT であり、UNION 演算子は異なる値を選択します。
構文
{ (< SQL- クエリステートメント1>) }
UNION [ALL]
{ (< SQL- クエリステートメント2>) }
INTERSECT演算子
INTERSECT 演算子は、2つの結果セットの共通部分、つまり2つのクエリで両方とも返されるすべての重複しない値を返します。
構文
{ (< SQL- クエリ文1>) }
INTERSECT
{ (< SQL- クエリ文2>) }
制限事項
すべてのクエリにおいて、列数と列の順序が同じでなければなりません。
比較する2つのクエリ結果セットの列データ型は異なってもかまいませんが、互換性が必要です。
比較する2つのクエリ結果セットには、比較できないデータ型の列(XML、TEXT、NTEXT、IMAGE、または非バイナリCLRユーザー定義型)を含めることはできません。
戻される結果セットの列名は、演算子の左側にあるクエリが返す列名と同じでなければなりません。
ORDER BY句内の列名またはエイリアスは、左側のクエリが返す列名を参照している必要があります。COMPUTEおよびCOMPUTE BY句と併用することはできません。行を比較して重複しない値を特定する場合、2つの
NULL値は等しいと見なされます。
MINUS演算子
MINUS 演算子は、2つの結果セットの差を返します。つまり、左側のクエリで検索されたが、右側のクエリでは検索されなかったすべての一意でない値を返します。
説明
OceanBaseデータベースは MINUS のみをサポートし、EXCEPT はサポートしていません。両者の意味は同じです。
構文
{ (< SQL- クエリステートメント1>) }
MINUS
{ (< SQL- クエリステートメント 2>) }
実行順序
MINUS 演算子は、式内の他の演算子と共に使用される場合、次のような実行順序を持ちます:
括弧内の式を評価します。
INTERSECT演算子を実行します。式内での位置に基づき、左から右の順に評価された
MINUSとUNIONを実行します。
MINUS または INTERSECT が2つ以上のクエリセットの比較に使用される場合、データ型の変換は一度に2つのクエリを比較することで決定され、前述の式の評価ルールに従います。
例
テーブル table_a とテーブル table_b を作成し、各テーブルにデータを挿入します。
CREATE TABLE table_a(PK INT, name VARCHAR(25));
INSERT INTO table_a VALUES(1,'フォックス');
INSERT INTO table_a VALUES(2,'パトカー');
INSERT INTO table_a VALUES(3,'タクシー');
INSERT INTO table_a VALUES(4,'リンカーン');
INSERT INTO table_a VALUES(5,'ニューヨーク');
INSERT INTO table_a VALUES(6,'ワシントン');
INSERT INTO table_a VALUES(7,'デル');
INSERT INTO table_a VALUES(10,'ロジャースソン');
CREATE TABLE table_b(PK INT, name VARCHAR(25));
INSERT INTO table_b VALUES(1,'フォックス');
INSERT INTO table_b VALUES(2,'パトカー');
INSERT INTO table_b VALUES(3,'タクシー');
INSERT INTO table_b VALUES(6,'ワシントン');
INSERT INTO table_b VALUES(7,'デル');
INSERT INTO table_b VALUES(8,'マイクロソフト');
INSERT INTO table_b VALUES(9,'アップル');
INSERT INTO table_b VALUES(11,'スコットランド');
UNIONの例
obclient> SELECT PK, name FROM table_a
UNION
SELECT PK, name FROM table_b;
+------+-----------+
| PK | NAME |
+------+-----------+
| 1 | 福克斯 |
| 2 | 警车 |
| 3 | 的士 |
| 4 | 林肯 |
| 5 | 纽约 |
| 6 | 华盛顿 |
| 7 | 戴尔 |
| 10 | 朗讯 |
| 8 | 微软 |
| 9 | 苹果 |
| 11 | 苏格兰 |
+------+-----------+
11 rows in set
UNION ALLの例
obclient> SELECT PK, name FROM table_a
UNION ALL
SELECT PK, name FROM table_b;
+------+-----------+
| PK | NAME |
+------+-----------+
| 1 | 福克斯 |
| 2 | 警车 |
| 3 | 的士 |
| 4 | 林肯 |
| 5 | 纽约 |
| 6 | 华盛顿 |
| 7 | 戴尔 |
| 10 | 朗讯 |
| 1 | 福克斯 |
| 2 | 警车 |
| 3 | 的士 |
| 6 | 华盛顿 |
| 7 | 戴尔 |
| 8 | 微软 |
| 9 | 苹果 |
| 11 | 苏格兰 |
+------+-----------+
16 rows in set
INTERSECTの例
obclient> SELECT PK, NAME FROM table_a
INTERSECT
SELECT PK, NAME FROM table_b;
+------+-----------+
| PK | NAME |
+------+-----------+
| 1 | 福克斯 |
| 2 | 警车 |
| 3 | 的士 |
| 6 | 华盛顿 |
| 7 | 戴尔 |
+------+-----------+
5 rows in set
MINUSの例
obclient> SELECT PK, NAME FROM table_a
MINUS
SELECT PK, NAME FROM table_b;
+------+--------+
| PK | NAME |
+------+--------+
| 4 | 林肯 |
| 5 | 纽约 |
| 10 | 朗讯 |
+------+--------+
3 rows in set