두 개 이상의 테이블을 연결 또는 결합하여 데이터를 출력하는 것을 JOIN 이라고 부릅니다. 일반적으로 하나의 데이터베이스에 테이블은 1개가 아닌 여러 개로 구성되어 있으며 테이블 간 관계가 있습니다. 그렇기 때문에 일반적으로 사용되는 SQL 문장들의 대부분은 JOIN을 통해 데이터를 조회합니다. 이는 관계형 데이터베이스의 가장 큰 장점이자 핵심적인 기능입니다
일반적인 경우 행들은 기본키(PK)나 외래키(FK) 값의 관계 의해서 JOIN이 성립됩니다. 하지만 어떤 경우에는 논리적인 값들의 연관만으로도 JOIN이 가능합니다.
FROM 절에 여러 테이블을 나열하여 JOIN을 할 수 있는데, 이때 JOIN의 발생은 두 테이블만 JOIN이 이루어집니다. 이렇게 2개의 테이블이 JOIN이 완료되면 그다음 테이블과 방금 JOIN된 테이블과의 두 번째 JOIN이 발생합니다. 이렇게 FROM에 작성된 모든 TABLE과의 JOIN이 발생합니다.
EQUI(등가) JOIN은 두 테이블 간에 칼럼의 값들이 서로 같은 경우 두 데이터를 하나의 데이터로 합치는 JOIN을 말합니다. 이때 주로 사용되는 칼럼이 PRIMARY KEY(PK)와 FOREIGN KEY(FK)입니다. 물론 PK와 FK 말고도 다른 칼럼의 값으로도 EQUI JOIN이 성립합니다.
기본 구조
= 연산자를 사용하여 표현합니다.Non EQUI(비등가) JOIN은 두 개의 테이블 간에 칼럼들이 서로 정확하게 일치하는 것이 아닌 특정 범위 내에 있는 경우 JOIN을 하고자 할 때 사용합니다. 그래서 = 연산자가 아닌 다른 (BETWEEN, >, >=, <, <= ) 연산자들을 사용을 합니다. 다만 설계상의 이유로 Non EQUI JOIN을 수행하지 못하는 경우도 있습니다.

SELECT e.ename '사원명', e.sal '급여', s.grade '급여등급'
FROM emp e, salgrade s
WHERE e.sal BETWEEN s.losal AND s.hisal;
또한 LIKE 연산으로 다른 테이블의 값을 이용하여 JOIN을 나타낼 수 있습니다.

SELECT COUNT(*) AS CNT
FROM emp_tbl a, rule_tbl b
WHERE a.ename LIKE b.rule;
3개 이상의 테이블을 JOIN을 할 때는 FROM 절에 JOIN 하고자 하는 테이블을 차례대로 작성해 주면 됩니다. 그러면 첫 번째와 두 번째 순서의 테이블이 먼저 JOIN 이 완료되고 그다음 순서로 세 번째 테이블과의 JOIN이 이루어지면서 3개 테이블의 JOIN이 완료됩니다. (JOIN은 항상 두개의 테이블에서 일어난다)
| Q. 문제 | 조인에 대한 설명으로 적절한 것은? |
|---|---|
| A. (1) | 조인은 다른 데이터베이스 시스템 간의 데이터 이동을 위해 사용된다 |
| A. (2) | 관련된 데이터를 단 하나의 테이블에서 결합하여 검색하는 것을 조인이라고 한다 |
| A. (3) | 데이터 그룹화하고 정렬하는 데 조인이 필수로 사용된다 |
| A. (4) | 2개 이상의 집합을 결합하여 데이터를 출력하는 것을 조인이라고 한다 |
답
(4)
| Q. 문제 | EQUI 조인에 대한 설명으로 옳지 않은 것은? |
|---|---|
| A. (1) | INNER JOIN 을 사용하여 JOIN을 만들 수 있다 |
| A. (2) | 두 개의 테이블 간에 교집합을 구한다 |
| A. (3) | = 비교 연산자를 사용한다 |
| A. (4) | 모든 비교 연산자를 사용해서 조인할 수 있다. |
답
EQUI 조인은=을 사용해서 조인한다 (4)
현재 사용하는 집합 연산을 토대로 만든 관계형 대수들은 4개의 일반 집합 연산자와 4개의 순수 관계 연산자로 나눌 수 있습니다. SQL은 8개의 연산자를 활용한 연산을 구현하는 데 초점을 두고 진행합니다.

UNION 연산
UNION ALL
INTERSECTION 연산
DIFFERENCE 연산
PRODUCT 연산
순수 관계 연산자는 관계형 데이터베이스를 구현하기 위해 새롭게 만들어진 연산자입니다.

