Oracle 5일차.

2021. 9. 13. 15:04Oracle

쿼리를 만들적에 경우에 따라서는 복잡한 쿼리를 이용할 수도 있지만,

직관적인 작업을 처리한다면, 몇개의 쿼리문으로 쪼개어 처리할 수도 있음.

웹서버에서 가장 많이 사용되는 부분은 CRUD;

CREATE, READ, UPDATE, DELETE

 

1) INSERT 명령문

  • INSERT
    • 테이블에 새로운 로우를 추가할 때 사용하는 SQL문이다
    • 테이블에 새로운 데이터를 입력하기 위해 사용하는 데이터 조작어이다.
    • 테이블의 모든 컬럼에 자료를 입력하는 경우 컬럼 목록을 기술하지 않아도 된다. 컬럼 목록이 생략되면 VALUES절 다음의 값들이 테이블의 기본 컬럼 순서대로 입력된다.

2) 다중 테이블에 다중행 입력하기

  • 다중 테이블에 다중 행 입력
    • INSERT ALL - 다중 테이블에 다중행 입력하기
      • 서브 쿼리의 결과를 조건 없이 여러 테이블에 입력할 수 있다.
    • INSERT ALL 명령문을 사용하지 않고 데이터를 추가하려면 INSERT 명령문을 두번 써야 한다.

3) UPDATE 명령문

  • UPDATE
    • 테이블에 저장된 데이터를 수정하기 위해서 사용하는 명령문이다.
    • 기존의 행을 수정하기 위해 사용된다.
    • 주의할 점! WHERE 절을 사용하지 않을 경우는 테이블에 있는 모든 행이 수정된다.

4) DELETE 명령문

  • 테이블에 저장되어 있는 데이터를 삭제하는 명령문이다.
  • 테이블의 기존 행을 삭제하는 명령문이다.
  • 특정 로우를 삭제하기 위해서는 WHERE절을 추가한다.
  • 만약 DELETE문에 WHERE절을 사용하지 않을 경우 테이블에 있는 모든 행이 삭제된다.

5) MERGE 명령문

  • 구조가 같은 두 개의 테이블을 하나의 테이블로 합치는 기능을 하는 명령문
    • 기존 테이블에 자료가 존재하는 경우 : 새로운 값으로 갱신(UPDATE)
    • 새로운 행으로 추가(INSERT)

 

무결성 제약 조건의 개념과 종류

  • 데이터 무결성 제약 조건(Data integrity Constraint Rule)
    • 테이블에 부적절한 자료가 입력되는 것을 방지하기 위해 테이블을 생성할 때, 각 컬럼에 대해서 정의하는 여러 가지 규칙이다.
    • 무결성 : 데이터베이스 내에 있는 데이터의 정확성 유지
    • 제약 조건 : 바람직하지 않은 데이터가 저장되는 것을 방지하는 것

1) PRIMARY KEY

  • UNIQUE 제약 조건 + NOT NULL 제약 조건
  • 컬럼명과 자료형을 기술한 다음 PRIMARY KEY를 기술하면 된다.
  • 사원 테이블(EMP05)의 사원번호(EMPNO)를 기본키(PRIMARY KEY)로 지정하는 경우

2) FOREIGN KEY

  • 참조 무결성
    • 테이블 사이의 관계에서 발생하는 개념이다.
    • 두 테이블 사이의 주종 관계(주체가 되는 테이블(부모 테이블 EX. 부서 테이블)과 종속이 되는 테이블(자식 테이블 EX. 사원 테이블))에 의해서 결정된다.
    • 주체 관계가 애매모호한 경우 - '어느 테이블의 데이터가 먼저 정의되어야 하는가?'가 기준이 된다. 먼저 정의되어야 하는 테이블이 부모 테이블, 나중에 정의되어야 하는 테이블이 자식 테이블이 된다.
  • FOREIGN KEY 제약 조건
    • 사원 테이블의 부서 번호는 반드시 부서 테이블에 존재하는 부서 번호만 입력해야 한다. → 사원 테이블이 부서 테이블의 부서 번호를 참조 가능하도록 하는 것이다.

