JOIN

EUNJI LEE·2023년 4월 7일
1

SQL

목록 보기
3/14

JOIN

두 개 이상의 테이블을 특정 컬럼을 기준으로 연결해주는 기능이다. 크게 INNER JOIN과 OUTER JOIN으로 나뉜다. 방법도 오라클 방식과 표준 방식인 ANSI 방식으로 나뉜다. 오라클 방식은 ,와 WHERE절로 작성해서 방법 자체가 단순하지만 오라클 외에서 사용할 수 없다는 단점이 있다. ANSI 방식은 JOIN,ON||USING 예약어를 사용한다.

JOIN한 SELECT문에도 WHERE, GROUP BY, HAVING 사용 가능하다. JOIN도 이어서 작성해서 다중 JOIN할 수 있다.

INNER JOIN

--오라클 방식으로 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;

--JOIN할 때 중복되는 컬럼명으로 조인할 때는 USING을 이용
SELECT *
FROM EMPLOYEE JOIN JOB USING(JOB_CODE)
-->JOB_CODE는 하나만 출력한다.
WHERE JOB_CODE='J3';
💡 단, USING을 사용한 쿼리에는 별칭을 사용할 수 없다. 별칭 부여 시 ⚠️ORA-25154: USING 절의 열 부분은 식별자를 가질 수 없다. ->오류가 발생한다.

💡INNER JOIN 문제점

NULL값을 누락하고 가져오기 때문에 COUNT에 포함되지 않는다. WHERE절을 사용해도 실행 순서가 FROM→SELECT→WHERE이기 때문에 FROM에서 불러오지 않기 때문에 조회가 안 된다.

SELECT COUNT(*)
FROM EMPLOYEE JOIN DEPARTMENT ON DEPT_CODE=DEPT_ID;
-->23. NULL값이 있는 2개를 제외하고 카운트한다.
SELECT COUNT(*)
FROM EMPLOYEE; --25

OUTER JOIN

컬럼에 대해 동일 비교를 했을 때 없는 ROW를 출력한다. 모든 데이터를 출력할 기준이 되는 테이블을 설정해줘야 한다. 테이블명 LEFT||RIGHT 테이블명 [OUTER] JOIN 형태로 작성하며 OUTER는 생략해도 상관없다. LEFT일 땐 왼쪽 테이블을 기준 값으로 설정하고, RIGHT일 땐 오른쪽 테이블을 기준 값으로 설정한다.

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

SELECT *
FROM EMPLOYEE RIGHT OUTER JOIN DEPARTMENT ON DEPT_CODE=DEPT_ID;
-->해당 부서인 사람이 없는 경우 NULL로 출력
💡 단, 기준 컬럼과 일치되는 ROW가 없는 경우에는 NULL로 표시한다.

CROSS JOIN

모든 ROW를 연결하는 JOIN, 전체를 연결하기 때문에 조건이 따로 없다.

SELECT EMP_NAME, DEPT_TITLE
-->각 값에 모든 로우를 연결한다.
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;
-->MANAGER_ID를 기준으로 EMP_ID를 불러오는 것.
💡 사원 이름, 매니저 아이디, 해당 매니저 사원번호, 해당 매니저 이름 조회
SELECT E.EMP_NAME, NVL(E.MANAGER_ID,'없음')
			, NVL(M.EMP_ID,'없음'), NVL(M.EMP_NAME,'없음')
FROM EMPLOYEE E LEFT JOIN EMPLOYEE M ON E.MANAGER_ID=M.EMP_ID;

LEFT로 할 때는 MANAGER_ID에 해당하는 값을 하나씩 출력하기 때문에 25개가 출력되RIGHT로 변경하면 EMP_ID에 해당하는 MANAGER_ID를 한번씩 다 출력하기 때문에 갯수가 늘어난다.

비동등 JOIN

연결한 테이블이 범위값을 갖는 경우에 사용할 수 있다. 포인트에 대한 회원 등급, 게시글 수에 대한 회원 등급 등 어떤 범위 안에서 등급 기준을 분리할 때 사용할 수 있다.

SELECT*
FROM EMPLOYEE JOIN SAL_GRADE ON SALARY BETWEEN MIN_SAL AND MAX_SAL;
-->월급이 포함된 SAL_GRADE의 범위를 출력

다중 JOIN

JOIN은 이행연산이므로 3개 이상의 테이블을 함께 조회할 때 사용한다. OUTER JOIN도 사용 가능하다.

--사원의 사원명, 부서명, 직챙명, 근무지역(LOCALNAME) 조회
SELECT EMP_NAME, JOB_NAME, NVL(DEPT_TITLE,'대기'), NVL(LOCAL_NAME,'대기발령')
FROM EMPLOYEE LEFT JOIN DEPARTMENT ON DEPT_CODE=DEPT_ID
        LEFT JOIN LOCATION ON LOCAL_CODE=LOCATION_ID JOIN JOB USING(JOB_CODE);
profile
천천히 기록해보는 비비로그

0개의 댓글