KIC/ORACLE

[Oracle] 조인개요 및 작성법

octopengj 2020. 10. 12. 10:41

제약조건

  • pk,uk,ck,not null =>하나의 테이블에 설정이 가능

     

    fk(외래키) =>관계형 데이터베이스의 테이블간 정의를 위해

                       한개 -> 두개로 만들어서 관리

                       모든 데이터- > 한테이블에 저장 가능(필드수가 25~)

                       ** 단점=>저장하기 힘들고->검색속도가 느리다.

     

     

    foreign key(외래키) -> 테이블에 값을 저장할려고 할때

                                  특정 필드와 연결이 되어있는 다른 테이블의 필드값을 검사(존재 체크)

                              -> 값을 저장을 시켜준다.

                              -> 존재X-->저장X

                                  참조(reference) 무결성 강화규칙에 위배

                                  ==(dept의 deptno)

     

     

테이블을 작성할때 제약조건을 한꺼번에 줄수 있다. -> 테이블 지정방식

 

SQL> create table dept

        (deptno number primary key,

        dname varchar2(20) not null,

        loc varchar2(15) not null);

 

SQL> insert into dept values(10,'영업부','서울');

        insert into dept values(20,'개발부','대전');

        insert into dept values(30,'총무부','마산');

 

 

SQL> select * from dept;

 

SQL> create table dept
     (deptno number primary key,
      dname varchar2(20) not null,
      loc varchar2(15) not null);

SQL>insert into dept values(10,'영업부','서울');
     insert into dept values(20,'개발부','대전');
     insert into dept values(30,'총무부','마산');

SQL>select * from dept;

    DEPTNO DNAME                LOC
---------- -------------------- ---------------
        10 영업부               서울
        20 개발부               대전
        30 총무부               마산
sql>create table sawon(
     id number primary key,
     name varchar2(20) not null,
     deptno number);
    
sql>insert into sawon values(1,'홍길동',10);
     insert into sawon values(2,'테스트',40); =>삭제

1 개의 행이 만들어졌습니다.    =>엉터리 데이터저장

 

 

 

<문1>

 

형식) alter table 수정t명 add constraint 관계설정할 이름

        foreign key(자기 테이블의 필드명) references

        상대방 테이블명(연결시키고자하는 필드명)

                = dept                 = deptno

 

 

sql> alter table sawon add constraint sawon_fk_deptno

       foreign key(deptno)

       references dept(deptno);

 

SQL> alter table sawon add constraint sawon_fk_deptno
  2        foreign key(deptno)
  3        references dept(deptno);
alter table sawon add constraint sawon_fk_deptno
                                 *
1행에 오류:
ORA-02298: 제약 (TEST1.SAWON_FK_DEPTNO)을 사용 가능하게 할 수 없음
 - 부모 키가 없습니다 =>40번 부서에 대한 데이터가 없기때문에 
                                fk키 설정을 할 수가 없다는 에러메세지
SQL> delete from sawon where id=2;


1 행이 삭제되었습니다.

SQL> ed
file afiedt.buf(이)가 기록되었습니다

  1* delete from sawon where id=2
SQL> alter table sawon add constraint sawon_fk_deptno
  2        foreign key(deptno)
  3        references dept(deptno);

테이블이 변경되었습니다.

SQL> insert into sawon values(2,'테스트22',20);//정상 OK
     insert into sawon values(3,'테스트3',900); //에러유발

insert into sawon values(3,'테스트3',900)
*
1행에 오류:
ORA-02291: 무결성 제약조건(TEST1.SAWON_FK_DEPTNO)이  위배되었습니다- 부모 키가 없습니다

 

 

 

 

<문2> 제약조건을 추가,삭제 -> 비활성화(기능정지), 활성화(기능 on)

 

=> 데이터 딕셔너리(=데이터 사전)에 저장

=> 테이블생성 -> DML -> 오라클의 특정테이블에 자동으로 저장(=시스템테이블)

 

 

1) user_XXX => 계정(test1)들이 조회(ex user_constraints에 저장)

2) dba_XXX => 관리자만 조회가 가능

3) all_XXX => 계정 O, 관리자 O

 

 

형식) select * from user_constraints=>필드갯수,데이터X

 

SQL> desc user_constraints

SQL> desc user_constraints

이름                                      널?      유형
 ----------------------------------------- -------- ----------------------------
 OWNER                                              VARCHAR2(30)
 CONSTRAINT_NAME(제약조건이름)                           NOT NULL VARCHAR2(30)
 CONSTRAINT_TYPE(제약조건 종류)                                    VARCHAR2(1)
 TABLE_NAME(제약조건이 설정된 테이블 이름)                               NOT NULL VARCHAR2(30)
 SEARCH_CONDITION                                   LONG
 R_OWNER                                            VARCHAR2(30)
 R_CONSTRAINT_NAME                                  VARCHAR2(30)
 DELETE_RULE                                        VARCHAR2(9)
 STATUS(제약조건 활성화상태)                                             VARCHAR2(8)
 DEFERRABLE                                         VARCHAR2(14)
 DEFERRED                                           VARCHAR2(9)
 VALIDATED                                          VARCHAR2(13)
 GENERATED                                          VARCHAR2(14)
 BAD                                                VARCHAR2(3)
 RELY                                               VARCHAR2(4)
 LAST_CHANGE                                        DATE
 INDEX_OWNER                                        VARCHAR2(30)
 INDEX_NAME                                         VARCHAR2(30)
 INVALID                                            VARCHAR2(7)
 VIEW_RELATED                                       VARCHAR2(14)
