Untitled

/*- 04_join.sql 0*/

/*
 * # join
 * - 하나 이상의 테이블에서 한번의 질의문으로 원하는 자료를 검색할 때 사용.
 */

/*
 * # equl join
 * - 가장 많이 사용되는 조인 방식으로 조인 대상이 되는 두 테이블에서 
 *   공통으로 존재하는 컬럼의 값이 일치되는 행을 연결해서 결과를 생성.
 */

-- EMP & DEPT 
-- 사원 정보 출력시에 각 사원들이 소속된 부서의 상세 정보 확인.
SELECT * FROM EMP, DEPT WHERE EMP.DEPTNO=DEPT.DEPTNO;
SELECT * FROM EMP INNER JOIN DEPT ON EMP.DEPTNO=DEPT.DEPTNO WHERE ENAME = 'JAMES';
-- 위 결과에서 특정 컬럼만 확인
SELECT ENAME,DNAME FROM EMP, DEPT WHERE EMP.DEPTNO=DEPT.DEPTNO;

-- 이름이 james 인 사람의 부서명 확인
SELECT ENAME,DNAME FROM EMP, DEPT WHERE EMP.DEPTNO=DEPT.DEPTNO AND ENAME = 'JAMES';

-- 두 개의 테이블에서 동일하게 존재하는 컬럼을 확인할 때에는, 컬럼명 앞에 테이블 명을 작성.
SELECT ENAME,DNAME, EMP.DEPTNO FROM EMP, DEPT WHERE EMP.DEPTNO=DEPT.DEPTNO AND ENAME = 'JAMES';

-- 테이블에 별칭 지정
-- FROM 절 뒤에 테이블 이름을 명시하고, 공백을 작성한 다음 별칭을 지정.
SELECT E.ENAME,D.DNAME, E.DEPTNO FROM EMP E, DEPT D WHERE E.DEPTNO=D.DEPTNO AND E.ENAME = 'JAMES';

/*
 * # Non-Equi join
 * - 조인 조건에 특정 범위 내에 있는지를 비교연산자를 사용해서 JOIN
 */

-- SALGRADE : 급여 등급 레이블
-- DESC SALGRADE;
-- 이름    널? 유형     
-- ----- -- ------ 
-- GRADE    NUMBER 
-- LOSAL    NUMBER 
-- HISAL    NUMBER 

-- 각 사원의 급여 등급 확인
SELECT ENAME, SAL, GRADE
FROM EMP,SALGRADE
WHERE SAL BETWEEN LOSAL AND HISAL;

-- 사원 이름과 소속 부서, 급여의 등급 확인
SELECT E.ENAME, D.DNAME, E.SAL, S.GRADE
FROM EMP E,DEPT D,SALGRADE S
WHERE E.DEPTNO=D.DEPTNO
AND E.SAL BETWEEN S.LOSAL AND S.HISAL;

/*
 * # SELFJOIN
 * - 하나의 테이블에서 조인해서 원하는 결과값을 출력.
 */
 
 -- 사원의 담당 MANAGER 확인
SELECT EMPLOYEE.ENAME || '의 MANAGER 는 ' || MANAGER.ENAME || ' 입니다.'
FROM EMP EMPLOYEE, EMP MANAGER
WHERE EMPLOYEE.MGR = MANAGER.EMPNO;
 
 /*
  * # OUTERJOIN
  * - 조인 조건에 만족하지 않는 행도 나타내는 조인.
  * - 조인될 때, 어느 한쪽의 테이블에는 해당하는 데이터가 있지만,
  *   다른 쪽 테이블에는 데이터가 없을 경우 그 데이터가 출력되지 않는 것을 해결.
  * - '+' 기호를 조인 조건에서 정보가 부족한 컬럼 이름 뒤에 붙임.
  */

SELECT EMPLOYEE.ENAME || '의 MANAGER 는 ' || MANAGER.ENAME || ' 입니다.'
FROM EMP EMPLOYEE, EMP MANAGER
WHERE EMPLOYEE.MGR = MANAGER.EMPNO(+);

/* quiz */
-- 'NEW YORK' 에서 근무하는 사원의 이름과 급여를 출력하세요
SELECT E.ENAME, E.SAL 
FROM EMP E,DEPT D 
WHERE E.DEPTNO=D.DEPTNO 
AND D.LOC='NEW YORK';

SELECT E.ENAME, E.SAL 
FROM EMP E 
INNER JOIN DEPT D 
ON E.DEPTNO=D.DEPTNO 
WHERE D.LOC='NEW YORK';

-- SMITH 사원과 동일한 근무지에서 근무하는 사원의 이름을 출력하세요
SELECT E.ENAME 
FROM EMP E,DEPT D 
WHERE E.DEPTNO=D.DEPTNO 
AND D.LOC='DALLAS' 
AND ENAME NOT LIKE '%SMITH%';

SELECT E.ENAME 
FROM EMP E 
INNER JOIN DEPT D ON E.DEPTNO=D.DEPTNO 
WHERE D.LOC='DALLAS' 
AND ENAME NOT LIKE '%SMITH%';

SELECT EA.ENAME, EB.ENAME
FROM EMP EA, EMP EB
WHERE EA.DEPTNO=EB.DEPTNO
AND EA.ENAME='SMITH';
--AND EA.ENAME!=EB.ENAME;

SELECT EA.ENAME, EB.ENAME 
FROM EMP EA 
INNER JOIN EMP EB ON EA.DEPTNO=EB.DEPTNO 
WHERE EA.ENAME='SMITH' 
AND EA.ENAME NOT LIKE EB.ENAME;