주니어 기초 코딩공부/Database 기초

06장 SQL JOIN (오라클-Cross Join, Equi Join, Non-Equi Join, Self Join)

jju_developer 2022. 12. 14. 21:35
728x90

안녕하세요 jju_developer입니다.

 

오늘은 지난 시간에 이어서 오라클 SQL JOIN에 대해 소개하는 시간을 갖겠습니다.

 

✔JOIN이란?

 SQL에서는 두 개 이상의 테이블을 결합해야만 원하는 결과를 얻을 수 있을 때 한 번의 질의로 원하는 결과를 얻을 수 있는 조인 기능을 제공합니다.

✔JOIN 연결방법?

서로 다른 분리된 두 테이블을 연결하고자 할 때 JOIN을 사용합니다.

 

 특정 부서 번호에 대한 부서 이름은 무엇인지는 부서(DEPT) 테이블에 있습니다.

특정 사원에 대한 부서명을 알아내기 위해서는 부서 테이블에서 정보를 얻어 와야 한다.

DEPT -> 부서정보
EMP -> 사원 정보

그렇다면,

 

SELECT 부서 번호 FROM EMP

WHERE 사원 이름=SMITH ; 

 

이렇게 조회하고

 

SELECT 부서 이름 FROM DEPT

WHERE 부서 번호 =20;

 

이렇게 두 번 일해야 하는데,

 

만약 JOIN을 쓴다면 어떨까요?

SELECT *
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO AND
EMP.ENAME= 'SMITH';

점과 콤마를 잘 구분해서 사용하여야 합니다.

 

<오라클에서만 사용하는 JOIN의 목록입니다.>

Oracle

<Oracle 외 다른 회사에서 사용하는 Join>

다른곳에서 사용하는 JOIN(오라클도 가능합니다.)

 

✔오라클의 CROSS JOIN?

 특별한 키워드 없이 SELECT 문의 FROM 절에 사원(EMP) 테이블과 부서(DEPT) 테이블을 콤마로 연결하여 연속하여 기술하는 것입니다.

 

크로스 조인은 관계가 없는 JOIN인 경우가 많기 때문에 잘 안 씁니다.

 

✔오라클의 Equi Join?

 EQUI JOIN은 가장 많이 사용하는 조인 방법으로서 조인 대상이 되는 두 테이블에서 공통적으로 존재하는 칼럼의 값이 일치되는 행을 연결하여 결과를 생성하는 조인 방법입니다.

일치된 값만 JOIN 하는 방법으로 대부분 EQUI JOIN을 사용합니다.

 

사용방법:

두개의 데이터를 연결해서 같은것만 불러옵니다.

--EQUI JOIN
SELECT*
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO;

EMP의 부서 번호와 DEPT의 부서 번호가 같은 값만 출력해라!입니다.

 

ENAME : 사원 이름

DNAME : 부서 이름

 

여기서 SELECT ENAME, DNAME, DEPTNO라고 하면

DEPTNO이 사원 정보 테이블에서 있고, 부서 정보 테이블에서도 있기 때문에 어떤 값을 검색할지 모호해집니다.

정확히

DEPT.DEPTNO로 "나는 어떤 테이블의 부서 번호를 가져올 거다!!"라고 알려줘야 합니다!!

 

 

✔오라클의 Non-Equi Join?

테이블 예시

 Non-Equi Join은 조인 조건에 특정 범위 내에 있는지를 조사하기 위해서 WHERE 절에 조인 조건을 = 연산자 이외의 비교 연산자를 사용합니다.

 

위의 테이블을 낮은 연봉~ 최고연봉이 있고, 그걸 

 

 

✔오라클의 Self Join?

자기 자신을 조인!

자기 테이블의 MGR을 찾기 위해서 자기 자신을 다시 참조하여 또다른 테이블을 만드는 겁니다.

같은 테이블 두개에서 정보를 뺴냄

예를들면 하나의 테이블에서 나의정보와 나의 매니저 정보가 있을때

같은 테이블을 조인하고 WHERE 테이블.매니저이름 =내태이블.사원번호를 비교하여 같을때

사원명과 상사명이 누군지 를 알 수 있습니다.

이게 SELF JOIN입니다.

 


다음은 학원에서 풀어본 join 예제를 보여드리겠습니다.

 

[과제] 과제-07-03.TXT
SQL> CONN SCOTT/TIGER 로 접속하여 SQL문을 작성하세요.


1.매니저가 KING인 사원들의 이름과 직급을 출력하세요.
<정답 풀이>

우선 테이블은

EMP 테이블

EMP 테이블이 위와 같을때,

MGR은 매니저의 번호입니다.

 

문제가 매니저가 KING인 사람을 출력하라 라고 했기 때문에

KING의 EMPNO 즉, KING 자기 자신의 사번이 MGR 들어가 있으면

내 상사가 KING이 라는 뜻 입니다.

SELECT E.ENAME 사원명, E.JOB 직급
FROM EMP E, EMP M
WHERE E.MGR = M.EMPNO
AND M.ENAME='KING'
ORDER BY E.ENAME ASC;

 


2. SCOTT과 동일한 근무지에서 근무하는 사원의 이름을 출력하세요.

 

<오답>

 

<정답>

 

<정답 풀이>

왜 첫번째 코드는 오답일까요?

정답은 동일하지만, 부서 번호가 20 이 SCOTT과 동일하다고 저렇게 쓰는 것은

이미 스콧의 부서 번호가 뭔지 검색해서 안다는 것 입니다.

 

그렇기 때문에 무언가를 찾을때에는 검색을 하지 않았을때를 가정하고 푸는게 맞습니다.

 


 

✔오라클의 Outer Join?

Outer Join이란!

조인 조건에 만족하지 못하였더라도 해당 로우를 나타내고 싶을 때에 사용하는 것입니다.

 

아렇게 하면 ENAME에 KING이 출력되지 않습니다.

왜냐면 KING은 사장이기때문에 매니저가 없으므로

WHERE E.MGR = M.EMPNO; 이 구문을 만족 시키지 않습니다.

 

이럴때!!!!

 

WHERE E.MGR = M.EMPNO(+); 

 

이렇게 플러스를 넣어준다면 만족하지 않아도 출력하게 됩니다.

 

 

 

 

지금까지 오라클의 JOIN 방법을 소개 해드렸습니다.

 

질문사항이나 공감 댓글은 환영입니다.

 

감사합니다.

 

:)

728x90