7장 조인
목 차 EQUI JOIN 컬럼 명의 모호성 해결 테이블명에 별칭 부여 EQUI JOIN에 AND 연산을 추가하여 검색 NON-EQUI JOIN SELF JOIN OUTER JOIN 예제
조인의 기본 개념 조인 : 원하는 정보가 하나의 테이블에 없을때 두 개이상의 테이블에서 정보를 얻음 사원번호가 7900인 사원의 이름, 부서명 조회 SQL> SELECT * FROM emp; SQL> SELECT * FROM dept; SQL> SELECT empno, ename, deptno 2 FROM emp 3 WHERE empno = 7900; SQL> SELECT dname 2 FROM dept 3 WHERE deptno = 30;
EQUI JOIN Equi join : 공통으로 존재하는 컬럼이 같은 값을 가질 때 결합
EQUI JOIN 사원명과 부서명 조회 SQL> SELECT ename, dname 2 FROM emp, dept 3 WHERE emp.deptno = dept.deptno;
컬럼 명의 모호성 해결 SQL> SELECT ename, dname, 2 FROM emp, dept 두 테이블에 같은 이름의 컬럼이 존재할 때 테이블명을 앞에 명시해야 함 - 테이블 명.컬럼명 SQL> SELECT ename, dname, 2 FROM emp, dept 3 WHERE deptno = deptno; Error : 열의 정의가 애매합니다. SQL> SELECT ename, dname, emp.deptno, dept.deptno 2 FROM emp, dept 3 WHERE emp.deptno = dept.deptno;
테이블명에 별칭 부여 SQL> SELECT e.ename, d.dname, e.deptno, d.deptno 테이블명 뒤에 공백을 두고 별칭 부여 SQL> SELECT e.ename, d.dname, e.deptno, d.deptno 2 FROM emp e, dept d 3 WHERE e.deptno = d.deptno;
EQUI JOIN에 AND 연산을 추가하여 검색 이름이 ‘SCOTT’인 사원의 이름과 부서명 조회 SQL> SELECT ename, dname 2 FROM emp e, dept d 3 WHERE e.deptno = d.deptno 4 AND e.ename='SCOTT';
NON-EQUI JOIN Non-Equi join : 컬럼이 일정 범위의 값을 가질 때 결합 호봉 테이블 조회 SQL> SELECT * from salgrade; 사원 이름과 급여, 호봉 산출 SQL> SELECT e.ename, e.sal, s.grade 2 FROM emp e, salgrade s 3 WHERE e.sal >= s.losal AND e.sal <= s.hisal; SQL> SELECT e.ename, e.sal, s.grade 2 FROM emp e, salgrade s 3 WHERE e.sal BETWEEN s.losal AND s.hisal;
SELF JOIN Self join : 자기자신 테이블과 결합 사원의 이름과 상사의 이름 조회 SQL> SELECT e.ename || ‘의 매니저는 ’ || m.ename || ‘입니다.’ 2 FROM emp e, emp m 3 WHERE e.mgr = m.empno;
OUTER JOIN Outer join : 조건에 만족하지 않는 행도 나타내도록 하는 결합 SQL> SELECT e.ename || ‘의 매니저는 ’ || m.ename || ‘입니다.’ 2 FROM emp e, emp m 3 WHERE e.mgr = m.empno(+); 값이 없는 쪽, Null값이 인쇄되는 쪽에 (+) 기호
OUTER JOIN 사원의 이름과 부서명을 조회하시오(부서테이블의 모든 부서 출력) SQL> SELECT e.ename, d.dname 2 FROM emp e, dept d 3 WHERE e.deptno(+) = d.deptno; 값이 없는 쪽에 (+) 기호 즉, null값이 인쇄되는 쪽
예제 1,2 사원의 이름과 부서번호, 부서명 조회 SQL> SELECT e.ename, d.deptno, d.dname 2 FROM emp e, dept d 3 WHERE e.deptno = d.deptno; 부서번호가 30인 사원의 이름, 직급, 부서번호, 부서위치 조회 SQL> SELECT e.ename, e.job, e.deptno, d.loc 2 FROM emp e, dept d 3 WHERE e.deptno = d.deptno 4 and e.deptno=30;
예제 3,4 커미션을 받는 사원의 이름, 커미션, 부서명, 위치 출력 SQL> SELECT e.ename, e.comm, d.dname, d.loc 2 FROM emp e, dept d 3 WHERE e.deptno = d.deptno 4 and e.comm is not null and e.comm > 0; and NVL(e.comm, 0) > 0 달라스에서 근무하는 사원의 이름, 직급, 부서번호, 부서이름 출력 SQL> SELECT e.ename, e.job, e.deptno, d.dname 2 FROM emp e, dept d 3 WHERE e.deptno = d.deptno 4 and d.loc=‘DALLAS’;
예제 5, 6 이름에 ‘A’들어가는 사원의 이름, 부서이름 출력 SQL> SELECT e.ename, d.dname 2 FROM emp e, dept d 3 WHERE e.deptno = d.deptno 4 and e.ename like ‘%A%’; 사원이름과 직급, 급여, 호봉 출력 SQL> SELECT e.ename, e.job, e.sal, s.grade 2 FROM emp e, salgrade s 3 WHERE e.sal BETWEEN s.losal AND s.hisal;
예제 7 사원명, 부서번호, 해당사원과 같은 부서에서 근무하는 사원 출력 SQL> SELECT e.ename“자신’,e.deptno, c.ename“동료”, c.deptno 2 FROM emp e, emp c 3 WHERE e.ename <> c.ename 4 and e.deptno=c.deptno 5 ORDER BY e.ename;