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 |