Database/SQL

[Oracle/SQL] Oracle 조인

gangintheremark 2023. 7. 28. 13:26
728x90

오라클 조인은 반드시 오라클에서만 사용 가능한 조인을 의미한다.오라클 조인 방법의 특징은 여러 테이블을 연결하는 조인 조건을 WHERE 절에 명시한다.

Equi 조인

조인 대상이 되는 두 테이블에서 공통적으로 존재하는 컬럼의 값이 반드시 일치하는 행을 연결하여 데이터를 반환하는 조인이다. 기본키 primary key를 가진 테이블(master)과 참조키 foreign key를 가진 테이블(slave)을 조인할 때 사용한다. WHERE절에 두 개의 테이블을 연결할 조건인 조인 조건을 동등 연산자 =를 사용하여 명시한다.

-- 사원 테이블(employees)과 부서 테이블(departments)의 사원명과 부서명 출력
SELECT last_name,department_name
FROM employees, departments
WHERE employees.department_id = departments.department_id;

① 공통 컬럼 사용 시 모호성 제거

여러 테이블을 조인하는 경우, master 테이블의 기본키와 salve 테이블의 참조키로 동일한 컬럼명이 존재하게 된다. 이러한 공통 컬럼을 사용하는 경우에는 반드시 컬럼명 앞에 테이블명을 지정해야 된다.

테이블에 별칭(alias) 사용

FROM 절에도 테이블 별칭을 사용할 수 있다. 테이블명이 길거나 식별이 힘든 경우에 유용하다. 가독성⬆️

-- employees 테이블의 별칭은 emp, departments 테이블의 별칭은 dept로 지정
SELECT emp.last_name,department_name, emp.department_id
FROM employees emp, departments dept
WHERE emp.department_id = dept.department_id;

③ 검색 조건 추가

Oracle 조인에서는 WHERE절에 조인 조건과 검색 조건을 같이 지정하기 때문에 가독성이 떨어질 수 있다. 따라서 인 조건을 먼저 명시하고 나중에 검색조건을 명시한다.

-- 사원 테이블과 부서 테이블 조인시 이름이 Whalen 사원만 검색
SELECT emp.last_name,salary,department_name 
FROM employees emp, departments dept
WHERE emp.department_id = dept.department_id
AND last_name='Whalen';

Non-Equi 조인

WHERE절에 조인 조건을 지정할 때 동등 연산자(=) 이외의 연사자를 사용하는 조인을 의미한다.

--  사원들의 월급 등급을 조회
SELECT last_name, salary, grade_level
FROM employees e, job_grades g
WHERE e.salary BETWEEN g.lowest_sal AND g.highest_sal;

-- 사원들의 월급 등급 및 부서명까지 조회
SELECT last_name, salary, department_name, grade_level
FROM employees e, departments d, job_grades g
WHERE e.department_id = d.department_id
AND e.salary BETWEEN g.lowest_sal AND g.highest_sal;

self 조인

하나의 테이블에서 두 개의 칼럼이 연관 관계를 가지고 있는 경우에 사용한다.

-- 사원번호, 사원이름과 관리자번호, 관리자이름 조회
SELECT e.employee_id 사원번호, e.last_name 사원명, e.manager_id 관리자번호, m.last_name 관리자명 
FROM employees e, employees m
WHERE e.manager_id = m.employee_id;

위 SQL문에서 하나의 employees 테이블을 em 별칭을 사용하여 마치 두 개의 테이블처럼 사용하고 있다. 이렇게 하나의 테이블을 별칭(Alias)을 사용하여 조인하는 방식을self조인이라고 한다.

 

 

 

 

 

 


outer 조인

조인 조건에 만족하지 않는 데이터는 누락되며 조인 조건에 일치하는 데이터만 조회하는 것을Inner조인이라고 한다. equi non-equi self 조인이 모두 Inner 조인이라고 할 수 있다. Outer조인은 조인 조건에 만족하지 않아도 결과 값에 포함시키는 방식으로 (+) 연산자를 사용한다.

  • (+) 연산자는 조인하고자 하는 테이블 중 반드시 하나에만 사용 가능
  • (+) 연산자는 일치하는 데이터가 없는 쪽에 지정
  • (+) 연산자를 지정하면 내부적으로 한 개 이상의 널(null)을 가진 행이 생성되고 이렇게 생성된 널 행들과 데이터를 가진 테이블의 행들이 조인하게 되어 결과 값에 포함이 됨.
--  관리자가 없는 사원 정보도 모두 포함하여 사원의 이름과 담당 관리자의 사원번호를 조회
SELECT e.last_name 사원명, m.last_name 관리자명 
FROM employees e, employees m
WHERE e.manager_id = m.employee_id(+);

관리자 테이블(m)에 일치하는 데이터가 없기 때문에m.employee_id(+) 연산자를 지정해야 되며 실행결과는 다음과 같이 관리자가 없는 King 사원 정보도 포함되어 출력된다.

 

 

 

 


💡 cartesian product

cartesian product은 조인할 때 일치하는 데이터만 반환하지 않고 조인하는 각 테이블의 행 개수를 서로 곱한 결과가 반환된다. 유효한 데이터로 사용되지 못하며 일반적으로 조인 조건이 생략된 경우 발생한다. 조인 조건 명시의 중요성 ✨

728x90