종류 | 설명 | |
---|---|---|
오라클 조인 | cartesian product | 조인 조건을 생략하거나 조인이 잘못된 경우에 발생된다. |
equi 조인 | 기본키(Primary Key)와 참조키(Foreign Key)을 사용하여 반드시 조건이 일치하는 데이터만 조회하는 방법이다. | |
non-squi 조인 | 조건이 반드시 일치하지 않더라도 범위에 포함하는 경우에 조회하는 방법이다. | |
outer 조인 | 조건에 일치하지 않아도 조인 결과에 포함시키는 방법이다. | |
self 조인 | 자신의 테이블과 조인하는 방법이다. | |
ANSI 조인 | cross 조인 | 오라클 조인의 catessian product와 동일한 방법이다. |
(다른 DB에서도 사용 가능) | natural 조인 | 오라클 조인의 equi 조인과 동일하며 자동으로 두 개의 테이블에서 일치하는 컬럼을 찾아서 조인된다. |
using(컬럼) | 오라클 조인의 equi 조인과 동일하며 명시적으로 일치하는 컬럼을 작성한다. | |
join ~ on절 | 오라클 조인의 non-equi 조인과 동일 조인 방법이다. on 절에 조인조건을 명시한다. | |
left, right, full outer 조인 | 오라클 조인의 outer 조인과 동일한 방법이다. | |
self 조인 | 오라클 조인의 self 조인과 동일한 방법이다. |
-- Equi 조인 문법
SELECT 테이블1.컬럼, 테이블2.컬럼
FROM 테이블1, 테이블2
WHERE 테이블1.공통컬럼 = 테이블2.공통컬럼;
SELECT e.empno, e.ename, d.dname, d.loc
FROM emp e, dept d
WHERE e.deptno = d.deptno;
SELECT e.empno, e.ename, d.dname, d.loc
FROM emp e, dept d
WHERE e.deptno = d.deptno
AND e.empno = 7900;
SELECT e.empno, e.ename, d.dname, d.loc
FROM emp e, dept d
WHERE e.deptno = d.deptno
AND e.empno = 7369;
SELECT d.dname 부서명, COUNT(*) 인원수
FROM emp e, dept d
WHERE e.deptno = d.deptno
AND e.hiredate < TO_DATE('05', 'RR')
GROUP BY d.dname;
테이블1.컬럼
이 아닌 컬럼
명만 써줘도 된다.SELECT 테이블1.컬럼, 테이블2.컬럼
FROM 테이블1, 테이블2
WHERE 테이블1.컬럼 비교연산자(>, < 등) 테이블2.컬럼;
SELECT ename, sal, grade
FROM emp e, salgrade s
WHERE e.sal BETWEEN s.losal AND s.hisal
ORDER BY 3;
SELECT empno, ename, job, sal, grade, losal, hisal
FROM emp e, salgrade s
WHERE e.sal BETWEEN s.losal AND s.hisal AND deptno = 10;
SELECT e.ename, e.sal, d.dname, s.grade
FROM emp e, dept d, salgrade s
WHERE e.deptno = d.deptno
AND e.sal BETWEEN s.losal AND s.hisal;
SELECT e.empno, e.ename, e.deptno, d.dname, d.loc, e.sal, s.grade
FROM emp e, dept d, salgrade s
WHERE e.sal BETWEEN s.losal AND s.hisal
AND d.deptno = 10
AND e.deptno = d.deptno;
SELECT e.empno, e.ename, e.deptno, d.dname, d.loc, e.sal, s.grade
FROM emp e, dept d, salgrade s
WHERE e.sal BETWEEN s.losal AND s.hisal
AND e.empno = 7369
AND e.deptno = d.deptno;
SELECT empno, ename, job, dept.deptno, dname, loc
FROM dept, emp
ORDER BY empno;
-- 사원번호, 매니저 번호 self join
SELECT a.ename 사원, b.ename 관리자, a.mgr, b.empno
FROM emp a, emp b
WHERE a.mgr = b.empno;
SELECT e.ename 사원이름, e.mgr 관리자번호, g.empno "관리자 사원번호", g.ename 관리자이름
FROM emp e, emp g
WHERE e.mgr = g.empno
AND e.empno = 7369;
SELECT e.ename, e.mgr, g.empno, g.ename, g.deptno, d.deptno, d.dname
FROM emp e, emp g, dept d
WHERE e.mgr = g.empno
AND d.deptno = g.deptno
AND e.empno = 7369;
SELECT 테이블1.컬럼, 테이블2.컬럼
FROM 테이블1, 테이블2
WHERE 테이블1.공통컬럼 = 테이블2.공통컬럼(+);
SELECT e.ename 사원명, m.ename 관리자명
FROM emp e, emp m
WHERE e.mgr = m.empno(+);
SELECT 테이블1.컬럼, 테이블2.컬럼
FROM 테이블 NATURAL JOIN 테이블2
[WHERE 검색조건];
SELECT empno, ename, deptno, dname, loc
FROM emp
NATURAL JOIN dept;
-- 위와 아래의 결과는 동일하다.
SELECT e.empno, e.ename, d.dname, d.loc
FROM emp e, dept d
WHERE e.deptno = d.deptno;
SELECT empno, ename, deptno, dname, loc
FROM emp e NATURAL JOIN dept d
WHERE deptno=10;
SELECT e.ename 사원명, deptno 부서번호, d.dname 부서번호
FROM emp NATURAL JOIN dept d
WHERE e.empno = 7369;
-- 공통컬럼
-- 별칭 (x)
SELECT empno, ename, e.deptno, dname, loc
FROM emp e NATURAL JOIN dept d;
-- 공통컬럼
SELECT empno, ename, deptno, dname, loc
FROM emp e NATURAL JOIN dept d; -- (o)
SELECT 테이블1.컬럼, 테이블2.컬럼
FROM 테이블1 [INNER] JOIN 테이블2 USING(공통컬럼)
[WHERE 검색조건];
SELECT empno, deptno, ename, dname, loc
FROM emp e
JOIN dept d
USING (deptno);
-- 위와 아래의 SQL문의 결과는 동일하다.
SELECT empno, deptno, ename, dname, loc
FROM emp e
INNER JOIN dept d
USING (deptno);
-- equi 조인과 동일하다.
SELECT empno, deptno, ename, dname, loc
FROM emp e
JOIN dept d
USING (deptno)
WHERE empno = 7396;
SELECT empno, ename, dname
FROM dept
CROSS JOIN emp;
-- 위와 아래의 SQL문은 동일한 결과를 도출한다.
SELECT empno, ename, dname
FROM dept, emp;
SELECT 테이블1.컬럼, 테이블2
FROM 테이블1 [INNER] JOIN 테이블2 ON 조인조건
[WHERE 검색조건];
-- equi 조인과 동일
SELECT empno, ename, dname, loc
FROM emp e
JOIN dept d
ON e.deptno = d.deptno;
-- 공통컬럼
-- 명시해줘야함
SELECT empno, deptno, ename, dname, loc
FROM emp e
JOIN dept d
ON e.deptno = d.deptno; -- (X)
SELECT empno, e.deptno, ename, dname, loc
FROM emp e
JOIN dept d
ON e.deptno = d.deptno; -- (O)
-- Inner 생략 가능하다.
SELECT e.ename, d.dname, d.loc
FROM emp e INNER JOIN dept d ON e.deptno = d.deptno
WHERE e.deptno = 10;
-- JOIN ~ ON으로 Non equi 사용 가능하다.
SELECT e.ename, e.sal, s.grade
FROM emp e JOIN salgrade s ON e.sal BETWEEN s.losal AND s.hisal
WHERE e.empno = 7369;
-- JOIN ~ ON으로 equi, Non equi 동시에 가능하다.
SELECT ename, sal, grade
FROM emp e JOIN dept d ON e.deptno = d.deptno
JOIN salgrade s ON e.sal BETWEEN s.losal AND s.hisal
WHERE e.empno = 7369;
-- JOIN ~ ON으로 self join 가능하다.
SELECT e.ename, e.mgr, m.empno, m.ename, m.mgr, mm.empno, mm.ename
FROM emp e JOIN emp m ON e.mgr = m.empno
JOIN emp mm ON m.mgr = mm.empno;
SELECT 테이블1.컬럼, 테이블2.컬럼
FROM 테이블1 LEFT|RIGHT|FULL OUTER JOIN 테이블2
ON 조인조건 | USING(컬럼)
[WHERE 검색조건];
-- 오른쪽 값이 일치여부와 관계없는 값인 NULL 값도 출력
SELECT e.ename 사원명, m.ename 관리자명
FROM emp e LEFT OUTER JOIN emp m
ON e.mgr = m.empno;
-- 왼쪽 값이 일치여부와 관계없는 값인 NULL 값도 출력
SELECT e.ename 사원명, m.ename 관리자명
FROM emp e RIGHT OUTER JOIN emp m
ON e.mgr = m.empno;
-- 왼쪽, 오른쪽 값이 일치여부와 관계없는 값인 NULL 값도 출력
SELECT e.ename 사원명, m.ename 관리자명
FROM emp e FULL OUTER JOIN emp m
ON e.mgr = m.empno;
SELECT e.empno 사원번호, e.ename 사원명, d.dname 부서명
FROM dept d LEFT OUTER JOIN emp e
ON d.deptno = e.deptno;
-- 위와 아래는 동일한 결과이다.
SELECT e.empno 사원번호, e.ename 사원명, d.dname 부서명
FROM dept d LEFT OUTER JOIN emp e
USING(deptno);