본문 바로가기

디버깅/Oracle

160401

반응형

DML

  • CREATE [객체 생성]

  • ALTER  [객체구조 변경]

  • DROP [객체구조 변경]

  • TRUNCATE  [모든 자료 제거]

테이블 생성(Create Table)

컬럼 생성(Insert Into)


INSERT INTO 테이블 명(컬럼 명) VALUES (입력할 데이터)


제약 조건 설정 방법

  • 가독성을 위해 주로 컬럼레벨 조건을 사용한다.


1)  테이블 레벨 제약 조건 설정 방법(P398)

  • 복합키로 기본 키를 지정할 경우 사용한다.

  • ALTER TABLE로 제약 조건을 추가할 때


=> 테이블을 추가할때 한번에 제약조건을 지정한다.



CREATE TABLE ab(

ab1 number(1) Constraint coco_pkpk PRIMARY KEY(ab1)

//컬럼 레벨


CREATE TABLE ab(

ab1 number(1),

CONSTRAINT coco_pk PRIMARY KEY(ab1)

//테이블



ALTER TABLE ab

ADD CONSTRAINT coco_pk PRIMARY KEY(ab1) //테이블


ALTER TABLE ab

MODIFY ab1 CONSTRAINT coco_pk PRIMARY KEY // 컬럼

2) 컬럼 레벨 제약 조건 설정 방법(P368)

  • NOT NULL은 컬럼 레벨 제약조건으로만 추가가 가능하다


제약조건을 제거할때, 제약 조건명보다는 제약조건의 유형

(PRIMARY KEY, CHECK 와 같은 유형을 입력한다)

CREATE

ADD MODIFY ~~~~


=> 이미 존재하는 테이블을 추가, 삭제, 변경하는 방식을 말한다.


주 식별자 지정

  • PRIMARY KEY


DML

  • INSERT [자료추가]

  • UPDATE [자료변경]

  • DELETE [자료삭제]

  • MERGE [자료 병합]



책정리

p258,264,368,374,383,395,398,270~281,290~299,303,311,323



예시



CREATE TABLE t1(

cchar char(10),

cvchar varchar2(10),

cnum number,

cnum1 number(10), => number(10,0) 과 같다.

cnum2 number(10, 2),

cdate DATE

)



INSERT INTO t1(cchar, cvchar) VALUES ('abc','abc' )


SELECT * FROM t1

SELECT LENGTH(cchar), LENGTH(cvchar) FROM t1


INSERT INTO t1(cnum, cnum1, cnum2)

VALUES (1234.567, 1234.567, 1234.567)



INSERT INTO t1(cdate) VALUES('16/03/28')

INSERT INTO t1(cdate) VALUES(sysdate)


SELECT TO_CHAR(cdate, 'YYYY-MM-DD HH24:MI:SS') FROM t1




--서브쿼리로 테이블 생성하기

1) 테이블 구조와 행 모두 복사 (기본키는 복사되지 않는다)

CREATE TABLE t2

AS

SELECT * FROM employees

SELECT * FROM t2


// 서브쿼리를 수정하여 원하는 부분만 생성할 수 있다.



2) 테이블 구조만 복사

CREATE TABLE t3

AS

SELECT employee_id, first_name FROM employees WHERE 1=0


DESC employees // 원본 테이블

DESC t3 //  복사본 테이블



--------------------------------------------------------------------------



--고객(customer) 테이블 생성

아이디, 비밀번호, 이름, 우편번호, 주소, 가입일자, 상태


아이디 : id varchar2(10)

비밀번호 : password varchar2(10)

이름 : name varchar2(20)

우편번호 : zipcode char(5)

주소 : address varchar2(60)

가입일자 : reg_dt date

상태 : status char(1)



CREATE TABLE customer

(

id varchar2(10),

password varchar2(10),

name varchar2(20)

)


INSERT INTO customer(id) VALUES('a')

INSERT INTO customer(password) VALUES('b')


SELECT * FROM customer


// 무결성 제약 조건의 필요성

(아이디가 중복되게 등록되고, 아이디가 없음에도 비밀번호가 추가되는 에러를 방지시킴)


DELETE FROM customer


--제약조건 설정방법

1)테이블 레벨 제약 조건 설정방법

문법) CONSTRAINT 제약조건명 제약조건종류(컬럼)


CREATE TABLE customer

(

id varchar2(10),

password varchar2(10),

name varchar2(20)

CONSTRAINT customer_id PRIMARY KEY(ID)

)



2)컬럼레벨 제약조건 설정방법


(

id varchar2(10) CONSTRAINT 제약조건명 제약조건종류,

password varchar2(10),

name varchar2(20)

)

--------------------------------------------

*NOT NUL제약조건은 컬럼레벨로만 설정할 수 있다



--테이블 구조 변경하기  

ALTER TABLE 테이블 명

[ADD 컬럼/ MODIFY 컬럼/ DROP컬럼] -> 추가,수정,삭제

