자격증/SQLD

SQLD SQL 기본(19~20) - 17일차

awspspgh 2024. 11. 16. 14:59
목차
19. DDL
20. DCL

 

19. DDL 

● DDL(Data Definition Language) 

- 데이터 정의어 
데이터 구조 정의(객체 생성, 삭제, 변경) 언어
- CREATE(객체 생성), ALTER(객체 변경), DROP(객체 삭제), TRUNCATE(데이터 삭제) 
AUTO COMMIT(명령어 수행하면 즉시 저장, 원복 불가)


● CREATE  

- 테이블이나 인덱스와 같은 객체를 생성하는 명령어
- 테이블 생성 시 테이블명, 컬럼명, 컬럼순서, 컬럼크기, 컬럼의 데이터타입 정의 필수 
- 테이블 생성 시 각 컬럼의 제약조건 및 기본값은 생략 가능 
테이블 생성 시 소유자 명시 가능(생략 시 명령어 수행 계정 소유)
- 숫자컬럼의 경우 컬럼 사이즈 생략 가능(날짜 컬럼은 사이즈 명시 X)

 

** 문법 1 

 

** 문법 2(테이블 복제) 

 

** 특징 
- 복제테이블의 컬럼명과 컬럼의 데이터 타입이 복제됨 
- SELECT 문에서 컬럼별칭 사용 시 컬럼별칭 이름으로 생성 
- CREATE 문에서 컬럼명 변경 가능 
- NULL 속성도 복제됨 
- 테이블에 있는 제약조건, INDEX 등은 복제되지 X


● 데이터타입 

-> SQL Server 의 경우도 유사, VARCHAR2 -> VARCHAR 사용, NUMBER -> NUMERIC 사용 

-> SQL Server 의 경우 문자타입도 사이즈 생략 가능(생략 시 1) 


※ NUMBER(7,2)의 경우 총 자리수가 7을 초과할 수 없음

 

예제) MERGE_OLD 테이블 만들기 

 

예제) EMP 테이블을 복제하여 TEST 테이블 만들기 

 

예제) EMP 테이블 데이터 없이 구조만 복제 

-> 항상 거짓인 조건을 SELECT 절에 전달하면, 데이터는 아무것도 출력되지 않지만 컬럼 정보들은 출력됨 따라서 테이블 내용은 제외하고 구조만 복제할 때 주로 사용!


예제) 테이블 복제 시 컬럼명 변경 가능 

 

< 결과 > 

 

● ALTER 

- 테이블 구조 변경(컬럼명, 컬럼 데이터타입, 컬럼사이즈, DEFAULT 값, 컬럼삭제, 컬럼추가, 제약조건) 
- 컬럼순서 변경 불가(재생성으로 해결) 

 

1. 컬럼 추가

- 새로 추가된 컬럼위치는 맨 마지막(절대 중간 위치에 추가 불가) 
- 컬럼 추가 시 데이터타입 필수, DEFAULT 값, 제약조건을 명시할 수 있음 
여러 컬럼 동시 추가 가능(반드시 괄호 사용) 

 

** 문법)  

 

예제) 컬럼 추가 

 

※ 동시에 여러 컬럼을 추가할 경우 반드시 괄호와 함께 전달!

 

※ 컬럼 추가시 NOT NULL 속성 전달 불가(컬럼 추가 시 모두 NULL인 값을 갖고 추가되므로)

 

※ 컬럼 추가시 DEFAULT 을 선언하면 NOT NULL 속성을 갖는 컬럼 추가 가능 

※ 순서 주의(NOT NULL 은 DEFAULT 값 선언 뒤) 

 

2. 컬럼(속성) 변경
- 컬럼 사이즈, 데이터타입, DEFAULT 값 변경 가능 
- 여러 컬럼 동시 변경 가능 

 

**문법 

☞ 괄호 생략 가능

 
1) 컬럼 사이즈 변경 
- 컬럼 사이즈 증가는 항상 가능 
- 컬럼 사이즈 축소는 데이터 존재 여부에 따라 제한(데이터가 있는 경우 데이터의 최대 사이즈 만큼 축소 가능) 
동시 변경 가능(반드시 괄호 필요)


