두 개 이상의 테이블들을 연결 또는 결합하여 데이터를 출력하는 것을 조인이라고 하며 일반적으로 사용 되는 SQL문의 상당수가 조인으로 이루어져 있다.
일반적인 경우 PRIMARY KEY와 FOREIGN KEY의 값 연관에 의해 조인이 이루어지며 PK,FK관계와는 별도로 일반 칼럼끼리 조인이 이루어지는 경우도 있다.
테이블을 연결하려면, 적어도 하나의 칼럼을 서로 공유하고 있어야 하므로 이를 이용하여 데이터 검색에 활용한다.
왜 필요한지가 중요하다. 아래 예시 처럼 백앤드와 프론트앤드를 구분을 해서 채팅방에 회원을 넣어줘야 하는 경우가 있다고 가정하자.
왼쪽 테이블에서 숫자만 보고 누가 백앤드인지 프론트앤드인지 구분이 되지않는다. 하지만 오른쪽 테이블을 참조해서 보면 누가 백앤드이고 프론트앤드인지 구분이 된다.
이러한 이유 때문에 필요하다.
정리하자면…
SQL 조인 쉽게 이해하기 위한 다이어 그램입니다.


명시적 조인 표현
테이블에 조인을 하나는 것을 지정하기 위해 JOIN 키워드를 사용하며 그리고 나서 다음의 예제와 같이 ON 키워드를 조인에 대한 구문을 지정하는데 사용한다.
SELECT
A.NAME, B.AGE
FROM EX_TABLE A
INNER JOIN JOIN_TABLE B ON A.NO_EMP = B.NO_EMP;
암시적 조인 표현
SELECT 구문의 FROM 절에서 그것들을 분리하는 컴마를 사용해서 단순히 조인을 위한 여러 테이블을 나열하기만 한다.
SELECT * FROM A, B WHERE A.NO_EMP = B.NO_EMP;

명시적 조인 표현
SELECT * FROM MEMBER CROSS JOIN DISCORD;
암시적 조인 표현
SELECT * FROM MEMBER, DISCORD;

비등가 조인은 동등비교(=)를 사용하지 않는 조인으로 조건문이 크거나 작거나 같이 않은 비교등을 사용하면 비등가 조인이라고 합니다.
암시적 조인 표현
SELECT * FROM MEMBER, DISCORD;
WHERE MEMBER.TYPEID between 1 and 2;
내부 조인의 경우에는 공통 컬럼명 기반으로 결과 집합을 생성합니다. 반면에 외부 조인은 조건문에 만족하지 않는 행도 표시해주는 조인입니다. 그래서, 조인을 했을 때 한쪽의 테이블에 데이터가 없어도 조인 결과에 포함시키는 조인입니다. 외부 조인은 3가지 종류가 있고 각각에 대해서 예제를 통해서 알아보도록 하겠습니다.

왼쪽 외부 조인은 테이블 A의 모든 데이터와 테이블 B와 매칭이 되는 레코드를 포함하는 조인입니다.
SELECT
A.NAME, B.AGE
FROM EX_TABLE A
LEFT OUTER JOIN JOIN_TABLE B ON A.NO_EMP = B.NO_EMP

왼쪽 외부 조인은 테이블 B의 모든 데이터와 테이블 A와 매칭이되는 레코드를 포함하는 조인입니다.

완전 외부 조인은 MySQL에서는 명시적인 SQL 구문은 지원하지 않지만, UNION을 사용해서 완전 외부 조인을 할 수 있습니다.
# 방법1 : JOIN와 UINION
SELECT *
FROM table1
LEFT OUTER JOIN table2
ON table1.n = table2.n
UNION
SELECT *
FROM table1
RIGHT OUTER JOIN table2
ON table1.n = table2.n;
# 방법2 : UNION ALL and exclusion join
SELECT *
FROM table1
LEFT OUTER JOIN table2
ON table1.n = table2.n
UNION ALL
SELECT *
FROM table1
RIGHT OUTER JOIN table2
ON table1.n = table2.n
WHERE table1.n IS null;
셀프 조인은 자기 자신과 조인하는 조인입니다. 예를 들면, 임직원중에 같은 부서에서 일하는 직원을 알고 싶으면 셀프 조인을 사용하면 좋습니다.
-- 셀프 조인(SELF JOIN)
# 암묵적 표현법 (implicit notation)
SELECT A.first_name AS EmployeeName1, B.first_name AS EmployeeName2, A.dept_no
FROM employees AS A, employees AS B
WHERE A.emp_no <> B.emp_no
AND A.dept_no = B.dept_no;
안티 조인은 서브 쿼리내에서 존재하지 않는 데이터만 추출하여 메인 쿼리에서 추출하는 조인입니다.
세미 조인은 안티 조인과 반대로 서브 쿼리 내에서 존재하는 데이터만을 가지고 메인 쿼리에서 추출하는 방식입니다.