集合演算子UNION、UNION ALL、INTERSECT、MINUSを使用して複数のクエリを組み合わせることができます。これを複合クエリと呼びます。すべての集合演算子は同じ優先順位を持ちます。SQL文に複数の集合演算子が含まれる場合、OceanBaseデータベースは、括弧で明示的に順序を指定しない限り、左から右の順に処理します。
集合演算子のルールと制限
OceanBaseデータベースでは、集合演算にORDER BYおよびLIMIT句を指定できますが、他の句の使用は許可されていません。
集合演算に参加する各クエリ結果の列数と対応する式の数は同じでなければならず、対応するデータ型も互換性が必要です(例:数値または文字)。
集合演算子のルール
複合クエリで文字データを選択した場合、戻り値のデータ型は以下のとおりです:
二つの長さが等しい
CHAR型の値を照会する場合、返される値は同じ長さのCHAR型です。長さが異なるCHAR型の値を照会する場合、返される値は、長い方のCHAR値の長さになるVARCHAR2型です。一つまたは二つのクエリが
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