본문 바로가기

IT/Oracle

오라클 함수정리 5탄 [JOIN]

SELECT JOB_TITLE, 

DEPARTMENT_NAME 

  FROM JOBS, DEPARTMENTS;

--카티션 조인 : 두테이블의 모든 행들의 JOIN이다 

--조인을 잘못걸면 이렇게 나온다 

--[아무 연관성이 없는 연결되는 조건이 없이 연결된 내용]


SELECT COUNT(JOB_ID) 

  FROM JOBS;


SELECT COUNT(DEPARTMENT_ID)

  FROM DEPARTMENTS;


SELECT 19*27

  FROM DUAL;

  

SELECT LAST_NAME

, EMPLOYEE_ID

, DEPARTMENT_ID

  FROM EMPLOYEES 

 WHERE UPPER(LAST_NAME) = 'KING'

   AND EMPLOYEE_ID = 156;

-- 노가다 <- 하면 안된다.

--KING이고 사원번호가 156번인 사람의 부서번호를 알기 위해서 <-문제

--DEPARTMENT_ID를 알기 위해서

-- EMPLOYEES 에서 이름 사원번호를 알아낸다

King 156 80

;;;


SELECT DEPARTMENT_ID 

    , DEPARTMENT_NAME

  FROM DEPARTMENTS

 WHERE DEPARTMENT_ID = 80;

--사원번호 가운데서 DEPARTMENTS 테이블에서 가져온다. 

;;;


SELECT E.EMPLOYEE_ID

, D.DEPARTMENT_ID

, E.LAST_NAME

     , D.DEPARTMENT_NAME

  FROM EMPLOYEES E, DEPARTMENTS D

 WHERE UPPER(LAST_NAME) = 'KING'

   AND E.DEPARTMENT_ID = D.DEPARTMENT_ID;

--사원테이블에 있는 사원이름 가져와라

--부서테이블에 있는 이름 가져와라 E.(임플로이 테이블)

--검색할 테이블이 중독되면 안되기 때문에 축약어 E. D.을 걸어준다. 

;;;


SELECT EMPLOYEES.EMPLOYEE_ID

     , DEPARTMENTS.DEPARTMENT_NAME

     , EMPLOYEES.LAST_NAME

  FROM EMPLOYEES 

  JOIN DEPARTMENTS

    ON EMPLOYEES.DEPARTMENT_ID = DEPARTMENTS.DEPARTMENT_ID

   AND LAST_NAME = 'King';

--ON <- 조인조건 // 명시적 조건(권장)

;;;;


SELECT E.EMPLOYEE_ID

  , J.JOB_TITLE

     , D.DEPARTMENT_NAME

  FROM EMPLOYEES E

  JOIN JOBS J

    ON E.JOB_ID = J.JOB_ID

  JOIN DEPARTMENTS D

  ON E.DEPARTMENT_ID = D.DEPARTMENT_ID 

   AND LAST_NAME = 'King';

--문제) 사원이름이 ‘King' 인 사원의 사원번호, 업무명, 부서명을 출력하시오

--조인을 두가지 걸기 위해선 같은 조건식 = 를 걸어주고 그 아래에 다시 비교할 것을

--JOIN -> ON / JOIN -> ON 을 걸어준다 [명시적인 조건]

;;;


SELECT E.EMPLOYEE_ID

, J.JOB_TITLE

, D.DEPARTMENT_NAME

  FROM EMPLOYEES E

, JOBS J

, DEPARTMENTS D

 WHERE E.JOB_ID = J.JOB_ID

   AND E.DEPARTMENT_ID = D.DEPARTMENT_ID

   AND E.LAST_NAME = 'King';

--명시적인 아닌 그냥 조건

;;;


--문제1) 2007년 상반기 입사한 사원의 사원번호, 이름, 입사일 부서명을 출력하시오.

;

SELECT E.EMPLOYEE_ID

     , E.LAST_NAME

     , E.HIRE_DATE

     , D.DEPARTMENT_NAME

  FROM EMPLOYEES E 

  JOIN DEPARTMENTS D

    ON E.DEPARTMENT_ID = D.DEPARTMENT_ID

 WHERE  TO_CHAR(HIRE_DATE, 'YYYYMM') BETWEEN '200701' AND '200706';

--BETWEEN 연산자 사용 기법 확인하기

--TO_CHAR(HIRE_DATE)

;;;


--GRAND가 포함된 (NULL값을 포함) OUTER JOIN(조건에 맞지 않는 JOIN일떄)

SELECT E.EMPLOYEE_ID

     , E.LAST_NAME

     , E.HIRE_DATE

     , D.DEPARTMENT_NAME

  FROM  EMPLOYEES E 

  LEFT OUTER JOIN DEPARTMENTS D

    ON  E.DEPARTMENT_ID = D.DEPARTMENT_ID

 WHERE  TO_CHAR(HIRE_DATE, 'YYYYMM') BETWEEN '200701' AND '200706';

-- 표시해야할 데이터가 왼쪽에 있다

--왜냐하면 사원의 코드는 있고 사원의 NAME이 NULL이기 때문에 LERF 조인

;;;


SELECT E.EMPLOYEE_ID

     , E.LAST_NAME

     , E.HIRE_DATE

     , D.DEPARTMENT_NAME

  FROM EMPLOYEES E , DEPARTMENTS D

 WHERE E.DEPARTMENT_ID = D.DEPARTMENT_ID(+)

   AND TO_CHAR(HIRE_DATE, 'YYYY-MM') BETWEEN '2007-01' AND '2007-06';

--LEFT RIGHT로 지정된 테이블의 컬럼값은 JOIN조건을 만족하지 않더라도 반환합니다.(표시한다) 

--반환안하는 놈에게 +를 걸어줘서 값을 반환하게 한다. -> DEPARTMENT_ID 

--대부분 (+) OUTER JOIN으로 되어있다.

;;;

--셀프조인 : 한 테이블 내에 두가지의 차트를 비교할때 사용함

SELECT E.EMPLOYEE_ID AS "EMPLOYEE ID"

  , E.LAST_NAME || ' ' || E.FIRST_NAME AS "EMPLOYEE NAME"

     , E1.EMPLOYEE_ID AS "MANAGER ID"

     , E1.LAST_NAME || ' ' || E1.FIRST_NAME AS "MANAGER NAME"

  FROM EMPLOYEES E LEFT OUTER JOIN EMPLOYEES E1

    ON E.MANAGER_ID = E1.EMPLOYEE_ID

 ORDER BY E.EMPLOYEE_ID ASC ;

-- OUTER 조인이 없을시 사장의 코드가 나오지 않음

-- 정확한 데이터를 위해서 일부러 추가함