JOIN (INNER / LEFT / RIGHT / OUTER)
설명
둘 이상의 테이블을 연결하여 데이터를 확인할 수 있는 방법이다. 연결하고자 하는 테이블 간 공통적인 컬럼이 있어야 하며, 그 컬럼은 그 테이블의 PK 혹인 FK 로 사용되고 있어야 한다.
[JOIN 설명을 위한 두 테이블 정의]
CREATE TABLE S1 (
ID INT PRIMARY KEY,
NAME VARCHAR(30) NOT NULL
);
INSERT INTO S1 VALUES
(111, 'AAA'),
(222, 'BBB'),
(333, 'CCC'),
(444, 'DDD');
CREATE TABLE S2 (
ID INT PRIMARY KEY,
NAME VARCHAR(30) NOT NULL
);
INSERT INTO S2 VALUES
(111, 'AAA'),
(222, 'BBB'),
(555, 'EEE'),
(666, 'FFF');
위와 같이 테이블과 데이터가 생성이 되었을 때를 예시로 설명하였다.
INNER JOIN (S1 ∩ S2)
두 테이블 모두 값이 존재하는 영역에 대해서만 값을 SELECT 한다. 또한 JOIN 의 DEFAULT JOIN 이다.
SELECT * FROM S1
JOIN S2 ON S1.ID = S2.ID;
LEFT JOIN (S1)
좌측 테이블(S1) 에 해당되는 모든 ID값을 기준으로 SELECT 한 것을 보여준다. S1 테이블에 존재하는 ID 이지만 S2 테이블에는 존재하지 않는 ID 라면, S2 테이블에 해당되는 값들은 모두 NULL값으로 보여진다.
SELECT * FROM S1
LEFT JOIN S2 ON S1.ID = S2.ID;
LEFT JOIN (S1 - S2)
좌측 테이블(S1) 에 해당되는 모든 ID값을 기준으로 S2.ID 의 값은 NULL 인 부분만 SELECT 하여 보여준다.
SELECT * FROM S1
LEFT JOIN S2 ON S1.ID = S2.ID
WHERE S2.ID IS NULL;
RIGHT JOIN (S2)
우측 테이블(S2) 에 해당되는 모든 ID값을 기준으로 SELECT 한 것을 보여준다. S2 테이블에 존재하는 ID 이지만 S1 테이블에는 존재하지 않는 ID 라면, S1 테이블에 해당되는 값들은 모두 NULL값으로 보여진다.
SELECT * FROM S1
RIGHT JOIN S2 ON S1.ID = S2.ID;
RIGHT JOIN (S2 - S1)
우측 테이블(S2) 에 해당되는 모든 ID값을 기준으로 S1.ID 의 값은 NULL 인 부분만 SELECT 하여 보여준다.
SELECT * FROM S1
RIGHT JOIN S2 ON S1.ID = S2.ID
WHERE S1.ID IS NULL;
OUTER JOIN (S1 ∪ S2)
좌측 테이블과 우측 테이블 ID값에 해당되는 모든 부분들을 SELECT 하여 보여준다. 오라클에서는 OUTER JOIN 이 사용 가능하지만 MySQL 에서는 지원을 하지 않기때문에 LEFT JOIN 과 RIGHT JOIN 을 UNION 하는 방식으로 구현할 수 있다.
SELECT * FROM S1
LEFT JOIN S2 ON S1.ID = S2.ID
UNION
SELECT * FROM S1
RIGHT JOIN S2 ON S1.ID = S2.ID;
OUTER JOIN (S1 ∪ S2 - S1 ∩ S2)
좌측 테이블과 우측 테이블 ID값에 해당되는 모든 부분들 중 공통되는 부분을 제외한 부분을 SELECT 하여 보여준다. 오라클에서는 OUTER JOIN 이 사용 가능하지만 MySQL 에서는 지원을 하지 않기때문에 LEFT JOIN 과 RIGHT JOIN 을 UNION 하는 방식으로 구현할 수 있다.
SELECT * FROM S1
LEFT JOIN S2 ON S1.ID = S2.ID
WHERE S1.ID IS NULL OR S2.ID IS NULL
UNION
SELECT * FROM S1
RIGHT JOIN S2 ON S1.ID = S2.ID
WHERE S1.ID IS NULL OR S2.ID IS NULL;
'Data Base > SQL' 카테고리의 다른 글
SQL) 순위함수(RANK, DENSE_RANK, ROW_NUMBER) (0) | 2021.09.03 |
---|---|
SQL) You can't specify target table '<Table>' for update in FROM clause (0) | 2021.09.02 |
SQL) 연산자 우선순위 (0) | 2021.08.23 |
엔터티 (Entity) (0) | 2021.08.12 |
MySQL 정수 타입 (Integer types) (0) | 2021.08.06 |
댓글