SQL>
  select constraint_name,constraint_type,table_name,
  status from user_constraints
  where table_name=upper('&table_name');
   
table_name의 값을 입력하십시오: b_prtest
구   3:   where table_name=upper('&table_name')
신   3:   where table_name=upper('b_prtest')

CONSTRAINT_NAME                C TABLE_NAME                     STATUS
------------------------------ - ------------------------------ --------
B_PRTEST_CK_AGE                C B_PRTEST                       ENABLED
  • ENABLED => 제약조건이 지금 작동중임을 표시

  • DISABLED => 제약조건이 지금 작동 off (임시로 중지)

SQL> save c:\webtest\2.db\print\consearch.txt =>자주 사용되는 SQL

 

 

 

 

<문3>제약조건이 활성화 <--> 비활성화

                               add/drop

 

형식) alter table 수정t명 disable constraint 비활성화시킬 제약조건이름

        alter table 수정t명 enable constraint 활성화시킬 제약조건이름

20~65살 입력=>>=65 입력X

SQL> alter table b_prtest disable constraint b_prtest_ck_age;
테이블이 변경되었습니다    //  작동이 멈춘 상태

SQL> @c:\webtest\2.db\print\consearch.txt
table_name의 값을 입력하십시오: b_prtest
구   3:   where table_name=upper('&table_name')
신   3:   where table_name=upper('b_prtest')

CONSTRAINT_NAME                C TABLE_NAME                     STATUS
------------------------------ - ------------------------------ --------
B_PRTEST_CK_AGE                C B_PRTEST                       DISABLED

SQL> insert into b_prtest values(9,'임시22',170,'서울시',sysdate);

1 개의 행이 만들어졌습니다.

foeign key 설정 => 두 테이블 사이의 서로 관련이 있는 필드끼리 설정

                         sawon(deptno)<----------------dept(deptno)

                                                                   부서번호

                                                                참조(확인해보고 데이터입력을 결정)

                         deptno(fk)------------------------deptno(pk)

  1. 필드명이 같아도 되고 달라된다. (default -> 같게 이름을 부여한다.)

  2. 두개의 연결된 필드는 자료형이 같아야 된다.(number <--> number)

 

 

 

 

<문4>조인? emp테이블에서 부서명을 알고 싶다. ALLEN이 근무한 부서명?

 

 

=> 한개 이상의 테이블을 가지고 검색 => 조인

     emp(사원) <--> dept(부서 -> 부번, 부서이름, 부서위치)

 

 

형식) select 필드명1, 필드명2,,,

        from 테이블1(emp), 테이블2(dept),,,

 

 

 

SQL> conn scott/tiger

 

 

SQL> select empno,ename,deptno,dname,loc from emp,dept;

 

SQL> select empno,ename,deptno,dname,loc from emp,dept;
select empno,ename,deptno,dname,loc
                   *
1행에 오류:
ORA-00918: 열의 정의가 애매합니다 // 서로 다른 테이블의 공통된 필드를 
                                  출력=>테이블명.필드명(emp.deptno)

조인(join) => 두 테이블에서 보고자하는 필드를 단순히 나열한다고 조인이되는것이 아니다.

     (=>cross join) => 의미가 없다. dept(부서 10~40) 4개=56개, A(20,000) B(35,000)

조인의 개요 => 한 개이상의 테이블을 검색하면서 중복된 데이터가 없게 설정하는 방법(조인)

                                                                                                           =>원하는 데이터를 검색

SQL> select empno,ename,dept.deptno,dname,loc from emp,dept;

   EMPNO ENAME          DEPTNO DNAME          LOC
---------- ---------- ---------- -------------- -------------
      7369 SMITH              10 ACCOUNTING     NEW YORK
      7499 ALLEN              10 ACCOUNTING     NEW YORK
      7521 WARD               10 ACCOUNTING     NEW YORK
      7566 JONES              10 ACCOUNTING     NEW YORK
      7654 MARTIN             10 ACCOUNTING     NEW YORK
      7698 BLAKE              10 ACCOUNTING     NEW YORK
      7782 CLARK              10 ACCOUNTING     NEW YORK
      7788 SCOTT              10 ACCOUNTING     NEW YORK
      7839 KING               10 ACCOUNTING     NEW YORK
      7844 TURNER             10 ACCOUNTING     NEW YORK
      7876 ADAMS              10 ACCOUNTING     NEW YORK

     EMPNO ENAME          DEPTNO DNAME          LOC