ADD CONSTRAINT 제약조건명 제약조건종류(컬럼)


**PRIMARY KEY 제약조건 추가**

ALTER TABLE customer

ADD CONSTRAINT customer_id_pk PRIMARY KEY(id)


DELETE FROM customer


**NOT NULL 제약조건 추가**

ALTER TABLE customer

MODIFY password CONSTRAINT customer_password_nn NOT NULL



DESC customer

INSERT INTO customer(id) VALUES ('A') -- ORA-01400: NULL을 ("HR"."CUSTOMER"."PASSWORD") 안에 삽입할 수 없습니다


**기존 테이블에 컬럼 추가**

ALTER TABLE customer

ADD zipcode char(5)


ALTER TABLE c

ADD address varchar2(60)

ADD reg_dt date


desc customer



========================== 오후======================






**컬럼 삭제하기

ALTER TABLE customer

DROP COLUMN reg_dt


**컬럼의 기본값(default value)

ALTER TABLE customer

ADD reg_dt date default SYSDATE NOT NULL



ALTER TABLE customer

ADD status char(1)

--가입상태인 경우 NULL, 탈퇴인 경우 'X', 블랙리스트인 경우 'B'




**CHECK제약 조건 추가**

문법) ADD CONSTRAINT 제약 조건명 CHECK (컬럼 조건)


ALTER TABLE customer

ADD CONSTRAINT customer_status_chk CHECK (status IN ('X', 'B'))


desc customer



SELECT * FROM customer

INSERT INTO customer(id, password, status) VALUES ('a', 'b', 'c')--ORA-02290: 체크 제약조건(HR.CUSTOMER_STATUS_CHK)이 위배되었습니다



---------------------------------------------------------------------------



INSERT INTO customer(id,password, name) VALUES ('test','test','테스트')

SELECT * FROM customer


SELECT * FROM user_constraints


---------------------------------------------------------------------------


**주문정보 테이블(order_info) 생성하기

주문번호 order_no number

주문자 order_id varchar2(10)

주문일자 order_dt date

<조건> 주문번호는 주식별자 역할, 주문자는 반드시 입력, 주문일자는 SYSDATE가 기본값



CREATE TABLE order_info

(

order_no number CONSTRAINT order_info_no_pk PRIMARY KEY,

order_id varchar2(10) CONSTRAINT order_info_id_nn NOT NULL,

order_dt date default SYSDATE CONSTRAINT order_dt_sysdt NOT NULL

)


DESC order_info




INSERT INTO order_info(order_no, order_id)VALUES (1, 'test')

INSERT INTO order_info(order_no, order_id)VALUES (2, 'test')

INSERT INTO order_info(order_no, order_id)VALUES (3, 'aa')


SELECT order_no, order_id, TO_CHAR(order_dt, 'YY/MM/DD HH24:MI:SS')

FROM order_info


DELETE FROM order_info


SELECT * FROM order_info


**주문의 order_id 컬럼값은 고객의 id값을 참조한다.

FOREIGN KEY 제약 조건


ALTER TABLE order_info

ADD CONSTRAINT order_info_id_fk

FOREIGN KEY(order_id) REFERENCES customer(id)



---------------------------------------------------------------------------


CREATE TABLE product

(

prod_no varchar2(10),

prod_name varchar2(60),

prod_price number(7)

)


desc product


**product 테이블에 제조일자 컬럼(컬럼명 prod_mf_dt CHAR(6))을 추가하시오.

<조건>

prod_no 컬럼은 주 식별자 역할,

prod_name 컬럼은 반드시 입력,

prod_price 컬럼은 0이상의 값만 입력


ALTER TABLE product

ADD prou_mf_dt CHAR(6)

ADD CONSTRAINT prod_no_pk PRIMARY KEY(prod_no)

MODIFY prod_name CONSTRAINT product_name_nn NOT NULL

ADD CONSTRAINT prod_pr_chk CHECK (prod_price >= 0)


desc product


--------------------------------------------------------------------------------------------------



행추가

상품정보 추가 [prod_no : 'R001', prod_name : '아메리카노', prod_price : 1000]

            ['R002', '라떼','1500']

            ['R003', 'ICE아메리카노','1500']


INSERT INTO product(prod_no, prod_name, prod_price) VALUES ('R001','아메리카노','1000')

INSERT INTO product(prod_no, prod_name, prod_price) VALUES ('R002','라떼','1500')

INSERT INTO product(prod_no, prod_name, prod_price) VALUES ('R003', 'ICE아메리카노','1500')



SELECT * FROM PRODUCT


UPDATE문

**행수정

모든 상품의 상품번호에 시작문자'R'을 'C'로 변경하시오.


UPDATE product

SET prod_no = REPLACE(SUBSTR(prod_no,1,1),'R','C')||SUBSTR(prod_no,2)


UPDATE product

SET prod_no = 'C'||SUBSTR(prod_no,2)

