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 조인이 없을시 사장의 코드가 나오지 않음
-- 정확한 데이터를 위해서 일부러 추가함
'IT > Oracle' 카테고리의 다른 글
오라클 6탄 (SCOOP) 서브쿼리 (0) | 2015.07.20 |
---|---|
오라클 함수정리 6탄 1(hr테이블) (0) | 2015.07.19 |
오라클 함수정리 4탄 (그룹함수) (0) | 2015.07.18 |
오라클 정규화 (0) | 2015.07.15 |
오라클 삭제 (oracle 레지스트리 완전삭제) (0) | 2015.04.17 |