Search

JOIN, UNION

JOIN

(INNER) JOIN

조인하는 테이블의 ON절의 조건과 일치하는 결과만 출력
표준 SQL과는 달리 MySQL에서는 JOIN, INNER JOIN, CROSS JOIN이 모두 같은 의미로 사용
SELECT [컬럼이름] FROM [테이블이름1] AS [별명] (INNER) JOIN [테이블이름2] AS [별명] ON [조인 조건] WHERE [조건]; -- 함축 구문SELECT [컬럼이름] FROM [테이블이름1] AS [별명], [테이블이름2] AS [별명] WHERE [조건] AND [조건];
SQL
복사

LEFT/RIGHT (OUTER) JOIN

OUTER JOIN은 조인하는 테이블의 ON절의 조건과 일치하는 한 쪽의 데이터를 모두 가져옵니다.
LEFT/RIGHT는 두 테이블이 합쳐질 때 어느 쪽을 기준으로 했느냐에 따라 달라집니다.
FULL OUTER JOIN도 있지만 성능 상 거의 사용하지 않습니다.
SELECT [컬럼이름] FROM [테이블이름1] LEFT/RIGHT (OUTER) JOIN [테이블이름2] ON [조인 조건] WHERE [조건];
SQL
복사

FULL OUTER JOIN

MySQL에선 FULL OUTER JOIN을 지원하지 않으므로 간접적으로 구현해야 합니다.
이 때 사용하는 UNION은 DISTINCT가 포함되어 자동으로 중복이 제거됩니다.
SELECT [컬럼이름] FROM [테이블이름1] AS [별명] LEFT JOIN [테이블이름2] AS [별명] ON [조건] UNION SELECT [컬럼이름] FROM [테이블이름1] AS [별명] LEFT JOIN [테이블이름2] AS [별명] ON [조건]
SQL
복사

EXCLUSIVE LEFT/RIGHT JOIN

두 테이블 중 하나의 테이블에만 있는 데이터를 가져옵니다.
LEFT JOIN과 WHERE절의 조건을 함께 사용하여 만드는 JOIN문법입니다.
SELECT [컬럼이름] FROM [테이블이름1] AS [별명] LEFT JOIN [테이블이름2] AS [별명] ON [테이블1의 키] = [테이블2의 키] WHERE [테이블2의 키] IS NULL;
SQL
복사

CROSS JOIN

ON절 없이 사용하며 모든 조합(모든 행의 곱)을 반환합니다.
SELECT [컬럼이름] FROM [테이블이름1] CROSS JOIN [테이블이름2];
SQL
복사

SELF JOIN

테이블 자기 자신을 조인합니다.
SELECT [별명1.컬럼이름] AS [컬럼별명], [별명2.컬럼이름] AS [컬럼별명] FROM [테이블이름] AS [별명1], [테이블이름] AS [별명2] WHERE [조건];
SQL
복사

UNION

여러 개의 SELECT문의 결과를 하나의 테이블이나 결과 집합으로 표현할 때 사용합니다.
이 때 각각의 SELECT문으로 선택된 컬럼의 개수와 타입, 순서가 모두 같아야 합니다.
UNION을 사용하면 자동으로 중복이 제거됩니다.
A와 B 테이블이 공통 요소가 없더라도 UNION은 합집합을 반환합니다.
UNION ALL을 사용하면 중복이 제거되지 않고 모든 값이 출력됩니다.
SELECT [컬럼이름] AS [별명] FROM [테이블이름1] (WHERE [조건]) UNION SELECT [컬럼이름] AS [별명] FROM [테이블이름2] (WHERE [조건]) (ORDER BY [컬럼이름]);
SQL
복사

JOIN vs UNION

차이를 직관적으로 보여주는 stackoverflow의 한 답변..
적용 조건
JOIN : 두 테이블에 적어도 하나의 공통 컬럼이 있어야만 적용 가능
UNION : SELECT절의 컬럼 이름, 개수, 타입, 순서가 같을 때 적용 가능