2015. 7. 9. 11:14 Naver Blog 백업용
모든 테이블 정보 보기
- SELECT * FROM TAB;
간단하게 JOIN 연습해보기
- SELECT ENAME,DNAME FROM EMP,DEPT;
- ENAME(14개 ROWS) / DNAME(5개 ROWS)
- 두개를 합친 70개 ROWS가 출력됨
- 조건이 없기때문에 DNAME을 모든 ENAME에 매치시킴
: HEEJU ACCOUNTING / HEEJU SALES / HEEJU RESEARCH / ...
CROSS JOIN = 카티션 프로덕트
- 테이블이 조인될 때 WHERE절에 의해 공통되는 컬럼에 의한 결합이 발생하지 않는 경우
조인의 종류 - EQUI JOIN : 동일 컬럼을 기준으로 조인 - NON-EQUI JOIN : 동일 컬럼이 없이 다른 조건을 사용하여 조인 - OUTER JOIN : 조인 조건에 만족하지 않는 로우도 나타냄 - SELF JOIN : 한 테이블 내에서 조인 |
1) EQUI JOIN
- 두 테이블에서 공통적으로 존재하는 컬럼의 값이 일치되는 행을 연결해 결과 생성
- SELECT ENAME,HIREDATE,DNAME
FROM EMP,DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO; -> 소속을 명확하게 해 줄 필요가 있음
+ 소속의 명확성 향상을 위해
- 테이블명.애트리뷰트
ex) SELECT EMP.DEPTNO, DEPT.DEPTNO
FROM EMP, DEPT
- ALIAS 사용
ex) SELECT E.DEPTNO, D.DEPTNO
FROM EMP E, DEPT D
- 문제. SALES 부서에 있는 사원의 이름,입사일,월급,부서명을 출력하세요. (2개 테이블 조인)
SELECT E.ENAME, E.HIREDATE, E.SAL, D.DNAME
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO AND D.DNAME='SALES';
- 문제. 3개 테이블 조인
SELECT E.ENAME, E.DEPTNO, D.DNAME, L.CITY
FROM EMP E, DEPT D, LOCATIONS L
HERE E.DEPTNO = D.DEPTNO AND D.LOC_CODE = L.LOC_CODE;
- 문제. 서울에 근무하는 사원의 목록
SELECT E.ENAME, E.DEPTNO, D.DNAME, L.CITY
FROM EMP E, DEPT D, LOCATIONS L
WHERE E.DEPTNO = D.DEPTNO AND D.LOC_CODE = L.LOC_CODE AND L.CITY='SEOUL';
2) NON-EQUI JOIN
- 특정 범위내에 있는지를 조사하기위해 WHERE 절에 조건을 넣어 비교함
- 주로 은행에서 실적, 회사에서 실적 등을 조회하기 위하여 사용함
- 문제. 사원의 월급의 등급을 출력
SELECT E.ENAME, E.SAL, S.GRADE
FROM EMP E, SALGRADE S
WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL;
--> 보통 BETWEEN AND를 활용
3) SELF JOIN
- 하나의 테이블 내에서 조인해서 데이터를 얻어내기 위한 조인
- 대표적인 예로 관리자의 이름/사원번호를 뽑아내기 위한 예시를 들 수 있다.
- 문제1. 관리자별로 관리하고 있는 직원이 몇명인지 구하시오.
SELECT M.ENAME, COUNT(E.EMPNO)
FROM EMP E, EMP M
WHERE E.MGR = M.EMPNO
GROUP BY M.ENAME;
- 문제2. 매니저가 KING인 사원의 사원명, 부서코드, 급여 정보 출력하기
SELECT E.ENAME, E.DEPTNO, E.SAL, E.MGR, M.ENAME
FROM EMP E, EMP M
WHERE M.ENAME = 'KING' AND E.MGR = M.EMPNO;
4) OUTER JOIN
- 어느 한쪽의 테이블에는 데이터가 존재하는데 다른쪽 테이블에는 존재하지 않는 경우,
그 데이터는 출력되지 않는 문제를 해결하기 위한 조인 기법
- 먼저, 두개의 튜플을 EMP 테이블에 넣는다
INSERT INTO EMP VALUES('7777','장동건',NULL,NULL,SYSDATE,0,0,NULL);
INSERT INTO EMP VALUES('8888','고소영',NULL,NULL,SYSDATE,0,0,NULL);
- 문제1. 사원이름, 부서번호, 입사일을 기본으로 출력 --> DEPTNO가 NULL인 값도 출력된다.
SELECT ENAME, DEPTNO, HIREDATE
FROM EMP;
- 문제2. DEPTNO가 동일한 정보를 출력 --> DEPTNO가 NULL인 값은 출력되지 않는다.
SELECT E.ENAME, E.DEPTNO, E.HIREDATE, D.DNAME
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO;
- 정보가 부족한 쪽에 (+) 기호를 붙인다.
SELECT E.ENAME, E.DEPTNO, E.HIREDATE, D.DNAME
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO(+);
부서명이 없지만 + 기호를 붙여 정보가 있다는 전제하에 데이터를 출력해주게됨.
- 문제3. 매니저가 없는 사원의 사원명, 부서코드, 급여 정보 출력하기(SELFJOIN문제2 응용)
SELECT E.ENAME, E.DEPTNO, E.SAL, E.MGR, M.ENAME
FROM EMP E, EMP M
WHERE E.MGR = M.EMPNO(+);
ANSI JOIN
- 형식
SELECT *
FROM TABLE1 INNER JOIN TABLE2
WHERE TABLE1.COL1 = TABLE2.COL2
- 예시
SELECT ENAME, DNAME
FROM EMP INNER JOIN DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO
-
'DB > Oracle' 카테고리의 다른 글
[Oracle] 데이터 무결성 -1- (0) | 2021.05.07 |
---|---|
[Oracle] 서브쿼리 -1- (0) | 2021.05.07 |
[Oracle] 검색(SELECT) -1- (0) | 2021.05.07 |
[Oracle] 그룹함수 -1- (0) | 2021.05.07 |
[Oracle ] SQL 주요함수 -3- (0) | 2021.05.07 |