하나의 테이블에서 있던 값을 가져오는 작업
SELECT * FROM EMP; -- 사원 정보 테이블
SELECT * FROM DEPT; -- 부서 정보 테이블
부서 정보가 변경이 되었을 경우 부서 테이블만 변경하도록 설계
사원 정보가 변경이 되어도 부서정보와는 무관하게 변경하도록 설계
데이커가 여러곳에 흩어져있기때문에 사용자가 원하는 데이터를 모두 찾으려고하면 여러 테이블을 모두 조회
>> JOIN : 여러 테이블에 흩어져있는 정보 중 필요한 정보만 가져와 가상 테이블처럼 결과 출력
SELECT * FROM EMP,DEPT -- 2개의 테이블을 호출 : 56행이 출력
ORDER BY EMPNO, DNAME;
EMP 테이블 한 행에 DEPT 테이블의 데이터가 모두 연결
테이블 2개를 출력하려고 하는데 2개의 테이블에 대한 정보를 정확하게 작성하지 않았기때문에
DB가 아무 조건 없이 모두 연결 >> 두 테이블의 공통적인 부분을 명시하여(WHERE) 올바른 연결 필요
조인 : 테이블 간의 기준값을 정해 다수의 테이블을 하나의 테이블로 출력
내부조인 : 서로 공통된 컬럼에 같은 값을 가질 경우만 출력
외부조인 : 서로 공통된 컬럼에 다른 값을 가지더라도 출력
DEPTNO : 공통컬럼
테이블명.컬럼명으로 호출 가능 > 테이블명이 길어지면 호출 시 문장이 너무 길다
> 테이블명을 별칭으로 선언
SELECT *
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO;
SELECT E.EMPNO, E.ENAME, E.DEPTNO, D.DNAME, D.LOC
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO;
-- 조인 대상이 되는 테이블의 공통적으로 존재하는 컬럼과 동일한 조건(=) 연결
테이블 별칭 작성 권장
WHERE 문에서 가장 우선적인 조건식으로 작성, 다른 조건은 그 다음
내부조인 : 두 테이블내에서 공통된 값만 출력
INSERT INTO EMP(EMPNO,ENAME, DEPTNO)
VALUES (9999, '홍길동',40);
COMMIT;
SELECT * FROM EMP;
-- 홍길동 데이터 추가 , DEPTNO 미존재시 내부조인 결과
SELECT E.EMPNO, E.ENAME, D.DEPTNO, D.DNAME, D.LOC
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO;
없는데이터를 포함하여 조인하는 기법
내부조인을 하면 두 테이블내에 공통값이 없다면 결과 출력 안함 (데이터 모두출력아니기에 훼손)
공통되지 않은 값들을 보여주는 기법
SELECT E.EMPNO, E.ENAME, D.DEPTNO, D.DNAME, D.LOC
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO(+);
- 한 테이블에 공통된 칼럼값이 없더라도(null포함) 검색
- (+) : 해당데이터가 존재하지 않더라도 무시하고 조인에 참여
- 기준이 아닌 테이블에 데이터가 없어도 기준테이블에 데이터는 모두 출력하는 것이 외부조인
- (+) 위치에따라 기준테이블 설정
조인 대상인 두 테이블에 있는 컬럼 중 조인 기준으로 선정한 컬럼 내 같은 값을 가진 행만 조회
SELECT E.EMPNO, E.ENAME, D.DEPTNO, D.DNAME
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO;
SELECT E.EMPNO, E.ENAME, D.DEPTNO, D.DNAME
FROM EMP E INNER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;
-- WHERE
-- * 조인 대상 테이블끼리 같은 컬럼명을 사용할 경우에만 사용가능
-- USING에 사용한 컬럼명은 테이블명 붙이면 안됌.
SELECT E.EMPNO, E.ENAME, DEPTNO, D.DNAME
FROM EMP E INNER JOIN DEPT D
USING (DEPTNO);
SELECT E.EMPNO, E.ENAME, DEPTNO, D.DNAME
FROM EMP E NATURAL JOIN DEPT D;
외부조인 : 내부조인결과 + 기준테이블에만 있는 데이터 포함
내부조인에서는 기준컬럼에 NULL 불허용
외부조인에서는 기준컬럼에 NULL 허용
(+)쓴 테이블은 NULL 허용
SELECT E.EMPNO, E.ENAME, D.DEPTNO, D.DNAME
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO(+);
LEFT OUTER JOIN : 왼쪽테이블이 기준(모든데이터출력)
SELECT E.EMPNO, E.ENAME, D.DEPTNO, D.DNAME
FROM EMP E LEFT OUTER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;
DELETE FROM EMP WHERE DEPTNO = 40;
SELECT E.EMPNO, E.ENAME, D.DEPTNO, D.DNAME
FROM EMP E, DEPT D
WHERE E.DEPTNO(+) = D.DEPTNO;
SELECT E.EMPNO, E.ENAME, D.DEPTNO, D.DNAME
FROM EMP E RIGHT OUTER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;
-- 오류 존재하지않는 문법
SELECT E.EMPNO, E.ENAME, D.DEPTNO, D.DNAME
FROM EMP E, DEPT D
WHERE E.DEPTNO(+) = D.DEPTNO(+);
-- FULL OUTER JOIN
SELECT E.EMPNO, E.ENAME, D.DEPTNO, D.DNAME
FROM EMP E FULL OUTER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;