가상 테이블인 뷰

  • 뷰(VIEW)
    • 물리적인 테이블을 근거한 논리적인 가상 테이블
    • 테이블에는 데이터가 있지만 뷰에는 데이터가 없고 SQL만 저장되어 있다.
    • 사용자가 해당 VIEW에 접근하면, 그때 VIEW에 들어 있던 SQL이 수행되어 결과를 가져오는 것이다.
  • 기본 테이블
    • 뷰를 생성하기 위해서는 실질적으로 데이터를 저장하고 있는 물리적인 테이블이 존재해야 한다.
    • DEPT 테이블과 EMP 테이블의 내용을 복사하여 이를 기본 테이블로 사용할 것이다.

 

UPDATE emp01
SET
 sal = sal * 1.1;
-- 전직원의 급여를 10% 인상.
SELECT
 sal,
 sal * 0.9
FROM
 emp01;
-- 인상후, 인상전 조회.
UPDATE dept03
SET
 loc = (
 SELECT
 loc
 FROM
 dept03
 WHERE
 deptno = 40
 )
WHERE
 deptno = 20;
-- 40번 부서위치를 가져와서,
-- 20번 부서위치로 설정.
-- 조건절에 서브쿼리 이용.
CREATE TABLE dept01
 AS
 SELECT
 *
 FROM
 dept;
-- 삭제를 연습할 dept01 테이블 생성.
DELETE FROM dept01;
-- 테이블의 구조는 남기고, 레코드는 모두 삭제.
DROP TABLE dept01;
CREATE TABLE dept01
 AS
 SELECT
 *
 FROM
 dept;
DELETE FROM dept01
WHERE
 deptno = 30;
-- 부서번호가 30번인 레코드를 삭제.
DELETE FROM emp01
WHERE
 deptno = (
 SELECT
 deptno
 FROM
 dept
 WHERE
 dname = 'SALES'
 );
-- 삭제에 서브쿼리 이용.
-- 부서명이 sales인 사원의 정보를 삭제.
-- 테이블 병합 merge
DROP TABLE emp01;
CREATE TABLE emp01
 AS
 SELECT
 *
 FROM
 emp;
DROP TABLE emp02;
CREATE TABLE emp02
 AS
 SELECT
 *
 FROM
 emp
 WHERE
 job = 'MANAGER';
-- 테스트용 테이블 2개를 생성, 현재 레코드는 3개.
UPDATE emp02
SET
 job = 'TEST';
-- 3개 레코드 모두 잡을 변경.
INSERT INTO emp02 VALUES (
 8000,
 'MIN',
 'TOP',
 7566,
 '2009/01/12',
 1200,
 10,
 20
);
-- 새로운 행 추가.
MERGE INTO emp01
USING emp02 ON ( emp01.empno = emp02.empno )
WHEN MATCHED THEN UPDATE
SET emp01.ename = emp02.ename,
 emp01.job = emp02.job,
 emp01.mgr = emp02.mgr,
 emp01.hiredate = emp02.hiredate,
 emp01.sal = emp02.sal,
 emp01.comm = emp02.comm,
 emp01.deptno = emp02.deptno
WHEN NOT MATCHED THEN
INSERT
VALUES
 ( emp02.empno,
 emp02.ename,
 emp02.job,
 emp02.mgr,
 emp02.hiredate,
 emp02.sal,
 emp02.comm,
 emp02.deptno );
-- 2개 테이블의 병합,
-- 일치할때는 값을 수정하고,
-- 불일치 할때는 값을 추가.
-- emp01, 12개 레코드,
-- emp02, 4개 레코드, 그 중에서 3개는 일치, 1개는 불일치.
-- 제약 조건.
SELECT
 *
FROM
 dept;
