• 구조(table, column, 자료형 등) 변경 : DDL
  • 구조 내의 데이터, 내용 변경 등 : DML
--dept에서 30번 부서를 시애틀로 변경
update dept set dname='SEATTLE' where deptno=30;

--emp테이블 TotalSal열을 하나 더 추가(number(20)으로 줄것)
alter table emp add TotalSal number(20);

--emp테이블 TotSal에 sal과 comm을 더한가격을 출력
update emp set TotalSal=sal+nvl(comm,0);
  • 1, 3번은 데이터의 내용을 변경하는 것이므로 DML 사용
  • 2번은 전체 구조(컬럼 추가, 컬럼의 자료형) 변경이므로 DDL 사용

DDL

CREATE

Table 생성

  • primary key는 기본키를 의미하며, not null과 unique를 합친 의미
--test테이블
create table test(num number(5) primary key, --숫자(자릿수)
									name varchar2(20),         --가변적 문자열(문자 수)
									score number(6,2),         --숫자(전체 자릿수,소수 자릿수)
									birth date);               --날짜 형식

desc test;--구조 보기
  • 테이블 생성(test)

Sequence 생성

--시퀀스 기본으로 생성, 1부터 1씩 증가하는 시퀀스 생성됨
create sequence seq1;

--전체시퀀스 확인
select * from seq;   --시퀀스명인 seq1과 다름, 전체 시퀀스를 의미하는 seq

--다음 시퀀스값을 발생 콘솔에 출력
select seq1.nextval from dual;

--현재 발생한 마지막 시퀀스값
select seq1.currval from dual;
  • 시퀀스 생성(seq1)
  • SELECT (시퀀스명).NEXTVAL FROM DUAL; 을 통해 다음 시퀀스 값 생성
--seq1 시작값:5 증가값:2 끝값:30 캐시:no cycle:yes
create sequence seq1 start with 5 increment by 2 maxvalue 30 nocache cycle;

--seq2 시작값 1 증가값 1 cache no
create sequence seq2 nocache;

--seq3 시작값 1 증가값 2 cache no
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);  --무조건 null로 데이터 추가
  • ALTER TABLE (테이블명) ADD (추가할 컬럼명) (데이터 타입);
--주소를 저장할 컬럼을 추가하는데 초기값을 강남구 라고 지정
alter table test add addr varchar2(30) default '강남구';
  • 추가한 컬럼의 기본 데이터는 null이지만 default 지정 시 일괄 생성 가능

Column Data Type 변경

--주소 저장컬럼 30=>50
alter table test modify addr varchar2(50);

--age 타입을 문자열(10)으로 변경하고 초기값을 20으로 설정
--기존 null은 그대로 있고 새로 insert하는것 부터 초기값 들어감
alter table test modify age varchar2(10) default '20';

insert into test (num,name) values (10,'강호동');  --10번 행의 age컬럼만 20, 나머지 null
  • ALTER TABLE (테이블명) MODIFY (컬럼명) (데이터 타입);
  • default를 지정해도 변경(alter) 전의 값은 그대로, 변경 후 추가되는 데이터만 default 값으로

Column명 변경

--score==>jumsu
alter table test rename column score to jumsu;

--birth==>birthday
alter table test rename column birth to birthday;
  • ALTER TABLE (테이블명) RENAME COLUMN (OLD컬럼명) TO (NEW컬럼명);

Column 삭제(Drop)

--age라는 컬럼을 삭제
alter table test drop column age;

--addr 삭제
alter table test drop column addr;
  • ALTER TABLE (테이블명) DROP COLUMN (삭제할 컬럼명);

DROP

Table 삭제

--테이블 삭제 test
drop table test;
  • 테이블 삭제(test)

Sequence 삭제

--seq1삭제
drop sequence seq1;
  • 시퀀스 삭제(seq1)
--전체삭제
drop sequence seq1;
drop sequence seq2;
drop sequence seq3;

DML

INSERT

  • 마치고 반드시 commit;
--test테이블
create table test(num number(5) primary key,name varchar2(20),score number(6,2),birth date);

--test에 전체데이터 insert
insert into test values(1,'손석구',67.2,'1993-12-03');

--test에 일부데이터 insert
insert into test (num,name) values (2,'강호동');
  • INSERT INTO (테이블명) VALUES(컬럼에 맞는 데이터 값);
  • 일부 컬럼명을 명시하여 일부 데이터만 입력 가능

INSERT Error

--무결성 제약 조건(RHEEMINGYU.SYS_C008353)에 위배
insert into test values(2,'이영애',68.72,'1998-12-12');

--sysdate현재날짜 의미
insert into test values(5,'이효리',72.32,sysdate);
  • num 컬럼은 primary key로써 중복이 금지되었기 때문에 이미 주어진 num 값인 2를 재입력했으므로 ‘무결성 제약 조건’을 위배하여 에러 발생

UPDATE

  • 내용 수정
  • 마치고 반드시 commit;
--모든 행 직업,나이 수정하기
update personinfo set job='teacher',age=12;

--잘못수정한데이터 원래대로 돌리기
rollback;

--2번 행만 직업,나이 수정하기
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

--5번만 삭제
delete from personinfo where num=5;
  • DELETE FROM (테이블명);

그룹 함수

GROUP BY

--professor에서 학과별로 교수들의 평균급여를 출력
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절은 그룹 함수의 비교 조건으로 사용 불가
--평균급여가 2000이상인 부서의 부서번호와 평균급여
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 (제약 조건 이름) (제약 조건)’ 표기 가능 (생략 가능)
  • 제약 조건 이름은 주로 ‘(테이블명)(제약 조건)(컬럼명)’으로 표기
--체크 제약조건(RHEEMINGYU.SAWON_CK_BUSEO)이 위배
insert into sawon values(seq_sawon.nextval,'이영미','f','게임개발부',3500000);
  • buseo 컬럼에 check 조건이 위배
  • ‘홍보부’, ‘인사부’, ‘교육부’ 중에 포함되지 않으므로
profile
초보개발자

0개의 댓글