본문 바로가기

IT개발 과정 [취성패 학원]/ORACLE

[ORACLE] 04. JOIN

JOIN

  • 두 개 이상의 테이블에서 데이터를 조회하고자 할 때 사용되는 구문 조회 결과는 하나의 결과물(RESULT SET)로 나옴
  • 관계형 데이터베이스는 최소한의 데이터로 각각의 테이블에 담고있음 (중복을 최소화하기 위해서)
    → JOIN 구문을 이용해서 여러개의 테이블 간 "관계"를 맺어서 조회해야됨!!
  • 무작정 JOIN을 해서 같이 조회하는게 아니라 테이블 "연결고리"의 컬럼 데이터를 "매칭" 시켜서 조회해야됨!!

등가조인(EQUAL JOIN) / 내부조인(INNER JOIN)

연결시키는 컬럼의 값이 일치하는 행들만 조인돼서 조회 (== 일치하는 값이 없는 행은 조회 X)

  • 오라클 전용 구문
    • FROM 절에 조회하고자 하는 테이블들을 나열 (, 구분자로)
    • WHERE 절에 매칭시킬 컬럼명(연결고리)에 대한 조건을 제시함
- 사번, 사원명, 부서코드, 부서명 조회
-- 1) 연결시킬 두 컬럼명이 다른 경우 (EMPLOYEE:DEPT_CODE / DEPARTMENT:DEPT_ID)

SELECT EMP_NO, EMP_NAME, DEPT_CODE, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID;

--> 일치하지 않는 값들은 조회에서 제외된 것 확인 가능
-- (DEPT_CODE가 NULL인 2명의 사원데이터 조회안됨, DEPT_ID가 D3, D4, D7인 부서데이터 조회안됨)

-- 사번, 사원명, 직급코드, 직급명 조회
-- 2) 연결시킬 두 컬럼명이 같은 경우 (EMPLOYEE:JOB_CODE / JOB:JOB_CODE)

SELECT EMP_NO, EMP_NAME, JOB_CODE, JOB_NAME ---> 오류남
FROM EMPLOYEE, JOB
WHERE JOB_CODE = JOB_CODE;

--> ambiguously: 애매하다, 모호하다


--     해결방법1) 테이블명을 이용하는 방법
SELECT EMP_NO, EMP_NAME, EMPLOYEE.JOB_CODE, JOB_NAME 
FROM EMPLOYEE, JOB
WHERE EMPLOYEE.JOB_CODE = JOB.JOB_CODE;

--     해결방법2) 별칭 사용 (각 테이블마다 별칭 부여가능)
SELECT EMP_NO, EMP_NAME, E.JOB_CODE, JOB_NAME 
FROM EMPLOYEE E, JOB J
WHERE E.JOB_CODE = J.JOB_CODE;

 

  • ANSI 구문
    • FROM절에 기준 테이블을 하나만 기술한 뒤 그 뒤에 JOIN절에서 같이 조회하고자 하는 테이블 기술 (또한 매칭시킬 컬럼에 대한 조건도 같이 기술) → USING구문, ON 구문
-- 사번, 사원명, 부서코드, 부서명
-- 1) 연결할 두 컬럼명이 다른 경우 (EMPLOYEE:DEPT_CODE / DEPARTMENT:DEPT_ID)
-- => JOIN ON 구문만 사용가능!!!
SELECT EMP_ID, EMP_NAME, DEPT_CODE, DEPT_TITLE
FROM EMPLOYEE
/*INNER*/JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);


-- 사번, 사원명, 직급코드, 직급명
-- 2) 연결할 두 컬럼명이 같은 경우 (EMPLOYEEE:JOB_CODE / JOB:JOB_CODE)
-- => JOIN ON구문, JOIN USING구문
-> ON구문 : ambiguously 발생가능
SELECT EMP_ID, EMP_NAME, E.JOB_CODE, JOB_NAME
FROM EMPLOYEE E
JOIN JOB J ON (E.JOB_CODE = J.JOB_CODE);

-> USING 구문 : ambiguously 발생X
SELECT EMP_ID, EMP_NAME, JOB_CODE, JOB_NAME
FROM EMPLOYEE
JOIN JOB USING(JOB_CODE);

-- [참고] 위의 예시는 NATURAL JOIN(자연조인) 으로도 가능
SELECT EMP_ID, EMP_NAME, JOB_CODE, JOB_NAME
FROM EMPLOYEE
NATURAL JOIN JOB;

-- * 추가적인 조건도 제시가능!!
-- 직급이 대리인 사원의 사번, 사원명, 급여 조회