INSERT INTO dept VALUES (
 10,
 'TEST',
 'SEOUL'
);
-- 무결성 제약 조건에 위배 됩니다.
-- 기본키에 중복 발생.
INSERT INTO dept VALUES (
 NULL,
 NULL,
 'SEOUL'
);
-- dept_no 는 널을 허용하지 않음.
INSERT INTO emp01 (
 empno,
 ename,
 job,
 deptno
) VALUES (
 NULL,
 NULL,
 'SALESMAN',
 30
);
-- 제약조건이 없으므로, 사원번호와 사원명이 없는 사원이 등록됨.
DROP TABLE emp01;
CREATE TABLE emp01 (
 empno NUMBER(4),-- 널 허용.
 ename VARCHAR2(10),
 job VARCHAR2(9),
 deptno NUMBER(2)
);
-- 제약 조건이 없이 데이터를 입력할 테이블과 컬럼 생성.
DROP TABLE emp02;
CREATE TABLE emp02 (
 empno NUMBER(4) NOT NULL,-- empno 는 널을 허용하지 않음.
 ename VARCHAR2(10) NOT NULL,
 job VARCHAR2(9),
 deptno NUMBER(2)
);
INSERT INTO emp02 (
 empno,
 ename,
 job,
 deptno
) VALUES (
 NULL,
 NULL,
 'SALESMAN',
 20
);
-- 널을 허용하지 않으므로, 개발자의 실수를 피해갈 수 있음.
DROP TABLE emp03;
CREATE TABLE emp03 (
 empno NUMBER(4) UNIQUE,
 ename VARCHAR2(10) NOT NULL,
 job VARCHAR2(9),
 deptno NUMBER(2)
);
INSERT INTO emp03 (
 empno,
 ename,
 job,
 deptno
) VALUES (
 7355,
 'ALLEN',
 'SALESMAN',
 20
);
INSERT INTO emp03 (
 empno,
 ename,
 job,
 deptno
) VALUES (
 7355,
 'JONES',
 'MANAGER',
 20
);
INSERT INTO emp03 (
 empno,
 ename,
 job,
 deptno
) VALUES (
 NULL,
 'JONES',
 'MANAGER',
 20
);
INSERT INTO emp03 (
 empno,
 ename,
 job,
 deptno
) VALUES (
 NULL,
 'JONES',
 'MANAGER',
 20
);
-- 널에 대해서는 예외로 중복 저장 가능함.
DROP TABLE emp04;
CREATE TABLE emp04 (
 empno NUMBER(4)
 CONSTRAINT emp04_empno_uk UNIQUE,
 -- 제약 조건의 이름을 주면서 제약조건 추가.
 ename VARCHAR2(10)
 CONSTRAINT emp04_ename_nn NOT NULL,
 job VARCHAR2(9),
 deptno NUMBER(2)
);
-- 제약조건명을 지정하면 지정한 데로 생성되고,
-- 제약 조건명을 지정하지 않으면 시스템이 자동으로 생성.
CREATE TABLE emp05 (
 empno NUMBER(4)
 CONSTRAINT emp05_empno_pk PRIMARY KEY,
 enamr VARCHAR2(10)
 CONSTRAINT emp05_ename_nn NOT NULL,
 job VARCHAR(9),
 deptno NUMBER(2)
);
CREATE TABLE emp05 (
 empno NUMBER(4) PRIMARY KEY,
 enamr VARCHAR2(10) NOT NULL,
 job VARCHAR(9),
 deptno NUMBER(2)
);
INSERT INTO emp (
 empno,
 ename,
 deptno
) VALUES (
 8000,
 'MIN',
 50
);
-- 부서가 없는 사원 정보 추가.
-- 제약조건 위배 : 부서가 없는 사원은 존재할 수 없다.
SELECT
 table_name,
 constraint_type,
 constraint_name,
 r_constraint_name
FROM
 user_constraints
WHERE
 table_name IN ( 'DEPT', 'EMP' );
-- 사원 테이블은 부서테이블의 부서번호를 참조.
CREATE TABLE emp06 (
 empno NUMBER(4)
 CONSTRAINT emp06_empno_pk PRIMARY KEY,
 ename VARCHAR2(10)
 CONSTRAINT emp06_ename_nn NOT NULL,
 job VARCHAR(9),
 deptno NUMBER(2)
 CONSTRAINT emp06_deptno_fk
 REFERENCES dept ( deptno )
);
-- 부모자식 관계를 만들면서 테이블 생성.
-- references 라는 키워드를 이용하여 참조하는 테이블과 컬럼 지정.
CREATE TABLE dept_copy
 AS
 SELECT
 *
 FROM
 dept;
CREATE TABLE emp_copy
 AS
 SELECT
 *
 FROM
 emp;
CREATE VIEW emp_view30 AS
 SELECT
 empno,
 ename,
 deptno
 FROM
 emp_copy
 WHERE
 deptno = 30;
SELECT
 *
FROM
 emp_view30; 
-- 뷰의 조회.
INSERT INTO emp_view30 VALUES (
 8000,
 'ANGEL',
 30
);
-- 가상 테이블인 뷰에 레코드 추가. 실제 테이블에 적용됨.
-- 단일 테이블로 구축된 뷰에 한해서 처리 가능.
CREATE VIEW emp_view_dept AS
 SELECT
 e.empno,
 e.ename,
 e.sal,
 e.deptno,
 d.dname,
 d.loc
 FROM
 emp e,
 dept d
 WHERE
 e.deptno = d.deptno
 ORDER BY
 empno DESC;
