Post

SQL - SET OPERATION, JOIN

Set Operation

집합 연산에 대한 설명이다.

아래의 테이블을 기준으로 설명하도록 하겠다.

img_3.png

UNION

두 개의 질의 결과를 합집합해서 출력

1
2
3
4
5
6
7
SELECT *
FROM STUDENT
WHERE CID=1
UNION
SELECT *
FROM STUDENT
WHERE CID=2;

img.png

INTERSECT

두 개의 질의 결과를 교집합해서 출력

1
2
3
4
5
6
7
SELECT *
FROM STUDENT
WHERE cid=1
INTERSECT 
SELECT *
FROM STUDENT
WHERE CIRCLE=2;

img_1.png

MINUS

두 개의 질의 결과를 차집합해서 출력

1
2
3
4
5
6
7
SELECT *
FROM STUDENT
WHERE cid=1
MINUS
SELECT *
FROM STUDENT
WHERE CIRCLE=2;

img_2.png

JOIN

  • 하나 이상의 테이블에 포함된 속성들을 검색 결과로 출력할 때 사용되는 기술이다.
  • 조인에 참여할 테이블을 공통된 속성을 가져야 한다.
  • 두 테이블에서 조인 속성의 값이 동일한 레코드들이 연결한다.

아래의 테이블을 기준으로 설명하도록 하겠다.

img.png

안시 조인(ANSI JOIN)과 오라클 조인(ORACLE JOIN)이 있는데 오라클에서는 10G 버전부터 안시 조인을 지원하기 시작했다. 여기서는 안시 조인을 기준으로 설명하겠다.

등가 조인

조인 조건에 등호를 사용하는 조인이다.

1
2
3
4
5
SELECT S.USER AS user, S.GRADE AS grade, C.NAME AS college
FROM STUDENT AS S
INNER JOIN COLLEGE AS C
ON S.CID = C.COLLEGE_ID;
-- STUDENT의 CID와 COLLEGE_ID가 같은 것을 체크해서 JOIN

img_1.png

비 등가 조인

조인 조건에 등호를 제외한 조인이다. 이런 경우 해당 숫자가 어떤 범위에 속해있는지를 알기 위해 사용한다.

1
2
3
4
5
SELECT S.USER AS user, G.GRADE AS grade
FROM STUDENT AS S
INNER JOIN GRADE_ALPHABET AS G
ON S.GRADE BETWEEN G.LOW AND G.HIGH;
-- STUDENT의 GRADE가 어떤 GRADE_ALPHABET인지 출력

img_2.png

Outer Join

완전히 1대 1 대응이 아닌 JOIN이다. JOIN할 값이 없을 경우 NULL로 출력한다.

LEFT와 RIGHT OUTER JOIN은 어느쪽 테이블이 기준이 되느냐에 따라 정해지면 만약 왼쪽 테이블이 기준이라면 LEFT, 오른쪽 테이블이 기준이라면 RIGHT를 사용한다.

만약 두 개의 테이블 모두의 데이터를 JOIN 후 빈 데이터를 NULL로 표기하고 싶다면 FULL OUTER JOIN을 사용하면 되지만 MYSQL의 경우 LEFT와 RIGHT 두개를 모두 구한 후 UNION하는 방식으로 사용해야한다.

1
2
3
4
SELECT S.USER AS user, C.NAME AS circle
FROM STUDENT AS S
LEFT OUTER JOIN CIRCLE AS C 
ON S.CIRCLE = C.CIRCLE_ID;

img_3.png

참고자료

This post is licensed under CC BY 4.0 by the author.