집합 연산

집합 연산 (Set Operations)

집합 연산에는 UNION, INTERSECT, EXCEPT, IN, EXISTS가 있어요. 이 연산들은 두 테이블 사이의 행을 결합하거나 비교해요.

출처: 문서

본문

UNION

UNION과 UNION ALL은 어느 한 테이블에서 발견되는 행을 반환해요. UNION은 중복 없는 행만 가져오지만, UNION ALL은 결과 행에서 중복을 제거하지 않아요.

Flink SQL> create view t1(s) as values ('c'), ('a'), ('b'), ('b'), ('c');
Flink SQL> create view t2(s) as values ('d'), ('e'), ('a'), ('b'), ('b');

Flink SQL> (SELECT s FROM t1) UNION (SELECT s FROM t2);
+---+
| s|
+---+
| c|
| a|
| b|
| d|
| e|
+---+

Flink SQL> (SELECT s FROM t1) UNION ALL (SELECT s FROM t2);
+---+
| c|
+---+
| c|
| a|
| b|
| b|
| c|
| d|
| e|
| a|
| b|
| b|
+---+

INTERSECT

INTERSECT와 INTERSECT ALL은 두 테이블 모두에서 발견되는 행을 반환해요. INTERSECT는 중복 없는 행만 가져오지만, INTERSECT ALL은 결과 행에서 중복을 제거하지 않아요.

Flink SQL> (SELECT s FROM t1) INTERSECT (SELECT s FROM t2);
+---+
| s|
+---+
| a|
| b|
+---+

Flink SQL> (SELECT s FROM t1) INTERSECT ALL (SELECT s FROM t2);
+---+
| s|
+---+
| a|
| b|
| b|
+---+

EXCEPT

EXCEPT와 EXCEPT ALL은 한 테이블에서는 발견되지만 다른 테이블에서는 발견되지 않는 행을 반환해요. EXCEPT는 중복 없는 행만 가져오지만, EXCEPT ALL은 결과 행에서 중복을 제거하지 않아요.

Flink SQL> (SELECT s FROM t1) EXCEPT (SELECT s FROM t2);
+---+
| s |
+---+
| c |
+---+

Flink SQL> (SELECT s FROM t1) EXCEPT ALL (SELECT s FROM t2);
+---+
| s |
+---+
| c |
| c |
+---+

IN

표현식이 주어진 테이블 서브쿼리에 존재하면 true를 반환해요. 서브쿼리 테이블은 한 컬럼으로 구성되어야 하고, 이 컬럼은 표현식과 같은 데이터 타입이어야 해요.

SELECT user, amount
FROM Orders
WHERE product IN (
SELECT product FROM NewProducts
)

옵티마이저는 IN 조건을 join 및 group 연산으로 다시 씁니다. 스트리밍 질의의 경우 질의 결과를 계산하는 데 필요한 상태가 고유 입력 행 수에 따라 무한정 커질 수 있어요. 과도한 상태 크기를 막기 위해 적절한 상태 TTL(time-to-live)을 가진 질의 구성을 제공할 수 있어요. 이는 질의 결과의 정확성에 영향을 줄 수 있다는 점에 주의해요. 자세한 내용은 query configuration을 참고해요.

EXISTS

SELECT user, amount
FROM Orders
WHERE product EXISTS (
SELECT product FROM NewProducts
)

서브쿼리가 하나 이상의 행을 반환하면 true를 반환해요. 연산이 join 및 group 연산으로 다시 쓰여질 수 있을 때만 지원돼요.

옵티마이저는 EXISTS 연산을 join 및 group 연산으로 다시 씁니다. 스트리밍 질의의 경우 질의 결과를 계산하는 데 필요한 상태가 고유 입력 행 수에 따라 무한정 커질 수 있어요. 과도한 상태 크기를 막기 위해 적절한 상태 TTL을 가진 질의 구성을 제공할 수 있어요. 이는 질의 결과의 정확성에 영향을 줄 수 있다는 점에 주의해요. 자세한 내용은 query configuration을 참고해요.

더 알아보기 (Learn more)