SELECT 연산
PROJECT 연산
JOIN 연산
DIVIDE 연산
2개 이상의 테이블을 합쳐서 원하는 결과를 만들어 출력하는 것을 '조인(JOIN)'이라고 합니다. JOIN은 관계형 데이터베이스에서 가장 핵심입니다. 사용자는 기존 WHERE 절의 검색 조건과 테이블 간의 JOIN 조건을 구분 없이 사용하던 방식을 그대로 사용할 수 있습니다. 동시에 추가된 선택 기능으로 JOIN 조건을 FROM 절에서 명시적으로도 정의할 수 있습니다. FROM 절에 명시적으로 사용할 수 있는 JOIN의 종류는 대표적으로 하나씩 알아가 보겠습니다.

예시
SELECT depno, empno, ename, dname
FROM emp NATURAL JOIN dept;
실습
군인 이름, 부대 이름, 계급을 Soldier, Unit 테이블의 NATURAL JOIN을 이용하여 출력해보세요.
SELECT first_name, unit_name, rank
FROM Soldier NATURAL JOIN Unit;
예시
SELECT empno, -- JOIN 컬럼에 대해 Alias 사용 불가
emp.ename,
dept.loc,
dept.dname
FROM emp JOIN dept
USING (deptno); -- 괄호 없으면 에러 발생, 괄호 필수!
실습
Soldier와 Unit 테이블을 USING절을 이용하여 부대 ID, 군인이름, 부대이름, 계급을 출력해보세요.
SELECT unit_id,
Soldier.first_name,
Unit.unit_name,
Soldier.rank
FROM Soldier JOIN Unit
USING (unit_id);
ON 조건절에 활용법
1. WHERE 절과의 혼용
ON 조건절은 WHERE 절과 충돌 없이 사용할 수 있습니다.
SELECT e.ename, e.deptno, d.deptno, d.dname
FROM emp e JOIN dept d
ON e.deptno = d.deptno
WHERE e.deptno = 30;
SELECT e.ename, e.deptno, d.deptno, d.dname
FROM emp e JOIN dept d
ON e.deptno = d.deptno AND e.mgr = 7698; -- WHERE 사용 권장
SELECT team_name, team_id, stadium_name
FROM team JOIN stadium
ON team.team_id = stadium.hometeam_id
ORDER BY team_id;
일반 집합 연산자의 PRODUCT 개념으로 테이블 간 JOIN 조건이 없는 경우 생길 수 있는 모든 데이터의 조합을 결과로 나타냅니다. 두 테이블에 대한 CARTESIAN PRODUCT 또는 CROSS PRODUCT 와 같은 표현으로도 불리며 결과는 M*N 건의 데이터 조합이 발생하게 됩니다.
CROSS JOIN 은 WHERE 절에 JOIN 조건을 추가하여 사용할 수 있습니다. 다만 INNER JOIN과 같은 결과를 얻기 때문에 CROSS JOIN 을 사용하는 의미가 없어지게 됩니다.
평소에는 CROSS JOIN이 필요한 경우는 많지 않지만, 간혹 튜닝이나 리포트를 작성하기 위해 의도적으로 사용하는 경우가 있습니다.
예시
부대 테이블과 봉사활동 테이블을 CROSS JOIN을 활용하여 부대 이름, 주스 종류, 판매수량을 판매수량 내림차순으로 하여 출력해 보세요.
SELECT unit_name, juice_type, quantity_sold
FROM Unit CROSS JOIN VolunteerActivity
ORDER BY quantity_sold DESC;
드라이빙 테이블(Driving Table)이란?
드라이빙 테이블은 데이터 행이 먼저 선택되는 테이블입니다.
SELECT *
FROM dept FULL [OUTER] JOIN dept_temp
ON dept.deptno = dept_temp.deptno;

JOIN 종류 정리

| Q. 문제 | 합집합을 만들 때 정렬을 유발하는 것은? |
|---|---|
| A. (1) | EXCEPT |
| A. (2) | MINUS |
| A. (3) | UNION ALL |
| A. (4) | UNION |
답
UNION 연산은 2개의 테이블을 하나로 합치며 중복 데이터를 제거한다. 이에 UNION은 정렬 과정을 발생시킨다
| Q. 문제 | Oracle 데이터베이스에서 차집합을 구하는 것은? |
|---|---|
| A. (1) | INTERSECTION |
| A. (2) | UNION ALL |
| A. (3) | MINUS |
| A. (4) | DIVIDE |
답
MINUS
| Q. 문제 | 데이터의 행 수가 가장 많이 조회되는 것은? |
|---|---|
| A. (1) | LEFT OUTER JOIN |
| A. (2) | RIGHT OUTER JOIN |
| A. (3) | CORSS JOIN |
| A. (4) | INNER JOIN |
답
CROSS JOIN은 카테시안 곱이 발생하여 많은 행이 조회된다