
- 구조(table, column, 자료형 등) 변경 : DDL
- 구조 내의 데이터, 내용 변경 등 : DML
update dept set dname='SEATTLE' where deptno=30;
alter table emp add TotalSal number(20);
update emp set TotalSal=sal+nvl(comm,0);
- 1, 3번은 데이터의 내용을 변경하는 것이므로 DML 사용
- 2번은 전체 구조(컬럼 추가, 컬럼의 자료형) 변경이므로 DDL 사용
DDL
CREATE
Table 생성
- primary key는 기본키를 의미하며, not null과 unique를 합친 의미
create table test(num number(5) primary key,
name varchar2(20),
score number(6,2),
birth date);
desc test;
Sequence 생성
create sequence seq1;
select * from seq;
select seq1.nextval from dual;
select seq1.currval from dual;
- 시퀀스 생성(seq1)
- SELECT (시퀀스명).NEXTVAL FROM DUAL; 을 통해 다음 시퀀스 값 생성
create sequence seq1 start with 5 increment by 2 maxvalue 30 nocache cycle;
create sequence seq2 nocache;
create sequence seq3 start with 1 increment by 2 nocache;
- 사이클(cycle)은 마지막 시퀀스 값에 도달한 후 처음 값부터 다시 시작
- 캐시(cache)는 생성할 시퀀스 값을 미리 메모리에 생성해놓음
select seq2.nextval from dual;
- start with한 값부터 increment by한 값만큼 시퀀스 증가(한 번 실행에 한 번씩)
- 콘솔(dual)로부터 실행
select seq1.nextval,seq2.nextval,seq3.nextval from dual;
Alter
Column 추가
alter table test add age number(5);
- ALTER TABLE (테이블명) ADD (추가할 컬럼명) (데이터 타입);
alter table test add addr varchar2(30) default '강남구';
- 추가한 컬럼의 기본 데이터는 null이지만 default 지정 시 일괄 생성 가능
Column Data Type 변경
alter table test modify addr varchar2(50);
alter table test modify age varchar2(10) default '20';
insert into test (num,name) values (10,'강호동');
- ALTER TABLE (테이블명) MODIFY (컬럼명) (데이터 타입);
- default를 지정해도 변경(alter) 전의 값은 그대로, 변경 후 추가되는 데이터만 default 값으로
Column명 변경
alter table test rename column score to jumsu;
alter table test rename column birth to birthday;
- ALTER TABLE (테이블명) RENAME COLUMN (OLD컬럼명) TO (NEW컬럼명);
Column 삭제(Drop)
alter table test drop column age;
alter table test drop column addr;
- ALTER TABLE (테이블명) DROP COLUMN (삭제할 컬럼명);
DROP
Table 삭제
drop table test;
Sequence 삭제
drop sequence seq1;
drop sequence seq1;
drop sequence seq2;
drop sequence seq3;
DML
INSERT
create table test(num number(5) primary key,name varchar2(20),score number(6,2),birth date);
insert into test values(1,'손석구',67.2,'1993-12-03');
insert into test (num,name) values (2,'강호동');
- INSERT INTO (테이블명) VALUES(컬럼에 맞는 데이터 값);
- 일부 컬럼명을 명시하여 일부 데이터만 입력 가능
INSERT Error
insert into test values(2,'이영애',68.72,'1998-12-12');
insert into test values(5,'이효리',72.32,sysdate);
- num 컬럼은 primary key로써 중복이 금지되었기 때문에 이미 주어진 num 값인 2를 재입력했으므로 ‘무결성 제약 조건’을 위배하여 에러 발생
UPDATE
update personinfo set job='teacher',age=12;
rollback;
update personinfo set job='teacher',age=12 where num=2;
update personinfo set gender='f' where name like '임%' and job='programmer';
commit;
- UPDATE (테이블명) SET (컬럼1)='(변경할 데이터)' WHERE (컬럼2)='(데이터 값)';
- 조건이 없으면 모든 데이터가 수정 (조건 필수)
DELETE
delete from personinfo where num=5;
그룹 함수
GROUP BY
select deptno 학과,avg(pay) "평균 급여"
from professor
group by deptno;
- select절에 사용된 그룹 함수 이외의 컬럼이나 표현식은 반드시 group by에 사용 필수
select deptno,position,avg(pay) 평균급여
from professor
group by deptno,position;
- group by 조건에 2개 이상의 조건 입력 가능
HAVING절
- group by의 조건에 대한 조건 (따라서 반드시 group by 조건 뒤에)
- where절은 그룹 함수의 비교 조건으로 사용 불가
select deptno,avg(sal)
from emp
group by deptno
having avg(sal)>=2000;
select to_char(hiredate,'yyyy'),count(ename),round(avg(sal),0)
from emp
group by to_char(hiredate,'yyyy')
order by to_char(hiredate,'yyyy');
RollUp 함수
- 자동으로 소계, 합계 구해주는 함수
- group by절에 주어진 조건으로 소계 값을 도출
select deptno 학과번호,position 직위,sum(pay) 총급여
from professor
group by position,rollup(deptno);

select deptno 학과번호,position 직위,sum(pay) 총급여
from professor
group by deptno,rollup(position);

select position,count(*),sum(pay)
from professor
group by rollup(position);
- group by (a) rollup((a));의 경우 group by rollup((a));로 대체 가능

select deptno,count(*),sum(pay)
from professor
group by rollup(deptno);

Cube 함수
- rollup처럼 각 소계에 전체 총계까지 구해준다
select deptno,position,count(*),sum(pay)
from professor
group by cube(deptno,position);

제약 조건

create table sawon(num number(5) CONSTRAINT sawon_pk_num primary key,
name varchar2(20),
gender varchar2(10),
buseo varchar2(20) CONSTRAINT sawon_ck_buseo check(buseo in('홍보부','인사부','교육부')),
pay number(10) default 2000000);
create sequence seq_sawon nocache;
- 모든 제약 조건 앞에 ‘CONSTRAINT (제약 조건 이름) (제약 조건)’ 표기 가능 (생략 가능)
- 제약 조건 이름은 주로 ‘(테이블명)(제약 조건)(컬럼명)’으로 표기
insert into sawon values(seq_sawon.nextval,'이영미','f','게임개발부',3500000);
- buseo 컬럼에 check 조건이 위배
- ‘홍보부’, ‘인사부’, ‘교육부’ 중에 포함되지 않으므로