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절의 컬럼 이름, 개수, 타입, 순서가 같을 때 적용 가능