-->> 오라클 구문 (FROM절에 조회할 테이블들 다 기술, WHERE절에 매칭시킬 컬럼에 대한 조건 기술
SELECT EMP_ID, EMP_NAME, SALARY
FROM EMPLOYEE E, JOB J
WHERE E.JOB_CODE = J.JOB_CODE
  AND JOB_NAME = '대리'
  AND SALARY >= 2500000;

--> ANSI 구문 (FROM절에 테이블 하나만 기술, JOIN절에 추가로 조회하고자 하는 테이블 및 매칭시킬 컬럼에 대한 조건 기술)
SELECT EMP_ID, EMP_NAME, SALARY
FROM EMPLOYEE
JOIN JOB USING(JOB_CODE)
WHERE JOB_NAME = '대리';

포괄조인 / 외부조인 (OUTER JOIN)

  • 테이블간에 JOIN시 일치하지 않은 행도 포함시켜서 조회 가능
    단, 반드시 어떤 테이블을 기준으로 해서 JOIN을 할건지 LEFT/RIGHT를 지정해야만 함
-- 사원명, 급여, 부서명 조회
SELECT EMP_NAME, SALARY, DEPT_TITLE
FROM EMPLOYEE
JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);
-- => 내부조인 (DEPT_CODE가 NULL인 2명의 사원 조회X, 부서에 배정된 사원이 없는 부서(D3, D4, D7) 조회X)

-- 1) LEFT OUTER JOIN : 두 테이블 중 왼편에 기술된 테이블 기준으로 JOIN

-->> ANSI구문
-- 사원명, 급여, 부서명 조회
SELECT EMP_NAME, SALARY, DEPT_TITLE
FROM EMPLOYEE
LEFT /OUTER/ JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);
--> DEPT_CODE가 NULL이었던 사원 (이오리, 하동운)의 데이터 조회됨

-->> 오라클 구문 -- 기준으로 삼고자하는 테이블의 반대편 테이블의 컬럼에 (+)를 붙임
SELECT EMP_NAME, SALARY, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID(+);

-- 2) RIGHT [OUTER] JOIN : 두 테이블 중 오른편에 기술된 테이블을 기준으로 JOIN
-->> ANSI 구문
SELECT EMP_NAME, SALARY, DEPT_TITLE
FROM EMPLOYEE
RIGHT JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);

-->> 오라클 구문
SELECT EMP_NAME, SALARY, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE(+) = DEPT_ID;

-- 3) FULL [OUTER] JOIN : 두 테이블이 가진 모든 행을 조회할 수 있음 (단, 오라클 구문으로는 안됨)
SELECT EMP_NAME, SALARY, DEPT_TITLE
FROM EMPLOYEE
FULL JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);

비등가 조인 (NON EQUAL JOIN)

  • '='(등호)를 사용하지 않는 조인문
  • 지정한 컬럼값이 일치하는 경우가 아닌, 값의 "범위"에 포함되는 경우 매칭
-- 사원명, 급여, 급여등급(SAL_LEVEL)
SELECT EMP_NAME, SALARY
FROM EMPLOYEE;

SELECT *
FROM SAL_GRADE;

-->> 오라클 구문
SELECT EMP_NAME, SALARY, SAL_LEVEL
FROM EMPLOYEE, SAL_GRADE
--WHERE SALARY >= MIN_SAL AND SALARY <= MAX_SAL;
WHERE SALARY BETWEEN MIN_SAL AND MAX_SAL;

-->> ANSI 구문 (JOIN ON구문만으로 가능!!)
SELECT EMP_NAME, SALARY, SAL_LEVEL
FROM EMPLOYEE
JOIN SAL_GRADE ON (SALARY BETWEEN MIN_SAL AND MAX_SAL);

다중 JOIN

-- 사번, 사원명, 부서명, 근무지역명(LOCAL_NAME)
-->> 오라클 구문
SELECT EMP_ID, EMP_NAME, DEPT_TITLE, LOCAL_NAME
FROM EMPLOYEE, DEPARTMENT, LOCATION
WHERE DEPT_CODE = DEPT_ID
AND LOCATION_ID = LOCAL_CODE;

-->> ANSI구문
SELECT EMP_NO, EMP_NAME, DEPT_TITLE, LOCAL_NAME, NATIONAL_NAME
FROM EMPLOYEE
JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID)
JOIN LOCATION ON (LOCATION_ID = LOCAL_CODE)
JOIN NATIONAL USING(NATIONAL_CODE);

'IT개발 과정 [취성패 학원] > ORACLE' 카테고리의 다른 글

[ORACLE] 06. CREATE(DDL)  (0) 2021.04.08
[ORACLE] 05. SUBQUARY  (0) 2021.04.07
[ORACLE] 03. GROUP BY&HAVING  (0) 2021.04.02
[ORACLE] 02. 함수 (FUNCTION)  (0) 2021.03.31
[ORACLE] 01. 기본문법  (0) 2021.03.30