-- 2개 테이블을 조합하여 뷰를 생성할 수 있음.
CREATE OR REPLACE VIEW view_chk30 AS
 SELECT
 empno,
 ename,
 sal,
 comm,
 deptno
 FROM
 emp_copy
 WHERE
 deptno = 30
WITH CHECK OPTION;
-- 뷰를 생성하거나 있다면 대체 함.
-- with check option, 뷰에 생성 조건에 맞추어, 뷰 dml 가능.
INSERT INTO view_chk30 VALUES (
 1111,
 'name',
 1100,
 0.2,
 40
);
-- with check option 조건 위배. 
-- 부서번호 30으로 재시도.
INSERT INTO view_chk30 VALUES (
 1111,
 'name',
 1100,
 0.2,
 30
);
CREATE OR REPLACE VIEW view_read30 AS
 SELECT
 empno,
 ename,
 sal,
 comm,
 deptno
 FROM
 emp_copy
 WHERE
 deptno = 30
WITH READ ONLY;
-- 읽기만 가능한 뷰로 지정.
UPDATE VIEW_READ30 SET COMM=2000;
-- WITH READ ONLY 조건으로 수정 불가

뷰를 이용하여 Top-N 구하기

  • Top-N
    • 예를들어 사원 중에서 입사일이 빠른 사람 5명(TOP-5)만을 추출하는 것이다
    • ROWNUM을 사용한다.
    • 테이블의 구조를 생성하면 제공되는 컬럼이 있다.
      • ROWID : 테이블의 특정 레코드를 랜덤하게 접근하기 위한 논르적인 주소값이다.
      • ROWNUM : 각 행에 대한 일련번호이다.

인덱스

  • 인덱스
    • SQL 명령문의 처리 속도를 향상시키기 위해서 컬럼에 대해서 생성하는 오라클 객체이다.
    • 인덱스의 장점
      • 검색 속도가 빨라진다.
      • 시스템에 걸리는 부하를 줄여서 시스템 전체 성능을 향상시킨다.
    • 인덱스의 내부 구조는 B-트리 형식으로 구성되어 있다.
    • 인덱스의 단점
      • 인덱스를 생성하는데 시간이 걸린다.
      • 인덱스를 위한 추가적인 공간이 필요하다.
      • 데이터의 변경 작업(INSERT/UPDATE/DELETE)이 자주 일어날 경우에는 오히려 성능이 저하된다.
    • 인덱스는 기본키나 유일키와 같은 제약 조건을 지정하면 따로 인덱스를 생성하지 않더라도 자동으로 생성된다.
    • 인덱스 객체에 대한 정보를 확인하는 방법
      • USER_INDEXES, USER_IND_COLUMNS 데이터 딕셔너리 뷰에서 확인 가능하다.

 

데이터베이스 보완을 위한 권한

  • 오라클은 다수의 사용자들이 데이터베이스에 저장된 정보를 공유해서 사용한다.
  • 하지만 정보의 유출이나 불법적인 접근을 방지하기 위해 보안을 위한 데이터베이스 관리자가 있어야 한다. 
  • 데이터베이스 관리자
    • 사용자가 데이터베이스의 객체(테이블, 뷰 등)에 대한 특정 권한을 가질 수 있도록 한다.
    • 다수의 사용자가 데이터베이스에 저장된 정보를 공유하면서도 정보에 대한 보안이 이루어지도록 한다.
    • 데이터베이스에 접근하기 위해서는 사용자가 이름과 암호를 입력해서 로그인 인증을 받아야 한다.
    • 사용자마다 서로 다른 권한을 부여함으로써 보안을 설정한다.
  • 권한
    • 사용자가 특정 테이블에 접근할 수 있도록 하거나, 해당 테이블에 SQL문(SELECT/INSERT/UPDATE/DELETE)을 사용할 수 있도록 제한을 두는 것이다.
    • 데이터베이스를 위한 권한은 시스템 권한과 객체 권한으로 나뉜다.
      • 시스템 권한(System Privileges) : 사용자의 생성과 제거, DB 접근 및 각종 객체를 생성할 수 있는 권한 등 주로 DBA에 의해 부여
      • 객체 권한(Object Privileges) : 객체를 조작할 수 있는 권한  

