SELECT E.EMPNO, E.ENAME, E.MGR, M.ENAME AS MGR_NAME FROM EMP E, EMP M WHERE E.MGR = M.EMPNO ORDER BY E.EMPNO;
EMPNO ENAME MGR MGR_NAME---------- ---------- ---------- ---------- 7369 SMITH 7902 FORD 7499 ALLEN 7698 BLAKE 7521 WARD 7698 BLAKE 7566 JONES 7839 KING 7654 MARTIN 7698 BLAKE 7698 BLAKE 7839 KING 7782 CLARK 7839 KING 7788 SCOTT 7566 JONES 7844 TURNER 7698 BLAKE 7876 ADAMS 7788 SCOTT 7900 JAMES 7698 BLAKE 7902 FORD 7566 JONES 7934 MILLER 7782 CLARK
13행이다. KING 은 MGR 이 NULL 이라 NULL = M.EMPNO 가 참이 되지 않아 빠졌다.
조인 조건 없이 FROM EMP E, EMP M 만 쓰면 14 × 14 = 196 행의 카티션 곱이다.
ANSI 로는 FROM EMP E JOIN EMP M ON E.MGR = M.EMPNO 다. 결과는 같다.
사원 → 관리자 → 관리자의 관리자는 EMP 를 세 번 쓴다. 별칭 T 가 세 번째 역할이다.
SELECT E.ENAME, M.ENAME AS MGR_NAME, T.ENAME AS TOP_NAME FROM EMP E, EMP M, EMP T WHERE E.MGR = M.EMPNO AND M.MGR = T.EMPNO ORDER BY E.EMPNO;
ENAME MGR_NAME TOP_NAME---------- ---------- ----------SMITH FORD JONESALLEN BLAKE KINGWARD BLAKE KINGMARTIN BLAKE KINGSCOTT JONES KINGTURNER BLAKE KINGADAMS SCOTT JONESJAMES BLAKE KINGFORD JONES KINGMILLER CLARK KING
10행이다. 관리자의 관리자가 있어야 남는다.
빠진 4명은 KING(관리자 없음)과 BLAKE·CLARK·JONES(관리자가 KING 이고, KING 의 관리자가 없음)다.
두 번째 조건 M.MGR = T.EMPNO 는 M 의 관리자를 찾는다. E.MGR = T.EMPNO 로 쓰면 T 가 M 과 같은 사람이 되어 버린다.
단계
FROM 의 EMP 수
조인 조건 수
내부 조인 결과
사원 – 관리자
2
1
13
사원 – 관리자 – 관리자의 관리자
3
2
10
테이블 n 개를 이으려면 조인 조건이 최소 n − 1 개 필요하다. W4 의 조인 규칙이 셀프 조인에도 그대로다.
ANSI 로는 FROM EMP E LEFT OUTER JOIN EMP M ON E.MGR = M.EMPNO 다. 실습 컨테이너에서 같은 14행이 나왔다.
3단계도 외부 조인으로 바꾸면 14명이 모두 남는다.
SELECT E.ENAME, M.ENAME AS MGR_NAME, T.ENAME AS TOP_NAME FROM EMP E LEFT OUTER JOIN EMP M ON E.MGR = M.EMPNO LEFT OUTER JOIN EMP T ON M.MGR = T.EMPNO ORDER BY E.EMPNO;
ENAME MGR_NAME TOP_NAME---------- ---------- ----------SMITH FORD JONESALLEN BLAKE KINGWARD BLAKE KINGJONES KINGMARTIN BLAKE KINGBLAKE KINGCLARK KINGSCOTT JONES KINGKINGTURNER BLAKE KINGADAMS SCOTT JONESJAMES BLAKE KINGFORD JONES KINGMILLER CLARK KING
두 번째 조인도 LEFT 여야 한다. 첫 조인만 LEFT 로 두고 둘째를 내부 조인으로 쓰면 M 이 NULL 인 KING 과 T 가 없는 BLAKE·CLARK·JONES 가 다시 빠진다.
계층형 질의에서도 PRIOR ENAME 을 SELECT 에 쓰면 부모 이름을 옆에 붙일 수 있다. 결과는 셀프 외부 조인과 같은 14쌍이고, LEVEL 이 더해진다.
SELECT LEVEL, ENAME, PRIOR ENAME AS MGR_NAME FROM EMP START WITH MGR IS NULL CONNECT BY PRIOR EMPNO = MGR ORDER SIBLINGS BY ENAME;
LEVEL ENAME MGR_NAME---------- ---------- ---------- 1 KING 2 BLAKE KING 3 ALLEN BLAKE 3 JAMES BLAKE 3 MARTIN BLAKE 3 TURNER BLAKE 3 WARD BLAKE 2 CLARK KING 3 MILLER CLARK 2 JONES KING 3 FORD JONES 4 SMITH FORD 3 SCOTT JONES 4 ADAMS SCOTT
구분
셀프 조인
계층형 질의
문법
같은 테이블에 별칭 둘 이상 + 조인 조건
START WITH + CONNECT BY PRIOR
표준 여부
ANSI 조인으로도 쓴다
Oracle 전용 (SQL Server 는 재귀 CTE)
따라가는 깊이
별칭 수만큼 고정 (2단계면 2, 3단계면 3)
끝까지, 깊이가 달라도 한 문장
한 행에 보이는 것
여러 단계의 값을 옆으로 나란히
한 단계씩 아래로 행이 늘어난다
깊이 정보
직접 세야 한다
LEVEL, SYS_CONNECT_BY_PATH 로 바로
잘 맞는 질문
"사원과 관리자의 급여 비교"
"KING 아래 전체 조직도"
둘 다 같은 EMP 의 MGR → EMPNO 관계를 쓴다. 정해진 단계의 값을 한 행에 놓을 때는 셀프 조인, 깊이를 모르는 트리를 펼칠 때는 계층형 질의가 맞다.
셀프 조인 : 같은 테이블을 별칭 둘 이상으로 FROM 에 두고 자기 자신과 조인하는 것.
테이블 별칭 : FROM 절에서 테이블에 붙이는 짧은 이름. 셀프 조인에서는 같은 테이블의 역할을 나누는 데 꼭 필요하다.
역할 : 셀프 조인에서 별칭이 맡는 의미. 같은 EMP 라도 E 는 사원, M 은 관리자 역할이다.
셀프 외부 조인 : 셀프 조인을 외부 조인으로 써서 짝이 없는 행(관리자가 없는 KING)도 남기는 것.
ORA-00918 : 여러 테이블에 같은 이름의 열이 있는데 어느 쪽인지 밝히지 않았을 때의 오류.
카티션 곱 : 조인 조건 없이 두 테이블의 모든 행을 짝지은 결과. EMP 끼리면 14 × 14 = 196 행이다.
📝 연습 문제
선택지를 클릭하면 정답·해설이 펼쳐집니다.
문제 1
EMP 14명 중 MGR 이 NULL 인 사원은 KING 한 명이다. SELECT COUNT(*) FROM EMP E, EMP M WHERE E.MGR = M.EMPNO; 의 결과는?
문제 2
사원 이름과 관리자 이름을 보이되, 관리자가 없는 KING 도 사원으로 결과에 남기는 Oracle 조건은? (FROM EMP E, EMP M, E 가 사원, M 이 관리자 역할이다)
문제 3
다음 SQL 의 결과 행 수는? (관리자가 없는 사원은 KING, 관리자가 KING 인 사원은 BLAKE·CLARK·JONES 다)
SELECT E.ENAME, T.ENAME FROM EMP E, EMP M, EMP T WHERE E.MGR = M.EMPNO AND M.MGR = T.EMPNO;
문제 4
SELECT ENAME FROM EMP, EMP WHERE MGR = EMPNO; 를 Oracle 에서 실행한 결과는?
문제 5
다음 SQL 의 결과는? (SMITH 의 관리자는 FORD, FORD 의 관리자는 JONES, JONES 의 관리자는 KING 이다)
SELECT T.ENAME FROM EMP E JOIN EMP M ON E.MGR = M.EMPNO JOIN EMP T ON M.MGR = T.EMPNO WHERE E.ENAME = 'SMITH';