본문 바로가기
SQL

SQL_DDL과 정규화

by 유서담 2023. 12. 18.

DDL (데이터정의어)

 

  • 오라클 데이터베이스 객체 생성, 변경, 삭제에 사용되는 명령어
  • DDL의 종류에는 CREATE, ALTER, DROP, TRUNCATE

 

주요 데이터베이스 객체

테이블 데이터의 기본 저장단위, 행과 열로 구성되어 있다
하나 이상의 테이블을 사용해서 만든 가상의 테이블
시퀀스 일련번호 생성기
인덱스 검색성능을 향상시키기 위해 데이터에 대한 색인을 가지고 있다
동의어 객체에 대한 다른 이름을 제공한다

 

 

 

테이블

  • 테이블과 컬럼의 이름규칙
    • 문자로 시작, 30자까지 가능(A~Z, a~z, 0~9, _, $, #만 허용)
    • 오라클 예약어도 이름에 사용할 수 없다

테이블 생성하기 ( CREATE )

  -- 테이블 생성 예시
  CREATE TABLE 테이블명 (
    컬럼명 데이터타입(크기) [DEFAULT 기본값],
    ...
  )

 

테이블 삭제 ( DROP )

  -- 테이블 삭제 예시
  DROP TABLE 테이블명

 

 

테이블 변경종류 명령어 ( ALTER, RENAME, TRUNCATE )

 

컬럼추가

  ALTER TABLE 테이블명 ADD (컬럼명 데이터타입(크기) [DEFAULT 기본값]);

 

컬럼 삭제

  ALTER TABLE 테이블명 DROP 컬럼명;

 

테이블 이름 변경

  RENAME 테이블명 TO 새테이블명

 

테이블 절단하기

  TRUNCATE TABLE 테이블명;
  
  -- truncate는 테이블에서 모든 행을 제거한다.
  -- 해당 테이블이 사용하는 저장공간을 해제한다.
  -- truncate로 제거된 행은 rollback할 수 없다.

 

 

시퀀스

  • 일련번호를 자동으로 생성하는 데이터베이스 객체다
  • 기본키 값(행을 대표하는 값)을 생성하는데 주로 사용됩니다

 

시퀀스 생성

  CREATE SEQUENCE 시퀀스명;	
  -- 1부터 1씩 증가하는 번호가 발행된다.

 

  CREATE SEQUENCE 시퀀스명
  [INCREMENT BY a]		a씩 증가한다.
  [START WITH   b]		b부터 시작한다.
  [{MAXVALUE c | NOMAXVALUE}]	c가 최대값이다.
  [{MINVALUE d | NOMINVALUE}]	d가 최소값이다.
  [{CYCLE | NOCYCLE}]		최대값/최소값이 도달했을 때 반복여부를 결정한다.
  [{CACHE e | NOCACHE}]		일련번호를 e개 만큼 미리 할당해서 메모리에 캐시하거나, 캐시를 활용하지 않는다.

 

 

시퀀스의 삭제

  DROP SEQUENCE 시퀀스명

 

 

시퀀스의 수정

  ALTER SEQUENCE 시퀀스명
  [INCREMENT BY a]		
  [{MAXVALUE c | NOMAXVALUE}]	
  [{MINVALUE d | NOMINVALUE}]	
  [{CYCLE | NOCYCLE}]		
  [{CACHE e | NOCACHE}]		
  
  -- START WITH를 제외한 나머지 설정을 변경할 수 있다.

 

 

시퀀스의 사용

  • 시퀀스명.NEXTVAL
    • 새로운 일련번호를 반환한다
  • 시퀀스명.CURRVAL
    • 현재 연결된 세션에서 nextval를 통해서 발행했던 번호를 다시
    • CURRVAL을 사용하려면 해당 시퀀스에 대한 NEXTVAL이 실행된 후에만 가능한다

 

  -- 새로운 일련번호 조회하기
  select product_seq.nextval from dual;
  
  -- 테이블에 새로운 행을 추가할 때 일련번호 활용하기
  insert into sample_products
  (product_no, product_name, product_company, product_price)
  values
  (product_seq.nextval, '아이패드 프로', '애플', 1200000);

 

 

 

 

  • 테이블 혹은 다른 뷰를 기반으로 하는 가상의 테이블(논리적인 테이블)이다

 

뷰의 특징

  • 물리적인 저장공간을 가지지 않는다
  • INSERT, UPDATE, DELETE 작업의 수행이 불편하다

 

뷰의 목적

  • 복잡한 SQL문을 간단하게 작성하기 위해서 사용
  • 데이터의 엑세스를 제한하기 위해서 사용(데이터에 대한 보안성 강화)
  • 동일한 데이터로부터 다양한 결과를 얻기 위해서 사용

 

뷰의 종류

 

단순 뷰

  • 한 테이블에서만 데어트를 가져온다
  • 함수 또는 데이터 그룹을 사용하지 않았음
  • DML(INSERT, UPDATE, DELETE가 가능하다)

 

복합뷰

  • 여러 테이블에 데이터를 가져온다
  • 함수 또는 데이터 그룹을 포함하고 있음
  • DML 거의 불가능하다

 

뷰 생성

  CREATE [OR REPLACE] VIEW 뷰이름
  AS 서브쿼리
  WITH READ ONLY
  
  -- 서브쿼리는 가상의 테이블이 포함할 데이터를 조회하는 SELECT문

 

 

뷰 수정

  CREATE OR REPLACE VIEW 뷰이름
  AS 서브쿼리
  
  -- 뷰이름을 수정하려는 기존 뷰이름과 동일하게 지정하면 된다.

 

 

뷰 삭제

  DROP VIEW 뷰이름

 

 

뷰 사용예시

 

 

 

 

 

인라인 뷰

  • SELECT문의 FROM절에 서브쿼리를 정의하고, 이 서브쿼리로 조회된 결과를 가상의 테이블로 취급하고, 별칭을 부여한 것
  • 데이터베이스 객체가 아니다

 

인라인 뷰 형식

  SELECT A.column, A.column, A.column
  FROM (SELECT column, column, column, ...
        FROM table1
        WHERE 조건식) A
   WHERE 조건식

 

인라인 뷰 예시

 

 

 

 

 

인덱스(색인)

  • 데이터 행의 검색 속도를 향상시키기 위해서 사용되는 데이터베이스 객체다
  • 데이터의 위치를 빠르게 찾는 신속한 경로 엑세스 방법을 사용하여 데이터I/O를 줄여 준다
  • 인덱스는 테이블과 독립적으로 존재한다
  • 한 번 생성된 인덱스는 Oracle이 자동으로 유지 관리한다
  • 테이블이 삭제되면 그 테이블의 데이터를 색인화하고 있는 인덱스도 같이 삭제된다

 

인덱스 생성

  • 자동생성 : 테이블 정의할 때 Primary key 제약조건, Unique 제약조건이 정의된 컬럼의 값들은 자동으로 인덱스가 생성된다
  • 수동생성 : 사용자가 행에 대한 엑세스 시간이 줄이기 위해서 특정 열을 대상으로 인덱스를 생성할 수 있다

 

인덱스 생성하기 

  CREATE INDEX 인덱스명
  ON 테이블명 (컬럼명, ....)

 

 

인덱스 삭제하기

  DROP INDEX 인덱스명

 

 

함수 기반 인덱스 생성하기

  CREATE INDEX 인덱스명
  ON 테이블명 (오라클함수)

 

 

인덱스 생성이 필요한 경우

  • WHERE절이나 조인조건에 자주 사용되는 경우
  • 컬럼이 매우 다양한 값을 포함하고 있는 경우
  • 데이터가 아주 많은 테이블을 대상으로 조회작업을 했을 때 대부분의 조회작업에서 검색되는 행이 전체 데이터의 2% ~ 4%미만인 경우

 

인덱스 생성이 필요하지 않은 경우

  • 테이블이 작은 경우
  • 테이블이 자주 갱신되는 경우
  • 인덱스화된 열이 표현식의 일부로 사용되는 경우
  • WHERE절의 조회 조건으로 자주 사용되지 않는 경우
  • 대부분의 조회작업에서 전체 데이터의 2%~4%이상 검색되는 경우

 

트리거

  • 특정 테이블에 INSERT, UPDATE, DELETE 작업이 수행될 때 자동으로 실행되는 것
  • 트리거는 데이터베이스 객체

 

트리거의 종류

  • 행 트리거 : 테이블의 데이터가 변경될 때 실행되는 트리거
  • 문장 트리거 : 영향을 받는 행이 없더라도 실행되는 트리거 / 특정 시간에 실행되는 트리거

 

트리거 형식

  CREATE OR REPLACE TRIGGER 트리거명
  {BEFORE | AFTER} 			-- 트리거 실행 싯점
  {INSERT, UPDATE, DELETE} ON 테이블명 	-- 이벤트종류	
  FOR EACH ROW				-- 데이터 행의 변화가 생길 때 마다 실행된다
  BEGIN
    실행할 SQL
  END;

 

 

트리거의 접두어( OLD, NEW )

  • OLD, NEW 접두어는 행 트리거에서만 사용가능하다
  • 트리거 수행문에서 변경이 발생한 행의 이전값, 변경된(추가된 값)을 사용할 수 있다
작업 OLD 값 NEW 값
INSERT NULL 추가된 값
UPDATE 갱신전의 값 갱신후의 값
DELETE 삭제전의 값 NULL

 

 

트리거 작성예시

  -- 주문정보가 추가되거나, 주문상태가 변경될 때마다 그 이력을 저장하기
  -- 주문정보 이력을 저장하는 테이블 생성하기
  
  create table tb_order_history (
  order_no number(7),
  cust_no number(5),
  order_status varchar2(20),
  order_update_date date
  );

 

 -- 주문정보 추가/변경시 실행될 트리거 생성하기
 CREATE OR REPLACE TRIGGER order_history_trigger
  AFTER 
  INSERT OR UPDATE ON tb_orders 
  FOR EACH ROW     
  BEGIN
    insert into tb_order_history
    (order_no, cust_no, order_status, order_update_date)
    values
    (:new.order_no, :new.cust_no, :new.order_status, sysdate);
  END;

 

 

트리거 활성화 / 비활성화 하기

  ALTER TRIGGER 트리거명 ENABLE;
  ALTER TRIGGER 트리거명 DISABLE;

 

 

트리거 삭제하기

  DROP TRIGGER 트리거명;

 

 

 

데이터베이스 정규화

 

  • 관계형 데이터베이스의 설계에서 중복을 최소화하게 데이터를 구조화하는 프로세스를 정규화라고 한다
  • 정규화의 목표는 관련이 없는 함수 종속성은 별개의 릴레이션으로 표현하는 것이다
  • 정규화된 결과를 정규형이라고 하며, 정규형은 기본 정규형, 고급 정규형으로 구분된다
    • 기본 정규형 : 제1정규형, 제2정규형, 제3정규형, BCNF(보이스/코드 정규형)
    • 고급 정규형 : 제4정규형, 제5정규형

 

제 1 정규형

  • 릴레이션에 속한 모든 속성의 도메인이 더 이상 분해되지 않는 원자값으로만 구성된 정규형이다

 

제 2 정규형

  • 릴레이션이 제 1 정규형에 속하고, 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속되면 제 2 정규형이다
  • 제 1 정규형에 속하는 릴레이션이 제 2 정규형을 만족하게 하려면, 부분 함수 종속을 제거하고, 모든 속성이 기본키에 완전 함수 종속 되도록 릴레이션을 분해하는 정규화 과정을 거쳐야 한다
    • 완전 함수 종속 : 어떤 속성이 기본키에 대해 완전히 종속일 때
    • 부분 함수 종속 : 어떤 속성이 기본키가 아닌 다른 속성에 종속되거나, 기본키가 여러 속성으로 구성되어 있을 경우, 기본키를 구성하는 속성 중 일부만 종속일 때

 

제 3 정규형

  • 릴레이션이 제 2 정규형에 속하고, 기본키가 아닌 모든 속성이 기본키에 이행적 함수 종속이 되지않으면 제 3 정규형
  • 이행적 함수 종속
    • A -> B, B-> C인 경우 A -> C가 성립될 때
    • 즉, A를 알면 B를 알고 이를 통해 C를 할 수 있는 경우를 의미

'SQL' 카테고리의 다른 글

SQL_TOP-N분석과 분석함수, 집합연산자, 계층형쿼리  (1) 2023.12.20
SQL_시퀀스, 트랜잭션, 무결성제약조건  (0) 2023.12.19
SQL_서브쿼리  (1) 2023.12.17
SQL_그룹함수(GROUP BY, HAVING)  (0) 2023.12.14
SQL_Join  (0) 2023.12.13