DB-디비는 즐겁다
Oracle Database - 2)JOIN
광형
2022. 6. 29. 23:22
728x90
728x90
SMALL
https://kwanghyung.tistory.com/entry/Oracle-Database-1JOIN
Oracle Database - 1)JOIN
https://kwanghyung.tistory.com/entry/Oracle-Database-JOIN Oracle Database- JOIN https://kwanghyung.tistory.com/entry/Oracle-Database-%EC%A7%91%ED%95%A9%EC%97%B0%EC%82%B0%EC%9E%90 Oracle Database -..
kwanghyung.tistory.com
카테시안 곱(CARTESIAN PRODUCT) / 교차조인(CROSS JOIN)
모든 테이블의 각 행들이 서로 매핑된 데이터가 조회된다.
두테이블의 행들이 모두 곱해진 행들의 조합 출력
각각 N개,M개의 행을 가진 테이블들의 카테시안 곱의 결과는 N*M행
모든 경우의 수를 다 따져서 조회하겠다.
방대한 데이터를 출력(과부화 위험)
사원명, 부서명
오라클 구문
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT; -- 23*9 =207행 조회
SELECT EMP_NAME,DEPT_TITLE
FROM EMPLOYEE
CROSS JOIN DEPARTMENT;
WHERE절에 기술하는 조인 조건이 잘못되었거나 아예 없을 경우 발생하는 구문
비등가 조인 (NON EQUAL JOIN)
'=' 등호를 사용하지 않는 조인문 -> 다른 비교 연산자를 써서 조인하겠다(>,<,>=,<=,BETWEEN A AND B)
->지정한 컬럼값들이 일치하는 경우가 아니라 '범위'에 포함되는 경우 매칭해서 조회하겠다.
등가 조인: '='로 일치하는 경우만 조회
비등가 조인 : '='가 아닌 다른 비교연산자들로 "범위"에 포함되는 경우를 조회
사원명, 급여
SELECT EMP_NAME,SALARY
FROM EMPLOYEE;
SAL_GRADE 테이블 조회
SELECT*
FROM SAL_GRADE;
사원명,급여,급여등급(SAL_LEVEL)
오라클구문
SELECT EMP_NAME,E.SALARY,S.SAL_LEVEL
FROM EMPLOYEE E, SAL_GRADE S
WHERE SALARY >= MIN_SAL AND SALARY <=MAX_SAL;
WHERE SALARY BETWEEN MIN_SAL AND MAX_SAL; --~이상 ~이하의 범위
ANSI
SELECT EMP_NAME,SALARY,S.SAL_LEVEL
FROM EMPLOYEE E
JOIN SAL_GRADE S ON (SALARY>=MIN_SAL AND SALARY<=MAX_SAL);
JOIN SAL_GRADE S ON (SALARY BETWEEN MIN_SAL AND MAX_SAL);
자체조인(SELF JOIN)
같은 테이블끼리 조인하는 경우
즉, 자기 자신과 조이하겠다.
-> 자체 조인의 겨우 테이블에 반드시 별칭을 붙여줘야한다. (서로 다른 테이블인 것처럼 조인하겠다.)
SELECT * FROM EMPLOYEE E; --사원에 대한 정보를 추출할 테이블
SELECT * FROM EMPLOYEE M; --사수에 대한 정보를 추출할 테이블
사원의 사번,사원명,사수의 사번, 사수명
오라클 구문
SELECT E.EMP_ID, E.EMP_NAME 사원명, E.MANAGER_ID 사수사번, M.EMP_NAME 사수명
FROM EMPLOYEE E,EMPLOYEE M
WHERE E.MANAGER_ID=M.EMP_ID(+); --LEFT OUTER JOIN
ANSI 구문
SELECT E.EMP_ID 사번, E.EMP_NAME 사원명, E.MANAGER_ID 사수사번,M.EMP_NAME 사수명
FROM EMPLOYEE E
LEFT OUTER JOIN EMPLOYEE M ON (E.MANAGER_ID =M.EMP_ID);
<다중조인>
3개 이상의 테이블을 조인해서 조회하겠다.
조인 순서가 중요하다.
사번, 사원명, 부서명, 직급명
일단 각 테이블을 따로 조회해보자
SELECT * FROM EMPLOYEE; --EMP_ID,EMP_NAME, DEPT_CODE, JOB_CODE
SELECT * FROM DEPARTMENT; --DEPT_ID,DEPT_TITLE
SELECT * FROM JOB; --JOB_CODE,JOB_NAME
합쳐보자
오라클 구문
SELECT EMP_ID 사번,EMP_NAME 사원명, DEPT_TITLE 부서명, JOB_NAME 직급명
FROM EMPLOYEE E, DEPARTMENT D, JOB J
WHERE E.DEPT_CODE=D.DEPT_ID(+)
AND E.JOB_CODE=J.JOB_CODE(+);
ANSI구문
SELECT EMP_ID 사번, EMP_NAME 사원명, DEPT_TITLE 부서명, JOB_NAME 직급명
FROM EMPLOYEE E
LEFT JOIN DEPARTMENT D ON (E.DEPT_CODE=D.DEPT_ID)
LEFT JOIN JOB J ON(E.JOB_CODE=J.JOB_CODE);
728x90
300x250
LIST