Search
Duplicate
moon
sun

조인

조인 (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
복사