SQL & DB/Oracle

[SQL] DML / DDL

YSY^ 2020. 6. 10. 17:44

▣ DML

▶ INSERT 문 : 행 추가 구문

INSERT INTO 테이블명 (컬럼 [, 컬럼]) VALUES (값 [, 값[])
  • 모든 컬럼에 값을 넣을 경우 컬럼 지정구문은 생략 할 수 있다. 
  • 조회결과를 INSERT 하기 (subquery 이용) 
    - INSERT INTO 테이블명 (컬럼 [, 컬럼])  SELECT 구문 
    - INSERT할 컬럼과 조회한(subquery) 컬럼의 개수와 타입이 맞아야 한다. 
    - 모든 컬럼에 다 넣을 경우 컬럼 설정은 생략할 수 있다.

EX)

insert into dept (dept_id, dept_name, loc) values(500, '기확부', 'seoul');
insert into dept values(501,'구매부','인천');
insert into dept (dept_id, dept_name) values(502,'구매부');

 

 

▶ UPDATE : 테이블의 컬럼의 값을 수정

UPDATE 테이블명 
SET    변경할 컬럼 = 변경할 값  [, 변경할 컬럼 = 변경할 값] 
[WHERE 제약조건] 

 

  • UPDATE: 변경할 테이블 지정
  • SET: 변경할 컬럼과 값을 지정
  • WHERE: 변경할 행을 선택. 
  • rollback : 지금까지 수정했던 것들을 롤백(commit 진행하기 전까지 롤백)
  • commit :지금까지한 작업을 DB에 적용

EX)

update emp
set salary = salary * 1.1
where emp_id = 200;

 

 

▶ DELETE : 테이블의 행을 삭제

DELETE FROM 테이블명 
[WHERE 제약조건] 

 

  • WHERE: 삭제할 행을 선택

EX)

delete from emp
where job_id = 'SA_MAN'
and salary < 12000;

 

 

▣ DDL

 

▶ DDL(Data Definition Language) - 데이터베이스에서 사용되는 객체(테이블,사용자,시퀀스)를 관리하는 언어
- create - drop - alter

create table 테이블 이름(   
     컬럼 설정 - 컬럼이름, 데이터타입[, default값, 제약조건] 
     ) 


▶ 데이터타입

  • 문자열 : char/nchar-고정길이, varchar2/nvarchar2/clob - 가변길이
  • 숫자 : number, number(전체자리수, 소수부자리수)
  • 날짜 : date, timestamp
  • 파일 : blob


▶ 제약조건

  • primary key(PK) : 기본키, 행식별자 컬럼
  • unique key(UK) : 중복값을 못가지는 컬럼. null은 가질 수 있음.
  • not null(NN) : null을 못가지는 컬럼
  • check key(CK) : 컬럼에 넣을 값의 조건을 직접 지정.
  • foreign key(FK) : 참조 칼럼. 부모테이블의 primary key만 값으로 가지는 컬럼. = 테이블 참조(조인)할 때 사용.

▶ 제약조건 설정 

  • 컬럼 레벨 설정 -> 컬럼 설정에 같이 설정
  • 테이블 레벨 설정 -> 컬럼 설정뒤에 따로 설정
  • 기본 문법
: constraint 제약조건이름 제약조건타입 
  •  테이블 제약 조건 조회 : USER_CONSTRAINTS 딕셔너리 뷰에서 조회 

▶ 테이블 삭제

DROP TABLE 테이블이름 [CASCADE CONSTRAINTS] -나를 참조하고 있는 제약조건들을 다 없애고 테이블 삭제

 

EX)

create table child_tb(
    no          number,--PK
    jumin_num   char(14), --UK
    age         number not null, --CK(10~90)
    p_no        number, --FK(parent_tb)
    constraint pk_child_tb primary key(no),
    constraint uk_child_tb_jumin_num unique(jumin_num),
    constraint ck_child_tb_age check(age between 10 and 90),
    --constraint FK_child_tb_parent_tb foreign key(p_no) references parent_tb,
    -- 부모테이블에서 참조하는 행이 삭제되면 자식의 행도 같이 삭제하겠다.
    --constraint FK_child_tb_parent_tb foreign key(p_no) references parent_tb on delete cascade,
    -- 부모테이블에서 참조하는 행이 삭제되면 참조컬럼의 값을 null로 update.
    constraint FK_child_tb_parent_tb foreign key(p_no) references parent_tb on delete set null
);

 