예제) 여러 컬럼 사이즈 수정 

-> 최대 길이보다 크거나 같은 사이즈로는 변경 가능 

 

2) 데이터 타입 변경 
빈 컬럼일 경우 데이터 타입 변경 가능 
CHAR, VARCHAR 타입일 경우 데이터가 있어도 서로 변경 가능

 

예제) 데이터타입 변경 

< 테이블 구조 및 데이터 > 

 

 

< 컬럼 데이터 타입 변경 > 

 

예제) CHAR <-> VARCHAR 데이터타입 변경 

< 테이블 구조 및 데이터 > 

 

 

< 컬럼 데이터 타입 변경 > 

 

3) DEFAULT 값 변경 
- DEFAULT 값이란 특정 컬럼에 값이 생략될 경우(입력 시 언급되지 않을 경우) 자동으로 부여되는 값 
- INSERT 시 DEFAULT 값이 선언된 컬럼에 NULL을 직접 입력할 때는 DEFAULT 값이 아닌 NULL 이 입력됨 
- 이미 데이터가 존재하는 테이블에 DEFAULT 값 선언 시 기존 데이터 수정 안됨(이후 입력된 데이터부터 적용)
- DEFAULT 값 해제 시 DEFAULT 값을 NULL 로 선언 


예제) DEFAULT 값 변경 및 적용

< TEST DATA 생성 > 

 

< DEFAULT 값 수정 > 

 

< 새로운 값 입력 > 

 

< 데이터 확인 > 

-> PARK 는 SAL 값이 DEFAULT 값이 아닌 NULL 로 입력됨 
-> CHOI 는 SAL 값이 DEFAULT 값으로 입력됨(입력 시 SAL 컬럼 언급 안됐기 때문) 

 

3. 컬럼 이름 변경 
- 항상 가능 
동시 여러 컬럼 이름 변경 불가(괄호 전달 불가) 
- ALTER ... RENAME 명령어로 처리 


** 문법  

 

예제) 컬럼 이름 변경 

< 테이블 구조 > 

 

< 컬럼 이름 변경 > 

 

4. 컬럼 삭제 
데이터 존재 여부와 상관없이 언제나 가능 
- RECYCLEBIN 에 남지 X(FLASHBACK 으로 복구 불가) 
동시 삭제 불가


예제) COL_A 컬럼의 삭제 

 

예제) 2 개이상 컬럼 삭제 시도 시 에러 발생 

-> 괄호로 묶어서 전달하여도 동시 삭제 불가 

 

● DROP 

- 객체(테이블, 인덱스 등) 삭제 
- DROP 후에는 조회 불가 

 

**문법 

※ PURGE 로 테이블 삭제시 RECYCLEBIN 에서 조회 불가 

 

예제) TEST 테이블 DROP 후 조회 결과 

 

-> 테이블 또는 뷰가 존재하지 않는다는 에러 발생 

 

● TRUNCATE 

- 구조 남기고 데이터만 즉시 삭제, 즉시 반영(AUTO COMMIT) 
- RECYCLEBIN 에 남지 않음 

 

**문법 

 

예제) TRUNCATE 사용하여 데이터 전부 삭제 

 

< 삭제 후 데이터 조회 > 

-> 구조(테이블 명, 컬럼 등)만 남고 데이터는 삭제된 것을 확인할 수 있음

 
● DELETE / DROP / TRUNCATE 차이 

- DELETE : 데이터 일부 또는 전체 삭제, 롤백 가능 
- TRUNCATE : 데이터 전체 삭제만 가능(일부 삭제 불가), 즉시 반영(롤백 불가) 
- DROP : 데이터와 구조를 동시 삭제, 즉시 반영(롤백 불가) 


● 제약조건 

