ddit/Oracle

Insert마스터하기

ssong2ku 2022. 6. 9. 18:33
728x90
CREATE TABLE REMAIN
(
  REMAIN_YEAR CHAR(4) NOT NULL,     -- 해당 년도
  REMAIN_PROD VARCHAR2(10) NOT NULL, -- 상품 코드
  REMAIN_J_00 NUMBER(5),             -- 전년 재고
  REMAIN_I    NUMBER(5),             -- 입고
  REMAIN_O    NUMBER(5),             -- 출고
  REMAIN_J_99 NUMBER(5),             -- 현재고
  REMAIN_DATE DATE,                  -- 처리일자
  CONSTRAINT PK_REMAIN PRIMARY KEY(REMAIN_YEAR, REMAIN_PROD),
  CONSTRAINT FR_REMAIN_PROD FOREIGN KEY(REMAIN_PROD) REFERENCES PROD(PROD_ID)
);

--컬럼과 데이터갯수가 같을 때
--컬럼의 목록을 생략할 수 있음

INSERT INTO REMAIN
VALUES('2003', 'P101000001',20,10,12,18,'2004-01-01');

INSERT INTO REMAIN (REMAIN_YEAR,REMAIN_PROD,REMAIN_J_00,
                    REMAIN_I, REMAIN_O,REMAIN_J_99,
                    REMAIN_DATE)
VALUES('2003', 'P101000002',11,7,6,12,'2004-01-02');
SELECT * FROM REMAIN;

--NULL을 입력하는 방법
--1)컬럼목록 및 데이터 목록에서 뺌 // N.N여부 확인
INSERT INTO REMAIN (REMAIN_YEAR, REMAIN_PROD, REMAIN_I)
            VALUES('2003','P102000007',10);

SELECT * FROM REMAIN;

INSERT INTO REMAIN (REMAIN_YEAR, REMAIN_PROD, REMAIN_j_00,
            REMAIN_I,REMAIN_J_99,REMAIN_DATE)
VALUES('2003','P102000001',31,21,41,'2003-12-31');
SELECT * FROM REMAIN;

--2) 컬럼목록에 포함 및 데이터목록에 NULL을 입력
INSERT INTO REMAIN (REMAIN_YEAR, REMAIN_PROD, REMAIN_j_00,
            REMAIN_I,REMAIN_O,REMAIN_J_99,REMAIN_DATE)
VALUES('2003','P102000002',31,21,NULL,41,'2003-12-31');
SELECT * FROM REMAIN;

--3) 컬럼목록에 포함 및 데이터목록에 ''(화이트스페이스)을 입력
--'' : ORACLE에서 NULL로 처리, SQLSERVER/MYSQL은 공백문자 데이터로 처리
INSERT INTO REMAIN (REMAIN_YEAR, REMAIN_PROD, REMAIN_j_00,
            REMAIN_I,REMAIN_O,REMAIN_J_99,REMAIN_DATE)
VALUES('2003','P102000003',31,21,'',41,SYSDATE);
SELECT * FROM REMAIN;

--insert 문제1)
--remain테이블에 다음 데이터를 입력하기
--해당년도 : 2003
--상품코드 : P302000023
--전년재고 : 35
--출고    : 20
--현재고  : 15
--처리일자 : sysdate
/
INSERT INTO REMAIN(REMAIN_YEAR, REMAIN_PROD, REMAIN_J_00,
            REMAIN_O,REMAIN_J_99,REMAIN_DATE)
VALUES('2003','P302000023',35,20,15,SYSDATE);

/
--insert 문제2)
--remain테이블에 다음 데이터를 입력하기
--오류발생 시 상품코드의 첫글자를 수정하여 디버깅
--해당년도 : 2003
--상품코드 : Z302000022->p302000022
--전년재고 : 27
--처리일자 : 2004년 1월 1일

INSERT INTO REMAIN(REMAIN_YEAR, REMAIN_PROD, 
            REMAIN_J_00,REMAIN_DATE)
VALUES('2003','P302000022',27,'2004-01-01');

--insert 문제3)
--remain테이블에 다음 데이터를 입력하기
--오류발생 시 디버깅(2003년도)->YEAR은 N.N이기 때문에 값을 넣어줘야함.
--상품코드 : P302000016
--전년재고 : 30
--입고    : 10
--출고    : 15
--현재고  :25
--처리일자 : 2004년 1월 2일

INSERT INTO REMAIN(REMAIN_YEAR, REMAIN_PROD, REMAIN_J_00,
                   REMAIN_I, REMAIN_O, REMAIN_J_99,REMAIN_DATE)
VALUES('2003','P302000016', 30,10,15,25,'2004-01-02');
            