---------- ---------- ---------- -------------- -------------
      7900 JAMES              10 ACCOUNTING     NEW YORK
      7902 FORD               10 ACCOUNTING     NEW YORK
      7934 MILLER             10 ACCOUNTING     NEW YORK
      7369 SMITH              20 RESEARCH       DALLAS
      7499 ALLEN              20 RESEARCH       DALLAS
      7521 WARD               20 RESEARCH       DALLAS
      7566 JONES              20 RESEARCH       DALLAS
      7654 MARTIN             20 RESEARCH       DALLAS
      7698 BLAKE              20 RESEARCH       DALLAS
      7782 CLARK              20 RESEARCH       DALLAS
      7788 SCOTT              20 RESEARCH       DALLAS

     EMPNO ENAME          DEPTNO DNAME          LOC
---------- ---------- ---------- -------------- -------------
      7839 KING               20 RESEARCH       DALLAS
      7844 TURNER             20 RESEARCH       DALLAS
      7876 ADAMS              20 RESEARCH       DALLAS
      7900 JAMES              20 RESEARCH       DALLAS
      7902 FORD               20 RESEARCH       DALLAS
      7934 MILLER             20 RESEARCH       DALLAS
      7369 SMITH              30 SALES          CHICAGO
      7499 ALLEN              30 SALES          CHICAGO
      7521 WARD               30 SALES          CHICAGO
      7566 JONES              30 SALES          CHICAGO
      7654 MARTIN             30 SALES          CHICAGO

     EMPNO ENAME          DEPTNO DNAME          LOC
---------- ---------- ---------- -------------- -------------
      7698 BLAKE              30 SALES          CHICAGO
      7782 CLARK              30 SALES          CHICAGO
      7788 SCOTT              30 SALES          CHICAGO
      7839 KING               30 SALES          CHICAGO
      7844 TURNER             30 SALES          CHICAGO
      7876 ADAMS              30 SALES          CHICAGO
      7900 JAMES              30 SALES          CHICAGO
      7902 FORD               30 SALES          CHICAGO
      7934 MILLER             30 SALES          CHICAGO
      7369 SMITH              40 OPERATIONS     BOSTON
      7499 ALLEN              40 OPERATIONS     BOSTON

     EMPNO ENAME          DEPTNO DNAME          LOC
---------- ---------- ---------- -------------- -------------
      7521 WARD               40 OPERATIONS     BOSTON
      7566 JONES              40 OPERATIONS     BOSTON
      7654 MARTIN             40 OPERATIONS     BOSTON
      7698 BLAKE              40 OPERATIONS     BOSTON
      7782 CLARK              40 OPERATIONS     BOSTON
      7788 SCOTT              40 OPERATIONS     BOSTON
      7839 KING               40 OPERATIONS     BOSTON
      7844 TURNER             40 OPERATIONS     BOSTON
      7876 ADAMS              40 OPERATIONS     BOSTON
      7900 JAMES              40 OPERATIONS     BOSTON
      7902 FORD               40 OPERATIONS     BOSTON

     EMPNO ENAME          DEPTNO DNAME          LOC
---------- ---------- ---------- -------------- -------------
      7934 MILLER             40 OPERATIONS     BOSTON

56 개의 행이 선택되었습니다.

 

 

 

 

<문5> 조인의 종류

  1. inner join(default) => 두 검색하고자하는 테이블의 양이 엇비슷할때 사용하는 검색방법

                                 (ex 중소기업,대기업의 기준에 따라 다르다)

    형식) select 필드명1,,테이블명1.필드명,,,

    from 테이블1,테이블2,,,

    where 조건식(emp.deptno=dept.deptno)

  2. outer join => 한쪽의 테이블의 데이터가 많을때 사용하는 방법

                  => 많은쪽의 테이블의 데이터를 무조건 다 나오게 설정하고

                       적은쪽의 테이블은 일치하는 데이터만 출력하게 설정

ed
  1  select empno,ename,dept.deptno,dname,loc
  2       from emp,dept
  3* where emp.deptno=dept.deptno
SQL> /

     EMPNO ENAME          DEPTNO DNAME          LOC
---------- ---------- ---------- -------------- -------------
      7369 SMITH              20 RESEARCH       DALLAS
     =>smith라는 사람이 부서번호가 20번인 research 라는 부서에 근무하고
        있으면 부서의 위치는 dallas다.

      7499 ALLEN              30 SALES          CHICAGO
      7521 WARD               30 SALES          CHICAGO
      7566 JONES              20 RESEARCH       DALLAS
      7654 MARTIN             30 SALES          CHICAGO
      7698 BLAKE              30 SALES          CHICAGO
      7782 CLARK              10 ACCOUNTING     NEW YORK
      7788 SCOTT              20 RESEARCH       DALLAS
      7839 KING               10 ACCOUNTING     NEW YORK
      7844 TURNER             30 SALES          CHICAGO
      7876 ADAMS              20 RESEARCH       DALLAS

     EMPNO ENAME          DEPTNO DNAME          LOC
---------- ---------- ---------- -------------- -------------
      7900 JAMES              30 SALES          CHICAGO
      7902 FORD               20 RESEARCH       DALLAS
      7934 MILLER             10 ACCOUNTING     NEW YORK

14 개의 행이 선택되었습니다.