セット操作
TiDBは、UNION、EXCEPT、およびINTERSECT演算子を使用した3つの集合演算をサポートしています。セットの最小単位はSELECT
ステートメントです。
UNIONオペレーター
数学では、2つのセットAとBの和集合は、AまたはBにあるすべての要素で構成されます。次に例を示します。
select 1 union select 2;
+---+
| 1 |
+---+
| 2 |
| 1 |
+---+
2 rows in set (0.00 sec)
TiDBは、 UNION DISTINCT
つとUNION ALL
のオペレーターの両方をサポートします。 UNION DISTINCT
は結果セットから重複レコードを削除し、 UNION ALL
は重複を含むすべてのレコードを保持します。 TiDBではデフォルトでUNION DISTINCT
が使用されます。
create table t1 (a int);
create table t2 (a int);
insert into t1 values (1),(2);
insert into t2 values (1),(3);
UNION DISTINCT
クエリとUNION ALL
クエリの例は、それぞれ次のとおりです。
select * from t1 union distinct select * from t2;
+---+
| a |
+---+
| 1 |
| 2 |
| 3 |
+---+
3 rows in set (0.00 sec)
select * from t1 union all select * from t2;
+---+
| a |
+---+
| 1 |
| 2 |
| 1 |
| 3 |
+---+
4 rows in set (0.00 sec)
EXCEPT演算子
AとBが2つのセットである場合、EXCEPTは、AにはあるがBにはない要素で構成されるAとBの差分セットを返します。
select * from t1 except select * from t2;
+---+
| a |
+---+
| 2 |
+---+
1 rows in set (0.00 sec)
EXCEPT ALL
演算子はまだサポートされていません。
INTERSECT演算子
数学では、2つのセットAとBの共通部分は、AとBの両方にあるすべての要素で構成され、他の要素は含まれません。
select * from t1 intersect select * from t2;
+---+
| a |
+---+
| 1 |
+---+
1 rows in set (0.00 sec)
INTERSECT ALL
演算子はまだサポートされていません。 INTERSECT演算子は、EXCEPTおよびUNION演算子よりも優先されます。
select * from t1 union all select * from t1 intersect select * from t2;
+---+
| a |
+---+
| 1 |
| 1 |
| 2 |
+---+
3 rows in set (0.00 sec)
括弧
TiDBは、括弧を使用して集合演算の優先順位を指定することをサポートしています。括弧内の式が最初に処理されます。
(select * from t1 union all select * from t1) intersect select * from t2;
+---+
| a |
+---+
| 1 |
+---+
1 rows in set (0.00 sec)
Order By
とLimit
を使用する
TiDBは、セット操作でのORDER BY
つまたはLIMIT
の句の使用をサポートしています。これらの2つの句は、ステートメント全体の最後にある必要があります。
(select * from t1 union all select * from t1 intersect select * from t2) order by a limit 2;
+---+
| a |
+---+
| 1 |
| 1 |
+---+
2 rows in set (0.00 sec)