[Oracle] 18.JOIN(1)
join
이제부터 join 연산에 대해 배워보겠습니다.
join 연산은 한 개 이상의 테이블을 연결해서 데이터를 가져오는 연산입니다.
join 연산은 CROSS JOIN, INNER JOIN, OUTER JOIN이 있습니다!
CROSS JOIN
CROSS JOIN은 카티션 프로덕트(Cartesian Product)로 알려져 있으며,
조인에 참여한 테이블들의 모든 데이터가 추출됩니다.
CROSS JOIN은 잘 사용하지 않는데, 목적과는 상관없는 결과이기 때문입니다.
CROSS JOIN이 발생하는 상황은 다음과 같습니다.
- join 조건을 잘못 기술했을 때
- join 조건을 정의하지 않았을 때
- 조인 조건이 조인 조건에 참여하는 테이블의 모든 행이 조인되는 경우
SELECT
*
FROM
employees,
departments;
또는
SELECT
*
FROM
employees
CROSS JOIN departments;
크로스 조인 후 행의 갯수는 두 테이블의 행의 갯수를 곱한 것과 같습니다~
Inner Join=Equi Join
Inner Join은 테이블 간에 연결되는 속성을 지정해주거나 조건을 주어서 조건에 맞는 결과가 나오게 합니다!
가장 많이 사용됩니다~! 정말 중요해요!
Inner Join을 이용하기 위해서는 테이블 간에 공통되는 속성(꼭 이름이 같을 필요는 없음)이 존재해야합니다!
SELECT
*
FROM
employees,
departments
WHERE
employees.department_id = departments.department_id;
또는
SELECT
*
FROM
employees INNER JOIN departments
ON employees.department_id = departments.department_id;
또는
-- USING 절을 사용할 때는 공통되는 이름의 속성을 가지고 있어야함 --
SELECT
*
FROM
employees INNER JOIN departments
USING(department_id);
INNER JOIN 후 행의 수는 선행테이블의 행의 수와 같습니다(속성이 null인 것은 제외)
예제를 해볼까요?
--사원이름과 부서이름 가져오기--
SELECT
employees.first_name|| ' '|| employees.last_name "사원이름",
departments.department_name "부서이름"
FROM
employees,
departments
WHERE
employees.department_id = departments.department_id;
테이블 별칭 주기
같은 테이블 끼리도 조인 연산이 가능한데, 서로 구분하기 위해서 별칭을 줄 수 있습니다.
또, 보통 이름이 같지 않아도 테이블 명을 붙여주면 좋습니다!
테이블 명 별칭은 속성과 다르게 as로 줄 수는 없습니다!
-- 사원번호, 사원 명, 상사번호, 상사 명을 조회 --
SELECT
emp1.employee_id "사원번호",
emp1.first_name|| ' '|| emp1.last_name "사원 명",
emp1.manager_id "상사번호",
emp2.first_name|| ' '|| emp2.last_name "상사 명"
FROM
employees emp1, --테이블 별칭
employees emp2 --테이블 별칭
WHERE
emp1.manager_id = emp2.employee_id;
위의 결과를 보면 상사가 없는 사원은 검색이 되지 않았습니다~
그 이유는 선행테이블의 연결되는 속성값이 null인 것은 검색이 되지 않아서 그런 것인데요!
이것은 다음 장에서 배울 OUTER JOIN 을 이용하면 해결할 수 있습니다~!
다음과 같이 같은 테이블이 아니어도 별칭을 줄 수 있습니다.
SELECT
emp.job_id "직책",
first_name|| ' '|| last_name "사원 명",
email,
TO_CHAR(salary,'L999,999,999') "급여",
job_title "직책 명"
FROM
employees emp, -- 테이블 별칭 EMP
jobs job -- 테이블 별칭 JOB
WHERE
emp.job_id = job.job_id;
예제
- 성이 John인 사람의 부서명을 출력
SELECT
first_name|| ' '|| last_name "사원이름",
department_name "부서이름"
FROM
employees,
departments
WHERE
first_name = 'John'
AND employees.department_id = departments.department_id;
- 뉴욕에서 근무하는 사원의 이름과 급여를 조회
SELECT
emp.first_name||' '||emp.last_name "사원이름",
salary "급여",
loca.city "근무지"
FROM
employees emp,
departments dept,
locations loca
WHERE
emp.department_id = dept.department_id
AND dept.location_id = loca.location_id
AND loca.city = 'London';
위와 같이 테이블 2개뿐만 아니라 3개이상도 조인 연산이 가능합니다!