Oracle DBA/SQL

061 여러 테이블의 데이터를 조인해서 출력하기 4(SELF JOIN)

Nuez 2023. 7. 3. 10:24
반응형

1. 기본 SELECT 문

 SELECT 컬럼 명
 FROM 테이블 명
 WHERE 검색 조건
 GROUP BY 그룹화할 컬럼
 ORDER BY 정렬할 컬럼 ;

 실행 순서 
 : FROM - WHERE - GROUP BY - SELECT - ORDER BY

 2. 함수

 1) 단일행 함수 : 문자, 숫자, 날짜, 변환, 일반
 2) 복수행 함수 : max, min, sum,avg, count

3. 조인

 

일단, 크게 나누면 INNER vs OUTER 조인 

OUTER JOIN아니면 다 INNER JOIN


1) 오라클 조인 문법 4가지 


 (1) EQUI JOIN : 조인하려는 두 테이블의 조인조건이 이퀄(=)조건인 조인 문법
 (2) NON EQUI JOIN : 조인하려는 두 테이블의 조인 조건이 이퀄(=) 조건이 아닌 조인 문법
 (3) OUTER JOIN
 (4) SELF JOIN

2) 1999 ANSI 조인 문법 (미국 국립 표준 협회) 10g
 (1) ON절
 (2) USING절
 (3) LEFT/ RIGHT / FULL OUTER JOIN
 (4) NATURAL
 (5) CROSS


SELF JOIN : 자기 자신과 조인하는 문법


문제 318. 사원이름, 관리자의 이름을 출력하시오. 

SELECT 사원.ename as 사원명, 관리자.ename as 관리자명
FROM emp 사원, emp 관리자 
WHERE 사원.mgr = 관리자.empno;

자기 자신 즉, 같은 테이블을 조인해서 결과를 출력하는 조인 방법

사원 테이블의 관리자 번호 = 관리자의 사원 번호인 구조를 활용


문제 319. 사원이름, 관리자 이름을 출력하는데 사원이름이 SMITH인 사원과 그 관리자를 출력하시오.

SELECT e.ename AS 사원명, m.ename AS 관리자명
FROM emp e, emp m
WHERE e.mgr = m.empno 
    AND e.ename = 'SMITH';


문제 320. 사원이름, 관리자 이름을 출력하는데, 관리자보다 월급이 더 많은 사원들만 출력하시오. 

SELECT e.ename AS 사원명, m.ename AS 관리자명
FROM emp e, emp m
WHERE e.mgr = m.empno 
    AND e.sal > m.sal;


문제 321. 사원이름, 사원의 입사일, 관리자 이름, 관리자의 입사일을 출력하는데, 관리자보다 먼저 입사한 사원들만 출력하시오.

SELECT e.ename AS 사원명, e.hiredate AS "사원 입사일",
        m.ename AS 관리자명, m.hiredate AS "관리자 입사일"
FROM emp e, emp m
WHERE e.mgr = m.empno
	AND e.hiredate < m.hiredate;

 

* 주의사항

 

날짜 컬럼을 바탕으로 선후를 비교할 때 부등호 방향을 잘 생각해야 함. 

값이 더 크다 = 더 최근이다


문제 322. (OCP 시험) 
HR 계정(유저)의 employees 테이블을 이용해서 self join을 하는데, 관리자 번호가 100번인 사원의 사원이름, 관리자 이름을 출력하시오.

employees 테이블 구조

SELECT e.last_name AS 사원명, m.last_name AS 관리자명
FROM employees e, employees m
WHERE e.manager_id = m.employee_id
    AND e.manager_id = 100;