Oracle

07. Chapter4 Advanced Query(Join)(20081029)

Gungume 2009. 1. 9. 10:41
  • 4장은 P2-36 'For Lab' 수행후에~
  1. // 일단 system계정으로 접속~
  2. SQL> conn system/system
    Connected.
  3.  
  4. // ID/PW = test00/test00인 계정 생성
    SQL> CREATE USER test00 IDENTIFIED BY test00;
  5. User created.
  6.  
  7. // test00 계정에게 권한 부여
  8. SQL> GRANT resource, connect TO test00;
  9. Grant succeeded.
  10.  
  11. // test00 계정으로 재접속
  12. SQL> conn test00/test00;
    Connected.
  13.  
  14. // ALTER SESSION SET -> 현재 세션과 관련된 정보 변경 (summit2.sql 파일의 내용과 맞추려고??)
  15. // 날짜 형식 변경
  16. SQL> ALTER SESSION SET nls_date_format = 'DD-MON-RR';
  17. Session altered.
  18.  
  19. // 언어 변경
  20. SQL> ALTER SESSION SET nls_language = 'ENGLISH';
  21. Session altered.
  22.  
  23. // summit2.sql 파일 이용해서 테이블 생성
  24. SQL> @D:\비트교육센터\Oracle\Oracle_1\summit2.sql
  25. Creating and populating tables and sequences.  Please wait.
    Tables and sequences created and populated.
  26.  
  27. / // 25개가 나와야 함~
  28. SQL> SELECT COUNT(*) FROM s_emp;
  29.   COUNT(*)
    ----------
            25
  30. 1 row selected.
  31.  
  32. // 12개가 나와야 함~
  33. SQL> SELECT COUNT(*) FROM s_dept;
  34.   COUNT(*)
    ----------
            12
  35. 1 row selected.
  36.  
  37. // 날짜 형식 원래으로 변경
  38. SQL> ALTER SESSION SET nls_date_format = 'RR/MM/DD';
  39. Session altered.

 

 

Table Alias(cont.) (P4-5)

  • column이 어느 table 소속인지를 명확히 하기 위해 아래와 같인 WHERE절을 수정해준다.
  1. // 아래 구문은 에러남~ id가 s_dept 소속인지 s_emp 소속인지 모름
  2. SQL> SELECT * FROM s_dept, s_emp WHERE id = dept_id;
  3.  
  4. // id가 어디 소속인지 명시적으로 표혐~ 에러 안남~
  5. SQL> SELECT * FROM s_dept, s_emp WHERE s_dept.id = s_emp.dept_id;

  

  • 복잡한 SELECT 문장을 작성하는 경우, 또는 table 명이 길어서 불편하거나, 또는 동일한 table을 두 번 이상 FROM 절에 사용하는 경우 등에는 table alias를 쓰도록 한다.
  1. SQL> SELECT *
      2  FROM s_dept d, s_emp e
      3  WHERE d.id = e.dept_id;

 

 

 Equijoin(cont.) (P4-7)

  • 사원 이름과 부서명 출력~(해당 사원이 소속된 부서~)
  1. SQL> conn scott/tiger
    Connected.
    SQL> SELECT ename, dname
      2  FROM emp, dept
      3  WHERE emp.deptno = dept.deptno;
  2.  
  3. ENAME      DNAME
    ---------- --------------
    CLARK      ACCOUNTING
    KING       ACCOUNTING
    MILLER     ACCOUNTING
    SMITH      RESEARCH
    ADAMS      RESEARCH
    FORD       RESEARCH
    SCOTT      RESEARCH
    JONES      RESEARCH
    ALLEN      SALES
    BLAKE      SALES
    MARTIN     SALES
  4. JAMES      SALES
    TURNER     SALES
    WARD       SALES
  5. 14 rows selected.

 

 

Non-equijoin(cont.) (P4-9)

  • Equal(=)이외의 연산자를 사용하여 join condition을 작성한 경우 non-equijoin이라고 함
  • 사원의 이름과 직종, 급여 그리고 급여의 등급을 출력하시오.
  1. SQL> conn scott/tiger;
    Connected.

  2. SQL> SELECT e.ename, e.job, e.sal, s.grade
      2  FROM emp e, salgrade s
      3  WHERE e.sal BETWEEN s.losal AND s.hisal;   // WHERE 조건이 없으면 Table1.데이터 갯수 * Table2.데이터 갯수 -> Cartesian Product라고 함(p4-1) -> 성능, 메모리 등에 영향을 끼침
  3. ENAME      JOB              SAL      GRADE
    ---------- --------- ---------- ----------
    SMITH      CLERK            800          1
    JAMES      CLERK            950          1
    ADAMS      CLERK           1100          1
    WARD       SALESMAN        1250          2
    MARTIN     SALESMAN        1250          2
    MILLER     CLERK           1300          2
    TURNER     SALESMAN        1500          3
    ALLEN      SALESMAN        1600          3
    CLARK      MANAGER         2450          4
    BLAKE      MANAGER         2850          4
    JONES      MANAGER         2975          4
  4. SCOTT      ANALYST         3000          4
    FORD       ANALYST         3000          4
    KING       PRESIDENT       5000          5
  5. 14 rows selected.

 

 

Outer Join(cont.) (P4-10)

  1. SQL> SELECT ename, dname, d.deptno
      2  FROM emp e, dept d
      3  WHERE e.deptno(+) = d.deptno;
  2.  
  3. ENAME      DNAME              DEPTNO
    ---------- -------------- ----------
    CLARK      ACCOUNTING             10
    KING       ACCOUNTING             10
    MILLER     ACCOUNTING             10
    SMITH      RESEARCH               20
    ADAMS      RESEARCH               20
    FORD       RESEARCH               20
    SCOTT      RESEARCH               20
    JONES      RESEARCH               20
    ALLEN      SALES                  30
    BLAKE      SALES                  30
    MARTIN     SALES                  30
  4. JAMES      SALES                  30
    TURNER     SALES                  30
    WARD       SALES                  30
               OPERATIONS             40
  5. 15 rows selected.

이 글은 스프링노트에서 작성되었습니다.