2016. 10. 20(Thu)
L08 join
Join
둘 이상의 테이블을 연결하여 데이터를 검색
join의 방식으로 크게 3가지(Equi, Non-Equi, Self Join)로 나눈다.
Cross Join
Cross Join 절은 조인 되는 두 테이블에서 곱집합을 반환
Cartesina Product를 구할 때 사용
왼쪽 테이블을 기준으로 오른쪽 테이블의 열 곱한 결과
m열을 가진 테이블과 n열을 가진 테이블이 교차 조인되면 m*n개의 열을 생성
SELECT ename FROM emp CROSS JOIN dept
CROSS JOIN을 생략하고 ‘,’ 사용 가능
Equi Join
조인하는 테이블 간에 공통된 값(Foreign Key)을 이용하여 조인한다.
Equi Join은 공통된 값 만은 이용하는 Inner Join과
공통 값을 이용하고 남은 데이터들도 조인한 Outer Join이 있다.
공통된 값을 비교할 때 Where절을 사용하지 않는 조인을 ANISI Join이라 부른다.
A a INNER JOING B b ON a.key = b.f_key
A JOIN B USING (key)
A NATURAL JOIN B
Inner Join
가장 흔한 결합 방식
일반적인 형태
SELECT e.empno, e.ename, d.dname
FROM dept d, emp e
WHERE d.deptno = e.deptno;
INNER JOIN을 사용한 예제
SELECT e.empno, e.ename, d.dname
FROM dept d INNER JOIN emp e
ON d.deptno = e.deptno;
콤마(,) 대신 INNER JOIN을 사용할 수 있다.
INNER는 생략 가능하다.
join 조건은 ON 절에 온다.
두 테이블에 칼럼이 같다면 ON 대신 USING(DEPTNO)로 대체 가능하다.
NATURAL JOIN을 이용하여 조인하는 예제
SELECT e.empno, e.ename, d.dname
FROM dept d NATURAL JOIN emp e;
NATURAL JOIN을 사용하면 동일한 칼럼을 내부적으로 모두 조인하므로, ON절이 생략 가능하다.
JOIN~USING절을 이용하여 조인하는 예제
SELECT e.empno, e.ename, d.dname
FROM dept d JOIN emp d
USING (deptno);
NATURAL JOIN의 단점은 동일한 이름을 가지는 칼럼은 모두 조인이 되는데. USING문을 사용하면 칼럼을 선택해서 조인할 수 있다.
4. OUTER JOIN
2개 이상의 테이블이 조인 될 때 조인 조건을 만족하지 않는 행들까지도 출력
ENAME이 ‘KING’직원의 DEPTNO를 NULL로 바꾼다
UPDATE EMP SET DEPTNO=NULL WHERE ENAME=’KING’
INNER JOIN의 결과가 12개이었지만, UPDATE 후 11개로 변경됨
KING의 DEPTNO가 DEPT TABLE에 만족하는 값이 없기 때문
이때 KING도 JOIN의 결과로 나타내기 위해 LEFT OUTER JOIN을 사용.
LEFT OUTER JOIN
LEFT OUTER JOIN은 오른쪽 테이블에 조인 시킬 칼럼의 값이 없는 경우 사용한다.
select ename, deptno, dname, loc from emp left outer join dept using(deptno);
select e.ename, e.deptno, d.dname FROM EMP e, DEPT d WHERE e.deptno=d.deptno(+);
KING이 출력 되지만 나머지 칼럼은 NULL
RIGHT OUTER JOIN
RIGHT OUTER JOIN은 왼쪽 테이블에 조인 시킬 칼럼의 값이 없는 경우 사용한다.
select ename, deptno, dname, loc from emp right outer join dept using(deptno);
select e.ename, e.deptno,d.deptno, d.dname FROM EMP e, DEPT d WHERE e.deptno(+)=d.deptno;
DEPTNO 40 부서가 출력 되지만 ename = NULL
FULL OUTER JOIN
FULL OUTER JOIN은 양쪽 테이블 모두 Outer Join을 걸어야 하는 경우 사용 한다.
select e.ename, e.deptno, d.dname, d.loc from emp e full outer join dept d on e.deptno = d.deptno;
Join의 조건은 ON or USING을 사용해야 한다.
MySQL에서는 union으로 합집합 결과를 출력해야 한다.
(SELECT e.ename, e.deptno ,d.dname
FROM EMP e LEFT OUTER JOIN DEPT d
on e.deptno = d.deptno)
UNION
(SELECT e.ename, e.deptno, d.dname
FROM emp e right outer join dept d
on e.deptno = d.deptno);
NON-EQUI Join
테이블 간에 공통된 값이 없는 조인
cross join이 일어난다. (두 테이블의 곱)
where의 검색 조건으로 많이 사용되며 두 테이블 간 공통된 값이 없음으로 동등(=) 이외의 연산자로 검색한다.
SELECT e.empno, e.sal, s.grade
FROM emp e, salgrade s
위의 쿼리에서 사원의 급여에 따른 등급을 표시하세요.
WHERE e.sal BETWEEN s.losal AND s.hisal;
6. Self Join
Equi Join과 같지만 하나의 테이블에서 조인이 일어난다.
같은 테이블에 대해 두 개의 alias를 사용하여 FROM절에 두 개의 테이블을 사용하는 것처럼 조인한다.
사원 매니저명을 조회하는 Self Join 예제
SELECT e.ename, a.ename “Manager”
FROM emp e, emp a
WHERE a.mgr = e.empno;
문제1) dallas에서 근무하는 직원의 이름, 직업, 부서번호, 부서이름을 출력하라
답) SELECT ename, job, deptno, dname, loc
from EMP JOIN DEPT
USING(deptno)
where lower(loc)='dallas';
문제2) accounting 부서 소속 사원의 이름과 입사일을 출력하세요
답)SELECT ename, hiredate, dname
FROM EMP NATURAL JOIN DEPT
WHERE LOWER(dname)='accounting';
문제3) 직급이 manager인 사원의 이름, 부서명을 출력하세요.
답) SELECT ename, dname, job
FROM EMP e, DEPT d
WHERE e.DEPTNO = d.DEPTNO
AND LOWER(job) = 'manager';
문제4) 급여 등급이 3등급 이상인 직원의 사원 이름과 사원의 관리자 이름, 급여와 급여 등급 순으로 출력하라.
답) SELECT e.ename, a.ename manager, e.sal, s.grade
FROM EMP e LEFT OUTER JOIN EMP a
ON e.mgr = a.empno
CROSS JOIN SALGRADE s
WHERE e.SAL BETWEEN s.LOSAL AND s.HISAL
AND s.grade > 2
ORDER BY s.grade;
문제5) 커미션을 받는 사원의 사원이름, 부서이름, 실제급여(급여+커미션), 실제급여의 등급을 실제급여 순으로 출력하세요.
답) SELECT e.ENAME, d.DNAME, e.SAL+e.COMM, s.GRADE
FROM EMP e JOIN DEPT d CROSS JOIN SALGRADE s
ON e.DEPTNO = d.DEPTNO
WHERE e.SAL+e.COMM BETWEEN s.LOSAL AND s.HISAL
AND e.COMM>0
ORDER BY e.SAL;
문제6) EMP TABLE을 Self Join해서 Smith씨와 동일한 근무지에 근무하는 사원의 이름을 출력하세요.
답) SELECT e.ename, e.deptno, a.ename, a.deptno
FROM EMP e JOIN EMP a
ON e.DEPTNO = a.DEPTNO
WHERE e.ENAME='SMITH'
AND a.ENAME <> 'SMITH';
서브쿼리) SELECT ename, deptno
FROM EMP
WHERE deptno = (
SELECT deptno
FROM EMP
WHERE LOWER(ename) = 'smith');
'IT story > JSP' 카테고리의 다른 글
[Jsp 강의] L01HelloServlet (0) | 2016.10.27 |
---|---|
L09 Sub Query (0) | 2016.10.22 |
L07 group by (0) | 2016.10.22 |
D+34~36 Oracle(SQL SELECT문: Function, Group Function) (0) | 2016.10.01 |
D+31~33 Oracle (서버 설치하기, SQL SELECT문) (0) | 2016.09.28 |