출처 : http://naver.kaist.ac.kr/oracle_sql/s05.htm
1. Join이란?
◈DB상에서 한 개 이상의 테이블로부터 데이터가 요구될 시 조인 조건이 사용된다.
◈한 테이블의 행들은 타 테이블의 column에 존재하는 공통된 값, 일반적으로 Primary key와
Foreign key 값을 사용하여 조인한다.
♣ Join 방법
◈주로 사용되는 두 개의 조인 방법
1. Equijoin : = 로 조인한 경우
2. Non-equijoin : = 을 쓰지 않고 조인한 경우
◈추가적인 조인 방법
1. Outer join : 데이터가 한 쪽 테이블에만 있을 경우에 전체를 출력한다.
2. Self join : 자기 자신과 조인
3. Set operators : union 등
♣ Cartesian product
◈Cartesian product는 다음과 같은 경우에 발생된다.
◈조인 조건을 생략한 경우와 조인 조건이 잘못된 경우
◈첫번째 테이블의 모든 행들이 두번째 테이블의 모든 행과 조인이 되는 경우
◈Cartesian product를 피하기 위해서는 WHERE절에 정확한 조인 조건을 쓰도록 한다.
◈Cartesian product란?
◈모든 가능한 행들의 조합이 display된다.
◈첫번째 테이블의 모든 행들은 두번째 테이블의 모든 행들과 조인 된다.
♠실습 : Catesian Product가 발생된 잘못된 조인 예
SQL> SELECT name, last_name FROM s_dept, s_emp; |
※ 현재 s_dept 테이블은 12개의 행, s_emp 테이블은 25개의 행으로 구성되어 있다.(12*25 = 300)
2. 단순 조인 Query(Equijoin)
두개 이상의 관련 테이블로 부터 데이터를 출력 시키기 위하여 WHERE 절에 단순한 조인 조건문을 작성한다.
♣ Syntax
SELECT table.column, table.column - 데이터를 검색할 테이블 column
FROM table1, table2
WHERE table1.column1 = table2.column2; - 조인 조건
◈Guidelines
◈같은 column명이 한개 이상의 테이블에 존재하는 경우 column명은 해당 테이블명을
붙여 사용한다.
◈테이블들을 함께 조인하기 위해서는 최소한 테이블 개수 1 조건의 개수가 필요하다.
즉 4개의 테이블을 조인하기 위해 최소 3개의 조인 조건이 필요하다.
◈두 테이블 상에서 각 column의 값이 일치하여야 한다.
♠실습 : s_emp테이블과 s_dept테이블을 조인하여 출력하시오.
SQL> SELECT s_emp.last_name, s_emp.dept_id, s_dept.name |
♣ 테이블명 사용
◈두개의 테이블상에서 같은 이름이 존재하지 않는 경우는 column명을 테이블명과 같이 쓸 필요가
없으나 테이블명을 접두사로 사용함으로써 향상된 성능을 얻을 수 있다.
♠실습 : 모든 부서에 대해 부서번호, 지역번호 및 지역명을 출력하시오.
SQL> SELECT s_dept.id, s_region.id, s_region.name |
♣ 추가적인 검색 조건
◈조인 이외에 WHERE절에 추가적인 조건을 가질 수 있는데, AND연산자 등을 이용한다.
◈테이블 Alias는 SQL코드를 더 적게하므오 더 적은 메모리를 사용하게 해준다.
♠실습 : Menchu라는 사원의 성, 부서번호 및 부서이름을 출력하시오.
SQL> SELECT s_emp.last_name, s_emp.dept_id, s_dept.name |
♣ 테이블 Alias 사용
◈테이블 이름을 사용하여 column명을 명확히 할때 테이블 이름이 긴 경우 매우 많은 시간을 요할 때
테이블의 alias로 column을 명확히 할 수 있다.
◈현재의 SELECT 문장에 대해서만 유효하다.
◈Alias를 작성한 경우 테이블 이름 대신에 테이블의 alias를 사용하여 columnm참조시 error발생을
방지한다.
♠실습 : 모든 고객에 대해 고객 이름, 지역번호 및 지역이름을 display 하고, 테이블 참조를 단축하기
위해 테이블 alias를 지속적으로 사용해야 한다.
SQL> SELECT c.name, c.region_id, r.name |
♠실습 : commission을 받는 모든 사원들의 성, 지역 이름 및 commission_pct를 출력하시오.
SQL> SELECT e.last_name, r.name, e.commission_pct |
3. Non-Equijoin
◈Non-Equijoin은 한 테이블의 어떤 column도 join할 테이블의 한 column에 직접적으로 일치하지
않을 시 사용한다.
◈조인조건은 등등(=)이외의 연산자를 갖는다.
◈예를들어 EMP와 SALGRADE 사이의 관련성은 EMP 테이블의 어떠한 column도 직접적으로
SALGRADE 테이블의 한 column에 상응하지 않기 때문에 Non-Equijoin이다.
※ <= 및 >= 같은 다른 연산자를 사용가능하나 BETWEEN이 가장 단순하다.
BETWEEN 사용시 하한값을 먼저 명시하고 상한값을 나중에 명시한다는 것을 명심하라.
♠실습 : 사원의 급여 등급을 평가하기 위한 Non-Equijoin을 사용하라.급여는 하한값과 상한값의
사이에 있어야 한다.
SQL> SELECT e.ename, e.sal, s.grade |
4. Outer Join
◈정상적으로 조인 조건을 만족하지 못하는 행들을 보기위해 outer join을 사용한다.
◈조인시킬 값이 없는 조인측에서 "(+)"를 위치 시킨다. 즉, 정보가 부족한 조인측에 위치한다.
◈Outer join을 포함하는 조건은 IN 연산자를 사용할 수 없고, OR 연산자에 의해 다른 하나의 조건에
연결 불가능하다.
◈(+)연산자는 한 개 이상의 NULL 행을 생성하고 정보가 충분한 테이블의 한 개 이상의 행들이 이런
NULL 행에 조인된다.
♣ Syntax
SELECT table.column, table.column
FROM table1.table2
WHERE table1.column = table2.column(+);
또는
SELECT table.column, table.column
FROM table1.table2
WHERE table1.column(+) = table2.column;
◈ 여기서, (+)는 Outer join 기호이다. 이 기호는 WHERE절 조건의 어느측에 올 수 있으나
양측 모두에는 올 수 없다. Outer join 연산자를 일치하는 행이 없는 테이블쪽에 두라.
♣ Outer join의 제약사항
◈Outer join은 표현식의 한 측에만 올수 있는데 정보가 부재한 쪽에 둔다.
다른 테이블의 어떠한column과도 일치하지 않는 한 테이블의 행을 돌려준다.
◈Outer join을 포함하는 조건은 IN 연산자를 사용할 수가 없고 OR 연산자에 의해 다른 하나의 조건에
연결 불가능하다.
♠실습 : 모든 고객에 대해 담당 영업사원 이름과 사번 및 고객 이름을 출력하라.
이때 고객을 담당하는 담당 영업사원이 없더라도 고객 이름을 출력하도록 하라.
SQL> SELECT e.last_name, e.id, c.name |
5. Self Join
◈Self join을 사용하여 한 테이블의 행들을 같은 테이블의 행들과 조인한다.
◈한개의 테이블을 두 개의 별도의 테이블처럼 사용하기 위해 테이블 alias를 사용하여 한 테이블을
자체적으로 조인가능하다.
◈FROM절 상에서 두 개의 테이블을 시뮬레이트하기 위해 아래 예는 같은 테이블인 S_EMP 테이블에
대해 alias를 사용하고 있다.
◈이 예에서 WHERE절은 사원의 관리자 번호가 관리자에 대한 직원번호와 일치하는것을 의미하는 조인
조건을 포함하고 있다.
♠실습 : 사원의 이름과 각자의 관리자를 출력하시오.
SQL> SELECT worker.last_name||' 관리자 '||manager.last_name |