본문 바로가기

개발/SQL

[SQL] Oracle - (JOIN) 카테시안곱, 교차조인 / 비등가조인

< JOIN >

 

- 두 개 이상의 테이블에서 데이터를 같이 조회하고자 할 때 사용하는 구문

- 조회 결과는 하나의 결과물(ResultSet)로 나옴

- 여러개의 테이블 간의 관계를 맺어서 조회 가능

- 테이블 간 "연결고리"에 해당하는 컬럼을 매칭시켜 조회함

오라클 전용 구문 ANSI(미국 국립표준협회) 구문
(오라클 + 다른 DBMS)
등가조인 (EQUAL JOIN) 내부조인 (INNER JOIN)
자연조인 (NATURAL JOIN)
포괄조인
(LEFT OUTER)
(RIGHT OUTER)
외부조인 (OUTER JOIN)
왼쪽 외부조인 (LEFT OUTER JOIN)
오른쪽 외부조인 (RIGHT OUTER JOIN)
전체 외부조인 (FULL OUTER JOIN)
카테시안곱(CARTESIAN PRODUCT) 교차조인(CROSS JOIN)
자체조인(SELF JOIN)

 


< 카테시안곱 (CARTESIAN PRODUCT) >

 

- 모든 테이블의 각 행들이 서로 매핑된 데이터 조회 (곱집합)

- 두 테이블의 행들이 모두 곱해진 조합 출력 => 방대한 데이터 출력 - 과부하 위험

   (사용하지 않도록 주의!!)

 

-- EMPLOYEE 테이블 23행, DEPARTMENT 테이블 9행 = 총 207행의 결과 조회됨!!

--> ORACLE 구문 <--
SELECT EMP_NAME, DEPT_TITLE
  FROM EMPLOYEE, DEPARTMENT;

--> ANSI 구문 <--
SELECT EMP_NAME, DEPT_TITLE
  FROM EMPLOYEE
 CROSS JOIN DEPARTMENT;

 

 


 

<  비등가 조인 (NON EQUAL JOIN) >

 

- '='을 사용하지 않는 JOIN문

- 지정해주는 컬럼값이 정확하게 일치하는 경우가 아니라, "범위"에 포함되는 경우 매칭

 

-- 사원명, 급여, 급여등급(SAL_LEVEL)*
-- * SAL_GRADE 테이블에 존재. 급여 등급의 최솟값과 최댓값 기재

--> ORACLE 구문 <--
SELECT EMP_NAME, SALARY, S.SAL_LEVEL
  FROM EMPLOYEE E, SAL_GRADE S
 WHERE SALARY BETWEEN MIN_SAL AND MAX_SAL;
-- WHERE MIN_SAL <= SALARY AND SALARY <= MAX_SAL; -- BETWEEN AND로 간단하게 작성 가능

--> ANSI 구문 <--
SELECT EMP_NAME, SALARY, S.SAL_LEVEL
  FROM EMPLOYEE
  JOIN SAL_GRADE S ON(SALARY BETWEEN MIN_SAL AND MAX_SAL);