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