-- 01. 무결성 제약 조건의 개념과 종류
-- 03. 필수 입력을 위한 NOT NULL 제약 조건
/*
따라서 사원의 정보를 입력할 때
반드시 입력해야하는 선택이 아닌
필수 입력을 요구하는 컬럼이 있다면
위와 같이 NULL 값이 저장되지 못하도록
제약 조건을 설정해야 합니다.
NOT NULL 제한 조건은
해당 컬럼에 데이터를 추가하거나 수정할 때
NULL 값이 저장되지 않게 제약을 걸어주는 것으로서
사원번호와 사원명과 같이
자료가 꼭 입력되게 하고 싶을 때 사용합니다.
CREATE TABLE EMP02 (
EMPNO NUMBER(4) NOT NULL,
ENAME VARCHAR2(10) NOT NULL,
JOB VARCHAR2(9),
DEPTNO NUMBER(2)
);
*/
DROP TABLE EMP02;
DESC EMP02;
SELECT * FROM EMP02;
CREATE TABLE EMP02 (
EMPNO NUMBER(4) NOT NULL , -- 제약조건 설정 ( NOT NULL )
ENAME VARCHAR2(10) NOT NULL , -- 제약조건 설정 ( NOT NULL )
JOB VARCHAR2(9) ,
DEPTNO NUMBER(2)
);
-- 아래 코드는 오류( 위에서 NOT NULL 이라 했는데 NULL을 삽입해서 )
INSERT INTO EMP02 VALUES ( NULL, NULL, 'SALESMAN', 10 );
-- 04. 유일한 값만 허용하는 UNIQUE 제약 조건
/*
UNIQUE 제약 조건이란 특정 칼럼에 대해 자료가 중복되지 않게 하는 것입니다.
즉, 지정된 칼럼에는 유일한 값이 수록되게 하는 것입니다.
새로운 사원이 입사하여 이 사원의 정보를 입력했는데,
이미 존재하는 사원의 번호와 동일한 사원번호로 입력하였더니
성공적으로 추가된다면 어떻게 될까요?
*/
DROP TABLE EMP02;
DESC EMP02;
SELECT * FROM EMP02;0
CREATE TABLE EMP02 (
EMPNO NUMBER(4) UNIQUE, -- 제약조건 설정 ( UNIQUE : 고유의 )
ENAME VARCHAR2(10) NOT NULL ,
JOB VARCHAR2(9) ,
DEPTNO NUMBER(2)
);
INSERT INTO EMP02 VALUES ( NULL, 'AAA', 'SALESMAN', 10 );
INSERT INTO EMP02 VALUES ( 7499, 'ALLEN', 'SALESMAN', 30 );
INSERT INTO EMP02 VALUES ( 7499, 'ALLEN', 'SALESMAN', 30 );
INSERT INTO EMP02 VALUES ( 1111, 'AAAA', 'AAAAAAAA', 10 );
INSERT INTO EMP02 VALUES ( 1112, 'AAAA', 'AAAAAAAA', 10 );
INSERT INTO EMP02 VALUES ( 1113, 'AAAA', 'AAAAAAAA', 10 );
-- 06. 데이터 구분을 위한 PRIMARY((순서, 단계상으로) 최초의) KEY 제약 조건
/*
테이블 내의 해당 행을 다른 행과 구분할 수 있도록 하는
칼럼은 반드시 존재해야 합니다.
식별 기능을 갖는 칼럼은 유일하면서도
NULL 값을 허용하지 말아야 합니다.
즉, UNIQUE 제약 조건과 NOT NULL 제약 조건을 모두 갖고 있어야 하는데
이러한 두 가지 제약 조건을 모두 갖는 것이
기본 키(PRIMARY KEY) 또는, 주키 제약 조건입니다.
*/
DROP TABLE EMP05;
DESC EMP05;
SELECT * FROM EMP05;
-- PRIMARY KEY (식별무결성) : 다른 행과 구분할 수 있도록 하는 칼럼
CREATE TABLE EMP05
(
EMPNO NUMBER(4) PRIMARY KEY ,
ENAME VARCHAR2(10) NOT NULL,
JOB VARCHAR2(9),
DEPTNO NUMBER(2)
);
INSERT INTO EMP05 VALUES ( 7499, 'ALLEN', 'SALESMAN', 30 );
-- unique constraint
INSERT INTO EMP05 VALUES ( 7499, 'JONES', 'MANAGER', 20 );
-- cannot insert NULL into
INSERT INTO EMP05 VALUES ( NULL, 'JONES', 'MANAGER', 20 );
/*
bdesc - 기본설명
mem - ddl 자동편집 회원테이블
*/
-- 문제풀이
DESC BOOK;
DROP TABLE BOOK;
SELECT * FROM BOOK;
-- 회원 도서 주문관리 SYSTEM
-- 도서테이블
CREATE TABLE BOOK
(
BNO NUMBER(3) PRIMARY KEY,
BNAME VARCHAR2(20) NOT NULL,
BDESC VARCHAR2(4000),
BPRICE NUMBER
);
-- 컬럼주석( 테이블 내부(컬럼)에 주석이 달림
COMMENT ON COLUMN BOOK.BNO IS '도서번호';
COMMENT ON COLUMN BOOK.BNAME IS '도서이름';
COMMENT ON COLUMN BOOK.BDESC IS '도서설명';
COMMENT ON COLUMN BOOK.BPRICE IS '도서가격';
COMMIT;
INSERT INTO BOOK VALUES ( 101, '오라클1', '기본', 1000 );
INSERT INTO BOOK VALUES ( 102, '오라클2', '기본', 2000 );
INSERT INTO BOOK VALUES ( 201, '자바1', '기본', 2000 );
COMMIT;
SAVEPOINT BOOKVALUEINSERT; --책추가
-- 회원테이블
CREATE TABLE MEM
(
MEMID VARCHAR2(20) PRIMARY KEY,
BNAME VARCHAR2(20),
BEMADDR VARCHAR2(20)
);
COMMENT ON COLUMN MEM.MEMID IS '회원ID';
COMMENT ON COLUMN MEM.BNAME IS '회원이름';
COMMENT ON COLUMN MEM.BEMADDR IS '회원주소';
SAVEPOINT MEMTABLECREATE; --회원 테이블 생성
COMMIT;
INSERT INTO MEM ( MEMID, BNAME, BEMADDR ) VALUES ( 'hong', '홍자바', '서울' );
SAVEPOINT MEMINSERT; --회원 추가
COMMIT;
DESC MEM;
SELECT * FROM MEM;
-- 주문테이블
CREATE TABLE BORDER
(
BON NUMBER PRIMARY KEY, -- 주문번호(1,2,...일련번호)
BNO NUMBER, -- 주문도서번호
MEMID VARCHAR2(20), -- 주문자 ID
OQTY NUMBER -- 주문도서수량
);
COMMENT ON COLUMN BORDER.BON IS '주문번호';
COMMENT ON COLUMN BORDER.BNO IS '주문도서번호';
COMMENT ON COLUMN BORDER.MEMID IS '주문자ID';
COMMENT ON COLUMN BORDER.OQTY IS '주문도서수량';
SAVEPOINT BORDERTABLECREATE; --주문 테이블 생성
COMMIT;
DESC BORDER;
SELECT * FROM BORDER;
/*
홍자바가 도서번호 101인 도서 2권 주문(INSERT)
주문한 회원명 및 도서명을 주문수량과 함계 출력(조인)
주문한 총도서수량을 도서명(혹은 도서번호)별로 그룹지어 출력(조인)
주문한 총도서수량을 도서명(혹은 도서번호)/회원별로 그룹지어 출력(조인)
*/
--문제1 : 홍자바가 도서번호 101인 도서 2권 주문(INSERT)
INSERT INTO BORDER VALUES (1, 101, 'hong', 2);
INSERT INTO BORDER VALUES (2, 101, 'hong', 3);
INSERT INTO BORDER VALUES (3, 201, 'hong', 4);
INSERT INTO BORDER VALUES (4, 301, 'hong', 10);
INSERT INTO BORDER VALUES (5, 401, 'hong', 10);
SELECT nvl(MAX(ono), 0) + 1 FROM border;
SELECT * FROM BORDER;
/* 특정행 삭제
DELETE FROM BORDER
WHERE BON=2;
*/
--문제2 : 주문한 회원명 및 도서명을 주문수량과 함께 출력(조인)
--주문테이블(공통컬럼 모두 존재)
SELECT M.BNAME, B.BNAME, O.OQTY
FROM BOOK B, MEM M, BORDER O
WHERE O.MEMID=M.MEMID
AND O.BNO=B.BNO;
SELECT M.BNAME, B.BNAME, O.OQTY
FROM BOOK B, MEM M, BORDER O
WHERE O.MEMID=M.MEMID;
select * from book, mem m, border;
--문제3 : 주문한 총도서수량을 도서명(혹은 도서번호)별로 그룹지어 출력(조인)
--그륩바이에 도서명이 있기 때문에 select 절에 b.bname이 올수 있음
SELECT B.BNAME, sum(O.OQTY)
FROM BOOK B, BORDER O
WHERE O.BNO=B.BNO
GROUP BY ROLLUP(B.BNAME);
commit;
SELECT * FROM BOOK; -- 도서 테이블
SELECT * FROM MEM; -- 회원 테이블
SELECT * FROM BORDER; -- 주문 테이블
--주문한 총도서수량을 도서명(혹은 도서번호)/회원별로 그룹지어 출력(조인)
--회원명으로 하위그룹으로 소분류
--SELECT 컬럼순서와 GROUP BY 컬럼순서를 일치
SELECT B.BNAME, M.BNAME, sum(O.OQTY) 총도서수량
FROM MEM M, BOOK B, BORDER O
WHERE O.BNO=B.BNO
GROUP BY B.BNAME, M.BNAME
ORDER BY B.BNAME, M.BNAME;
SELECT B.BNAME, M.BNAME, sum(O.OQTY) 총도서수량
FROM MEM M, BOOK B, BORDER O
GROUP BY B.BNAME, M.BNAME
ORDER BY B.BNAME, M.BNAME;
commit;
SELECT * FROM BOOK; -- 도서 테이블
SELECT * FROM MEM; -- 회원 테이블
SELECT * FROM BORDER; -- 주문 테이블
'IT > 오라클' 카테고리의 다른 글
쿼리문들 (0) | 2018.04.07 |
---|---|
COMMIT과 ROLLBACK (0) | 2018.04.07 |
오라클 수업 7일째 (18.04.06) - 3 데이터 읽기 일관성과 락 (0) | 2018.04.06 |
데이터 형 (0) | 2018.04.06 |
오라클 수업 7일째 (18.04.06) - 2 (0) | 2018.04.06 |