☞ JOIN 기본개념 및 종류 |
|
- 정의 : 하나 이상의 테이블로부터 연관된 데이터를 검색해오는 방법 - Join의 종류 1. Equijoin : 컬럼간의 값들이 서로 정확히 일치하는 경우에 사용, 일반적으로 PK, FK 관계에 의함 2. Non-Equijoin : 한 컬럼의 값이 다른 컬럼의 값과 정확히 일치하지 않는 경우에 사용 3. Outer Join : Join 조건을 만족하지 않는 경우에도 모든 행들을 다 보고자 하는 경우 사용 4. Self Join : 같은 테이블에 있는 행들을 Join하고자 하는 경우에 사용 5. Cartesian Join : Join에 대한 조건이 생략되거나 잘못 기술되면 한 테이블에 있는 모든 행들이 다른 테이블에 있는 모든 행들과 Join이 되어 얻어진 결과 6. ANSI Join ㅇ Natural Join : 두 테이블에 공통 칼럼이 있는 경우 별다른 조인 조건 없이 공통 칼럼에 대해 묵시적으로 조인이 되는 유형 ㅇ JOIN ~ USING : 조인하고자 하는 테이블에 같은 이름의 칼럼이 많은데, 이 중 특정한 칼럼으로만 조인하고 싶다면 조인하고자 하는 칼럼명에 USING 절을 사용 7. CROSS JOIN : CROSS 죠인은 두 테이블의 곱집합을 생성한다. 이는 두 테이블 간의 Cartesian 곱과 같다. 8. FULL OUTER 조인 9. INNER JOIN : SQL: 1999 표준에 의하면 두 테이블을 죠인하여 오로지 대응되는 행들만을 반환하는 것을 INNER 죠인이라 합니다. INNER 죠인의 결과와 함께 왼쪽(오른쪽) 테이블의 대응되지 않는 행들도 반환하는 것을 LEFT(RIGHT)OUTER 죠인이라 합니다. INNER 죠인의 결과와 함께 LEFT 및 RIGHT OUTER 죠인의 결과까지 모두 반환하는 것을 FULL OUTER 죠인이라 합니다. 10. NATURAL JOIN : NATURAL 죠인은 두 테이블에서 같은 이름을 가진 모든 컬럼에 기반한다. 두 테이블의 대응되는 모든 컬럼에 대해 같은 값을 가지는 행들을 선택한다. 만일 같은 이름을 가지는 컬럼들이 서로 다른 데이터 형을 가질 때에는 오류가 반환된다. 만일 SELECT * 문법을 사용한다면, 공통 컬럼들은 결과 집합에서 단 한번만 나타난다. 테이블 이름이나 가명 등의 수식자들은 NATURAL 죠인에 사용된 컬럼들을 수식할 수 없다.
|
☞ |
|
☞ ANSI Join |
|
예시) SELECT d.name, r.name FROM s_dept d JOIN s_region r USING (region_id) WHERE r.name like '%서울%' ; ㅇ JOIN ~ ON : 공통된 이름의 칼럼이 없다거나, 일반적인 조인을 수행하는 경우 가장 보편적으로 사용되는 조인 유형
예시) SELECT e.name 사원명, d.name 부서명, r.name 지역명 FROM s_emp e JOIN s_dept d ON (e.dept_id = d.dept_id ) JOIN s_region r ON (d.region_id = r.region_id ) WHERE d.name = '인사부' ;
▣ USING절을 이용한 조인 만일 여러 개의 컬럼이 이름은 같지만 데이터 형이 모두 일치되지는 않을 때에는, NATURAL JOIN은 USING 절을 이용하여 동등 죠인에 사용될 컬럼들을 명시하도록 수정될 수 있습니다.
USING 절에서 참조되는 컬럼들은 SQL 문 어디에서도 수식자(테이블 이름이나 가명)에 의해 수식될 수 없습니다.
NATURAL 과 USING의 두 키워드는 상호 배타적으로 사용됩니다.
예시) SELECT e.employee_id, e.last_name, d.location_id FROM employees e JOIN departments d USING (department_id); |
|
|
|
☞ SELF Join |
|
정의 : 한 테이블의 행을 같은 테이블에 있는 행과 연결하는 방법으로 같은 테이블을 마치 두 개의 테이블인 것처럼 사용하여 Join하는 방법 예시1) SELECT w.id 사번, w.name 사원명, m.id 부서장사번, m.name 부서장명 FROM s_emp w, s_emp m WHERE w.manager_id = m.id ; 예시2) SELECT w.id 사번, w.name 사원명, m.id 부서장사번, m.name 부서장명 FROM s_emp w JOIN s_emp m ON w.manager_id = m.id ; |
☞ Non-equ Join |
|
정의 : 한 칼럼의 값이 다른 칼럼의 값과 정확히 일치하지 않는 경우에 연산자 외의 다른 연산자를 사용하여 Join하는 방법 예시1) SELECT e.name, e.salary , g.grade 급여등급 FROM s_emp e, salgrade g WHERE e.salary BETWEEN g.losal AND g.hisal ; 예시2) SELECT e.name, e.salary , g.grade 급여등급 FROM s_emp e JOIN salgrade g ON e.salary BETWEEN g.losal AND g.hisal ;
|
☞ Outer Join |
|
예시) SELECT e.name 사원명,e.id,c.name 고객명 FROM s_emp e, s_customer c WHERE e.id(+) = c.sales_rep_id OR RIGHT JOIN s_customer c ON e.id = c.sales_rep_id ORDER BY 2;
|
|
- UNION(합집합), UNION ALL(합집합+교집합), INTERSECT(교집합), MINUS(차집합) ※ 첫 번째 SELECT구문에서 기술된 칼럼들과 두 번째 SELECT구문에서 기술된 칼럼들은 그 개수와 타입이 일치해야 함. ※ 칼럼의 Heading은 첫번째 SELECT구문의 칼럼명이 출력됨 ※ ORDER BY절은 마지막에 한 번만 기술됨
예시) S_EMP 테이블에서 사원의 사번, 이름, 그리고 담당 부서장을 아래의 결과와 같이 출력하되, Outer Join을 사용하지 않고 SET연산자를 사용하여 담당부서장이 없는 사원까지 나타내시오.
SQL> SELECT w.id 사번, w.name 사원명 , m.name 부서장명 FROM s_emp w, s_emp m WHERE w.manager_id = m.id UNION SELECT id 사번, name 사원명 , '부서장없음' FROM s_emp WHERE manager_id is null ;
Outer Join 연산의 경우) SQL> SELECT w.id 사번, w.name 사원명 , m.name 부서장명 FROM s_emp w LEFT JOIN s_emp m ON m.id = w.manager_id ; |
|
▣ LEFT OUTER 조인 SELECT e.last_name, d.department_name FROM employees e LEFT OUTER JOIN departments d ON (e.department_id = d.department_id); |
|
▣ RIGHT OUTER 조인 SELECT e.last_name, d.department_name FROM employees e RIGHT OUTER JOIN departments d ON(e.department_id = d.department_id) |
|
|
☞ CROSS Join |
|
SELECT last_name, department_name FROM employees CROSS JOIN departments; |
|
|
☞ NATURAL JOIN |
|
SELECT department_id, location_id FROM locations NATURAL JOIN departments; |
|
|
☞ FULL OUTER JOIN |
|
SELECT e.last_name, d.department_name FROM employees e FULL OUTER JOIN departments d ON (e.dept_id = d.dept_id); |
|
|
☞ 추가JOIN방법 |
|
▣ Exists를 이용한 조회
FROM locations l JOIN departments d ON ((l.location_id = d.location_id) AND NOT EXISTS ( SELECT 1 FROM employees e WHERE e.dept_id = d.dept_id ) ); |
|
|
|