- 데이터 무결성을 위해 각 컬럼에 생성하는 데이터의 제약 장치 
- 테이블 생성 시 정의 가능, 컬럼 추가 시 정의 가능, 이미 생성된 컬럼에 제약조건만 추가 가능

 
1. PRIMARY KEY(기본키) 
- 유일한 식별자(각 행을 구별할 수 있는 식별자 기능) 
- 중복 허용 X, NULL 허용 X => UNIQUE + NOT NULL 
- 특정 컬럼에 PRIMARY KEY 생성하면 NOT NULL 속성 자동 부여(CTAS 로 테이블 복사 시 복사되지 X) 
- 하나의 테이블에 여러 기본키를 생성할 수 없음 
- 하나의 기본키를 여러 컬럼을 결합하여 생성할 수 있음 
- PRIMARY KEY 생성 시 자동으로 UNIQUE INDEX 생성

 
**문법 
1) 테이블 생성 시 제약조건 생성 

 

2) 컬럼 추가 시 제약 조건 생성 

 

3) 이미 생성된 컬럼에 제약조건만 추가 

 

4) 제약조건 삭제 

 

예제) 테이블 생성 시 제약조건 설정(이름 전달 없이) 

 

-> 제약조건 생성 시 이름을 설정하지 않으면 자동으로 부여

-> CREATE 문 밑에 제약조건 이름과 함께 전달 가능!


예제) 테이블 생성 시 제약조건 설정(이름과 함께 전달) 

 

예제) 컬럼 추가 시 제약조건 생성 

 

예제) 이미 있는 컬럼에 제약조건만 생성 

 

2. UNIQUE 
- 중복을 허용하지 않음 
NULL은 허용
- UNIQUE INDEX 자동 생성 


예제) UNIQUE KEY 가 생성된 컬럼의 값 입력 

< UNIQUE KEY 가 생성 > 

 

< 값의 입력 > 

 

< 확인 > 

 

3. NOT NULL 
- 다른 제약조건과 다르게 컬럼의 특징을 나타냄 => CTAS 로 복제 시 따라감 
- 컬럼 생성 시 NOT NULL 을 선언하지 않으면 Nullable 컬럼으로 생성됨 
- 이미 만들어진 컬럼에 NOT NULL 선언 시 제약조건 생성이 아닌 컬럼 수정(MODIFY)으로 해결 

 

예제) NOT NULL 선언 

 

4. FOREIGN KEY 
참조테이블의 참조 컬럼에 있는 데이터를 확인하면서 본 테이블 데이터를 관리할 목적으로 생성 
반드시 참조(부모)테이블의 참조 컬럼(REFERENCE KEY)이 사전에 PK 혹은 UNIQUE KEY 를 가져야 함! 

 

**문법 

 

예제) FOREIGN KEY 테스트 

** 테스트 테이블 생성 

 

** 부모 테이블(DEPT_TEST1)에 REFERENCE KEY(참조대상)에 PK 설정! 

 

** 자식 테이블(EMP_TEST1)에 FOREIGN KEY 생성 

 

TEST1) 자식 테이블(EMP_TEST1)에서 10 번 부서원 삭제 시도 

 

TEST2) 자식 테이블(EMP_TEST1)에서 20 번 부서원 50 번으로 변경 시도(불가) 

-> 부모 테이블에 50 번 부서번호가 정의되어 있지 않아 자식 테이블에 해당 값으로 수정 불가!


TEST3) 자식 테이블(EMP_TEST1)에서 50 번 부서원(나머지 정보 자유) 입력 시도(불가) 

-> 부모 테이블에 50 번 부서번호가 정의되어 있지 않아 자식 테이블에 해당 값으로 입력 불가!

 

TEST4) 부모 테이블(DEPT_TEST1)에 20 번 부서원 삭제 시도(불가) 

-> 20 번 부서 정보가 자식 테이블에 존재하므로 삭제 불가


TEST5) 부모 테이블(DEPT_TEST1)에 20 번 부서원의 부서번호를 60 변경 시도(불가) 

-> 20 번 부서 정보가 자식 테이블에 존재하므로 다른 값으로 변경 불가


