DB/ORACLE

17.[오라클]JOIN 관련 정리

혼자좀비 2024. 2. 7. 18:19
  • 조인 연산자에 따른 구분 : 동등조인,안티조인
  • 조인대상에 따른 구분 : 셀프 조인
  • 조인 조건에 따른 구분 : 내부조인,외부조인,세미조인,카타시안조인
  • 기타 : ANSI조인
조인명 설명 예시
동등 조인 WHERE절에서 등호 연산자를 사용해
2개이상의 테이블이나 뷰를 연결한 조인
SELECT 
a.employee_id
, a.emp_name
, a.department_id
, b.department_name
FROM employees a, departments b
WHERE a.department_id = b.department_id;
  -> 부서 번호를 등호 연산자를 사용해 조회조건에 명시
세미조인 서브쿼리에 존재하는 데이터만 메인 쿼리에서 추출하는 조인 방법으로 IN과 EXISTS연산자를 사용한 조인 SELECT 
    department_id
  , department_name
FROM departments a
WHERE EXISTS (
    SELECT * FROM employees b
    WHERE a.department_id = b.department_id
    AND b.salary > 3000)
   ORDER BY a.department_name;
  -> EXISTS함수 안에 쓰여 있는 빨간색 부분이
     세미조인형식 

SELECT department_id, department_name
  FROM departments a
 WHERE a.department_id  IN 
  SELECT b.department_id FROM employees b
  WHER  E b.salary > 3000
)
ORDER BY department_name;
  ->빨간색 부분이 세미조인 형식
안티조인 서브쿼리의 B테이블에 없는 메인쿼리의 A테이블의 데이터만 추출하는 조인 방법
NOT IN이나 NOT EXISTS
세미조인과 반대의 개념이다.
SELECT 
  COUNT(*)
FROM employees a,
     departments b
WHERE a.department_id = b.department_id
AND a.department_id NOT IN 
   SELECT department_id FROM departments 
   WHERE manager_id IS NULL) ;
 -> b테이블에 없는 a데이터만 추출

SELECT 
  count(*)
FROM employees a
WHERE NOT EXISTS 
   SELECT 1
    FROM departments c
    WHERE a.department_id = c.department_id 
    AND manager_id IS NULL) ;
 -> A테이블에 대한 데이터만 추출
셀프 조인 서로 다른 두 테이블이 아닌 동일 테이블을 조인하는 방법 SELECT a.employee_id, a.emp_name, b.employee_id, b.emp_name, a.department_id
  FROM employees a,
        employees b
 WHERE a.employee_id < b.employee_id      
   AND a.department_id = b.department_id
   AND a.department_id = 20;
   -> 같은 테이블을 조인하여 결과같을 추출
외부 조인 조인 조건 중 (+)가 붙어있는 부분,
조인조건에서 데이터가 없는 테이블의 컬럼에(+)기호를 붙이는 것이 바로 외부조인이다.
참고로 외부조인은 조건에 해당하는 조인 조건 모두에게 (+)를 붙여야한다.

※외부조인시 주의점
 - 조인 대상 테이블 중 데이터가 없는 테이블 조인 조건에 (+)를 붙인다.
 - 외부 조인의 조인 조건이 여러개일 때 모든 조건에 (+)를 붙인다.
 - 한번에 한 테이블에만 외부 조인을 할 수 있다.
   (A,B,C가 있다고 하면 B,C에 대한 외부조인은 할수 없다.)
 - (+)연산자가 붙은 조건과 OR를 같이 사용할수 없다.
 - (+)연산자가 붙은 조건에는 IN연산자를 같이 사용할수없다.
   (단 IN절에 포함되는 값이 1개인 때는 사용 가능)
select 
    a.employee_id
  , a.emp_name
  , b.job_id
  , b.department_id 
from employees a,
       job_history b
where a.employee_id  = b.employee_id(+)
and a.department_id = b.department_id(+);
->외부 조인시 (+)를 명시한다.
카타시안 조인 WHERE절에 조건이 없는 조인을 말한다.
조인이 없으므로 결과는 두 테이블 건수의 곱으로 나온다.
(a테이블 갯수*b테이블 갯수)
SELECT a.employee_id, a.emp_name, b.department_id, b.department_name
  FROM employees a,
       departments b;
  -> 조인 조건이 없는것은 카타시안 조인
ANSI조인 ANSI SQL문법을 사용한 조인으로 기존 문법과 ANSI조인의 차이점은 조인 조건이 WHERE절이 아닌 FROM절에 들어간다는 점이다.

ANSI내부 조인은 FROM절에서 INNSER JOIN구문을 쓴다. 조인 조건은 ON절에 명시하고, 조인 조건 외의 조건은 기존대로 WHERE절에 명시한다.
만약 조건 컬럼이 모두 동일하면 ON대신 USING절을 사용할 수 있다.
SELECT 
    a.employee_id
  , a.emp_name
  , b.department_id
  , b.department_name
FROM employees a
INNER JOIN departments b
ON (a.department_id = b.department_id )
WHERE a.hire_date >= TO_DATE('2003-01-01','YYYY-MM-DD');
  ->ANSI조인에 대한 문법

SELECT 
    a.employee_id
  , a.emp_name
  , department_id
  , b.department_name
FROM employees a
INNER JOIN departments b
USING (department_id)
WHERE a.hire_date >= TO_DATE('2003-01-01','YYYY-MM-DD');
  -> ANSI조인시 ON에 대한 칼럼이 같으면 USING으로 할수 있다.(USING으로 할 경우 해당 칼럼은 칼럼명만 명시해야 한다.)
CROSS조인 WHERE절에 조건을 명시하지 않은 카타시안 조인부분을 ANSI조인에서는 CROSS조인이라고 한다. SELECT a.employee_id, a.emp_name, b.department_id, b.department_name
FROM employees a 
CROSS JOIN departments b;
 ->카타시안 조인 부분과 동일
    (a테이블 갯수*b테이블 갯수)
FULL OUTER조인 ANSI조인에서만 제공하는 기능으로 기존 문법을 사용할수 없다.
두테이블중 어느 한 테이블에 조인 조건에 만족하는 데이터가 없더라도 한쪽으로만 데이터가 조회되는 형식이였는데 이 문제점을 해결하기 위해 FULL OUTER조인을 사용하면 된다.
(한마디로 두 테이블에 대한 결과값을 동시에 보고 싶을 경우에 사용)
SELECT 
  A.*
 ,B.*
FROM HONG_A A
FULL OUTER JOIN HONG_B B 
ON A.EMP_ID=B.EMP_ID;
  ->두개의 테이블에 대한 데이터가 나온다.

 

 

'DB > ORACLE' 카테고리의 다른 글

19.[오라클]계층형쿼리  (1) 2024.02.12
18.[오라클]서브쿼리 정리  (0) 2024.02.11
16.[오라클]집합연산자 정리  (0) 2024.02.07
15.[오라클]그룹쿼리관련 정리  (1) 2024.02.07
14.[오라클]집계함수 정리  (0) 2024.02.05