JOIN
- 데이터베이스에서 '두 개 이상의 테이블'을 연결하여 '하나의 결과의 테이블'로 만드는 것을 의미하며 이를 통해 데이터를 효율적으로 검색하고 처리하는데 도움을 줍니다.
- JOIN을 사용하는 이유는 데이터베이스에서 테이블을 분리하여 '데이터 중복을 최소화'하고 '데이터의 일관성'을 유지하기 위함이니다.
- 대표적으로 INNER JOIN, OUTER JOIN(LEFT, RIGHT, FULL) 등이 있으며 각각의 JOIN 방식에 따라 결과가 달라집니다.

SQL 데이터
CREATE TABLE department
(
DepartmentID INT,
DepartmentName VARCHAR(20)
);
CREATE TABLE employee
(
LastName VARCHAR(20),
DepartmentID INT
);
INSERT INTO department(DepartmentID, DepartmentName) VALUES(31, '영업부');
INSERT INTO department(DepartmentID, DepartmentName) VALUES(33, '기술부');
INSERT INTO department(DepartmentID, DepartmentName) VALUES(34, '사무부');
INSERT INTO department(DepartmentID, DepartmentName) VALUES(35, '마케팅');
INSERT INTO employee(LastName, DepartmentID) VALUES('Rafferty', 31);
INSERT INTO employee(LastName, DepartmentID) VALUES('Jones', 33);
INSERT INTO employee(LastName, DepartmentID) VALUES('Steinberg', 33);
INSERT INTO employee(LastName, DepartmentID) VALUES('Robinson', 34);
INSERT INTO employee(LastName, DepartmentID) VALUES('Smith', 34);
INSERT INTO employee(LastName, DepartmentID) VALUES('John', NULL);
1. CROSS JOIN
CROSS JOIN 절은 조인되는 두 테이블에서 곱집합을 반환한다. 즉, 두 번쨰 테이블로부터 각 행과 첫 번째 테이블에서 각 행이 한번씩 결합된 열을 만들 것이다.예를 들어 m행을 가진 테이블과 n행을 가진 테이블이 교차 조인되면 m*n개의 행을 생성한다.
SELECT * FROM employee CROSS JOIN department;
SELECT * FROM employee, department;

2. 내부 조인
내부 조인(inner join)은 두 테이블 모두에서 일치하는 데이터만 선택합니다. 예를 들어, 고객 테이블과 주문 테이블을 INNER JOIN하면, 주문이 있는 고객 정보만 결과로 나타납니다.
SQL은 '명시적 조인 표현'(explicit)과 '암시적 조인 표현'(implicit) 2개의 다른 조인식 구문을 지정한다.
'명시적 조인 표현'에서는 테이블에 조인을 하라는 것을 지정하기 위해 JOIN 키워드를 사용한다.
SELECT *
FROM employee INNER JOIN department
ON employee.DepartmentID = department.DepartmentID;
'암시적 조인 표현'은 SELECT 구문의 FROM 절에서 그것들을 분리하는 컴마를 사용해서 단순히 조인을 위한 여러 테이블을 나열하기만 한다. 그리하여 그것은 교차 조인(cross join)을 지정하면, WHERE 절은 추가적인 필터 구문(명시적 구문에서 조인 구문을 비교하는 역할을 하는)을 적용할 것이다.
SELECT *
FROM employee, department
WHERE employee.DepartmentID = department.DepartmentID;
두 테이블의 DepartmentID 컬럼을 이용해서 Employee 와 Department 테이블을 조인할 것이다. 이 두테이블에서 DepartmentID가 일치하는 곳(즉, 조인 구문이 충족되는 곳)에서 쿼리는 LastName, DepartmentID와 DepartmentName 컬럼을 결과 열로 결합할 것이다. DepartmentID가 일치하지 않는다면, 어떠한 결과 값도 생성되지 않을 것이다.