COMMIT;

--INSERT 복습(2022-06-09)
CREATE TABLE IU
(  IU_ACTINFO VARCHAR2(10) NOT NULL,
   IU_ACTYEAR VARCHAR2(20) NOT NULL,
   IU_MEMBER VARCHAR2(60),
   IU_SITE VARCHAR2(40),
  CONSTRAINT PK_IU PRIMARY KEY(IU_ACTINFO)
);

/*
1. IU테이블에 데이터를 입력하기
IU_ACTINFO : IU
IU_ACTYEAR : 2022
IU_MEMBER  : 아이유
IU_SITE    : http://www.smtown.com
*/

INSERT INTO IU(IU_ACTINFO, IU_ACTYEAR, IU_MEMBER, IU_SITE)
VALUES('IU', '2022','아이유','http://www.smtown.com');

SELECT*FROM IU;

INSERT INTO IU(IU_ACTINFO, IU_ACTYEAR, IU_MEMBER)
VALUES('SUGA', '2022','슈가');

COMMIT;

--IU테이블을 사용하여 IU2테이블을 복제하기(테이블백업)
--제약조건은 복제안됨
CREATE TABLE IU2
AS
SELECT * FROM IU;

--IU테이블 데이터삭제
DELETE FROM IU2;

--IU테이블로 데이터를 INSERT하기
INSERT INTO IU2(IU_ACTINFO, IU_ACTYEAR,IU_MEMBER, IU_SITE)
SELECT IU_ACTINFO
     , IU_ACTYEAR
     , IU_MEMBER
     , IU_SITE
FROM IU;

--문제풀기

--TEST 계정. INSERT연습
/*
새로운 과목이 개설되었다. T_COURSE 테이블에
추가하시오. 과목코드는 'L1061'이고,
과목명이 'ERP실무', 3학점이며, 
담당교수가 'P12'이고, 추가 수강료는
50000원이다.
*/
INSERT INTO T_COURSE(COURSE_ID, TITLE, C_NUMBER, PROFESSOR_ID, COURSE_FEES)
VALUES('L1061', 'ERP실무', 3, 'P12', 50000);

COMMIT;

SELECT * FROM T_COURSE;


/*
--예제 9.03
학번이 'B0901'인 'L1061'과목의 85점에 대한 성적 취득
날짜는 2010년 06월 28일이다. 이 정보를 SG_SCORES 테이블에
입력하시오.
*/
--C1601   L1011   93      16/12/27
--SCORE_ASSIGNED 날짜형 컬럼에 날짜형문자 데이터로 입력함.
--데이터타입이 동일하지 않아도(날짜형문자->DATE) 예외사항이
--적용되어 날짜형으로 자동형변환이 되어 저장됨
INSERT INTO SG_SCORES(STUDENT_ID,COURSE_ID,SCORE,GRADE,SCORE_ASSIGNED)
VALUES('B0901', 'L1061', 85, NULL,'2010-06-28');

--USER_CONSTRAINTS : 시스템 뷰(VIEW)테이블(가상테이블)
SELECT * FROM USER_CONSTRAINTS 
WHERE CONSTRAINT_NAME = 'SG_SCORES_FK2';
COMMIT;
/*
예제 9.04
과목코드가 'L3041',과목명이 '임베디드시스템', 3학점이며,
담당교수번호가 'P31', 추가 수강료는 30000원일 때,
이 정보를 COURSE 테이블에 입력하시오.
*/
INSERT INTO COURSE(COURSE_ID,TITLE,C_NUMBER,PROFESSOR_ID,COURSE_FEES)
VALUES('L3041','임베디드시스템',3,'P31',30000);