WHERE SUBSTR(prod_no,1,1)='R'



**상품가격을 10% 인상한다.


UPDATE product

SET prod_price = prod_price+(prod_price * 0.1)


**1500원 이상의 상품들만 상품가격을 5%인하 하시오.ㄱ

UPDATE product

SET prod_price = prod_price-(prod_price * 0.05)

WHERE prod_price >= 1500


**상품명에 '아메리카노'를 포함하는 상품의 가격만 1% 인하하시오.

UPDATE product

SET prod_price = prod_price-(prod_price * 0.01)

WHERE prod_name LIKE '%아메리카노%'


SELECT * FROM PRODUCT





퀴즈

1.**상품테이블의 모든 행을 삭제하시오.


DELETE FROM product


2.**카테고리테이블을 생성하시오


테이블명: category

컬럼 : category_no char(1), category_name varchar2(20)

조건 : category_no컬럼은 주식별자역할, category_name은 반드시 입력



CREATE TABLE category

(

category_no char(1) CONSTRAINT category_no_pk PRIMARY KEY,

category_name varchar2(20) NOT NULL

)


3.**상품테이블에 컬럼을 추가하시오.

컬럼 : category_no char(1)



ALTER TABLE product

ADD category_no char(1)



4.**상품 테이블에 제약 조건 추가하시오

category 테이블의 category_no컬럼을 상품 테이블의 category_no컬럼이 참조


ALTER TABLE product

ADD CONSTRAINTS category_no_fk

FOREIGN KEY (category_no) REFERENCES category(category_no)


동일 답

MODIFY category_no CONSTRAINTS produtct_category_no_fk REFERENCES category(category_no)




5.**category 테이블에 행 추가하시오

category_no   category_name

'C'         '커피'

'J'         '주스'

'F'         '푸드'


INSERT INTO category(category_no, category_name) VALUES ('C','커피')

INSERT INTO category(category_no, category_name) VALUES ('J','주스')

INSERT INTO category(category_no, category_name) VALUES ('F','푸드')


6.**상품테이블에 행 추가하시오

[prod_no:'C001', prod_name:'아메리카노',  prod_price:1000, category_no:'C' ]

[     'C002'         '라테',               1500, category_no:'C' ]

[     'C003'         'ICE아메리카노',       1500, category_no:'C' ]

[     'J001'         '오렌지주스',       2000, category_no:'J' ]

[     'J002'         '딸기주스',       2000, category_no:'J' ]

[     'F001'         '녹차아이스크림', 2000, category_no:'F' ]

[     'F002'         '초코케익',       5000, category_no:'F' ]

[     'F003'         '클럽샌드위치',       4000, category_no:'F' ]



INSERT INTO product(prod_no, prod_name, prod_price, category_no)

VALUES ('C001','아메리카노',1000,'C')

INSERT INTO product(prod_no, prod_name, prod_price, category_no)

VALUES ('C002','라테','1500','C')

INSERT INTO product(prod_no, prod_name, prod_price, category_no)

VALUES ('C003','ICE아메리카노','1500','C')

INSERT INTO product(prod_no, prod_name, prod_price, category_no)

VALUES ('J001','오렌지주스','2000','J')

INSERT INTO product(prod_no, prod_name, prod_price, category_no)

VALUES ('J002','딸기주스','2000','J')

INSERT INTO product(prod_no, prod_name, prod_price, category_no)

VALUES ('F001','녹차아이스크림','2000','F')

INSERT INTO product(prod_no, prod_name, prod_price, category_no)

VALUES ('F002','초코케익','5000','F')

INSERT INTO product(prod_no, prod_name, prod_price, category_no)

VALUES ('F003','클럽샌드위치','4000','F')



7.**주스카테고리에 속한 상품들을 출력하시오.

select * from product where prod_name like '%주스%'


동일 답

SELECT product WHERE category_no =

(

SELECT category_no FROM category WHERE categoty_name = ’ 주스’

)


8.**3000원 이상의 상품수를 출력하시오. 단, 상품가격이 높은 상품부터 출력하시오.

select count(*)

from product

where prod_price >= 3000


9.**카테고리별 상품수를 출력하시오.


SELECT category_name, c.category_no, count(*)

FROM product p join category c

ON p.category_no = c.category_no

group by c.category_no, c.category_name


10.**카테고리별 최고가격의 카테고리이름, 상품번호, 상품명, 가격을 출력하시오


SELECT c.category_name, p.prod_no, p.prod_name, p.prod_price

FROM product p join category c

ON p.category_no = c.category_no

WHERE (p.category_no, p.prod_price) IN

(

select category_no, max(prod_price)

from product

group by category_no

)








반응형

'디버깅 > Oracle' 카테고리의 다른 글

160405  (0) 2016.04.09
060404  (0) 2016.04.09
160331  (0) 2016.04.09
160330  (0) 2016.04.09
160329  (0) 2016.04.09