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
연산자를 사용하기 위해 다음의 규칙을 따라야 한다:
- 쿼리들의 select list에 존재하는 columns의 수와 순서는 같아야만 한다.
- 상응하는 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 설정하기
다음의 구문은 t1
과 t2
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 JOIN
과 DISTINCT
연산자를 사용하여 두 tables에서 distinct rows를 반환한다.
SELECT
id
FROM t1
INNER JOIN t2 USING(id);
output:
id |
---|
2 |
3 |
INNER JOIN
절은 양 쪽 table에서 rows를 반환한다.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 |
- subquery는 첫 번째 result set을 반환한다.
- outer query는
IN
연산자를 사용해 첫 번째 result set에 존재하는 값만을 선택한다.DISTINCT
연산자는 오직 distinct values만을 선택하게 한다.
IN
이 가능하다면 EXISTS를 통해서도 가능하다는 것을 알 수 있다. subquery가 대용량 데이터일 경우 EXISTS를 활용할 수 있을 것이다.