본문 바로가기

개발하자/ORACLE

sql문장의 구성요소와 db객체

<SQL 해부>
*DML(데이터 조작어)
-데이터의 조회:SELECT
-데이터의 삭제:DELETE(메모리상에 존재하는 테이블의 데이터를 삭제)
-데이터의 저장:INSERT(신규 데이터 입력),UPDATE(기존 데이터 수정)

**데이터 변경작업을 한후 COMMIT을 실행해야 데이터 파일에 반영됨
<->ROLLBACK:COMMIT과는 반대의 개념,작업 내용 되돌리기

*트랜잭션:
예를 들어 우리가 ATM기에서 돈을 뽑는 하나의 과정을 말하며
컴퓨터로 따지면 어떤 명령이 내려져서 결과값이 나오기까지의 과정이다.
COMMIT,SAVEPOINT,ROOLLBACK을 인출과정에 에러가 발생하지 않도록 제어하는 명령어들이다

*DDL(데이터 정의어)
-데이터베이스 생성:CREATE
-데이터베이스 변경:ALTER
-데이터베이스 삭제:DROP(테이블에 있는 데이터를 삭제함은 물론 테이블 구조까지 소멸)
-데이터베이스 저장 공간 삭제:TRUNCATE(DELETE문과 동일한 역할이지만 ROLLBACK 으로 데이터 복구 불가)

*DCL(데이터 제어어)
-데이터베이스에 대한 권한 부여:GRANT
-데이터베이스에 대한 권한 취소:REVOKE

<SQL문장의 구성요소들>
-예약어:SELECT,FROM,WHERE등(툴에서 입력하면 검정색이 아닌 다른색으로 표시됨)
-연산자:수식연산자(+,-,*,/),문자 연산자(||),논리연산자(>,<,=,>=,<=)
 ,계층형 쿼리 연산자(PRIOR,CONNECT_BY_ROOT),SET연산자(UNION,UNION ALL,INTERSECT,MINUS)
-의사컬럼:테이블에 있는 일반적인 컬럼처럼 행동하기는 하지만 실제로 테이블에 저장되어 있지 않은 컬럼
 EX)ROWNUM(쿼리의 결과로 나오게 되는 각각의 로우들에 대한 순서값-SELECT할때 생성)
 ,ROWID(테이블에 저장된 각각의 로우들이 저장된 주소값-INSERT할때 생성)
-함수
-표현식(2*5,TO_CHAR(SYSDATE),NVL(last_name,'HONG')과 같은 것들)
-조건:WHERE 뒤에 쓰는것들(TRUE,FALSE,UNKNOWN의 값을 반환)


 <테이블생성>
[구문형식]CREATE TABLE 테이블명
 ( 컬럼1 컬럼1타입
   ,컬럼2 컬럼2타입
   ,컬럼3 컬럼3타입
...
);
*기본데이터 타입
문자형 데이터:CHAR(고정길이),VARCHAR2(가변길이),NCHAR(고정길이의 유니코드 문자형 데이터 타입)
숫자형 데이터:NUMBER(가변 숫자타입,최대값은 21BYTE)
날짜형 데이터:DATE

*데이터 무결성 제약조건(데이터의 정확성을 보장하기 위한 제약조건)
-NULL:데이터가 없음
-UNIQUE:유일한값 식별가능,NULL허용,테이블당 여러개 생성가능
-PRIMARY KEY(기본키):유일한값 식별가능,NULL허용안함,테이블당 1개만 생성가능
-FOREIGN KEY(외래키):부모테이블의 기본키를 참조하는 자식테이블의 컬럼
-CHECK:입력되는 값을 체크하여 일정한 조건에 해당되는 값만 입력될 수 있게 하는 제약조건
-DEFAULT:기본값을 설정할경우 설정값이 자동으로 입력

*테이블 복사
[구문형식]
CREATE TABLE "스키마명.테이블명"AS
SELECT 컬럼리스트
FROM 원본 테이블명;
*테이블 제거
DROP TABLE [스키마명].테이블명[CASCADE CONSTRAINTS];
->ROLLBACK에 의해 복원될 수 없음,영원히 사라짐
->참조 제약조건(외래키)들까지 자동으로 삭제 시키려면
    CASCADE CONSTRAINTS 옵션을 붙여야함

<인덱스의 생성과 삭제>
*인덱스의 생성
[구문형식]
CREATE [UNIQUE] INDEX [스키마명].인덱스명
ON [스키마명].테이블명(컬럼1 [,컬럼2,컬럼3,...]);