※ ALTER : 테이블 수정

▶ 컬럼 추가

ALTER TABLE 테이블이름 ADD (추가할 컬럼설정 [, 추가할 컬럼설정])

 

-> 하나의 컬럼만 추가할 경우 ( ) 는 생략가능

▶ 컬럼 수정

 ALTER TABLE 테이블이름 MODIFY (수정할컬럼명  변경설정 [, 수정할컬럼명  변경설정]) 

 

  • 하나의 컬럼만 수정할 경우 ( )는 생략 가능
  • 숫자/문자열 컬럼은 크기를 늘릴 수 있다.
  • 크기를 줄일 수 있는 경우 : 열에 값이 없거나 모든 값이 줄이려는 크기보다 작은 경우
  • 데이터가 모두 NULL이면 데이터타입을 변경할 수 있다. (단 CHAR<->VARCHAR2 는 가능.)

▶ 컬럼 삭제

 ALTER TABLE 테이블이름 DROP COLUMN 컬럼이름 [CASCADE CONSTRAINTS] 
  • CASCADE CONSTRAINTS : 삭제하는 컬럼이 Primary Key인 경우 그 컬럼을 참조하는 다른 테이블의 Foreign key 설정을 모두 삭제한다.
  • 한번에 하나의 컬럼만 삭제 가능.
  ALTER TABLE 테이블이름 SET UNUSED (컬럼명 [, ..])   
  ALTER TABLE 테이블이름 DROP UNUSED COLUMNS 
  • SET UNUSED 설정시 컬럼을 바로 삭제하지 않고 삭제 표시를 한다. 
  • 설정된 컬럼은 사용할 수 없으나 실제 디스크에는 저장되 있다. 그래서 속도가 빠르다.
  • DROP UNUSED COLUMNS 로 SET UNUSED된 컬럼을 디스크에서 삭제한다. 

▶ 컬럼 이름 바꾸기

ALTER TABLE 테이블이름 RENAME COLUMN 원래이름 TO 바꿀이름; 

 

※ 제약 조건 관련 수정

▶ 제약조건 추가

  ALTER TABLE 테이블명 ADD CONSTRAINT 제약조건 설정 


▶ 제약조건 삭제
  

ALTER TABLE 테이블명 DROP CONSTRAINT 제약조건이름 
  •  PRIMARY KEY 제거: ALTER TABLE 테이블명 DROP PRIMARY KEY [CASCADE]
ALTER TABLE 테이블명 DROP PRIMARY KEY [CASCADE] 
  • CASECADE : 제거하는 Primary Key를 Foreign key 가진 다른 테이블의 Foreign key 설정을 모두 삭제한다.

▶ NOT NULL <-> NULL 변환은 컬럼 수정을 통해 한다.   

ALTER TABLE 테이블명 MODIFY (컬럼명 NOT NULL)
ALTER TABLE 테이블명 MODIFY (컬럼명 NULL)   

 

- 컬럼, 데이터복사, not null을 제외한 제약조건은 복사되지 않는다. (FK,PK등은 복사되지 않는다.)

EX)

-- PK제약조건 추가
alter table cust add constraint pk_cust primary key(cust_id);
alter table ord add constraint fk_ord_cust foreign key(cust_id) references cust;

-- 컬럼추가
alter table cust add (age number(2) default 0);
alter table cust add (age2 number(2) not null);

