테이블의 스키마(Schema, 구조)를 변경하기 위한 SQL구문
새로운 컬럼을 추가 👉🏻 추가된 컬럼은 마지막 컬럼으로 들어감
ALTER TABLE alter_table
ADD (phone VARCHAR2(11));
기존 컬럼의 데이터타입을 변경
-- 기존 컬럼의 데이터 타입 변경하기 : phone VARCHAR2(11) -> phone VARCHAR2(100)
ALTER TABLE alter_table
MODIFY (phone VARCHAR2(100));
-- 기존 컬럼에 NOT NULL 속성 부여
ALTER TABLE alter_table
MODIFY (empno NOT NULL);
컬럼을 비활성화 함
락(LOCK)이 걸림user_unused_col_tabs : 비활성화 컬럼 자료사전 👉🏻 상세항목은 없고 비활성화 컬럼 개수만 적혀있음ALTER TABLE alter_table
SET UNUSED (deptno);
📑 DB LOCK
- ROW LOCK / TABLE LOCK / DB LOCK
- 특정 사용자에게만 해당 LOCK영역에 대한 접근을 허용하는 것 👉🏻 사용자 이외에는 SELECT 조차 안됨
- 동시에 여러 사용자가 데이터처리하지 못하도록 막는 개념
- 트랜잭션은 변경사항에 대해 ROW LOCK이 발생
<기존 컬럼 삭제>
-- phone 컬럼 삭제하기
ALTER TABLE alter_table
DROP COLUMN phone;
<비활성화 해둔 컬럼을 물리적으로 삭제>
ALTER TABLE alter_table
DROP UNUSED COLUMNS;
<테이블 이름 변경>
ALTER TABLE alter_table
RENAME TO alter_tb;
<컬럼 이름 변경>
ALTER TABLE alter_table
RENAME COLUMN ename TO deptno;
NOT NULL, DEFAULT-- 테스트 테이블
CREATE TABLE alter_cons(
data VARCHAR2(10)
);
-- MODIFY
-- NOT NULL설정
ALTER TABLE alter_cons
MODIFY (data NOT NULL); --CHECK 제약사항 생김
--MODIFY (data NULL);
-- DEFAULT 설정
ALTER TABLE alter_cons
MODIFY (data DEFAULT 'HI');
-- DEFUALT 설정 제거 -> 디폴트로 null값 부여
ALTER TABLE alter_cons
MODIFY (data DEFAULT null);
-- ADD
-- UNIQUE 설정
ALTER TABLE alter_cons
ADD CONSTRAINT uk_data UNIQUE(data);
-- CHECK 설정
ALTER TABLE alter_cons
ADD CONSTRAINT ck_data CHECK(data >='a' AND data <= 'b');
-- PRIMARY KEY 설정
ALTER TABLE alter_cons
ADD CONSTRAINT pk_data PRIMARY KEY(data);
-- FOREIGN KEY 설정
ALTER TABLE fk_cons
ADD CONSTRAINT fk_data
FOREIGN KEY(fk_data)
REFERENCES alter_cons(data);
-- DROP
-- UNIQUE 설정 제거
ALTER TABLE alter_cons
DROP CONSTRAINT uk_data;
-- CHECK 설정 제거
ALTER TABLE alter_cons
DROP CONSTRAINT ck_data;
-- PRIMARY KEY 설정 제거
ALTER TABLE alter_cons
DROP CONSTRAINT pk_data;
-- FOREIGN KEY 설정 제거
ALTER TABLE fk_cons
DROP CONSTRAINT fk_data;
테이블의 데이터(내용물, 행)을 삭제
테이블의 자체를 삭제 👉🏻 스키마(구조)까지 포함하여 제약사항, 컬럼, 데이터 전부 삭제
테이블의 데이터(내용물, 행)만 삭제 👉🏻 스키마(구조)는 유지
📑 데이터 베이스 객체(Database Object)
테이블, Table / 사용자 계정, User / 인덱스, Index / 뷰, View / 시퀀스, Sequence
CREATE 하기 위해서는 system(관리자)계정으로 로그인 해야 함 👉🏻 관리자 접속 만들기
DBA계정, Database Administrator
SYS, SYSTEMS 계정을 기본으로 제공SYS - DB생성권한을 가지고 있음, 자료사전의 소유자(OWNER)SYSTEM - DB생성 권한이 없음DB객체들에 대한 관리작업을 수행하는 일반 계정
scott, hrCREATE USER sample IDENTIFIED BY apple; --아직 아무 권한이 없음
--DROP USER 구문에 CASCADE옵션을 적용하면 계정에 종속된 모든 객체도 함께 삭제됨
DROP USER sample CASCADE;
-- 처음 생성된 사용자 계정은 아무 권한도 없음 / DB접속 권한(CREATE SESSION)도 없음
-- 기본 권한 부여 -> system 이용
GRANT
RESOURCE --테이블 관리 권한
, CONNECT --DB 접속 권한
TO sample;
테이블의 탐색(검색) 속도를 향상시키기 위해 사용하는 DB객체
user_indexes : 인덱스 정보user_ind_columns : 인덱스가 적용된 컬럼 정보CREATE INDEX idx_salgrade
ON salgrade(grade);
INSERT INTO salgrade
VALUES( 5, 7777, 8888); --중복값 허용이라 여러번 들어감
-- 인덱스 삭제
DROP INDEX idX_salgrade;
CREATE UNIQUE INDEX idx_salgrade --salgrade 테이블에 중복된 데이터들이 있어 안됨
ON salgrade(grade);
SELECT * FROM salgrade
--DELETE salgrade
WHERE grade = 5 AND losal = 7777; --중복된 데이터 삭제
-- unique 특성때문에 삽입 불가
INSERT INTO salgrade
VALUES( 5, 7777, 8888);
-- 조건으로 2개 이상의 컬럼이 같이 조회되는 경우 -> 복합인덱스 필요
CREATE INDEX idx_emp
ON emp (empno, ename);
장점
단점
-- 인덱스 재구성(재생성)
ALTER INDEX idx_salgrade REBUILD;
연속적인 숫자를 생성하는 객체
.currval : 현재 시퀀스 값 확인 👉🏻 nextval을 한 번이라도 해야 실행 가능.nextval : 다음 시퀀스 값 확인START WITH n : 시작값 설정INCREMENT BY n : 증가단위 설정MAXVALUE n | NOMAXVALUE : 최대값 설정MINVALUE n | NOMINVALUE : 최소값 설정 👉🏻 start의 값보다 작거나 같아야 함CYCLE | NOCYCLE : 순환구조 여부CACHE | NOCACHE : 미리 생성할 숫자의 개수 (캐시의 개수)user_sequences-- 시퀀스 자료사전
SELECT * FROM user_sequences;
-- 시퀀스 생성
CREATE SEQUENCE seq;
-- 시퀀스의 현재 값
SELECT seq.currval FROM dual; 👉🏻 currval은 한 번이라도 사용된 적이 있어야 조회 가능
-- 시퀀스의 다음 값
SELECT seq.nextval FROM dual;
-- 시퀀스 값 사용해서 INSERT 하기
INSERT INTO emp(empno, ename)
VALUES (seq.nextval, 'TEST'); --시퀀스를 사용하면 중복값을 체크하기 쉬움
-- 시퀀스 삭제
DROP SEQUENCE seq;
-- 옵션을 부여해서 시퀀스 생성
CREATE SEQUENCE seq
START WITH 2001 --시작값
INCREMENT BY 100 --증가값
MINVALUE 2001 --최소값
MAXVALUE 3000; --최대값
-- CACHE 5개로 저장해서 1CYCLE보다 적어지도록 설정
ALTER SEQUENCE seq
CYCLE
CACHE 5;
복잡한 쿼리를 간단한 이름으로 지정해서 사용하는 것
❗ 일반 사용자 계정은 view 객체 생성권한이 없음! system 계정 이용해 권한부여 필요!
❗ 뷰를 이용한 데이터 삽입에서 삽입된 데이터가 저장되는 곳은 원본테이블
user_viewsCREATE OR REPLACE VIEW ➡ 뷰를 생성하거나 이미 존재하는 뷰라면 쿼리를 수정WITH CHECK OPTION : AS 절의 서브쿼리에 적용된 CONSTRAINT 제약조건 또는 WHERE 조건절에 맞는 데이터만 뷰를 이용하여 다룰 수 있도록 설정WITH READ ONLY : 조회만 가능한 뷰로 설정하는 옵션-- system 계정으로 scott에게 권한 부여
GRANT
CREATE VIEW
TO
scott;
-- 뷰 생성
CREATE OR REPLACE VIEW test_view
AS (
SELECT * FROM emp
WHERE empno > 7800
);
-- 뷰를 이용한 데이터 삽입 👉🏻 원본테이블에 삽입 및 저장됨
INSERT INTO test_view(empno, ename)
VALUES (9152, 'DAVE');
-- WITH CHECK OPTION
CREATE OR REPLACE VIEW test_view
AS (
SELECT * FROM emp
WHERE empno > 7800
)
WITH CHECK OPTION;
-- 에러, WITH CHECK OPTION으로 서브쿼리의 WHERE절 검사
INSERT INTO test_view (empno, ename)
VALUES (7000, 'TEST');
-- WITH READ ONLY
CREATE OR REPLACE VIEW test_view
AS (
SELECT * FROM emp
WHERE empno > 7800
)
WITH READ ONLY;
-- 에러, 읽기 전용 뷰에는 DML을 수행할 수 없음
INSERT INTO test_view(empno, ename)
VALUES(9060, 'GG');