1) 사용자 생성하기

  • 신입사원이 한명 들어오면 관리자는 이 신입사원에게 계정을 발급해줘야 한다.
    • 부서나 사원의 직무에 따라 사용하는 테이블을 고려해서, Oracle 데이터베이스에서도 사용자 계정 발급을 해야한다.
  • CREATE USER
    • 사용자 이름과 암호를 함께 기술한다.
    • SCOTT사용자는 사용자 생성 권한이 없다.
    • 사용자를 생성하기 위해서는 시스템 권한을 가지고 있어야 한다.
      • 데이터베이스 관리다(DBA) : SYS, SYSTEM

2) 권한을 부여하는 GRANT 명령어

  • GRANT
    • 사용자에게 시스템 권한을 부여하는 명령어이다.
    • user_name자리에 PUBLIC을 기술하면 모든 사용자에게 해당 시스템 권한이 부여된다.
    • PUBLIC란 DB 내에 있는 모든 계정을 의미한다.
  • 사용자에게 시스템 권한으로 WITH ADMIN OPTION과 함께 부여하면 그 사용자는 데이터베이스 관리자가 아니더라도 부여받은 시스템 권한을 다른 사용자에게 부여할 수 있는 권한도 함께 부여받게 된다.

 

시퀀스와 동의어

시퀀스의 개념 이해와 시퀀스 생성하기

  • 오라클에서는 행을 구분하기 위해서 기본키를 두는데 기본키는 중복값이 아닌 항상 유일한 값을 가져야 한다.
    • 기본키가 유일한 값을 갖도록 사용자가 직접 값을 생성해내려면 사용자 입장에서 부담이 너무 크다. 그래서 기본키를 시퀀스로 사용하면 좋다.
  • 시퀀스
    • 테이블 내의 유일한 숫자를 자동으로 생성하는 자동 번호 발생기이다.
    • 시퀀스를 기본키로 사용하면 사용자의 부담이 감소한다.
    • 다음은 시퀀스를 생성하기 위한 기본형식이다.
    • CREATE SEQUENCE sequence_name[INCREMENT BY n]................②[{MINVLAUE N | NOMINVLAUE}].....④[{CACHE n | NOCACHE}]...........⑥
    • [{CYCLE | NOCYCLE}].............⑤
    • [{MAXVLAUE n | NOMAXVLAUE}].....③
    • [STRAT WITH n]..................①

① STRAT WITH

  • 시스템에서 장애 발생 시 복구 작업을 하게 될 때 사용한다,
  • 1부터 시작되는 시퀀스를 생성하려면 STRAT WITH 1이라고 기술하면 된다.

② INCREMENT BY

  • 연속적인 시퀀스 번호의 증가치를 지정할 때 사용된다.
  • 1씩 증가하는 시권스를 생성하려면, INCREMENT BY 1이라고 기술하면 된다.

③ MAXVLAUE n | NOMAXVLAUE

  • MAXVLAUE는 시퀀스가 가질 수 있는 최대값을 지정한다.
  • NOMAXVLAUE를 지정하게 되면, ASCENDING 순서일 경우에는 1027승이고, DESCENDING 순서일 경우에는 -1로 설정된다.

④ MINVLAUE N | NOMINVLAUE

  • MINVLAUE은 시퀀스가 가질 수 있는 최소값을 지정한다.
  • NOMINVLAUE을 지정하게 되면, ASCENDING 순서일 경우에는 1027승이고, DESCENDING 순서일 경우에는 -1로 설정된다.

⑤ CYCLE | NOCYCLE

  • CYCLE은 지정된 시퀀스 값이 최대값까지 증가가 완료되게 되면, 다시 START WITH 옵션에 지정한 시작 값에서 다시 시퀀스를 시작하도록 한다.
  • NOCYCLE은 증가가 완료되게 되면 에러를 유발시킨다.

⑥ CACHE n | NOCACHE

  • CACHE : 메모리상의 시퀀스 값을 관리하도록 하는 것인데 기본 값은 20이다.
  • NOCACHE : 원칙적으로 메모리 상에서 시퀀스를 관리하지 않는다.
  • 생성된 시퀀스 객체에 대한 정보를 저장하는 시퀀스 관련 데이터 딕셔러리에는 USER_SEQUENCES가 있다.
    • 시퀀스 객체의 정보를 살펴보려면 다름과 같은 쿼리문을 사용한다.SQL> SELECT SEQUENCE_NAME, MIN_VLAUE, MAX_VALUE, INCREMENT_BY, CYCLE_FLAG FROM USER_SEQUENCES;
  • 시권스 값을 알아보는 CURRVAL과 NEXTVAL
    • CURRVAL
      • 시퀀스의 현재 값을 알아내기 위해서 사용
      • CURRVAL에 새로운 값을 할당받기 위해서는 NEXTVAL로 새로운 값을 생성해야 한다. 즉, NEXTVAL로 새로운 값을 생성하여 새로운 값을 CURRVAL에 대체해야 한다.
    • NEXTVAL
      • 시퀀스의 다음 값을 알아내기 위해서 사용 

중간에 시퀀스 옵션을 변경하여 3부터 시작하는 형태를 만드는 것은 번거로운 일.
건너뛰는 것을 추천.
기존 시퀀스를 삭제하고, 새롭게 생성하여 사용하는 것을 추천.

 

2) 동의어의 개념과 종류

  • 사용자가 다른 사용자의 객체를 참조할 때 [사용자ID].[테이블명]과 같이 길게 표시해야 하기 때문에 이해하기가 어렵고 코딩이 불편하다. 이러한 문제점을 해결하기 위해서 동의어(SYNONYM)라는 객체를 사용한다.
  • 데이터베이스의 객체에 대한 소유권은 해당 객체를 생성한 사용자에게 있다. 따라서 다른 사용자가 객체에 접근하기 위해서는 소유자에게 접근권한을 부여받아야 한다. 또한 다른 사용자가 소유한 객체에 접근하기 위해서는 소유자의 이름을 객체 앞에 지정해야 한다.
  • 예를들어 HR계정 사용자가 SCOTT 계정의 소유인 EMPTBL 테이블을 조회하는 경우 테이블 조회의 권한을 받은 후 [SELECT * FROM SCOTT.EMPTBL;]와 같이 작성해야 한다. 이렇게 객체를 조회할 때마다 일일히 객체의 소유자를 지정하는 것이 번거로울 경우 동의어를 정의하면 긴 이름대신 간단한 이름으로 접근할 수 있다.
  • 동의어의 종류는
    • 개별 사용자를 대상으로 한 비공개 동의어
      • 객체에 대한 접근 권한을 부여 받은 사용자가 정의한 동의어(해당 사용자만 사용 가능)
    • 전체 사용자를 대상으로 하는 공개 동의어가 있다.
      • 권한을 주는 사용자가 정의한 동의어(누구나 사용 가능)
      • 공개 동의어는 DBA 권한을 가진 사용자만이 생성할 수 있다.
      • SYNONYM 앞에 PUBLIC을 붙여서 정의한다.
  • 예를들어 DUAL 테이블은 SYS가 소유하는 테이블이므로 다른 사용자가 DUAL 테이블에 접근하려면 SYS.DUAL로 표현해야 하는 것이 원칙이다. 그럼에도 불구하고 모든 사용자가 SYS.을 생략하고, DUAL이라고 간단하게 사용할 수 있었던 것은 공개 동의어로 지정되어 있기 때문이다.

 

SELECT
 ROWNUM,
 empno,
 ename,
 hiredate
FROM
 emp;
-- rownum 은 실제 테이블의 값은 아니고,
-- 오라클 내부적으로 레코드를 관리할 때 사용하는 행번호.
DESC emp;
SELECT
 ROWNUM,
 empno,
 ename,
 hiredate
FROM
 emp
ORDER BY
 hiredate;
-- 입사일을 기준으로 오름차순 정렬한 사원 번호.
CREATE OR REPLACE VIEW view_hire AS
 SELECT
 empno,
 ename,
 hiredate
 FROM
 emp
 ORDER BY
 hiredate;
-- 입사일 기준의 뷰를 생성하고, 
 
SELECT
 ROWNUM,
 empno,
 ename,
 hiredate
FROM
 view_hire
WHERE
 ROWNUM <= 5;
-- 로우넘 5이하 값을 찾기. 
SELECT
 ROWNUM,rowid,
 empno,
 ename,
 hiredate
FROM
 emp;