-- 컬럼 수정
desc cust;
alter table cust modify (cust_name nvarchar2(200));
alter table cust modify (address varchar2(10); -- 지금 저장할수 있을 만큼의 크기로 줄여야함
alter table cust modify (cust_name null, address null, postal_code null); -- null 허용

-- 컬럼명변경
alter table cust rename column cust_name to name; --cust이름을 name으로 바꾼다.

--컬럼삭제
alter table cust drop column age;
select * from cust;

-- 제약조건 삭제
alter table ord drop constraint fk_ord_cust;
--alter table cust drop constraint pk_cust
alter table cust drop primary key;

 

※ 시퀀스 : SEQUENCE

  • 자동증가하는 숫자를 제공하는 오라클 객체
  • 테이블 컬럼이 자동증가하는 고유번호를 가질때 사용한다.
  • 하나의 시퀀스를 여러 테이블이 공유하면 중간이 빈 값들이 들어갈 수 있다.

▶ 생성 구문

CREATE SEQUENCE sequence이름
	[INCREMENT BY n]	
	[START WITH n]                		  
	[MAXVALUE n | NOMAXVALUE]   
	[MINVALUE n | NOMINVALUE]	
	[CYCLE | NOCYCLE(기본)]		
	[CACHE n | NOCACHE]	

 

 

  • INCREMENT BY n: 증가치 설정. 생략시 1
  • START WITH n: 시작 값 설정. 생략시 0
  • 시작값 설정시
     - 증가: MINVALUE 보다 크커나 같은 값이어야 한다.
     - 감소: MAXVALUE 보다 작거나 같은 값이어야 한다.
  • MAXVALUE n: 시퀀스가 생성할 수 있는 최대값을 지정
  • NOMAXVALUE : 시퀀스가 생성할 수 있는 최대값을 오름차순의 경우 10^27 의 값. 내림차순의 경우 -1을 자동으로 설정. 
  • MINVALUE n :최소 시퀀스 값을 지정
  • NOMINVALUE :시퀀스가 생성하는 최소값을 오름차순의 경우 1, 내림차순의 경우 -(10^26)으로 설정
  • CYCLE 또는 NOCYCLE : 최대/최소값까지 갔을때 순환할 지 여부. NOCYCLE이 기본값(순환반복하지 않는다.)
  • CACHE|NOCACHE : 캐쉬 사용여부 지정.(오라클 서버가 시퀀스가 제공할 값을 미리 조회해 메모리에 저장) NOCACHE가 기본값(CACHE를 사용하지 않는다. )

 시퀀스 자동증가값 조회

  • sequence이름.nextval  : 다음 증감치 조회
  • sequence이름.currval  : 현재 시퀀스값 조회


 시퀀스 수정

ALTER SEQUENCE 수정할 시퀀스이름
	[INCREMENT BY n]	               		  
	[MAXVALUE n | NOMAXVALUE]   
	[MINVALUE n | NOMINVALUE]	
	[CYCLE | NOCYCLE(기본)]		
	[CACHE n | NOCACHE]	

 

- 수정후 생성되는 값들이 영향을 받는다. (그래서 start with 절은 수정대상이 아니다.)   


시퀀스 제거

DROP SEQUENCE sequence이름 


EX) 1부터 1씩 자동증가하는 시퀀스
create sequence dept_id_seq; -- dept_id : 이 시퀀스를 사용할 컬럼. _seq

 

EX.1)

-- 100 부터 -100까지 -100씩 자동 감소하는 시퀀스
-- 감소 : maxvalue 기본 : -1 start with 가 maxvalue보다 크면 안됨
-- 증가 : start with 가 minvalue 보다 작으면 안됨
create sequence ex6_seq
increment by -100
start with 100
maxvalue 100
minvalue -100;

 

EX.2)

select ex8_seq.nextval from dual;
-- 순환하는 시퀸스의 경우 제공하는 값의 개수가 cache개수보다 적어야 한다.
-- cathe의 기본값 : 6
create sequence ex9_seq
increment by 10
maxvalue 50
cycle
cache 3;
select ex9_seq.nextval from dual;
728x90
반응형

'SQL & DB > Oracle' 카테고리의 다른 글

[SQL] 서브쿼리(Sub Query), 집합연산자(결합쿼리)  (0) 2020.06.10
[SQL] 조인(Join)  (0) 2020.06.09
[SQL] 함수/집계함수(Having, Groupby)  (0) 2020.06.09
[SQL] Basic  (0) 2020.05.27