주의 : 프로그래머는 조인 조건이 명시적으로 IS NULL 또는 IS NOT NULL과 같은 추가 구문을 사용하지 않는다면 NULL은 어떠한 값도 일치하지 않으므로(심지어 NULL 자체도) NULL 값이 포함될 수 있는 테이블을 조인하는데 있어서 특별한 주의를 기울여야 한다.
내부 조인
1) 동일 조인
동일 조인(Equi-Join)은 조인하는 두 테이블 간의 컬럼 값이 동등한 경우에만 해당 데이터를 연결합니다. 이는 조인 구문에서 '=' 연산자를 사용하여 표현됩니다. 예를 들어, 두 테이블의 특정 컬럼 값이 서로 같을 때만 해당 행들을 결합합니다.
SELECT * FROM employee JOIN department ON employee.DepartmentID = department.DepartmentID;

2) 자연 조인
자연 조인(natural join)은 두 테이블 간에 동일한 이름을 가진 컬럼을 기반으로 자동적으로 조인을 수행합니다. 명시적으로 조인 조건을 지정하지 않습니다. 대신, 두 테이블에서 이름이 같은 모든 컬럼을 찾아 그 값이 일치하는 행을 자동으로 연결합니다.
SELECT * FROM employee NATURAL JOIN department;

자연 조인과 동등 조인 차이점
- 자연 조인은 조인 조건을 명시하지 않고, 동일한 이름의 컬럼을 자동으로 찾아 조인합니다. 반면, 동등 조인은 명시적으로 조인할 컬럼을 지정해야 합니다.
- 자연 조인은 간결함과 자동화의 이점을 제공하지만, 데이터베이스의 구조를 잘 이해하고 있어야 합니다. 동등 조인은 조인 조건을 더 세밀하게 제어할 수 있으며, 특정한 조인 요구 사항에 더 적합할 수 있습니다.
외부조인(Outer Join)
외부 조인(Outer Join)은 데이터베이스에서 사용되는 중요한 조인 유형 중 하나입니다. 이 조인은 두 테이블 간에 일치하는 행 뿐만 아니라 일치하지 않는 행도 결과에 포함시킵니다.
Left Outer Join
- 왼쪽 테이블의 모든 행과 오른쪽 테이블에서 일치하는 행을 결합합니다. 오른쪽 테이블에 일치하는 행이 없는 경우, 해당 행의 오른쪽 테이블 컬럼을 NULL로 채워집니다.
- 사용 예 : 고객 테이블(A)과 주문 테이블(B)을 왼쪽 외부 조인하면, 주문을 하지 않은 고객의 정보도 결과에 포함됩니다.
SELECT * FROM employee
LEFT OUTER JOIN department
ON employee.DepartmentID = department.DepartmentID;

Right Outer Join
- 오른쪽 테이블의 모든 행과 왼쪽 테이블에서 일치하는 행을 결합합니다. 왼쪽 테이블에 일치하는 행이 없는 경우, 해당 행의 왼쪽 테이블 컬럼은 NULL로 채워집니다.
- 주문 테이블(A)과 고객 테이블(B)을 오른쪽 외부 조인하면, 고객이 없는 주문 정보도 결과에 포함됩니다.
SELECT * FROM employee
RIGHT OUTER JOIN department
ON employee.DepartmentID = department.DepartmentID;

Full Outer Join
- MySQL은 기본적으로 완전 외부 조인(Full Outer Join)을 지원하지 않습니다.
- 하지만, 왼쪽 외부 조인과 오른쪽 외부 조인을 'UNION' 연산자를 사용하여 결합함으로써 완전 외부 조인과 동일한 결과를 얻을 수 있습니다.
SELECT * FROM employee LEFT OUTER JOIN department ON employee.DepartmentID = department.DepartmentID
UNION
SELECT * FROM employee RIGHT OUTER JOIN department ON employee.DepartmentID = department.DepartmentID;
