티스토리 뷰
조인
테이블 가로 연결(집합 연산자 : 세로 연결)
FROM절에 여러 테이블 지정
SELECT
FROM 테이블1, 테이블2, 테이블3 ...
**WHERE절을 사용한 조건을 걸지 않으면 데카르트 곱 현상 발생.
SELECT *
FROM EMP, DEPT
ORDER BY EMPNO;
EMP의 DEPTNO 하나에 DEPT의 DEPTNO가 하나씩 연결되어 총 54개 행 발생. 데카르트 곱
→ WHERE 절을 사용해 조인. (이게 조인 테이블 개수 -1 해준 거?)
--EMP의 부서번호와 DEPT의 부서번호 연결
SELECT *
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO
ORDER BY EMPNO;
--FROM의 테이블 이름도 별칭 사용 가능
--테이블 이름 띄우고 적으면 별칭 부여.
SELECT *
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO
ORDER BY EMPNO;
'.'을 찍어 별칭 표현할 수 있고 출력시 '.'은 출력되지 않음.
(1) 등가 조인(equi join) =
열 이름을 비교하는 조건식으로 조인(WHERE 조건절을 사용함으로써 테이블 개수 -1한 거? 데카르트 곱 발생 노)
--EMP의 부서번호와 DEPT의 부서번호 연결
SELECT *
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO
ORDER BY EMPNO;
※ 테이블 이름 별칭 적용과 표현 ※
--테이블 이름을 별칭으로 표현
SELECT *
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO
ORDER BY EMPNO;
--두 데이블에서 부서 번호가 똑같은 열 이름으로 포함되어 있을 때 - EMP의 DEPTNO, DEPT의 DEPTNO
--테이블 이름 띄우고 적으면 별칭 부여.
--'.'을 찍어 별칭 표현 / 출력시 .은 출력되지 않음.
SELECT E.EMPNO, E.ENAME, D.DEPTNO, D.DNAME, D.LOC
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO;
※ WHERE절에 조건식을 넣어 출력할 수 있음 ※
SELECT E.EMPNO, E.ENAME, E.SAL, E.DEPTNO, D.DNAME, D.LOC
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO
AND E.SAL >=3000;
(2) 비등가 조인 <, <=, >, >=
--급여 범위에 따른 등급 부여표
SELECT *
FROM SALGRADE;
--급여 범위를 지정하는 조건식으로 조인
--
SELECT *
FROM EMP E, SALGRADE S
WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL;
(3) 자체 조인
하나의 테이블을 여러 테이블처럼 사용
--같은 테이블을 두 번 사용하여 자체 조인
SELECT
E1.EMPNO, E1.ENAME, E1.MGR,
E2.EMPNO AS MGR_EMPNO,
E2.ENAME AS MGR_ENAME
FROM EMP E1, EMP E2
WHERE E1.MGR = E2.EMPNO;
(4) 외부 조인
왼쪽 외부 조인, 오른쪽 외부 조인. NULL 데이터 출력!
--왼쪽 외부 조인 : WHERE TABLE1.COL1 = TABLE2.COL1(+)
SELECT E1.EMPNO, E1.ENAME, E1.MGR,
E2.EMPNO AS MGR_EMPNO,
E2.ENAME AS MGR_ENAME
FROM EMP E1, EMP E2
WHERE E1.MGR = E2.EMPNO(+)
ORDER BY E1.EMPNO;
--오른쪽 외부 조인 : WHERE TABLE1.COL1(+) = TABLE2.COL1
SELECT E1.EMPNO, E1.ENAME, E1.MGR,
E2.EMPNO AS MGR_EMPNO,
E2.ENAME AS MGR_ENAME
FROM EMP E1, EMP E2
WHERE E1.MGR(+) = E2.EMPNO
ORDER BY E1.EMPNO;
※ SQL-99 표준 문법 ※
오라클 외에서도 사용할 수 있는 조인 문법
(1) NATURAL JOIN : 등가 조인과 같은 결과 출력
연결할 명은 별칭없이 적어줌(DEPTNO)
SELECT E.EMPNO, E.ENAME, E.JOB, E.MGR, E.HIREDATE, E.SAL, E.COMM,
DEPTNO, E.ENAME, D.LOC
FROM EMP E NATURAL JOIN DEPT D
ORDER BY DEPTNO, E.EMPNO;
(2) JOIN ~ USING ( 연결할 명 )
연결할 명은 별칭없이 적어줌(DEPTNO)
SELECT E.EMPNO, E.ENAME, E.JOB, E.MGR, E.HIREDATE, E.SAL, E.COMM,
DEPTNO, E.ENAME, D.LOC
FROM EMP E JOIN DEPT D USING (DEPTNO)
WHERE SAL >= 3000
ORDER BY DEPTNO, E.EMPNO;
(3) JOIN ~ ON( )
괄호 사이에 직접 조건 명시
SELECT E.EMPNO, E.ENAME, E.JOB, E.MGR, E.HIREDATE, E.SAL, E.COMM,
D.DEPTNO,
D.DNAME, D.LOC
FROM EMP E JOIN DEPT D ON (E.DEPTNO = D.DEPTNO)
WHERE SAL <= 3000
ORDER BY E.DEPTNO, E.DEPTNO;
(4) INNER JOIN ~ ON
공통인 영역 가져옴.
SELECT E.EMPNO, E.ENAME, E.JOB, E.MGR, E.HIREDATE, E.SAL, E.COMM,
D.DEPTNO,
D.DNAME, D.LOC
FROM EMP E INNER JOIN DEPT D ON (E.DEPTNO = D.DEPTNO);
※ 오라클 외부 조인을 ANSI 표준문법으로 바꾸기 ※
--OUTER JOIN : JOIN 조건에서 동일한 값이 없는 행도 반환할 때 사용. NULL값 같은.
조건에 맞지 않는 데이터도 출력하고 싶을 때.
--왼쪽 외부 조인 : WHERE TABLE1.COL1 = TABLE2.COL1(+)
--왼쪽 테이블 기준 조인. 왼쪽 테이블의 NULL 출력.
--왼쪽 테이블 기준으로 오른쪽 테이블의 데이터를 참조해옴. 참조해올 값이 없을 경우 NULL값으로 가져옴.
SELECT E1.EMPNO, E1.ENAME, E1.MGR,
E2.EMPNO AS MGR_EMPNO,
E2.ENAME AS MGR_ENAME
FROM EMP E1 LEFT OUTER JOIN EMP E2 ON(E1.MGR = E2.EMPNO)
ORDER BY E1.EMPNO;
--오른쪽 외부 조인 : WHERE TABLE1.COL1(+) = TABLE2.COL1
--오른쪽 테이블 기준 조인. 오른쪽 테이블의 NULL 출력.
--오른쪽 테이블을 기준으로 왼쪽 테이블 데이터를 참조해옴. 역시 참조해올 값이 없을 경우, NULL값 가져옴.
SELECT E1.EMPNO, E1.ENAME, E1.MGR,
E2.EMPNO AS MGR_EMPNO,
E2.ENAME AS MGR_ENAME
FROM EMP E1 RIGHT OUTER JOIN EMP E2 ON(E1.MGR = E2.EMPNO)
ORDER BY E1.EMPNO;
--세 개 이상의 테이블 조인. 조인할 만큼 나열
FROM TABLE1, TABLE2, TABLE3
WHERE TABLE1.COL = TABLE2.COL
AND TABLE2.COL = TABLE3.COL
AND TABLE3.COL = TABLE4.COL;
-ANSI 표준 INNER JOIN
FROM TABLE1 INNER JOIN TABLE2 ON (TABLE1.COL = TABLE2.COL)
INNER JOIN TABLE3 ON (TABLE2.COL = TABLE3.COL)
INNER JOIN TABLE4 ON (TABLE3.COL = TABLE4.COL);
'수업 > └Oracle' 카테고리의 다른 글
주말(01.15~16) 연습문제 (0) | 2022.01.17 |
---|---|
[CH10]데이터 조작(DML) : 데이터 추가(INSERT), 수정(UPDATE), 삭제(DELETE) (0) | 2022.01.17 |
[CH07]다중행 함수 (0) | 2022.01.13 |
[함수]_문자 (0) | 2022.01.07 |
[CH05]WHERE, 연산자 (0) | 2022.01.07 |
- Total
- Today
- Yesterday
- 변수
- Java
- 스크립태그
- empty-cell
- text formatting
- selcetor
- CascadingStyleSheet
- html input type
- caption-side
- html pre
- input type 종류
- html
- scanner
- A%B
- 미디어 태그
- BAEKJOON
- improt
- border-spacing
- 외부구성요소
- JavaScript
- 기본선택자
- html atrribute
- html base tag
- 입력양식
- initialized
- html a tag
- html layout
- css
- ScriptTag
- typeof
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |