본문 바로가기
DB/Oracle

2024_07_01_월

by 알케니브 2024. 7. 1.

오늘의 코딩순서 + 코딩 포인트

1.데이터 무결성

  • 성능보다도 중요한 것이 무결성, 무결성이 좋지 않으면 사용률이 줄어듬

1-1. 데이터 무결성 제약조건⭐⭐⭐

  • 정의: 데이터 정확성과 일관성을 보장
  • 데이터 정확성을 유지하여 다양한 종류의 업무규칙을 고려한 예
    • student 테이블에서 학년 데이터는 1,2,3,4 중의 하나의 값만 입력
    • 모든 학번은 유일
    •  student 테이블의 지도교수 번호는 professor 테이블의 교수 번호 중의 하나와 반드시 일치
  • 장점
    • 테이블 생성시 무결성 제약조건을 정의 가능
    • 테이블에 대해 정의, 데이터 딕셔너리(=데이터사전, 시스템 카탈로그)(밑에 기술)에 저장되므로 응용 프로그램에서 입력된 모든 데이터에 대해 동일하게 적용
    • 제약 조건을 활성화, 비활성화 할 수 있는 융통성

1-2. 제약조건(Constraint)   종류⭐⭐⭐

NOT NULL UNIQUE KEY   PRIMARY KEY

tip) KEY란?:  테이블에 있는 tuple을 유일하게 식별하는(uniquely identify) attributes 집합을 의미함

 tuple란?: 하나의 레코드를 나타내는 행(row)을 의미함

 INDEX란?: 테이블에 있는 tuple을 빠르게 찾기 위해 테이블에 적용되는 추가적인 자료 구조

무결성 제약조건 설명
NOT NULL  - 데이터 입력 시에 필수로 값이 들어가야 하는 것을 의미함.
- 누락이 되어서는 안되는 부분 (예를 들어, 유저 테이블의 이름) 과 같은 부분은 NOT NULL로 컬럼을 정의하여, 데이터가 입력되기 전에 오류를 내도록 함
  NULL값이 들어갈 경우 오류가 발생하며 데이터가 아예 입력되지 않음
- 데이터가 무조건 들어가야 하는 컬럼에는 NOT NULL을 사용하여 누락되는 것을 방지

  >>>공백과 NULL은 같은 데이터가 아님, NULL 값은 정의할 수 없는 값이며 공백과는 다른 의미임
       DB에서 ' '(공백)은  NULL이 아닌, 값이 있는 것으로 인식됨
고유키(unique(유일성) key) - 테이블의 모든 행에서 고유한 값을 갖는 열 또는 열 조합을 지정함
- unique: 해당 테이블내에서 존재하는 값이 유일해야 함,  INSERT or UPDATE 시 제약이 걸려있는 컬럼에 동일한 데이터가 나올 경우 오류 발생
- NULL 값은 UNIQUE 제약 조건이 적용되지 않음. UNIQUE로 설정된 컬럼이어도 NULL이 가능한 컬럼이라면 NULL 데이터 행이 여러개일 수 있음
- CONSTRAINTS 키웓를 사용하여 제약조건의 이름을 명시해줄 수 있음, 다만 UNIQUE 제약으로 들어가는 컬럼들의 조합은 유일해야 함
기본키(primary key, pk)
⭐⭐⭐
- 한 테이블 내의 PRIMARY KEY는 해당 테이블 내에서 데이터를 식별하기 위한 제약조건
- 해당 칼럼 값은 반드시 존재해야 하며 유일해야 함
- ⭐⭐⭐(면접필수질문) UNIQUE +  NOT NULL() + 최소성  제약조건을 결합한 형태
- UNIQUE와는 다르게 한 테이블 내의 하나의 컬럼만 지정 가능
참조키,외래키
(foreign key, fk)
⭐⭐⭐
(기사시험 단골 손님)
- 한 열과 참조된 테이블의 열 간의 외래 키 관계를 설정하고 시행함
- 해당 컬럼에 참조하는 테이블로부터 존재하는 값들만 사용한다는 의미의 제약 조건,
   만약 참조하려는 데이터가 없을 경우 오류발생
- 여러 개의 컬럼에 중복적으로 적용가능, 즉 하나의 테이블이 여러 개의 테이블을 참조할 수 있음
- 외래키의 조건:  Restrict, Cascading Delete, SET NULL (면접필수질문)⭐⭐⭐
CHECK - 해당 칼럼에 저장 가능한 데이터 값의 범위나 조건 지정
- 조건에 부합하는 데이터만 입력이 가능하도록 하는 제약 조건
- 조건에는 기본연산자, 비교연산자, IN, NOT IN 등등 사용 가능

 

0. 제약조건(Constraint) 적용 위한 강좌(subject) 테이블 인스턴스

CREATE TABLE subject (
    subno       NUMBER(5)       CONSTRAINT subject_no_pk PRIMARY KEY, -- PRIMARY KEY을 빼면 관리가 쉽지 않음
    subname     VARCHAR2(20)    CONSTRAINT subject_name_nn NOT NULL, -- NOT NULL을 빼면 관리가 쉽지 않음
    term        VARCHAR2(1)     CONSTRAINT subject_term_ck CHECK(term IN('1','2')),
    typeGUbun   VARCHAR2(1)
);

 

COMMENT ON COLUMN subject.subno     IS  '수강번호';
COMMENT ON COLUMN subject.subname   IS  '수강과목';
COMMENT ON COLUMN subject.term     IS  '학기';

 

1.INSERT

-- PK Constraint --> Unique
INSERT INTO subject(subno , subname , term , typegubun)
            Values(10001 , 'Spring개론' , '1' , '1');    
-- >>오류걸림 -- 오류 보고 ORA-00001: unique constraint (SCOTT.SUBJECT_NO_PK) violated
-- ↳  pk에 UNIQUE 제약 조건이 걸리기 때문
-- PK Constraint --> NN
INSERT INTO subject(subname , term , typegubun)
            Values('Spring개론2' , '1' , '1');
-- >>오류걸림 -- 오류 보고 -ORA-01400: cannot insert NULL into
-- ↳  pk에는  NULL값이 들어갈 수 없다
-- subname NN
INSERT INTO subject(subno , term , typegubun)
            Values(10003 , '1' , '1');
-->>오류걸림 --오류 보고 - ORA-01400: cannot insert NULL into ("SCOTT"."SUBJECT"."SUBNAME")
-- Check Constraint --> term            
INSERT INTO subject(subno , subname , term , typegubun)
            Values(10003 , 'Spring개론3' , '5' , '1');            
-->>오류걸림 --오류 보고 -ORA-02290: check constraint (SCOTT.SUBJECT_TERM_CK) violated
-- ↳  여기서 term은 1과 2뿐, 그런데 5를 넣으려고 했으니 오류가 남

 

2.UNIQUE 

  • Table 선언시 못한 것을 추후 정의 가능
  • Student Table 의 idnum을 unique로 선언
ALTER TABLE student
ADD CONSTRAINT stud_idnum_uk UNIQUE(idnum);
-->>오류걸림 --오류 보고 - ORA-02299: cannot validate (SCOTT.STUD_IDNUM_UK) - duplicate keys found
-- ↳  중복되는 값이 있음
-- idnum --> unique constraint
INSERT INTO student(studno , name , idnum)
            VALUES (30101 , '대조영' , '8012301036613');
INSERT INTO student(studno , name , idnum)
            VALUES (30102 , '강감찬' , '8012301036613');
-->>오류걸림 --오류 보고 -ORA-00001: unique constraint (SCOTT.STUD_IDNUM_UK) violated
INSERT INTO student(studno , name)
            VALUES(30103 , '강민첨');
--오류 안걸림

 

3.NOT NULL

 -- Student Table 의 name을 NN로 선언 
ALTER TABLE student
MODIFY (name  CONSTRAINT stud_name_nn NOT NULL);           
            
INSERT INTO student(studno , idnum)
            VALUES(30103 , '8012301036614');
-->>오류걸림 --오류 보고 -ORA-01400: cannot insert NULL into ("SCOTT"."STUDENT"."NAME")

 

4. CONSTRAINT 조회⭐⭐⭐

-- CONSTRAINT 조회 ***
SELECT  CONSTRAINT_name , CONSTRAINT_Type
FROM    user_CONSTRAINTs
WHERE   table_name IN('SUBJECT','STUDENT')  --TBL이름은 대문자로 하는것이 좋음
;

 

1-3. Foreign Key의 제약조건⭐⭐⭐

  • 서로 다른 테이블 간 관계를 정의하는데 사용하는 제약 조건
  • 외래키 제약조건은 두 테이블 사이의 관계를 선언함으로써 데이터의 무결성을 보장해 주는 역할을 함.
    외래키 관계를 설정하면 하나의 테이블이 다른 테이블에 의존하게 된다
  • 테이블을 생성할 때 FK를 정의하는데, FK가 정의된 테이블이 자식 테이블이고 레퍼런스되는 테이블은 부모 테이블이다
    • REFERENCES : 참조할 부모 테이블과 부모 테이블에 있는 컬럼을 정의함
  • 부모 테이블은 미리 생성되어 있어야 하며, 참조되는 컬럼에 존재하는 값만을 입력 할 수 있다.
  • 부모 테이블은 FK로 인해 삭제가 불가능하다.
  • 데이터 타입이 반드시 일치해야 한다.
  • 참조되는 컬럼은 PK이거나 UK(Unique key)만 가능하다.

예시) 대충 emp TBL에 뭔가 하나 만들고나서 실행, 대신 emp와 dept의 deptno컬럼에 동일한 값 만들기

DELETE  emp
WHERE   empno  =1000
;

 

조건 1. Restrict(작업없음) -->>emp TBL>>우클릭>>편집>>제약조건>>외래키>>'작업없음' 확인

  • 자식 존재 삭제 안됨  (연관 관계 때문)
  • 두 값 모두 남아있음
DELETE  dept
WHERE   deptno  =50
;

 

조건 2. Cascading Delete(종속삭제)   -->>emp TBL>>우클릭>>편집>>제약조건>>외래키>>'종속삭제' 확인

  • 같이 죽자: 부모, 자식 값 전부 삭제됨
  • 1) 선언   Emp Table에서  REFERENCES DEPT (DEPTNO) 
  • 2) 예시   integrity constraint (SCOTT.FK_DEPTNO) violated - child record found
DELETE  dept
WHERE   deptno  =50
;

 

조건 3.  SET NULL(널 설정) -->>emp TBL>>우클릭>>편집>>제약조건>>외래키>>'널 설정' 확인

: 1) 종속 NULL 선언

  • Emp Table에서 REFERENCES DEPT (DEPTNO)  ON DELETE SET NULL
  • 자식이 부모와 관계가 끊겨 Null값으로 변경되지만 남아있음, 부모는 삭제됨
DELETE  dept
WHERE   deptno  =50
;

2. 인덱스 관리⭐⭐⭐(인덱스 관리가 평판을 좌우한다!)

1. 인덱스의 개념

1. 인덱스란?

  • 인덱스는 SQL 명령문의 처리속도를 향상시키기 위해 컬럼에 대해 생성하는 객체
    좀 더 쉬운말: TBL의 어떤 컬럼을 향상시키기 위한 객체
  • 인덱스는 포인트를 이용하여 테이블에 저장된 데이터를 랜덤 액세스하기 위한 목적으로 사용
  • 권장사항: 한 TBL당 7개 이상의 인덱스는 걸지 않는다

2. 인덱스 생성

  • UNIQUE: 고유 인덱스 시정
  • ASC/DESC: 인덱스 키를 오름차순 또는 내림차순으로 정렬

3. 인덱스의 구조

B-트리 인덱스: 왼쪽으로 갈수록 값이 줄어들고, 오른쪽으로 갈수록 값이 늘어난다

B-트리 인덱스

3. 인덱스의 종류

1) 고유 인덱스

  • 유일한 값을 가지는 칼럼에 대해 생성하는 인덱스
  • 모든 인덱스 키는 테이블의 하나의 행과 연결됨
CREATE  UNIQUE INDEX idx_dept_name
ON      department(dname);		--INDEX IDX_DEPT_NAME이(가) 생성되었습니다.
INSERT INTO department VALUES(300 , '이과대학' , 10 , 'kkk');

INSERT INTO department(deptno , dname ,  college , loc) VALUES(301 , '이과대학' , 10 , 'kkk2');
-- 오류 보고 -ORA-00001: unique constraint (SCOTT.IDX_DEPT_NAME) violated
-- unique 제약 조건과 unique ㅇㅇ가 같이 걸림

 

2) 비고유 인덱스:

  • 중복된 값을 가지는 칼럼에 대해 생성하는 인덱스
  • 하나의 인덱스 키는 테이블의 여러 행과 연결 가능

문제 1-1) 학생 테이블의 birthdate 칼럼을 비고유 인덱스로 생성하여라

CREATE INDEX idx_stud_birthdate		-- 테이블 생성
ON  student(birthdate);

 

INSERT INTO student(studno , name , idnum ,      birthdate)
            VALUES(30102 , '김유신' , '8012301036614' , '84/09/16');
SELECT  *
FROM    student
WHERE   birthdate = '84/09/16'
;   
--만약 위의 인덱스를 걸어두지 않았다면, 
-- 처음부터 끝까지 모든 컬럼을 다 대조하여 거치느라(Full Scan) 컬럼이 길어질수록 시간이 오래걸린다

 

3) 단일 인덱스: 하나의 컬럼으로 구성된 인덱스, 하나의 컬럼을 기준으로 인덱싱 되기 때문에 활용 또한 단순함

 

4) 결합 인덱스(복합 인덱스): 두 개 이상의 칼럼을 결합하여 생성하는 인덱스

문제1-2) 학생 테이블의 deptno, grade 칼럼을 결합 인덱스로 생성, 결합 인덱스의 이름은 idx_stud_dno_grade 로 정의

CREATE INDEX idx_stud_dno_grade     --테이블 생성
ON  student(deptno , grade);

 

SELECT  *
FROM    student
WHERE   grade = 2
AND     deptno = 101
;
--WHERE   grade = 2
--AND     deptno = 101
--  오류 보고 - SQL 오류: ORA-00904: "IDNM": invalid identifier
-- 밑의 Optimizer를 하고 나서야 실행됨

>>>> Optimizer 실행

4. optimizer

  • 정의
    • SQL 개발자가 SQL을 작성하여 실행할 때, 옵티마이저는 SQL을 어떻게 실행할 것인지를 계획하게 된다
    • QL 실행 계획(Execution Plan)을 수립하고 SQL을 실행한다
    • 옵티마이저는 SQL의 실행 계획을 수립하고 SQL을 실행하는 데이터베이스 관리 시스템의 소프트웨어이다
    • 동일한 결과가 나오는 SQL도 어떻게 실행하느냐에 따라서 성능이 달라지기에, SQL 성능에 옵티마이저는 아주 중요한 역할을 한다
  • 특징
    • 데이터 딕셔너리(Data Dictionary)에 있는 오브젝트 통계, 시스템 통계 등의 정보를 사용해서 예상되는 비용을 산정함
    • 옵티마이저는 여러 개의 실행 계획 중에서 최저 비용을 가지고 있는 계획을 선택해서 SQL을 실행함
  • 필요성: SQL 개발자가 작성한 SQL문을 어떻게 실행하느냐에 따라 성능이 달라짐
  • 실행 방법
    1. 개발자가 SQL을 실행하면 파싱(Parsing)을 실행해서 SQL의 문법 검사 및 구문 분석을 수행
    2. 구문 분석이 완료되면, 옵티마이저가 규칙 기반 혹은 비용 기반으로 실행 계획을 수립함
    3. 실행 수립이 완료되면, 최종적으로 SQL을 실행하고, 실행이 완료되면 데이터를 인출(Fetch)
--- Optimizer
--- 1) RBO  2) CBO
-- RBO 변경
ALTER SESSION SET OPTIMIZER_MODE = RULE;

 

구분 RBO(Rule Based Optimizer)  CBO(Cost Based Optimizer)
특징 - 통계정보를 사용하지 않고  SQL문 실행시 사전에 정의된 규칙에 따라 실행
- 사후에 RBO 규칙을 변경하기가 어려움
- 예전에는 많이 사용했지만 요즘에는 덜 사용하는 추세
실행계획을 미리 예측하기 힘들고, 실행계획을 특정한 처리경로로 유도하는 등의 제어가 어려움
- 최적화된 결정을 위해 정기적으로 통계정보의 갱신 필요
- 요즘에 많이 사용하는 추세
경로 선택 - 인덱스 구조나 비교 연산자에 따른 순위여부를 기준으로 최적 경로 설정 - 처리 방법에 대한 비용을 산정한 후 최소 비용이 소요되는 방법 선택
동작 방식 - ROWID를 이용한 직접 접근, INDEX를 이용한 Random Access, Full Table Scan을 이용하는 순차 Scan으로 구분
- 각 경로의 분류는 하나 이상의 경로가 유용할 떄 한 경로를 선택하기 위한 규칙-기반 접근 방식에 의해 사용
-시스템 통계정보(CPU, 디스크 엑세스타임)를 이용해서 처리시간으로 환산한 방식을 사용
- SQL 문장에서 대한 여러가지 경우의 수별로 처리시간에 비례한 비용을 산출해내고 이들 비용에서 가장 작은 비용을 갖는 플랜을 결정
장점 - 판단이 매우 규칙적이고 분명하여 수립될 실행계획이 예측 가능하기 때문에 사용자가 원하는 처리 경로로 유도하기에 용이 - 최적화를 깊이 이해하고 있지 않더라도 최소 성능 보장
단점 - 통계 정보를 반영하지 않으므로 오차 발생 가능 - 실행 계획을 미리 예측, 제어가 어려움

 

 

1. SESSION 상에서 변경하는 Optimizer: 프로그램을 종료해도 값이 남아 저장된다

--SESSION 상에서 변경할때
alter session set optimizer_mode = rule
alter session set optimizer_mode = CHOOSE
alter session set optimizer_mode = first_rows
alter session set optimizer_mode = ALL_ROWS     --가장 느림
  • choose: 명령어에 따라 RBO 또는 CBO를 알아서 선택
  • first_rows: 가장 성능이 좋음
  • ALL_ROWS: Full Scan으로 돌리느라 아주 오래걸림1

>> 문제 1-2의 구조와 비슷해 보이지만 순서를 바꿈으로서 성능이 바뀐다, 테이블에 따라 순서대로 작성해야 성능↑↑

SELECT  *
FROM    student
WHERE   deptno = 101
AND     grade = 2
;

 

2. SQL Optimizer: : 일회성/ 프로그램을 종료하면 값이 날아간다

SELECT /*+first_rows*/ ename
FROM    emp
;
SELECT /*+rule*/ ename
FROM    emp
;

 

3. OPTIMIZER 모드 확인

SELECT  NAME , VALUE , ISDEFAULT , ISMODIFIED , DESCRIPTION
FROM    V$SYSTEM_PARAMETER
WHERE   NAME LIKE '%optimizer_mode%'
;

 

TIP) Execute Plan    

참고: https://gngsn.tistory.com/161

  • 말 그대로 SQL 문으로 요청한 데이터를 어떻게 불러올 것인지에 관한 계획, 즉 경로를 의미함
  • 지름길을 사용해 데이터를 빠르게 찾아낼 것인지, 지름길이 있어도 멀리 돌아가서 찾을 것인지 미리 확인할 수 있음
  • 키워드: EXPLAIN, DESCRIBE, DESC
  • Execute Plan의 단계는 Step라고 함,각 스텝별로 그 단계에서 어떤 명령이 어떻게 수행되었고, 총  건의 데이터가 처리되었으며, 이를 위해 얼마만큼의 비용과 시간이 들었는지가 표시됨
  •  읽는 방법
    1. 위에서 아래로 읽어 내려가면서 제일 먼저 읽을 스텝 찾기
    2. 내려가는 과정에서 같은 들여쓰기가 존재하면, 무조건 위에서 아래 순으로 읽기
    3. 읽고자 하는 스텝보다 들여쓰기가 된 하위 스텝이 존재한다면, 가장 안쪽으로 들여쓰기 된 스텝을 시작으로 하여 한 단계씩 상위 스텝으로 읽어 나오기

2. 인덱스의 효율적인 사용 방법

2-0. 인덱스가 효율적인 경우

  1. WHERE 절이나 JOIN 조건절에서 자주 사용되는 컬럼
  2. 전체 데이터 중에서 10~15% 이내의 데이터를 검색하는 경우
  3. 두 개 이상의 컬럼이 WHERE 절이나 JOIN 조건절에서 자주 사용되는 경우
  4. 테이블에 저장된 데이터의 변경이 드문 경우
  5. 열에 NULL 값이 많이 포함된 경우, 열에 광범위한 값이 포함된 경우
-- 학생 테이블에 생성된 PK_DEPTNO 인덱스를 재구성(PK_DEPTNO가 깨졌을때 사용)
ALTER INDEX PX_DEPTNO REBUILD;

 

2-1. 1.Index 조회

SELECT  index_name , table_name , column_name
FROM    user_ind_columns
;

 

2-2. Index 생성 emp(job)

CREATE INDEX idx_emp_job ON emp(job);

 

2-3. 조회

SELECT * FROM emp WHERE job = 'MANAGER';        -- = Index OK

SELECT * FROM emp WHERE job <> 'MANAGER';       -- <> Index No

SELECT * FROM emp WHERE job Like '%NA%';        -- Like '%NA%' Index No

SELECT * FROM emp WHERE job Like 'MA%';         -- Like 'MA%' Index OK
                                        -- %앞글자를 매길때 컬럼명의 첫글자를 쓰면 Index가 먹여짐

SELECT * FROM emp WHERE UPPER(job) = 'MANAGER';     --UPPER(job) Index No

-- 조건따라 자꾸 달라지는 INDEX 삽입. 그렇다면 INDEX를 어떻게 먹일까??


↳ 5) 함수 기반 인덱스

  • 함수 기반 인덱스는 오라클  8i 버전부터 지원하는 새로운 형태의 인덱스로 칼럼에 대한 연산이나 함수의 계산 결과를 인덱스로 생성 가능
  • UPPER(column_name) 또는 LOWER(column_name) 키워드로 정의된 함수 기반 인덱스를 사용하면 대소문자 구분 없이 검색할 수 있음
  • 함수 기반 인덱스는 INSERT, UPDATE 시에는 새로운 값을 인덱스에 추가
CREATE INDEX uppercase_idx ON emp (UPPER(job));
SELECT * FROM emp WHERE UPPER(job) = 'SALESMAN';

 

⭐⭐⭐PK와  INDEX의 비교

항목 PK INDEX
특성 unique, NN, 최소성 Trade off
구조 cluster Non-Cluster
Index 객체 따로
Count / 200개 이상~2^8 이하
(권장 7개 이하)
Focus 무결성 Performance(성능)

 

 

6) DESCENDING 인덱스: 칼럼별로 정렬 순서를 별도로 지정하여 결합 인덱스를 생성하기 위한 방법

 


3. Transaction 트랜잭션

Transaction 트랜잭션

  • 관계형 데이터베이스에서 실행되는 여러 개의 SQL명령문을 하나의 논리적 작업 단위로 처리하는 개념
  • 데이터베이스의 상태를 변화시키기 위해서 수행하는 작업의 단위
  • 데이터를 조작하는 업무의 물리적(시간적)단위
  • 1개 이상의 명령어(행동, SQL)로 구성된 작업 단위(기간)
  • 특징: 원자성, 일관성, 고립성, 지속성 

COMMIT : 트랜잭션의 정상적인 종료

  • 트랜잭션내의 모든 SQL 명령문에 의해 변경된 작업 내용을 디스크에 영구적으로 저장하고 트랜잭션을 종료
  • 해당 트랜잭션에 할당된 CPU, 메모리 같은 자원이 해제
  • 서로 다른 트랜잭션을 구분하는 기준
  • COMMIT 명령문 실행하기 전에 하나의 트랜잭션 변경한 결과를 다른 트랜잭션에서 접근할 수 없도록 방지하여 일관성 유지

ROLLBACK : 트랜잭션의 전체 취소

  • 트랜잭션내의 모든 SQL 명령문에 의해 변경된 작업 내용을 전부 취소하고 트랜잭션을 종료
  • CPU,메모리 같은 해당 트랜잭션에 할당된 자원을 해제, 트랜잭션을 강제 종료

4. SEQUENCE

 고유 키(Primary key), 순번, 특정한 규칙을 가진 수열 등의 생성을 위한 목적으로, SQL에서 정수로 된 등차수열인 '시퀀스' 객체를 생성해줌

1. SEQUENCE 형식

CREATE SEQUENCE sequence
[INCREMENT BY n]
[START WITH n]
[MAXVALUE n | NOMAXVALUE]
[MINVALUE n | NOMINVALUE]
[CYCLE | NOCYCLE]
[CACHE n | NOCACHE];

INCREMENT BY n : 시퀀스 번호의 증가치로 기본은 1,  일반적으로 ?1 사용
START WITH n : 시퀀스 시작번호, 기본값은 1
MAXVALUE n : 생성 가능한 시퀀스의 최대값
MAXVALUE n : 시퀀스 번호를 순환적으로 사용하는 cycle로 지정한 경우, MAXVALUE에 도달한 후 새로 시작하는 시퀀스값
CYCLE | NOCYCLE : MAXVALUE 또는 MINVALUE에 도달한 후 시퀀스의 순환적인 시퀀스 번호의 생성 여부 지정
CACHE n | NOCACHE : 시퀀스 생성 속도 개선을 위해 메모리에 캐쉬하는 시퀀스 개수, 기본값은 20

 

2. SEQUENCE sample 예시

1) SEQUENCE sample 예시 1

CREATE SEQUENCE sample_seq
INCREMENT BY 1      --옵션을 1씩 증가함
START WITH  10000;  --10000무터 시작
SELECT  sample_seq.nextval FROM dual;   --next 다음 Value 값을 갖고 와라

SELECT  sample_seq.CURRVAL FROM dual;   --CURRVAL: Current Value
                                        -- 여기서 다시 nextval을 다시 실행시키면 옵션 1이 증가됨

 

2) SEQUENCE sample 예시 2 --> 실 사용 예시

CREATE SEQUENCE dept_dno_seq
INCREMENT BY 1
START WITH   76;	--dept_dno_seq 시퀸스를 만들고 76을 시작값으로 1씩 증가시켜라

 

3) SEQUENCE dept_dno_seq를 이용 dept_second 입력 --> 실 사용 예시

INSERT INTO dept_second
VALUES(dept_dno_seq.NEXTVAL , 'Accounting' , 'NEW YORK');
SELECT  dept_dno_seq.CURRVAL FROM dual;

 

4) SEQUENCE dept_dno_seq를 이용 dept_second 입력 --> 실 사용 예시

INSERT INTO dept_second
VALUES(dept_dno_seq.NEXTVAL , 'Accounting' , 'NEW YORK');
SELECT  dept_dno_seq.CURRVAL FROM dual;

 

문제 2-1) '회계','이대' 삽입

INSERT INTO dept_second
VALUES(dept_dno_seq.NEXTVAL , '회계' , '이대');
SELECT  dept_dno_seq.CURRVAL FROM dual;

 

문제 2-2) '인사팀','당산'

INSERT INTO dept_second
VALUES(dept_dno_seq.NEXTVAL , '인사팀' , '당산');
SELECT  dept_dno_seq.CURRVAL FROM dual;

 

3. MAX 전환 (Sequence와 MAX는 섞어쓰지 말기)

예시 1)

INSERT INTO dept_second
VALUES((SELECT MAX(DEPTNO)+1 FROM dept_second)
        , '경영팀'
        , '대림'
        );

 

SEQUENCE와 MAX의 비교

항목 SEQUENCE MAX
주체 객체 함수
사용 PK 입력
발행 - 객체 생성시 규칙을 이용하여 발행함
- 1씩 증가하며 시작번호를 setting함
항상 최대값을 발행함
중복 문제 발생 가능성이 매우 적음
권장↑
문제 발생할 가능성이 있음
공통점 혼용금지

4) SEQUENCE 삭제

DROP SEQUENCE SAMPLE_SEQ;

5)  Data 사전에서 정보 조회

SELECT  sequence_name , min_value , max_value , increment_by
FROM    user_sequences;

5. Table 조작

1.Table 생성

CREATE TABLE address
(   id      NUMBER(3),
    NAME    VARCHAR2(50),
    addr    VARCHAR2(100),
    phone   VARCHAR2(30),
    email   VARCHAR2(100)
);

 

↳ TIP) DB TBL 종류⭐⭐(면접질문!)

항목 Master Table (원장성 테이블) History Table (이력 테이블) Transaction Table (거래성 테이블)
정의 업무의 핵심 개체, 즉 위에서 말한 주체에 대한 정보들을 담고 있는 테이블 - 마스터 테이블의 변경된 상태 속성을 보관하는 테이블 - 행위에 대한 테이블
- 부속성 이력성 테이블 존재 X
특징 - 부속된 많은 자식 테이블 존재
- 이력성 테이블 또한 부속되어 존재함 
   
예시 사원의 발령정보, 개인인사정보 발령내역 거래내역, 입출력 내역, 근태 기록
데이터 성격 - 가장 최신의 상태 유지
- 데이터베이스에서 상태라고하면 속성을 가장 최신의 것으로 유지한다고 생각
- 속성에는 가변 /불변의 데이터들이 있는데 최신의 정보를 유지하기 위해 가변속성들을 관리
  => 이를 위해 History Table 존재
변경된 상태 정보를 구간으로 구분하는 형태(시작~끝) 등록만 되는 개념이 없으면 변경 불가능

 

+++ ERP와 ERD

ERP (Enterprise Resource Planning)

  • 전사적 자원관리라고 함
  • 재무, 인사 관리, 제조, 공급망, 서비스, 조달 등 비즈니스의 여러 부문에서 자동화와 프로세스를 지원해 운영 효율성을 높이도록 돕는 소프트웨어 시스템

ERD (Entity Relationship Diagram)

  • 엔터티 관계 다이어그램
  • 데이터베이스 내의 요소가 어떻게 관련되어 있는지 보여 주는 데이터베이스의 시각적 표현
  • ER 다이어그램은 엔터티와 관계라는 두 가지 개체 유형으로 구성되며, 이 컨텍스트의 엔터티는 캔버스에 도형으로 표시되는 데이터 집합의 데이터 구성 요소임

6. 데이터사전(=Data Dictionary)

7-1. 데이터 사전이란?

  • 사용자와 데이터베이스 자원을 효율적으로 관리하기 위한 다양한 정보를 저장하는 시스템 테이블의 집합
  • 사전 내용의 수정은 오라클 서버만 가능
  • 오라클 서버는 데이타베이스의 구조, 감사, 사용자 권한, 데이터 등의 변경 사항을 반영하기 위해 지속적 수정 및 관리
  • 데이타베이스 관리자나 일반 사용자는 읽기 전용 뷰에 의해 데이터 사전의 내용을 조회만 가능
  • 실무에서는 테이블, 칼럼, 뷰 등과 같은 정보를 조회하기 위해 사용

7-2. 데이터 사전 관리 정보

  1. 데이터베이스의 물리적 구조와 객체의 논리적 구조
  2. 오라클 사용자 이름과 스키마 객체 이름
    • 스키마?: 데이터베이스의 구조와 제약조건에 관한 전반적인 명세 를 기술한 것
      즉, DB 내에 어떤 구조로 데이터가 저장되는 가를 나타내는 데이터베이스 구조를 의미함
  3. 사용자에게 부여된 접근 권한과 롤
  4. 무결성 제약조건에 대한 정보
  5. 칼럼별로 지정된 기본값
  6. 스키마 객체에 할당된 공간의 크기와 사용 중인 공간의 크기 정보
  7. 객체 접근 및 갱신에 대한 감사 정보
  8. 데이터베이스 이름, 버전, 생성날짜, 시작모드, 인스턴스 이름

7-3. 데이터 사전 종류

1. USER_ : 객체의 소유자만 접근 가능한 데이터 사전 뷰
-- user_tables는 사용자가 소유한 테이블에 대한 정보를 조회할 수 있는 데이터 사전 뷰.

SELECT  table_name
FROM    user_tables
;
SELECT  *
FROM    user_catalog
;

 

2. ALL_ : 자기 소유뿐만 아니라 권한을 부여 받은 객체까지 접근 가능한 데이터 사전 뷰

SELECT  owner , table_name
FROM    all_tables
;

 

3. DBA_   : 데이터베이스 관리자만 접근 가능한 데이터 사전 뷰

SELECT  owner , table_name
FROM    dba_tables
;

 


오늘의 숙제

문1) address스키마/Data 유지하며 addr_second Table 생성

>>내가 한 것

CREATE TABLE addr_second
AS SELECT * FROM ADDRESS
;

 

>>선생님이 한 것

CREATE TABLE addr_second(id,name,addr,phone,email)	-- 괄호안의 내용은 안써도 됨
AS SELECT * FROM ADDRESS
;

 

문2) address스키마 유지하며 Data 복제 하지 않고 addr_seven Table 생성

>>내가 한 것

CREATE TABLE addr_seven
AS SELECT   id , NAME , addr, phone , email
    FROM    address
    WHERE   1=0		--따옴표 안써도 된다고 함
;

 

>>선생님이 한 것

CREATE TABLE addr_seven(id,name,addr,phone,email)
	AS SELECT * FROM    address
    WHERE   '1'='2'
;


문3)
address(주소록) 테이블에서 id, name 칼럼만 복사하여 addr_third 테이블을 생성하여라

>>내가 한 것

CREATE TABLE addr_third
AS SELECT   id , name
    FROM    address
;

 

>>선생님이 한 것

 


문4)
addr_second 테이블 을 addr_tmp로 이름을 변경하시오

>>내가 한 것

RENAME  addr_second TO addr_tmp;

 

>>선생님이 한 것

 

 

 

'DB > Oracle' 카테고리의 다른 글

2024_07_03_수~ 07_04_목  (0) 2024.07.03
2024_07_02_화  (0) 2024.07.02
2024_06_28_금  (0) 2024.06.28
2024_06_27_목  (0) 2024.06.27
2024_06_26_수  (0) 2024.06.26