복습
데이터베이스 6일차 - 제약조건(2), 테이블 수정, 뷰 본문
제약조건
기본키(Primary Key) 설정
- 테이블 생성시 PK를 정의한다.
- PK(기본키)는 유일성, 최소성을 만족해야 한다.
외래키(Foreign Key) 설정
- FK가 정의된 테이블이 자식 테이블, 참조되는 테이블을 부모 테이블이라고 한다.
- 자식 테이블은 부모 테이블의 참조되는 컬럼에 존재하는 값이나 NULL만 입력가능하다.
ON DELETE CASCADE : 참조되는 부모 테이블의 행에 대한 DELETE를 허용한다. 즉, 부모 테이블의 행이 지워지면
자식 테이블의 행도 같이 지워진다.
ON DELETE SET NULL : 마찬가지로 DELETE를 허용하며, 부모 테이블의 행이 지워지면 자식 테이블의 행은
NULL값으로 설정된다.
* 참조되는 컬럼은 PK이거나 UK만 가능하다.
제약조건 조회
SELECT *
FROM ALL_CONSTRAINTS
WHERE table_name = '테이블명';
위의 형태로 테이블명을 입력하면 해당 테이블의 모든 제약조건을 조회할 수 있다.
제약조건 추가
위의 형태로 제약조건을 추가하며, NOT NULL은 아래와 같이 MODIFY를 이용하여 추가한다.
제약조건 삭제
위의 형태로 제약조건을 삭제하며, CASCADE를 사용하면 이를 참조하는 FK도 삭제된다.
테이블 열 추가/수정/삭제
- ADD는 컬럼 추가, MODIFY는 컬럼 수정
-- 열 추가
ALTER TABLE E_EMP
ADD (GENDER VARCHAR2(1));
ALTER TABLE E_EMP
ADD (커미션 NUBER DEFAULT 0 NOT NULL);
-- 한 번에 두개의 열 추가
ALTER TABLE E_EMP
ADD (날짜 DATE DEFAULT SYSDATE,
제작자 VARCHAR2(100) DEFAULT USER);
-- 열의 수정
ALTER TABLE E_EMP
MODIFY (제작자 VARCHAR2(200)); -- (100) => (200)
ALTER TABLE E_EMP
MODIFY (GENDER NUMBER);
-- 열의 삭제
ALTER TABLE E_EMP
DROP COLUMN 제작자;
-- 여러 개 열 삭제
ALTER TABLE E_EMP
DROP (GENDER, 커미션, 커미션2);
테이블 이름 수정, CREATE TABLE AS
CREATE TABLE AS
: 서브 쿼리의 결과를 테이블로 저장하는 방법이다. 주로 테스트용 테이블, 임시테이블, 분석테이블을 생성하는데 이용
테이블 이름 수정
-- 테이블의 열 및 이름 수정
ALTER TABLE E_EMP
RENAME COLUMN department_id TO 부서번호;
ALTER TABLE E_EMP
RENAME COLUMN employee_id TO 직원번호; -- 열 이름 수정
RENAME E_EMP TO 직원테이블; -- 테이블 이름 수정
CREATE TABLE stmans(id,job,sal) -- 열이름 지정하여 테이블 생성
AS
SELECT employee_id, job_id, salary FROM employees
WHERE job_id = 'ST_MAN';
뷰(VIEW)
: 테이블에서 사용자가 필요로 하는 부분만 선택하여 만들어 놓은 데이터의 집합. 즉, 가상의 테이블
* 뷰를 사용하는 이유는 사용자의 편의와 데이터베이스의 보안 때문이다. 뷰를 사용하면 원본 테이블에 직접 접근하지 않아도 사용자에게 적절한 데이터를 제공할 수 있어,데이터베이스의 데이터를 안전하게 유지할 수 있다. 또, 복잡한 SQL문을 매번 작성하지 않아도 된다.
뷰의 특징
- 뷰는 기본테이블로부터 유도된 테이블이기 때문에 기본테이블과 같은 형태의 구조이며, 조작도 거의 동일하다.
- 뷰는 가상테이블이기 때문에 물리적으로 구현되어 있지 않다.
- 필요한 데이터만 뷰로 정의해서 처리할 수 있기 때문에 관리가 용이하고 명령문이 간단해진다.
- 뷰를 통해서만 데이터에 접근하게 하면 뷰에 나타나지 않는 데이터를 안전하게 보호하는 효율적인 기법으로 사용할 수 있다.
복잡한 뷰
-- 그룹함수를 사용한 뷰는 DML 사용 불가(수정, 삭제, 입력)
DROP VIEW 부서별_직원_보고서;
CREATE OR REPLACE VIEW 부서별_직원_보고서 -- OR REPLACE VIEW 추가
AS
SELECT department_id 부서번호, COUNT(employee_id) 직원수, MAX(salary) 최고급여,
MIN(salary) 최저급여, ROUND(AVG(salary),0) 평균급여
FROM employees
GROUP BY department_id;
SELECT * FROM 부서별_직원_보고서;
--DML 사용 시 에러
INSERT INTO 부서별_직원_보고서 VALUES(120,6,10000,5000);
읽기 전용 뷰(WITH READ ONLY)
CREATE OR REPLACE VIEW EMP_V_READ
AS
SELECT employee_id 직원번호, first_name 이름, last_name 성,
email 이메일, hire_date 고용일자, job_id 직종
FROM employees
WHERE department_id = 90
WITH READ ONLY;
SELECT * FROM EMP_V_READ;
-- DML 사용 불가
DELETE FROM emp_v_read;
체크 옵션 뷰(WITH CHECK OPTION) : 특정 조건만 DML 적용
CREATE OR REPLACE VIEW EMP_체크옵션
AS
SELECT employee_id 직원번호, first_name 이름, last_name 성,
email 이메일, hire_date 고용일자, job_id 직종, department_id 부서번호
FROM employees
WHERE department_id = 90 -- 부서번호가 90번 일 때만 DML 사용가능
WITH CHECK OPTION;
인덱스(INDEX)
: 인덱스는 색인으로 RDBMS에서 검색속도를 눞이기 위해 사용하는 하나의 기술이다.
- 자동 인덱스 : PK(기본키) 또는 UNIQUE 제한 규칙에 의해 자동적으로 생성되는 인덱스.
- 수동 인덱스 : CREATE INDEX 명령을 실행해서 만드는 인덱스
인덱스 확인하기
SELECT TABLE_NAME 테이블명,
INDEX_NAME 인덱스이름,
COLUMN_NAME 컬럼이름
FROM ALL_IND_COLUMNS
WHERE TABLE_NAME = 'EMPLOYEES';
인덱스 만들기
CREATE INDEX members_last_name_i
ON members(last_name);
인덱스 삭제 : 인덱스는 테이블이 DROP/삭제 시 같이 삭제됨
DROP INDEX MEMBERS_first_name_i;
멀티 인덱스
'데이터베이스' 카테고리의 다른 글
데이터베이스 7일차 - 시퀀스, DCL (0) | 2020.04.28 |
---|---|
데이터베이스 5일차 - 트랜잭션, DML, 데이터타입, 제약조건 (0) | 2020.04.24 |
데이터베이스 4일차 - 외부·교차 조인, 서브쿼리, 집합연산자 (0) | 2020.04.23 |
데이터베이스 3일차 - 그룹함수, 조인(JOIN) (0) | 2020.04.22 |
데이터베이스 2일차 - 데이터 조회(이어서), 함수 (0) | 2020.04.21 |