두 개 이상의 테이블들을 연결해 데이터를 출력하는 것이다. 일반적으로 PK나 FK 값의 연관에 의해 조인이 성립된다. 하지만 어떤 경우에는 PK, FK 관계가 없어도 논리적 값들의 연관만으로 조인이 성립될 때도 있다.
FROM 절에 여러 테이블이 나열되더라도 SQL에서 데이터 처리 시 단 두개의 집합 간에만 조인이 발생된다.
조인의 기본 원리는 N개의 테이블을 카테시안 곱으로 테이블을 조합한다는 것이다.
FROM 절에 2개 이상의 테이블이 있을 때 두 테이블 사이 유효 JOIN 조건을 적지 않았을 때 해당 테이블에 대한 모든 데이터를 전부 결합해 테이블에 존재하는 행 갯수를 곱한만큼의 결과값이 반환되는 것이다.

사진 출처 : https://jasmine46.tistory.com/52
두 개의 테이블 간 칼럼 값들이 서로 정확히 일치하는 경우에 사용된다.
<, > 기호를 사용하지 않는다는 것을 기억해두자.
JOIN 조건은 WHERE 절에 기술한다.
SELECT 테이블1.칼럼명, 테이블2.칼럼명
FROM 테이블1, 테이블2
WHERE 테이블1.칼럼명 = 테이블2.칼럼명;
- ANSI/ISO SQL 표준 방식으로 표현
SELECT 테이블1.칼럼명, 테이블2.칼럼명
FROM 테이블1 INNER JOIN 테이블2
ON 테이블2.칼럼명 = 테이블1.칼럼명
테이블명.칼럼명을 사용하는 이유는 여러개의 테이블에 같은 칼럼명이 존재할 수 있기에 가독성과 유지보수성을 높이기 위해 사용한다.
두 개 테이블 간 논리적 연관 관계를 가지고 있으나 칼럼 값들이 서로 일치하지 않는 경우에 사용한다. =연산자가 아닌 다른 연산자들을 사용해 조인을 수행한다.
SELECT 테이블1.칼럼명, 테이블2.칼럼명
FROM 테이블1, 테이블2
WHERE 테이블1.칼럼명 BETWEEN 테이블2.칼럼명1 AND 테이블2.칼럼명2;
앞 서 나온 두 개의 조인 모두 다 결과가 참인 행들만 반환하는 내부조인이다. OUTER JOIN은 조인조건을 만족하지 않는 행들도 함께 반환할 때 사용한다.
Oracle의 경우 조인 칼럼 뒤에 (+) 기호를 사용해 OUTER JOIN을 나타낸다.
(+) 표시의 반대에 있는 테이블이 OUTER JOIN의 기준이 된다.
- Oracle
SELECT 테이블1.칼럼명, 테이블2.칼럼명
FROM 테이블1, 테이블2
WHERE 테이블2.칼럼명(+) = 테이블1.칼럼명;
- SQL Server
SELECT 테이블1.칼럼명, 테이블2.칼럼명
FROM 테이블1 LEFT JOIN 테이블2
ON 테이블1.칼럼먕 = 테이블2.칼럼명
조인에 성공한 행들은 INNER JOIN과 같이 조인에 참여한 각 테이블 칼럼의 값들이 표시되고 실패항 행들은 기준 테이블은 칼럼 값들은 NULL로 표시된다.
내부 조인이라고 하며 조인조건을 만족하는 행들을 반환한다. USING 조건절이나 ON 조건절을 필수로 사용해야 한다. 이때 INNER JOIN은 조인의 디폴트 옵션이라서 JOIN 이라고만 적어도 된다.
SELECT A.PLAYER_NAME, A.BACK_NO, B.TEAM_ID, B.TEAN_NAME
FROM PLAYER A INNER JOIN TEAM B
ON A.TEAM_ID = B.TEAM_ID;
두 테이블 간 동일한 이름을 갖는 모든 칼럼들에 대해 EQUI JOIN을 수행한다. 조인이 되는 테이블의 데이터 도메인과 컬럼명 등이 동일해야 한다.
추가로 USING 조건절, ON 조건절, WHERE 절에서 조인 조건 정의가 불가능 하다.
SQL Server에선 지원되지 않는다.
그리고 ALIAS나 테이블명 같은 접두사를 사용할 수 없다.
NATURAL JOIN에선 같은 이름을 가진 모든 칼럼들에 대해 조인이 이루어지지만, FROM절의 USING 조건절을 이용하면 같은 이름을 가진 칼럼들 중 원하는 칼럼에 대해서만 EQUI JOIN을 수행할 수 있다.
SQL Server에서 지원하지 않는다.
그리고 ALIAS를 사용할 수 없다.
SELECT DEPTNO, A.DNAME, A.LOC, B.DNAME, B.LOC
FROM DEPT A JOIN DET_TEMP B
USING (DEPTNO);
칼럼명이 달라도 조인 조건을 사용할 수 있다.
ON 조건절을 사용한 조인의 경우에는 이름이 같은 칼럼에 대해 ALIAS나 테이블명 같은 접두사를 명확히 지정해줘야 한다.
SELECT A.ENAME, A.DEPTNO, B.DEPTNO, B.DNAME
FROM EMP A JOIN B
ON B.DEPTNO = A.DEPTNO
WHERE B.DEPTNO = 30;
테이블 간 조인 조건이 없는 경우에도 조인을 할 수 있다.
테이블 A와 B가 있을 때, A를 기준으로 A와 B를 비교해 B의 조인 칼럼에 조인 조건을 만족하는 값이 있으면 해당 로우 데이터를 가져오고, 조인 조건에 만족하는 값이 없을 땐 B 테이블에서 가져오는 칼럼들은 NULL로 채운다. 이때 LEFT JOIN으로 표기해도 된다.
[TEST46_1] [TEST46_2]
COL1 COL2 COL1 COL2
------------- -------------
1 2 1 2
2 4 2 4
4 5 4 5
[RESULT]
TEST46_1. TEST46_1. TEST46_2. TEST46_2.
COL1 COL2 COL1 COL2
----------------------------------------------
1 2 1 2
2 2 2 4
3 3 NULL NULL
SELECT * FROM TEST46_1 LEFT OUTER JOIN TEST46_2
ON TEST46_1.COL1 = TEST46_2.COL1;
TEST46_1 테이블을 기준으로 OUTER JOIN을 수행한 것을 알 수 있다. 조인 조건에 맞지 않다면 TEST46_2 테이블에서 가져온 값들을 NULL로 채운 것을 확인할 수 있다.
테이블 A와 B가 있을 때, B를 기준으로 A와 B를 비교해 A의 조인 칼럼에 조인 조건을 만족하는 값이 있으면 해당 로우 데이터를 가져오고, 조인 조건에 만족하는 값이 없을 땐 A 테이블에서 가져오는 칼럼들은 NULL로 채운다. 이때 RIGHT JOIN으로 표기해도 된다.
좌측, 우측 테이블의 모든 데이터를 읽어 조인해 결과를 생성한다.
테이블 A와 B가 있을 때, RIGHT JOIN과 LEFT JOIN의 결과를 합집합으로 처리한 결과와 동일하다. 이때 조인에 성공한 행들은 한번만 표시한다.