-- rowid : 행별로 가지고 있는 고유 id. 
-- index : 책의 목차 비슷, 책의 내용을 빠르게 파악하고, 원하는 내용을 빠르게 찾는다
-- 인덱스를 지나치게 사용하면 오히려 느려진다.
-- 인덱스를 사용하는 경우는 값의 변화가 별로 없는 컬럼에 사용.
-- 인덱스 만들기.
CREATE INDEX IDX_EMP05_ENAME ON EMP05(ENAME);
-- emp05 테이블의 ename을 기준으로 인덱스 생성.
-- 인덱스명 : IDX_EMP05_ENAME
-- 현재 시간 비교가 될 정도의 레코드가 있지는 않아요.
-- 레코드가 많은 상태에서 테이블 검색 보다 인덱스 검색의 경우, 
-- 시간을 단축시킬 수 있습니다.
alter session set "_ORACLE_SCRIPT"=true;
-- 이전 버전처럼 사용자 계정을 자유롭게 추가할 수 있도록 설정 변경.
CREATE USER USEREDU IDENTIFIED BY TIGER;
-- sys 계정에서 새로운 사용자를 생성.
-- 아이디 : useredu, 비밀번호 : TIGER(문자는 대소문자 구분)
-- grant dba to useredu;
-- useredu 에게 데이터베이스 관리자 권한을 주겠다. role 부여.
-- 일일이 지정하지 않고, 역할을 부여.
GRANT CREATE SESSION TO USEREDU;
-- useredu 로 디비에 접속 권한 부여.
CREATE USER USEREDU01 IDENTIFIED BY TIGER;
GRANT CREATE SESSION TO USEREDU01 WITH ADMIN OPTION;
-- 디비 접속 권한을 주면서 WITH ADMIN OPTION 추가.
-- 권한을 부여한 것은 같지만, 권한을 해제할때 차이가 발생됨.
REVOKE SELECT ON useredu.EMP FROM useredu; 
-- useredu 계정이 emp 테이블에서 select 하는 권한을 해지.
grant SELECT ON useredu.EMP to useredu;
-- useredu 계정이 emp 테이블에서 select 하는 권한을 부여.
create table USEREDU.EMP as
select * from scott.emp;
-- scott 계정의 emp 를 조회하여
-- useredu 계정의 emp 테이블로 생성 시도.
-- useredu 계정이 테이블 생성에 대한 설정이 필요함.
alter user useredu 
default tablespace users;
-- 새로운 계정에 물리적인 디폴트 공간 지정.
alter user useredu 
quota unlimited on users;
-- 새로운 계정에 대해서 사용량 제한 지정.
CREATE SEQUENCE SALPLE_SEQ;
-- 1부터 시작해서 1씩 증가하는 자동번호 생성기 지정.
SELECT SALPLE_SEQ.nextval FROM DUAL;
-- 다음에 표시할 시퀀스 생성.
SELECT SALPLE_SEQ.CURRVAL FROM DUAL;
-- 현재 생성된 시퀀스 확인.
-- 1,2,3,4
-- 1,2
-- 원하는 형태는 3번부터 시작되는 시퀀스를 만들고 싶음.
-- nextval 5를 준비하고 있음.
-- 중간에 시퀀스 옵션을 변경하여 3부터 시작하는 형태를 만드는 것은 번거로운 일.
-- 건너뛰는 것을 추천. 5,6,7,8...
-- 기존 시퀀스를 삭제하고, 새롭게 생성하여 사용하는 것을 추천.
-- synonym 시노님, 동의어
CREATE TABLE SYSTABLE(ENAME VARCHAR2(20));
-- 왕 계정으로 새로운 테이블 생성.
INSERT INTO SYSTABLE VALUES('홍길동');
-- 레코드 1개 추가.
INSERT INTO SYSTABLE VALUES('홍길순');
GRANT SELECT ON SYSTABLE TO SCOTT;
-- scott 계정에 systable 검색 권한 부여.
select * from sys.systable;
CREATE SYNONYM SYS5 FOR SYS.SYSTABLE;
-- 시노님을 만들어서,SYS.SYSTABLE 호출해야 되는 상황을
-- SYSTABLE 조금 짧게 호출할 수 있도록 변경.
select * from sys5

'Oracle' 카테고리의 다른 글

Oracle 보충 1일차  (0) 2021.10.22
Oracle 예제4.  (0) 2021.09.14
Oracle 4일차.  (0) 2021.09.10
Oracle 예제3.  (0) 2021.09.09
Oracle 3일차.  (0) 2021.09.09