*인덱스 구성 컬럼의 개수에 따른 분류
1. 단일 인덱스 지정:컬럼 개수가 한개
CREATE INDEX index_name
ON TABLE_NAME (column_name)
2. 다중 인덱스(복합 인덱스) 지정:컬럼 개수가 2개이상
CREATE INDEX index_name
ON TABLE_NAME (column_name1,column_name2,column_name3)

*유일성 여부에 따른 분류
1.UNIQUE 인덱스:인덱스 컬럼에 유일한 값만 입력 가능
2.NON-UNIQUE 인덱스:중복값 입력가능

*인덱스 생성자에 따른 분류
1.수동 인덱스:CREATE INDEX 문을 사용하여 사용자가 생성
2.자동 인덱스:UNIQUE나 기본키 생성에 따라 오라클이 자동으로 생성

- 인덱스는 책앞의 목차와도 같은 개념
- 즉 특정 단어나 주제를 빨리 찾고자 할 때 인덱스를 사용
- SQL 명령문의 처리속도를 향상시키기 위해서 컬럼에 대해서 생성하는 오라클 객체
- 오라클에서의 인덱스는 B-Tree INDEX 구조
- null 허용 컬럼은 인덱스를 만들수 없다.

*INDEX 삭제
[구문형식]
DROP INDEX INDEX_NAME;

- TABLE이 삭제되면 INDEX도 삭제된다.
- 인덱스의 소유자와 DROP ANY INDEX권한을 가진 사람만 인덱스 삭제가 가능

*INDEX 사용 조건
- 자주 사용되는 컬럼을 인덱스 컬럼으로 선택한다.
- 참조 제약 조건이 있는 컬럼에 생성한다.
- 데이터 량이 많은 테이블에 있어 전체 데이터의 15% 이하의 데이터를 조회할 경우에 인덱스를 생성한다.
- 데이블 간 조인에 사용된 컬럼을 인덱스 컬럼으로 선택하면 조인 성능이 향상된다.
- 테이블 전체 로우가 적은 경우에는 굳이 인덱스를 만들 필요가 없다.
- 복합 인덱스를 구성할 경우 컬럼의 순서는 SELECT 문의 WHERE 절에서 좀 더 자주 사용되는 컬럼을 먼저 오게 한다.
 
<뷰>
- VIEW:SELECT문장을 통해 생성되는 가상테이블
*뷰의 특성
-데이터의 보안
-복잡한 쿼리를 저장하여 사용

<클러스트>
-하나 이상의 컬럼을 공통으로 사용해서 동일한 테이터 블록을 공유하는 테이블들의 집합

<시노님>
-내 계정에서 다른 계정의 특정 테이블을 내 계정에서 볼 때
  Alias(별칭)를 정해놓고, 그 테이블을 참조할 때 Alias로 참조

<시퀀스>
[시퀀스 생성 기본 문법 형식]
      create SEQUENCE sequence_name
             START WITH n ----->시퀀스 시작 번호값 만일 1부터 시작할려면
                                  ----->START WITH 1 라고 기술한다.
             increment by n ---->시퀀스 번호 증가값. increment by 1 라고
                                  ---->하면 1씩증가
             maxvalue n     ----->증가치 최대값을 지정.
             minvalue n     ----->시퀀스가 가질수 있는 최소값
             cycle 또는 nocycle   --->cycle 로 지정하면 시퀀스값이 최대값까지
                               --->증가를 완료하면 다시 start with 옵션에
                                --->지정한 시작값에서 다시 시퀀스를 시작한다.
                                --->nocycle 로 지정하면 증가가 완료된 이후에
                                --->에러를 발생시킨다.
             cache 또는 nocache --->cache 라고 지정하면 메모리상에서 시퀀스
                -->값을 관리한다. nocache 라고 지정하면  원칙적으로 메모리상에서
                -->시퀀스를 관리하지 않는다.

-데이터베이스에서 숫자값이 일정한 규칙에 의해서 연속적으로
  자동증가 해야 하는 경우 오라클에서는 시퀀스라는 객체를 사용

*시퀀스 값을 알아보는 CURRVAL과 NEXTVAL
- 현재 시퀀스값을 알아낼 때는 CURRVAL을 사용한다.
- 다음값을 알아낼 때는 NEXTVAL을 사용한다.
- CURRVAL로 현재값을 알아볼려면 반드시 사전에 NEXTVAL로 새로값을 생성해야한다.
- NEXTVAL로 새로운값을 생성한 다음에 CURRVAL로 대체하게 된다.