● FOREIGN KEY 옵션(생성 시 정의, 변경 불가 -> 재생성)

1. ON DELETE CASCADE : 부모 데이터 삭제 시 자식 데이터 함께 삭제 
2. ON DELETE SET NULL : 부모 데이터 삭제 시 자식 데이터의 참조값은 NULL 로 수정 


예제) FOREIGN KEY 옵션 TEST(ON DELETE CASCADE )

 < FOREIGN KEY 재생성(ON DELETE CASCADE ) >  

 

< 부모 데이터 삭제 > 

-> 부모 데이터 삭제 시, 자식 데이터도 함께 삭제됨! 

 

예제) FOREIGN KEY 옵션 TEST(ON DELETE SET NULL) 

< FOREIGN KEY 재생성(ON DELETE SET NULL ) >  

 

< 부모 데이터 삭제 > 

-> 자식 테이블의 데이터도 함께 삭제되지 않음(NULL 로 수정)

 
5. CHECK 
- 직접적으로 데이터의 값 제한 
  ex) 양수(1, 2, 3, 4) 중 하나

 
예제) EMP_TEST1 테이블의 SAL 값은 0 이상이어야 한다는 CHECK 제약조건 추가 

 

● 기타 오브젝트 

1) 뷰(VIEW) 
- 저장공간을 가지지는 않지만 테이블처럼 조회 및 수정할 수 있는 객체 


** 뷰(VIEW)의 종류 
  - 단순뷰 : 하나의 테이블 조회 뷰(VIEW) 
  - 복합뷰 : 둘 이상의 테이블 조인 뷰(VIEW) 


** 뷰(VIEW)의 특징 
  - 뷰(VIEW)는 기본 테이블로부터 유도된 테이블이기에 기본 테이블과 같은 형태의 구조를 가지고 있으며, 조작도 기본 테이블과 거의 같음 

  - 뷰는 가상의 테이블이기에 물리적으로 구현되어 있지 않으며 저장공간을 차지하지 않음 
  - 데이터를 안전하게 보호가능 
  - 이미 정의되어 있는 뷰(VIEW)는 다른 뷰(VIEW)의 정의에 기초가 될 수 있음 
  - 기본 테이블이 삭제되면 그 테이블을 참조하여 만든 뷰 역시 삭제됨 


** 뷰(VIEW)의 장점 
  - 논리적 독립성을 제공 
  - 데이터의 접근을 제어 함으로써 보안유지 
  - 사용자의 데이터 관리 단순화 
  - 데이터의 다양한 지원가능 


** 뷰(VIEW)의 단점  
- 뷰의 정의 변경 불가 
- 삽입, 삭제, 갱신 연산에 제한 
- 인덱스 구성불가 

 

** 문법 

 

** 뷰(VIEW)의 삭제 

 

예제) 뷰 생성 및 조회 

< 생성 > 

-> EMP 테이블과 DEPT 테이블에서 가져올 데이터를 선택 

 

< 조회 > 

 

2) 시퀀스(SEQUENCE) 
- 자동으로 연속적인 숫자 부여해주는 객체 

 

** 문법 

 

3) 시노님(SYNONYM) 
- 테이블 별칭 생성 
  EX) HR 계정에서 SCOTT.EMP 를 EMP 로 조회하는 방법 

 

** 문법 

-> OR REPLACE : 기존에 같은 이름으로 시노님이 생성되어 있는 경우 대체 
-> PUBLIC : 시노님을 생성한 유저만 사용 가능한 PRIVATE SYNONYM 의 반대(누구나 사용가능) 

-> PUBLIC 으로 생성한 시노님은 반드시 PUBLIC 으로 삭제 

 

예제) 시노님 생성 전 후 테이블 조회비교(HR 계정으로 조회) 

< 시노님 생성 > 

 

< 시노님 생성 전 HR 계정에서 EMP 조회 > 

 

< 시노님 생성 후 HR 계정에서 EMP 조회 > 

 

20. DCL 

● DCL(Data Control Language)

