[Oracle] INNER JOIN / OUTER JOIN / 동등조인 / 비동등조인

라라·2023년 4월 7일
0

Oracle

목록 보기
14/16

📂 JOIN

☑️ 두 개 이상의 테이블을 특정 컬럼을 기준으로 연결해 주는 기능
☑️ 오라클 조인방식 : , 와 WHERE로 작성
☑️ ANSI 표준 조인방식 : JOIN, ON || USING 예약어를 사용해서 작성

➡️ INNER JOIN : 기준되는 값이 일치하는 ROW만 가져오는 JOIN
➡️ OUTER JOIN : 기준되는 값이 일치하지 않는 ROW도 가져오는 JOIN
→ 기준이 필요


❗ 두 테이블에서 일치하는 값을 먼저 찾기 (DEPT_CODE, DEPT_ID)

SELECTFROM EMPLOYEE;
SELECTFROM DEPARTMENT;

📎 오라클 방식으로 JOIN 하기
SELECT *
FROM EMPLOYEE, DEPARTMENT
WHERE EMPLOYEE.DEPT_CODE = DEPARTMENT.DEPT_ID;

📎 ANSI 표준으로 JOIN 하기
SELECT *
FROM EMPLOYEE
 JOIN DEPARTMENT ON EMPLOYEE.DEPT_CODE = DEPARTMENT.DEPT_ID;



📍 INNER JOIN ( ON / USING ➡️ 모든 JOIN에서 사용 가능)

👉 NULL 값이 있으면 가져오지 않는다. = 일치값이 없으면 결과에 포함 X
👉 두 개의 컬럼값이 같을 때 ON 을 사용하면 두 개 컬럼값이 모두 조회된다.
👉 따라서 이런 경우에는 USING을 사용할 수 있다.

✏️ 사원에 대해 사원명, 이메일, 전화번호 (EMPLOYEE) /
부서명 (DEPARTMENT) 을 조회하기
❗ 테이블 . 을 입력하지 않아도 자동으로 인식하고 부여
❗ 컬럼명이 같다면 . 을 입력해서 구별할 수 있도록 한다.

SELECT EMP_NAME, EMAIL, PHONE, DEPT_TITLE
FROM EMPLOYEE
  JOIN DEPARTMENT ON DEPT_CODE = DEPT_ID;

✏️ 부서가 총무부인 사원명, 월급, 보너스, 부서명 조회하기
❗ JOIN 문에서도 WHERE 절 사용하기

SELECT EMP_NAME, SALARY, BONUS, DEPT_TITLE
FROM EMPLOYEE
JOIN DEPARTMENT ON DEPT_CODE = DEPT_ID
WHERE DEPT_TITLE = '총무부';

✏️ 부서별 평균 급여를 출력하기 / 부서명, 평균 급여가 300만원 이상
❗ JOIN 문에서 GROUP BY 절 사용하기

SELECT DEPT_TITLE, AVG (SALARY)
FROM EMPLOYEE
JOIN DEPARTMENT ON DEPT_CODE = DEPT_ID
GROUP BY DEPT_TITLE
HAVING AVG (SALARY) >= 3000000;

❗ 컬럼명이 같다면 별칭을 부여해서 구별할 수 있도록 한다.

SELECT *
FROM EMPLOYEE E -- 별칭부여
  JOIN JOB ON JOB_CODE = JOB_CODE;
  -- 두 테이블에 모두 JOB_CODE 가 있으므로 별칭 부여
  JOIN JOB J ON E. JOB_CODE = J. JOB_CODE
WHERE E. JOB_CODE='J3'; -- 별칭이 없으면 두 개가 조회된다.

❗ USING 을 쓸 때는 식별자(별칭)를 쓰지 않는다.

SELECT *
FROM EMPLOYEE
  JOIN JOB USING (JOB_CODE)
WHERE JOB_CODE='J3';

✏️ 직책이 과장인 사원의 이름, 직책명, 직책코드, 월급을 조회하기
SELECT EMP_NAME, JOB_NAME, JOB_CODE, SALARY
FROM EMPLOYEE
JOIN JOB USING (JOB_CODE)
WHERE JOB_NAME = '과장';

❗ NULL 값이 있으면 데이터를 가져오지 않는다. (INNER JOIN)
= 일치값이 없으면 결과에 포함X

SELECT COUNT (*)
FROM EMPLOYEE
JOIN DEPARTMENT ON DEPT_CODE = DEPT_ID;



📍 OUTER JOIN ( LEFT / RIGHT )

👉 NULL 값이 있으면 가져오지 않는다. = 일치값이 없으면 결과에 포함 X
👉 컬럼에 대해 동일비교를 했을 때 없는 ROW를 출력해 주는 JOIN
👉 기준이 되는 테이블(모든 데이터를 출력할)을 설정해줘야 한다.
👉 일치되는 ROW가 없는 경우 모든 컬럼을 NULL로 표시함

📎 LEFT OUTER JOIN : JOIN을 기준으로 왼쪽에 있는 테이블을 기준으로 설정
📎 RIGHT OUTER JOIN : JOIN을 기준으로 오른쪽에 있는 테이블을 기준으로 설정

❗ 왼쪽 컬럼을 기준으로 조회

SELECT *
FROM EMPLOYEE LEFT OUTER JOIN DEPARTMENT
ON DEPT_CODE = DEPT_ID; -- OUTER 생략가능

❗ 오른쪽 컬럼을 기준으로 조회

SELECT *
FROM EMPLOYEE RIGHT JOIN DEPARTMENT
ON DEPT_CODE = DEPT_ID;



📍 CROSS JOIN

👉 모든 ROW를 연결해 주는 JOIN

SELECT *
FROM EMPLOYEE CROSS JOIN DEPARTMENT
ORDER BY 1;



📍 SELF JOIN

👉 한 개의 테이블에 다른 컬럼의 값을 가지고 있는 컬럼이 있는 경우 그 두개 컬럼을 이용해서 JOIN

✏️ 매니저가 있는 사원의 이름, 매니저 아이디, 매니저 사원번호, 매니저 이름 조회

SELECT E.EMP_NAME, E.MANAGER_ID, M.EMP_ID, M.EMP_NAME
FROM EMPLOYEE E
JOIN EMPLOYEE M ON E.MANAGER_ID = M.EMP_ID;

✏️ 사원이름, 매니저 아이디, 매니저 사원번호, 매니저 이름 조회
✏️ 매니저가 없으면 없음을 출력하기

SELECT E.EMP_NAME, NVL(M.MANAGER_ID, '없음'), NVL(M.EMP_ID, '없음'), NVL(M.EMP_NAME, '없음')
FROM EMPLOYEE E
LEFT JOIN EMPLOYEE M ON E.MANAGER_ID=M.EMP_ID;

profile
코딩하는 라라 :)

0개의 댓글