DB練習-08


外部キー関係での制約の変更


一時的に制約を無効にし、変更後に制約を有効にします.
1-1. cascadeキーワードによって確立されたすべてのカラムを同時に無効にする
  • 制約を永続的にクリアします.
    ->条件の挿入/削除後
    ->制約条件の再指定
  • サブempの外部キーを一時的に無効にする

    -- emp1 테이블 생성
    create table emp1 (
        empno number(4),
        ename varchar2(10) constraint emp1_ename_nn not null,
        job varchar2(9),
        deptno number(2),
        constraint emp1_empno_pk primary key(empno),
        constraint emp1_job_uk unique(job),
        constraint emp1_deptno_fk foreign key(deptno) references dept1(deptno) );
    
    -- dept1 테이블 생성
    create table dept1(
        deptno number(2) constraint dept1_deptno_pk primary key,
        dname varchar2(14),
        loc varchar2(13) );
    
    -- 자료 입력
    insert into dept1 values(10, '경리부', '서울');
    insert into dept1 values(20, '인사부', '인천');
    insert into dept1 values(30, '전산부', '수원');
    insert into dept1 values(40, '영업부', '용인');
    
    -- dept1에는 50 값이 없는데, emp1에서 50을 넣으려하니 오류발생
    insert into emp1 values(1000, '허준', '사원', 50);
    
    -- 제약 조건을 일시적으로 비활성화 시켜서 허준을 넣고 싶다면?
    -- 외래키 관계에 있던 걸(CONSTRAINT emp1_deptno_fk) 비활성화(disable) 하겠다
    alter table emp1 disable CONSTRAINT emp1_deptno_fk;
    
    -- 다시 입력해보니 외래키 관계가 없어져서 오류없이 입력된다.
    insert into emp1 values(1000, '허준', '사원', 50);
    insert into emp1 values(1001, '허영', '대리', 60);
    
    -- emp1의 job 제약조건도 비활성화 시켜보자
    alter table emp1 disable constraint emp1_job_uk;
    
    -- job에 걸려있던 유일키 제약조건을 지웠기 때문에, '대리' 가 중복으로 입력 가능하게 되었다.
    insert into emp1 values (1002, '허임', '대리', 70);
    
    -- 비활성화 풀어서 다시 제약조건 활성화하기
    alter table emp1 enable constraint emp1_deptno_fk;
    
    -- 위처럼 그냥 켜면 이미 값으로 들어가있는 중복 값이 걸려버린다.
    delete from emp1; -- 깔끔하게 내용 모두 지워버리고
    
    -- 제약 조건 다시 걸기
    alter table emp1 enable constraint emp1_deptno_fk;
    alter table emp1 enable constraint emp1_job_uk;
    
    -- 현재 제약조건 확인하기 in ('테이블 명은 대문자로!')
    select * from user_constraints where table_name in ('EMP1');

    親dept側で無効化

    -- dept1 의 구조 확인하기
    select * from user_constraints where table_name in ('DEPT1');
    
    -- dept1 쪽에서 비활성화 시키기
    -- 1. 무작정 비활성화 시키려 하면 외래키 관계에 있는 자식 때문에 오류난다.
    alter table dept1 disable constraint dept1_deptno_pk;
    alter table dept1 disable primary key;
    
    -- 2. cascade : 관계에 있는 것이 있을 경우 모두 -해주어라
    alter table dept1 disable primary key cascade;
    -- 제약 조건을 풀었으니 null 값이 허용되는지 확인
    insert into dept1 (dname, loc) values ('개발부', '부산');
    -- 제약 조건을 풀었으니 중복이 허용되는 지 확인
    insert into dept1 values (10, '총무부', '대전');

    サイン


  • リレーショナル・データベースでは、テーブル間の関係が重要であるため、1つ以上のテーブルを頻繁にマージできます.1つ以上のテーブルでデータをクエリーするために使用します.

  • 1つ以上のテーブルでのデータの検索
    タイプ:cross、equal、non-equal、outer、self-join
  • ex)「従業員」表の部門番号については、「部門」表から定義された部門名を取得する必要がある場合に使用します.

    cross join


    crossjoin:一緒に使えばいい
    -- 원래 자료 찾기
    select * from emp where ename='감우성';
    select dname from dept where deptno=30;
    
    -- cross join
    select * from student, member;
    -- 이런식으로 하면 김사랑의 부서가 하나로 나올 거 같지만 제대로 안나온다
    select empno, ename, dname from emp, dept where ename='김사랑';

    equl join


    equal join:条件の下で、2つのテーブルの列が同じ場合、結合
    -- equl join
    select * from dept, emp where dept.deptno = emp.deptno;
    select * from dept d, emp e where d.deptno = e.deptno and ename='김사랑';
    -- 처리 순서가 from 을 확인하고 where 조건을 확인해서 select 의 것들을 order by 조건대로 출력할 것이다
    select e.ename, d.dname, d.loc from dept d, emp e where d.deptno = e.deptno and loc in ('서울');

    non-equl join


    non-equal join:2つのテーブルで-と-の値を検索したいのですが
    -- non-equal join
    -- salgrade01 값 변경하기
    update salgrade01 set losal = 70, hisal=120 where grade=1;
    update salgrade01 set losal = 121, hisal=140 where grade=2;
    update salgrade01 set losal = 141, hisal=200 where grade=3;
    update salgrade01 set losal = 201, hisal=300 where grade=4;
    update salgrade01 set losal = 301, hisal=500 where grade=5;
    insert into salgrade01 values(6, 501, 700);
    insert into salgrade01 values(7, 701, 1000);
    
    -- 급여 등급 테이블 출력하기
    select * from salgrade01;
    select * from emp;
    
    -- 검색하고 싶은것 : 사원, 급여, 급여등급
    select e.ename, e.sal, s.grade from emp e, salgrade01 s where e.sal between s.losal and s.hisal;
    select e.ename, e.sal, s.grade from emp e, salgrade01 s where e.sal >= s.losal and e.sal <= s.hisal;
    
    -- 이름 순서대로 정렬하고 싶다
    select e.ename, e.sal, s.grade from emp e, salgrade01 s where e.sal between s.losal and s.hisal order by ename;
    
    -- 검색하고 싶은 것 : 사원 이름, 소속 부서 이름, 사원 급여 등급
    select e.ename, d.dname, s.grade from emp e, dept d, salgrade01 s
        where e.deptno = d.deptno and e.sal between s.losal and s.hisal order by grade;
    -- 검색하고 싶은 것 : 이름, 급여, 급여등급, 부서명
    select e.ename, e.sal, s.grade, d.dname from emp e, dept d, salgrade01 s
        where e.deptno = d.deptno and e.sal between s.losal and s.hisal;

    self join


    :同じテーブルで情報を検索する
    :1つのテーブルに結合する必要がある場合は、自分のテーブルを再参照して検索します.
    -- 그냥 검색한다면 이런 식으로 검색 가능하다
    select mgr, ename from emp where ename='김사랑';
    select ename from emp where empno=1013;
    
    -- 모호성을 없애기 위해 애칭 붙이기
    select * from emp e1, emp e2;
    -- 애칭으로 검색하기
    select e1.ename 사원이름, e2.ename 사수이름 from emp e1, emp e2 where e1.mgr = e2.empno and e1.ename = '김사랑';

    ANSI join


    :現在、ほとんどの商用データベースシステムは標準言語です.
    1. cross join
    2. inner join
    :from次にinner joinという言葉を使用して結合するテーブル名を記入し、onを使用して結合条件を指定します.
    3. outer join
    :full,left,rightの3種類.
    -- cross join
    -- 오라클 sql.98 버젼의 join
    select * from emp, dept;
    -- anst join
    select * from emp cross join dept;
    
    
    -- 오라클 sql.98 버젼의 equal join
    select * from emp e, dept d where e.deptno=d.deptno;
    -- inner join
    select * from emp e inner join dept d on e.deptno=d.deptno;
    -- '이문세'의 부서명 조회해보기
    select ename, dname from emp e inner join dept d on e.deptno=d.deptno where ename='이문세';
    
    
    -- outer join
    -- full outer join = 값 모두(합집합)
    -- left-right join = 기준을 어디로 삼고 어떻게 join 할 것인가
    select e1.ename 사원명, e2.ename 사수명 from emp e1 left outer join emp e2 on e1.mgr = e2.empno;