조인 (JOIN)
여러 테이블을 조합하여 조회하는 방식
테이블의 별칭
: 테이블의 대한 별칭은 테이블명 뒤에 한 칸을 띄우고 지정한다.
SELECT *
FROM 테이블명1 별칭1, 테이블명2 별칭2, ... ;
SQL
복사
•
긴 이름의 테이블명을 짧은 이름의 별칭으로 지정하여
코드를 가독성이 높게 작성해주는 것을 권장한다.
•
ex)
SELECT *
FROM employee emp, department dept;
SQL
복사
조인 종류
내부조인
•
동등 조인
•
세미 조인
•
안티 조인
•
셀프 조인
외부조인
•
(+)
•
ANSI 조인
◦
LEFT OUTER JOIN
◦
RIGTH OUTER JOIN
◦
FULL OUTER JOIN
◦
CROSS JOIN (카타시안 조인)
내부조인 (INNER JOIN)
•
동등 조인
•
세미 조인
•
안티 조인
•
셀프 조인
동등조인 (EQUI JOIN)
: 등호(=) 연산자를 사용하여, 2개 이상의 테이블을 연결지어 출력하는 방식
SELECT *
FROM A, B
WHERE A.x = B.y;
SQL
복사
•
INNER JOIN
: 왼쪽 테이블과 오른쪽 테이블의 조인 조건에 만족하는 교집합이 되는 데이터를 조회하는 방식
SELECT *
FROM A INNER JOIN B
ON (A.x = B.y);
SQL
복사
세미 조인 (SEMI JOIN)
: 서브 쿼리에 존재하는 데이터만 메인 쿼리에서 추출하여 출력하는 방식
•
IN 또는 EXISTS 연산자를 사용한 조인
안티 조인 (ANTI JOIN)
: 서브 쿼리에 존재하는 데이터만 제외하고 메인 쿼리에서 추출하여 출력하는 방식
셀프 조인 (SELF JOIN)
: 동일한 하나의 테이블을 2번 이상 조합하여 출력하는 방식
외부조인 (OUTER JOIN)
LEFT OUTER JOIN
왼쪽 테이블을 먼저 읽어드린 후,
조인 조건에 일치하는 오른쪽 테이블을 함께 조회하는 것
조건에 만족하지 않는, 오른쪽 테이블의 데이터는 NULL 로 조회된다.•
ANSI
테이블1 A LEFT [OUTER] JOIN 테이블2 B ON 조인조건;
테이블1 A LEFT [OUTER] JOIN 테이블2 B USING(공통컬럼);
SQL
복사
•
(+)
FROM 테이블1 A, 테이블2 B
WHERE A.공통컬럼 = B.공통컬럼(+)
SQL
복사
RIGHT OUTER JOIN
오른쪽 테이블을 먼저 읽어드린 후,
조인 조건에 일치하는 왼쪽 테이블을 함께 조회하는 것
조건에 만족하지 않는, 왼쪽 테이블의 데이터는 NULL 로 조회된다.•
ANSI
테이블1 A RIGHT [OUTER] JOIN 테이블2 B ON 조인조건;
테이블1 A RIGHT [OUTER] JOIN 테이블2 B USING(공통컬럼);
SQL
복사
•
(+)
FROM 테이블1 A, 테이블2 B
WHERE A.공통컬럼(+) = B.공통컬럼
SQL
복사
FULL OUTER JOIN
조인 조건에 일치하는 양쪽 테이블의 데이터를 조합하여 조회하는 것
조건에 만족하지 않는, 양쪽에 데이터는 NULL 로 조회된다.테이블1 A FULL [OUTER] JOIN 테이블2 B ON 조인조건;
SQL
복사
카타시안 조인 (Catesian; CATASIAN PRODUCT) : CROSS 조인
: WHERE 절에 조인 조건이 없는 조인
•
A 테이블의 데이터 건수 : X
•
B 테이블의 데이터 건수 : Y
•
결과 건수 : X * Y (두 테이블의 곱)
SELECT *
FROM employees e
,departments d;
SQL
복사
•
ANSI
SELECT *
FROM employees e
CROSS JOIN departments d;
SQL
복사
HR, 한글HR 스키마 실습 코드
내부조인
•
동등조인
SELECT e.employee_id
,e.first_name
,d.department_id
,d.department_name
FROM employees e
,departments d
WHERE e.department_id = d.department_id;
SQL
복사
•
세미조인
EXISTS 사용
SELECT department_id, department_name
FROM departments d
WHERE EXISTS(SELECT *
FROM employees e
WHERE e.department_id = d.department_id
AND e.salary > 3000 )
ORDER BY d.department_name;
SQL
복사
IN 사용
SELECT department_id, department_name
FROM departments d
WHERE d.department_id IN ( SELECT e.department_id
FROM employees e
WHERE e.salary > 3000 )
ORDER BY d.department_name
SQL
복사
•
안티조인
NOT EXISTS 사용
SELECT department_id, department_name
FROM departments d
WHERE NOT EXISTS(SELECT *
FROM employees e
WHERE e.department_id = d.department_id
AND e.salary > 3000 )
ORDER BY d.department_name;
SQL
복사
NOT IN사용
SELECT e.employee_id
,e.first_name
,d.department_id
,d.department_name
FROM employees e
,departments d
WHERE e.department_id = d.department_id
AND e.department_id NOT IN (
SELECT department_id
FROM departments
WHERE manager_id IS NULL
)
;
SQL
복사
•
셀프조인
◦
“사원과 관리자” 를 함께 조회하시오.
SELECT a.employee_id 사원번호
,a.first_name 사원명
,b.employee_id 관리자번호
,b.first_name 관리자명
,a.department_id 부서번호
FROM employees a,
employees b
WHERE a.manager_id = b.employee_id
AND a.department_id = b.department_id
;
SQL
복사
외부조인
•
LEFT OUTER JOIN
(+)
: 조인 조건에서 데이터가 없는(NULL) 테이블의 컬럼에 기호를 붙여준다.
SELECT e.emp_id
,e.emp_name
,d.dept_id
,d.dept_title
FROM employee e
,department d
WHERE e.dept_code = d.dept_id(+)
;
SQL
복사
ANSI
SELECT e.emp_id
,e.emp_name
,d.dept_id
,d.dept_title
FROM employee e LEFT OUTER JOIN department d -- OUTER 생략가능
ON e.dept_code = d.dept_id
;
SQL
복사
•
RIGHT OUTER JOIN
(+)
: 조인 조건에서 데이터가 없는(NULL) 테이블의 컬럼에 기호를 붙여준다.
SELECT e.emp_id
,e.emp_name
,d.dept_id
,d.dept_title
FROM employee e
,department d
WHERE e.dept_code(+) = d.dept_id
;
SQL
복사
ANSI
SELECT e.emp_id
,e.emp_name
,d.dept_id
,d.dept_title
FROM employee e RIGHT OUTER JOIN department d -- OUTER 생략가능
ON e.dept_code = d.dept_id
;
SQL
복사
외부조인 유의사항
: 두 테이블의 조인 조건이 되는 공통 컬럼에 모두 (+) 기호를 붙여야한다.
•
ex) 공통컬럼 : employee_id, department_id
SELECT e.employee_id
,e.first_name
,j.job_id
,j.department_id
FROM employees e
,job_history j
WHERE e.employee_id = j.employee_id(+)
AND e.department_id = j.department_id(+)
;
SQL
복사
•
FULL OUTER JOIN
(+) 기호로 구현 불가
SELECT *
FROM employee e
,department d
WHERE e.dept_code(+) = d.dept_id(+); -- (+) 기호로는 FULL JOIN 불가
SQL
복사
ANSI
SELECT e.emp_name
,d.dept_title
FROM employee e
FULL OUTER JOIN department d
ON dept_code = d.dept_id;
SQL
복사











