☑️ 두 개 이상의 테이블을 특정 컬럼을 기준으로 연결해 주는 기능
☑️ 오라클 조인방식 : , 와 WHERE로 작성
☑️ ANSI 표준 조인방식 : JOIN, ON || USING 예약어를 사용해서 작성
➡️ INNER JOIN : 기준되는 값이 일치하는 ROW만 가져오는 JOIN
➡️ OUTER JOIN : 기준되는 값이 일치하지 않는 ROW도 가져오는 JOIN
→ 기준이 필요
❗ 두 테이블에서 일치하는 값을 먼저 찾기 (DEPT_CODE, DEPT_ID)
SELECT * FROM EMPLOYEE;
SELECT * FROM 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;
👉 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;
👉 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;
👉 모든 ROW를 연결해 주는 JOIN
SELECT *
FROM EMPLOYEE CROSS JOIN DEPARTMENT
ORDER BY 1;
👉 한 개의 테이블에 다른 컬럼의 값을 가지고 있는 컬럼이 있는 경우 그 두개 컬럼을 이용해서 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;