DML 복습
○ 사원번호 7369 와 업무 동일한 모든사원 부서번호를 사원 7369의 현재 부서번호로 갱신
update emp_copy set dno=(select dno from emp_copy where eno=7369) where job=(select job from emp_copy where eno=7369);
○ dept_copy 테이블 삭제, department 테이블 구조 내용 복사, dept_copy 테이블 재생성
drop table dept_copy;
create table dept_copy as select * from department;
○ dept_copy 테이블에서 부서명이 'research'인 부서 삭제 (행)
delete from dept_copy where dname='RESEARCH';
○ dept_copy에서 부서번호가 10 이거나 40인 부서 삭제
delete from dept_copy where dno=10 or dno=40;
MERGE문
: 조건 비교하여 테이블에 해당 조건에 맞는 데이터 없으면 INSERT / 있으면 UPDATE 수행
MERGE INTO 테이블명
USING 비교할 테이블/서브쿼리 ON 조건
WHEN MATCHED THEN
UPDATE SET 컬럼1=값1,...
WHEN NOT MATCHED THEN
INSERT (컬럼명1,..) VALUES(값1,..) WHERE 조건;
- 보너스테이블 중 직속상관이 7839인 직원만 급여의 30%를 보너스로, 그외는 새로 추가해 급여 20% 보너스로 설정 (단 급여 2500이하)
merge into emp_bonus eb using (select eno, ename, salary, manager from employee where manager=7839) e on (eb.eno=e.eno) //using) 매니저가 7839인 데이터 뽑아오고 on) 해당 데이터들끼리 매칭
2 when matched then
3 update set bonus=e.salary*0.3 //매니저 7839인 데이터
4 when not matched then
5 insert (eb.eno, eb.ename, eb.bonus) values (e.eno, e.ename, e.salary*0.2) where e.salary<2500; //그 외
※ alter table emp_bonus modify bonus invisible; //bonus열 숨기기
=> 숨기고 보여주면서 컬럼 순서 바꿀 수 있음
뷰
: 하나 이상의 테이블이나 다른 뷰를 이용해 생성하는 가상 테이블 (virtual table)
자료가 없어 디스크 공간 할당되지 않음 => 쿼리문만 저장되어 있음 (테이블 존재 X)
보안, 편의성 高
CREATE (OR REPLACE) VIEW 뷰명 AS SELECT 문장;
=> or replace : 중복된 뷰명 있을 때에도 생성 가능 (대체됨)
- 뷰 목록 검색
select view_name, text from user_views;
- 뷰 생성
- 업무가 'salesman'인 직원의 사원번호, 사원이름, 부서번호, 담당업무 컬럼만 갖는 뷰 생성
create view v_emp_sales(사원번호, 사원이름, 부서번호, 담당업무) as select eno, ename, dno, job from employee where job='SALESMAN';
- 사원번호, 사원명, 급여, 부서번호, 부서명, 지역명
create view v_emp_complex as select e.eno, e.ename, e.salary, dno, d.dname, d.loc from employee e natural join department d;
=>
ENO ENAME SALARY DNO DNAME LOC
---------- -------------------- ---------- ---------- ---------------------------- --------------------------
7782 CLARK 2450 10 ACCOUNTING NEW YORK
7839 KING 5000 10 ACCOUNTING NEW YORK
7934 MILLER 1300 10 ACCOUNTING NEW YORK
7566 JONES 2975 20 RESEARCH DALLAS
7902 FORD 3000 20 RESEARCH DALLAS
7876 ADAMS 1100 20 RESEARCH DALLAS
7369 SMITH 800 20 RESEARCH DALLAS
7788 SCOTT 3000 20 RESEARCH DALLAS
7521 WARD 1250 30 SALES CHICAGO
7844 TURNER 1500 30 SALES CHICAGO
7499 ALLEN 1600 30 SALES CHICAGO
7900 JAMES 950 30 SALES CHICAGO
7698 BLAKE 2850 30 SALES CHICAGO
7654 MARTIN 1250 30 SALES CHICAGO
create view v_emp_salary as select dno, sum(salary) as 급여합계, avg(salary) as 급여평균 from employee group by dno;
select * from v_emp_salary;
DNO 급여합계 급여평균
---------- ---------- ----------
30 9400 1566.66667
10 8750 2916.66667
20 10875 2175
- 그룹함수 => 별칭 필수
create view v_emp_salary2 as select dno, sum(salary), avg(salary) from employee group by dno; //오류 //sum, avg 별칭 추가해야 함
- 그룹함수 갖는 뷰는 DML 사용 불가
insert into v_emp_salary values(20,2000,420); //오류
- 뷰 삭제
drop view v_emp_salary;
- force : 테이블 유무 상관없이 무조건 뷰 생성
create or replace force view v_emp_job2 as select eno, ename, dno,job from empl where job='SALESMAN';
경고: 컴파일 오류와 함께 뷰가 생성되었습니다.
//
테이블 없더라도 미래에 생성될 수 있다면 미리 뷰 생성 가능
- 뷰에 DML 조작어 사용 => 뷰 X 원본 테이블 O에 실행됨
SQL> create or replace view v_emp_job as select eno, ename, dno, job from employee where job='MANAGER';
뷰가 생성되었습니다.
SQL> insert into v_emp_job values(9000,'김ㅊ',30,'SALESMAN');
1 개의 행이 만들어졌습니다.
SQL> select * from v_emp_job;
ENO ENAME DNO JOB
---------- -------------------- ---------- ------------------
7566 JONES 20 MANAGER
7698 BLAKE 30 MANAGER
7782 CLARK 10 MANAGER
SQL> select * from employee;
ENO ENAME JOB MANAGER HIREDATE SALARY COMMISSION DNO
---------- -------------------- ------------------ ---------- -------- ---------- ---------- ----------
9000 김ㅊ SALESMAN 30
7369 SMITH CLERK 7902 80/12/17 800 20
7499 ALLEN SALESMAN 7698 81/02/20 1600 300 30
7521 WARD SALESMAN 7698 81/02/22 1250 500 30
7566 JONES MANAGER 7839 81/04/02 2975 20
7654 MARTIN SALESMAN 7698 81/09/28 1250 1400 30
7698 BLAKE MANAGER 7839 81/05/01 2850 30
7782 CLARK MANAGER 7839 81/06/09 2450 10
7788 SCOTT ANALYST 7566 87/07/13 3000 20
7839 KING PRESIDENT 81/11/17 5000 10
7844 TURNER SALESMAN 7698 81/09/08 1500 0 30
7876 ADAMS CLERK 7788 87/07/13 1100 20
7900 JAMES CLERK 7698 81/12/03 950 30
7902 FORD ANALYST 7566 81/12/03 3000 20
7934 MILLER CLERK 7782 82/01/23 1300 10
- with check option : 전체 뷰에 현재 조건 (where) 강제
create or replace view v_emp_job as select eno, ename, dno, job from employee where job='MANAGER' with check option;
//insert into v_emp_job values(9500,'이영희',30,'SALESMAN');
//ORA-01402: 뷰의 WITH CHECK OPTION의 조건에 위배 됩니다
- with read only : 읽기 전용 뷰 => DML 작업 방지
SQL> create or replace view v_emp_job as select eno, ename, dno, job from employee where job='SALESMAN' with read only;
SQL> insert into v_emp_job values(9700,'q',10,'SALESMAN');
ORA-42399: 읽기 전용 뷰에서는 DML 작업을 수행할 수 없습니다.
데이터 무결성과 제약 조건
CREATE TABLE 테이블명 (컬럼명 타입,..,..., CONSTRAINT 유일키이름 PRIMARY KEY(컬럼명));
※ primary key(=기본키, 유일키) : 중복값 입력 불가
- constraint ~ primary key
create table dept_second(dno number(2) constraint pk_dept1 primary key, dname varchar2(14), loc varchar2(13));
- not null : null 입력 불가
create table customer(id varchar2(20) not null, pwd varchar2(20) not null, name varchar2(20) not null, phone varchar2(20), address varchar2(100));
- unique : 유일값만 입력 가능 (null도 가능)
create table customer2(id varchar2(20) unique, pwd varchar2(20) not null, name varchar2(20) not null, phone varchar2(20), address varchar2(100));
'Programming > 국비학원' 카테고리의 다른 글
220914 - PL/SQL - 제어문, 커서 (0) | 2022.09.15 |
---|---|
220913 - 오라클 - 시퀀스, 인덱스, 권한, 동의어, PL/SQL (0) | 2022.09.14 |
220905 - 오라클 - 데이터 정의어, 데이터 조작어, 트랜잭션 (0) | 2022.09.06 |
220902 - 오라클 - 셀프 조인, 서브 쿼리, 다중행 서브쿼리 (0) | 2022.09.03 |
220831 - 오라클 - 숫자, 날짜, 변환, 일반, 그룹 함수, GROUP BY절 (0) | 2022.09.02 |