update 테이블명 set 컬럼명 = 바꿀값 where 컬럼명 = 바꿀값;
예시) 관리자보다 입사일이 더 빠른 직원들의 이름, 관리자이름, 입사일, 관리자의 입사일, 부서번호, 부서명을 출력
select e.ename, m.ename, e.hiredate, m.hiredate, e.dno, dname
from emp e, emp m, dept d
where e.mgr = m.eno and e.dno = d.dno and
e.hiredate < m.hiredate;
-> 동일한 테이블에서 참조되는 경우에는 self 조인을 해야하고, 어떠한 경우에는 반드시 서브쿼리를 써야만 문제 해결을 할 수 있고, 어떤 경우에는 서브쿼리를 써도되고, 조인을 해도 되는 경우가 있다. 쿼리에는 반드시 어떤 것을 써라. 라는 것은 없고 선택사항이다. 다만, 데이터 양이 많을 때에는 검색 속도 측면에서 서브쿼리가 조인보다 성능이 더 좋다.
테이블을 구성하고, 속성과 속성에 관한 제약을 정의하며, 기본키 및 외래키를 정의하는 명령(테이블을 생성하는 명령어)
형식
create table 테이블이름 (
컬럼이름 자료형 [제약],
...
)
테이블의 구조를 변경
이미 있는 테이블에 새로운 컬럼을 추가하거나 삭제, 제약을 추가하거나 삭제, 자료형을 변경
형식
alter table 테이블명 add 컬럼명 자료형;
예시) member 테이블의 현재 구조
SQL> desc member;
이름 널? 유형
-------------------------- -------- ----------------------------
ID NOT NULL VARCHAR2(20)
PWD VARCHAR2(20)
NAME VARCHAR2(20)
===> member 테이블에 주소를 위한 컬럼을 추가
alter table member add address varchar2(50);
===> 이미 레코드가 있는 테이블에 새로운 컬럼을 추가하게 되면 그 컬럼의 값은 모두 null
<결과>
SQL> desc member;
이름 널? 유형
-------------------------- -------- ----------------------------
ID NOT NULL VARCHAR2(20)
PWD VARCHAR2(20)
NAME VARCHAR2(20)
ADDRESS VARCHAR2(50)
===> 주소 컬럼이 추가된 것을 볼 수 있다.
alter table 테이블명 add 컬럼명 자료형;
예시) 이미 있는 테이블에 pk 설정
alter table 테이블명 add primary key (컬럼명);
alter table member add primary key(id);
예시) 이미 있는 테이블에 fk 설정
alter table 테이블명 add foreign key (컬럼명) references 부모테이블(부모테이블컬럼이름);
alter table board add foreign key(id) references member(id);
alter table 테이블명 drop column 컬럼명;
alter table 테이블명 modify 컬럼명 새로운자료형;
예시) 설정했던 컬럼의 자료형 중에 지정해준 컬럼 값이 너무 작을 때
insert into member values('lee', '1234', '이순신', '서울시 마포구 서교동 풍성빌딩');
*
1행에 오류:
ORA-12899: "C##SIST"."MEMBER"."ADDR" 열에 대한 값이 너무 큼(실제: 42, 최대값:20)
===> 테이블의 구조를 변경해야함. 주소는 최대 20인데 입력한 값은 42이기 때문에 오류
테이블을 삭제하는 명령어
형식
drop table 테이블명;
예시) newbook 테이블 생성
create table newbook (
bookid number not null,
bookname varchar2(20) not null,
publisher varchar2(20) null,
price number null
);
insert into newbook (4, null, null, null);
===> 오류가 발생, bookname에 not null 제약을 설정하였는데 null값을 주었기 때문에 오류가 발생한다.
예시) newbook 테이블 생성
create table newbook (
bookid number unique,
bookname varchar2(20) not null,
publisher varchar2(20),
price number
);
insert into newbook values(1, '재미있는 자바', null, null);
insert into newbook values(1, '즐거운오라클', null, null);
-> 1행에 오류:
ORA-00001: 무결성 제약 조건(C##SIST.SYS_C008327)에 위배됩니다
insert into newbook values(null, '재미있는자바', null, null);
===> bookid는 unique로 설정되었는데 중복된 값을 넣어서 오류가 발생.
===> unique는 유일한지만 판별, null값을 허용한다.
<컬럼레벨의 pk설정>
예시) newbook 테이블 생성
create table newbook (
bookid number primary key,
bookname varchar2(20),
publisher varchar2(20),
price number
);
insert into newbook values(1, '즐거운자바', null, null);
insert into newbook values(1, '즐거운오라클', null, null);
1행에 오류:
ORA-00001: 무결성 제약 조건(C##SIST.SYS_C008330)에 위배됩니다
===> pk로 설정된 bookid에 이미 1번도서가 있는데 중복되었기 때문에 오류가 발생
insert into newbook values(null, '즐거운오라클', null, null);
1행에 오류:
ORA-01400: NULL을 ("C##SIST"."NEWBOOK"."BOOKID") 안에 삽입할 수 없습니다
==> pk로 설정된 bookid에 null을 추가할 수 없어 오류가 발생한다.
<테이블 레벨의 pk설정>
create table newbook (
bookid number,
bookname varchar2(20),
publisher varchar2(20),
price number,
primary key(bookid)
);
insert into newbook values(1, '즐거운자바', null, null);
insert into newbook values(1, '즐거운오라클', null, null);
1행에 오류:
ORA-00001: 무결성 제약 조건(C##SIST.SYS_C008331)에 위배됩니다
===> 마찬가지로 중복이 허용되지 않는 bookid에 중복 값이 들어갔기 때문에 오류
예시) newbook 테이블 생성, publisher에 '쌍용미디어'라는 기본 값을 제약
create table newbook (
bookid number primary key,
bookname varchar2(20) not null,
publisher varchar2(20) default '쌍용미디어',
price number
);
insert into newbook values(1, '재미있는자바', default, null); //기본값을 설정
insert into newbook values(2, '즐거운오라클', '한빛미디어', null); //값을 설정해주면 기본값을 무시함
insert into newbook (bookid, bookname) values(3, '신나는자바'); //기본값으로 나옴
<결과>
BOOKID BOOKNAME PUBLISHER PRICE
------ --------------- ------------------------ --------
1 재미있는자바 쌍용미디어
2 즐거운오라클 한빛미디어
3 신나는자바 쌍용미디어
예시) newbook 테이블 생성, price의 값이 1000원 이상을 만족해야 하는 제약
create table newbook (
bookid number primary key,
bookname varchar2(20) not null,
publisher varchar2(20) default '쌍용미디어',
price number default 10000 check(price >= 1000)
);
===> price 값이 기본 값은 10000원이고, 값이 무조건 1000원 이상이여야 한다. 라는 제약!
insert into newbook values(3, '신나는자바', '한빛미디어', 500);
1행에 오류:
ORA-02290: 체크 제약조건(C##SIST.SYS_C008335)이 위배되었습니다
===> 1000원 이상이 아닌 500원이기 때문에 오류
==> 참조 키를 설정할 때에는 반드시 부모테이블의 pk로 설정된 '주식별자'만이 참조키로 설정할 수 있다 !!
예시) 기본키가 없고 부모테이블인 member 테이블과 그것을 참조해야 하는 board 테이블
create table member(
id varchar2(20),
pwd varchar2(20),
name varchar2(20)
);
create table board (
no number primary key,
title varchar2(50),
id varchar2(20) references member(id),
content varchar2(3000)
);
==> 위와 같은 방법으로 참조할 수 있다. 하지만 오류발생!!
4행에 오류:
ORA-02270: 이 열목록에 대해 일치하는 고유 또는 기본 키가 없습니다.
==> 참조키로 설정하려는 컬럼은 반드시 부모테이블의 pk로 설정된 주식별자이어야 한다.
예시) 위와 같은 상황들을 제거하려면, 부모테이블인 member에 pk를 설정해야 한다.
create table member(
id varchar2(20) primary key,
pwd varchar2(20),
name varchar2(20)
);
create table board (
no number primary key,
title varchar2(50),
id varchar2(20) references member(id),
content varchar2(3000)
);
==> 위와 같이 테이블을 생성하게 되면 member 테이블과 board 테이블은 주종관계(부모, 자식관계)가 성립된다. member = 부모 , board = 자식
<데이터추가>
insert into member values('tiger', '1234', '김범');
insert into member values('lion', '1234', '홍사자');
insert into board values(1, '안녕', 'tiger', '안녕');
insert into board values(2, '금요일', 'lion', '즐거운 금요일입니다.');
insert into board values(3, '점심', 'kim', '점심 뭐먹을까요?');
ORA-02291: 무결성 제약조건(C##SIST.SYS_C008343)이 위배되었습니다- 부모 키가 없습니다
==> 부모테이블에 'kim'이라는 데이터가 없기 때문에 오류가 난다.
==> 추가하려는 레코드에 'kim'이라는 아이디가 부모테이블인 member에 존재하지 않는 아이디라서 오류가 발생
create table member(
id varchar2(20) primary key,
pwd varchar2(20),
name varchar2(20)
);
create table board (
no number primary key,
title varchar2(50),
id varchar2(20) references member(id),
content varchar2(3000)
);
create table member(
id varchar2(20),
pwd varchar2(20),
name varchar2(20),
primary key(id)
);
create table board (
no number,
title varchar2(50),
id varchar2(20),
content varchar2(3000),
primary key(no),
foreign key(id) references member(id)
);
예시) 자식테이블에 참조하고 있는 레코드가 있어 삭제할 수 없는 경우
delete member where id = 'lion';
1행에 오류:
ORA-02292: 무결성 제약조건(C##SIST.SYS_C008346)이 위배되었습니다- 자식 레코드가 발견되었습니다
==> 자식 테이블인 board에 삭제하려고 하는 아이디 lion을 참조하고 있는 레코드가 있어서 삭제를 할 수 없다.
==> 자식레코드를 먼저 삭제한 후, 부모 레코드를 삭제할 수 있다.
<해결>
create table member (
id varchar2(20),
pwd varchar2(20),
name varchar2(20),
primary key(id)
);
create table board (
no number,
title varchar2(50),
id varchar2(20),
content varchar2(3000),
primary key(no),
foreign key(id) references member(id) on delete cascade
);
==> 부모테이블에 레코드 삭제될 때에 참조되고 있는 자식레코드도 삭제.
//orderno와 bookid가 (pk)
create table orderDetail(
orderno number,
bookid number,
qty number,
primary key(orderno, bookid)
);