/*
예제 9.05
과목코드가 'L3041', 과목명이 '임베디드시스템', 3학점이며,
담당교수번호가 'P31', 추가 수강료는 30000원일 때,
이 정보를 COURSE 테이블에 입력하시오.
*/
--SQL 오류: ORA-00947: not enough values
--값의 수가 충분하지 않습니다.
--COURSE 테이블의 컬럼 수가 5개이고, 입력 데이터가 4개면
--발생하는 오류.
INSERT INTO COURSE(COURSE_ID,TITLE,C_NUMBER,PROFESSOR_ID,COURSE_FEES)
VALUES('L3041','임베디드시스템',3,'P31');
--그리하여 개수를 맞춰주자..
INSERT INTO COURSE(COURSE_ID,TITLE,C_NUMBER,PROFESSOR_ID,COURSE_FEES)
VALUES('L3041','임베디드시스템',3,'P31',30000);
--ORA-00001: unique constraint (TEST.COURSE_PK) violated
--UNIQUE(중복불가, NULL허용) : 유일한 <-> PRIMARY KEY(중복불가, NULL불허)
SELECT * FROM USER_CONSTRAINTS
WHERE CONSTRAINT_NAME = 'COURSE_PK';
--L3041   임베디드시스템   3   P31   30000
/*
예제 9.06
과목코드는 'L1031'이고, 과목명이 'SQL', 3학점이며,
담당교수가 'P12'이고, 추가 수강료는 30000원이다.
이 정보를 COURSE 테이블에 입력하시오.
*/
INSERT INTO COURSE(COURSE_ID,TITLE,C_NUMBER,PROFESSOR_ID,COURSE_FEES)
VALUES('L1031','SQL',3,'P12',30000);
--ORA-00001: unique constraint (TEST.COURSE_PK) violated
--          무결성(개체 무결성:중복안됨, N.N) 제약조건에 위배됩니다.
/*
예제 9.07
컴퓨터공학과에 신임교수가 채용되었다. 교수번호는 'P14',
교수명은 '조성우', 직위는 '전임강사', 전화번호는
'765-4114'일 때, 이 정보를 PROFESSOR 테이블에 입력하시오.
*/
--P31   장혜연   부교수   컴공   
--765-4512   yaham@cyber.ac.kr   학과장   P00
INSERT INTO PROFESSOR(PROFESSOR_ID,NAME,POSITION,DEPT_ID,
TELEPHONE,EMAIL,DUTY,MGR)
VALUES('P14','조성우','전임강사','컴퓨터공학과',
'765-4114',NULL,NULL,NULL);
--value too large for column "TEST"."PROFESSOR"."DEPT_ID" (actual: 18, maximum: 10)
--column "TEST"."PROFESSOR"."DEPT_ID" : TEST계정의 PRORESSOR테이블의 DEPT_ID컬럼
--value too large : 값이 매우 크다(입력데이터: 18BYTES, 최대허용: 10BYTES)
INSERT INTO PROFESSOR(PROFESSOR_ID,NAME,POSITION,DEPT_ID,
TELEPHONE,EMAIL,DUTY,MGR)
VALUES('P14','조성우','전임강사','컴공',
'765-4114',NULL,NULL,NULL);
/*
예제 9.08
'컴공'학과 2학년에 편입한 '박은혜' 학생을 STUDENT 테이블에
입력하시오. 학번은 'C0931'이고, 주민등록번호는
'911119-2******', EMAIL주소는 'C0931@CYBER.AC.KR'이다.
*/
INSERT INTO STUDENT(DEPT_ID,YEAR,STUDENT_ID,NAME,ID_NUMBER
,EMAIL)
VALUES('컴공','2','C0931','박은혜','911119-2******'
,'C0931@CYBER.AC.KR');

--USER_CONSTRAINTS : 시스템 뷰테이블
SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE, SEARCH_CONDITION
FROM   USER_CONSTRAINTS
WHERE  TABLE_NAME = 'STUDENT';

/*
예제 9.09
'C0931'의 '박은혜' 학생의 ID_NUMBER 컬럼에
고유키(UNIQUE) 제약조건이 중복된 데이터를 찾아
수정하여 입력해보자
*/
--컴공   2   C0931   박은혜   911119-2******         
--C0931@CYBER.AC.KR      
--CONSTRAINT "STUDENT_UK" UNIQUE ("ID_NUMBER")

/*
예제 9.10
컴퓨터공학과에 외국인을 초빙강사로 채용하였다.
교수번호가 'P91', 교수명은 'Bill Gates', 직위는
'초빙강사'이며, 전화번호는 '765-4119'일 때,
이 초빙강사의 정보를 입력하시오.
*/
--P14   조성우   전임강사   컴공   765-4114         
INSERT INTO PROFESSOR(PROFESSOR_ID,NAME,POSITION,DEPT_ID
,TELEPHONE)
VALUES('P91','Bill Gates','초빙강사','컴공'
,'765-4119');
--PROFESSOR 테이블의 POSITION(직위) 컬럼에 유효한 데이터
--('총장','교수','부교수','조교수','초빙교수','전임강사')
--가 입력되지 않으면, 체크 제약조건이 위배되어 오류 발생.
/*
예제 9.12
COURCE 테이블로부터 교수번호가 'P12'인 교수의
개설과목의 정보를 T_COURSE 테이블에 저장하시오.
*/
INSERT INTO T_COURSE(COURSE_ID,TITLE,C_NUMBER,PROFESSOR_ID,COURSE_FEES)
SELECT COURSE_ID,TITLE,C_NUMBER,PROFESSOR_ID,COURSE_FEES
FROM   COURSE
WHERE  PROFESSOR_ID = 'P12';

COMMIT;

 

728x90