- 데이터 제어어로 객체에 대한 권한을 부여(GRANT)하거나 회수(REVOKE)하는 기능 
테이블 소유자는 타계정에 테이블 조회 및 수정 권한 부여 및 회수 가능 

 

● 권한

- 일반적으로 본인(접속한 계정) 소유가 아닌 테이블은 원칙적으로 조회 불가(권한 통제) 
- 업무적으로 필요시 테이블 소유자가 아닌 계정에 테이블 조회, 수정 권한 부여 가능 

 

※ 권한 종류
1) 오브젝트권한
  - 테이블에 대한 권한 제어 
    ex) 특정 테이블에 대한 SELECT, INSERT, UPDATE, DELETE, MERGE 권한  
  - 테이블 소유자는 타계정에 소유 테이블에 대한 조회 및 수정 권한 부여 및 회수 가능 페이지


2) 시스템권한 
  - 시스템 작업(테이블 생성 등)등을 제어 
    ex) 테이블 생성 권한, 인덱스 삭제 권한 
  - 관리자 권한만 권한 부여 및 회수 가능 

 

● GRANT

- 권한 부여 시 반드시 테이블 소유자나 관리자계정(SYS, SYSTEM)으로 접속하여 권한을 부여하여야 함 
동시에 여러 유저에 대한 권한 부여 가능
동시 여러 권한 부여 가능
- 동시 여러 객체 권한 부여 불가 

 

** 문법 

 

예제) 오브젝트 권한 부여(PROFESSOR 소유자 실행) 

 

예제) 시스템 권한 부여(관리자 권한으로 실행) 

 

● REVOKE

 동시 여러 권한 회수 가능
- 이미 회수된 권한 재회수 불가 
동시 여러 유저로부터의 권한 회수 가능 

 

** 문법 

 

예제) 오브젝트 권한 회수 

 

● 롤(ROLE) 

- 권한의 묶음(생성 가능한 객체) 
- SYSTEM 계정에서 ROLE 생성 가능 

 

** 문법 

 

예제) 롤(ROLE) 

< 생성 > 

 

< 롤에 권한 담기 > 

 

< 롤 부여 >  

 

< HR 계정에서 수행 >  

 

< 롤에서 권한 빼기 > 

 

< 권한 회수 후 HR 계정에서 조회 > 

-> 권한이 불충분하다는 에러 
-> ROLE 에서 회수된 권한은 즉시 반영되므로 다시 ROLE 을 부여할 필요가 없음 

 

< 롤을 통해 부여한 권한 직접 회수(SCOTT 에서 실행) > 

-> ROLE 을 통해 부여한 권한은 직접 회수 불가 
-> ROLE 을 통한 회수만 가능 


● 권한부여 옵션(중간관리자의 권한)

1. WITH GRANT OPTION
  - WITH GRANT OPTION 으로 받은 오브젝트 권한을 다른 사용자에게 부여할 수 있음
  - 중간관리자(WITH GRANT OPTION 으로 권한을 부여받은 자)가 부여한 권한은 중간관리자만 회수 가능
  - 중간관리자에게 부여된 권한 회수 시 제 3 자에게 부여된 권한도 함께 회수됨 

 

2. WITH ADMIN OPTION
  - WITH ADMIN OPTION 을 통해 부여 받은 시스템 권한/롤 권한을 다른 사용자에게 부여할 수 있음
  - 중간관리자를 거치지 않고 직접 회수 가능
  - 중간관리자 권한 회수시 제 3 자에게 부여된 권한도 함께 회수 X(남아있음)


예제) WITH GRANT OPTION / WITH ADMIN OPTION TEST

권한 부여)

 

오브젝트 권한 회수 시도)

-> 중간관리자를 통해 부여한 제 3 계정의 권한은 관리자가 직접 회수 불가 

 

-> 대신 중간관리자에게 부여된 권한을 회수(회수 시 제 3 의 계정에 부여된 권한도 함께 회수됨) 

 

-> 중간관리자(HDATALAB)에 의해 부여된 제 3 의 계정(PARK) 권한도 함께 회수됨&nb