2021-12-13 18:14 작성

My SQL basic 메모

Table of contents

주의: MySQL은 INTERSECT 연산자를 지원하지 않는다. 이번 튜토리얼은 MySQL에서 JOIN을 이용해 INTERSECT를 모방하는 방법에 대해 학습한다.

SQL INTERSECT 연산자 도입

INTERSECT 연산자는 두 개 혹은 그 이상의 쿼리에서 distinct rows만을 반환하는 set 연산자다.

다음은 INTERSECT 연산자의 기본 문법이다:

(SELECT column_list
FROM table_1)
INTERSECT
(SELECT column_list
FROM table_2);

INTERSECT 연산자는 두 쿼리의 result sets을 비교하고 두 쿼리로 발생하는 결과인 distinct rows를 반환한다.

둘 이상의 쿼리에서 INTERSECT 연산자를 사용하기 위해 다음의 규칙을 따라야 한다:

  1. 쿼리들의 select list에 존재하는 columns의 수와 순서는 같아야만 한다.
  2. 상응하는 columns의 data types는 호환 가능해야 한다.

다음의 벤 다이어그램은 INTERSECT 연산자를 시각적으로 보여준다.


왼쪽의 쿼리는 (1,2,3) result set을 생산한다.

오른쪽의 쿼리는 (2,3,4) result set을 생산한다.

INTERSECT 연산자는 (2,3)을 포함하는 두 result sets의 distinct rows를 반환한다.

UNION 연산자와 달리 INTERSECT 연산자는 두 원(circles) 사이에서 교차점을 반환한다.



MySQL에서 INTERSECT 모방하기

샘플 tables 설정하기

다음의 구문은 t1t2 tables를 생성하고 두 tables에 데이터를 집어 넣는다.

CREATE TABLE t1 (
    id INT PRIMARY KEY
);

CREATE TABLE t2 LIKE t1;

INSERT INTO t1(id) VALUES(1),(2),(3);

INSERT INTO t2(id) VALUES(2),(3),(4);


1) DISTINCT와 INNER JOIN 절을 사용해 INTERSECT 모방하기

다음의 구문은 INNER JOINDISTINCT 연산자를 사용하여 두 tables에서 distinct rows를 반환한다.

SELECT
    id
FROM t1
    INNER JOIN t2 USING(id);

output:

id
2
3
  1. INNER JOIN 절은 양 쪽 table에서 rows를 반환한다.
  2. DISTINCT 연산자는 중복 rows를 제거한다.


2) IN과 subquery를 사용해 INTERSECT 모방하기

다음의 구문은 IN 연산자와 subquery를 사용해 두 result sets의 교차값을 반환한다.

SELECT DISTINCT id
FROM t1
WHERE id IN (SELECT id FROM t2);

output:

id
2
3
  1. subquery는 첫 번째 result set을 반환한다.
  2. outer query는 IN 연산자를 사용해 첫 번째 result set에 존재하는 값만을 선택한다. DISTINCT 연산자는 오직 distinct values만을 선택하게 한다.

IN이 가능하다면 EXISTS를 통해서도 가능하다는 것을 알 수 있다. subquery가 대용량 데이터일 경우 EXISTS를 활용할 수 있을 것이다.