학원수업_Oracle

201008 Oracle 숫자자료형, 날짜형, 이진자료 저장, SELECT문

logloglog 2020. 10. 8. 12:50

 

숫자 자료형은 딱 하나만 존재

1. 숫자 자료형 (NUMBER) 

-정수 및 실수 자료를 저장하고자 할 때 사용

 

*사용 형식

칼럼명 NUMBER[(*|P[,S])]

여기서,

P는 정밀도(전체 자릿수)로 1~38 사이의 값(DEFAULT는 38)

S는 Scale의 약자. 소수점 이하 자릿수 (-84~127). DEFAULT는 0

*자바에서는 LONG타입이 8BYTE로 표현될 수 있는 정수.

그보다 큰 아주 큰 수는 BIG INTEGER라고 하는 별도의 클래스가 있음

BUT 오라클에서는 NUMBER하나로 아주 아주 큰 수까지 커버 가능함

(1) 정수를 표현하는 법

 

NUMBER     :  사용자가 정수든 실수든 암거나 입력해도 그대로 저장한다.

  데이터 저장
NUMBER 15.79 15.79 (그대로 저장됨)
  1230 1230 (그대로 저장됨)

NUMBER(5)  :  5개의 숫자가 올 수 있다는 뜻 > 즉 -99999~99999까지

NUMBER(5,0): 위와 같음 즉 , 0는 생략될 수 있다. 즉 소수점 이하가 0개라는 뜻

*소수점 자릿수는

2    1  .  5  7  9

-2  -1    1  2  3 번째 자리

 

만약 NUMBER(5)으로 21.579 저장하면 22가 저장됨 (반올림)

  데이터 저장
NUMBER(5) 21.57 22
NUMBER(5,0) 12.47 13

NUMBER(5)와 NUMBER(5,0)은 같은 의미

 

 

(2) 실수를 표현하는 법

입력값 타입 저장되는 값
12.456 NUMBER 12.456
12.456 NUMBER(*,2) 12.46 소수3자리에서 반올림
12.456 NUMBER(4,2) 12.46
소수2자리니까 정수의 자리2자리남음
12.456 NUMBER(3,2)
정수가 두자리인데 한자리만 저장할수있다? 잘려서 저장? no 오라클은 오류남
Over Flow
146.78 NUMBER(5,-1) 150 (소수첫째자리에서 반올림)
144.67 NUMBER(4,-2) 100

*ROUND (반올림) TRUNC(버림) 함수... 나중에 함수에서 배운다

 

 

(3) 스케일이 정밀도보다 큰 경우

 

EX NUMBER(3,7) 같은 경우

P는 ( 0을 제외한 ) 유효숫자의 개수

S-P의 결괏값 : 소수점 이하에 표현될 '0'의 개수

S는 소수점 이하 전체 자릿수

입력값 타입 저장되는 값
0.01234 NUMBER(3,4) 0.0123
0.01234 NUMBER(2,4) 오류 (4-2는 2인데 0.012..에서 소숫점 뒤 0은 하나밖에없음)
0.001234 NUMBER(2,4) 0.0012

 

 


 

2. 날짜형 (DATE(기본형), TIMESTAMP) 

 

(1) DATE

 

- 기본 날짜형 (년, 월, 일, 시, 분 초)

- +와 - 연산의 대상이 될 수 있음 (*와 /는 안됨)

 

*사용 형식

컬럼명 DATE

 

EX 

CREATE TABLE TEMP05(
    COL1 DATE,
    COL2 DATE);
INSERT INTO TEMP05
    VALUES(SYSDATE, '20191008');

문자열을 저장했더니 날짜로 바꼈다. >> 자동형변환

 

슬래시가 들어가있다. 시분초는 어디로?

시분초도 저장되어있다. 출력만 안될 뿐

SELECT TO_CHAR(COL1,'YYYY-MM-DD HH24:MI:SS')
FROM TEMP05;

SELECT TO_CHAR(COL1,'YYYY-MM-DD HH24:MI:SS'),
        TO_CHAR(COL2,'YYYY-MM-DD HH24:MI:SS')
FROM TEMP05;

 

만약

INSERT INTO TEMP05
    VALUES(SYSDATE+15, '201910');

오류 : literal does not match format string

날짜데이터를 문자열로 입력하고자 할때는 최소한의 데이터가 년월일! 이중에 하나만 빠져도 안됨

 

만약

 

INSERT INTO TEMP05
    VALUES(SYSDATE+15, TO_DATE('20191008101131','YYYYMMDDHH24,MISS'));

 

-15일 해보면

INSERT INTO TEMP05
    VALUES(SYSDATE-15,'20191008');

이렇게 +와 -만 되고 *,/는 안된다.

 

 

 

(2) TIMESTAMP

 

- 기본 날짜형에서 밀리초(10억분의 1초)까지 제공

- 타임존 정보 제공(TIMESTAMP WITH TIME ZONE : 아시아의 타임존 정보,

                         TIMESTAMP WITH LOCAL TIME ZONE : 내가 쓰고있는 가상서버 (LOCAL HOST가 위치해있는 지역의 타임존 정보)

 

*사용형식

컬럼명 TIMESTAMP
컬럼명 TIMESTAMP WITH TIME ZONE
컬럼명 TIMESTAMP WITH LOCAL TIME ZONE

바코드를 찍으면 초정보까지 저장이됨

 

EX

CREATE TABLE TEMP06(
    COL1 DATE,
    COL2 TIMESTAMP,
    COL3 TIMESTAMP WITH TIME ZONE,
    COL4 TIMESTAMP WITH LOCAL TIME ZONE);
INSERT INTO TEMP06
VALUES ( SYSDATE,SYSDATE, SYSDATE, SYSDATE); 

COL1은 시분초있지만 출력은 안됨. COL3 타임존은 ASIA/SEOUL, COL4는 TIMESTAMP와 같다

 

 3. 이진자료 저장 (BLOB, BFILE) 

오라클에서 제공해주는게 아니고 자바나 JSP에서 모듈로 구형해야하기때문에 입출력이 자유롭지못함

 

(1) BLOB

 

- 이진 자료 저장

- 최대 4GBYTE

- 원본 자료를 테이블 내부에 저장

- 출력시 해석되지 않음  (즉 SELECT문에 나타나지않음. 별도의 모듈이 필요함)

 

 

*사용형식

컬럼명 BLOB

 

(2) BFILE

 

- 이진 자료 저장

- 최대 4GBYTE

- 원본 자료를 테이블 외부에 저장하고 경로와 파일명만 테이블에 저장

>해당되어지는 경로를 알아야 함

>>사용을 위해 디렉토리 객체 생성이 필요

- 출력시 해석되지 않음 (즉 SELECT문에 나타나지않음 별도의 모듈이 필요함)

 

*사용형식

컬럼명 BFILE

 

 

 


 

 

 

 

 SELECT문 

 

- 테이블에 저장된 자료를 조회하기 위한 명령

 

*사용형식

SELECT [DISTINCT] 컬럼명 [AS]["][컬럼별칭]["][,]
        컬럼명 [AS]["][컬럼별칭]["][,]
                :
        컬럼명 [AS]["][컬럼별칭]["][,]
    FROM 테이블명 [테이블별칭]
[WHERE 조건 
    [AND|OR 조건]]
    [GROUP BY 컬럼명[,컬럼명,...]]
    [HAVING 조건
        [AND|OR 조건]]
    [ORDER BY 컬럼명|컬럼인덱스][ASC|DESC];

- SELECT절과 FROM절은 생략불가!

 

- DISTINCT : 중복자료를 배제시킬 때 사용 (한번만 사용)

 

- 컬럼별칭 : 컬럼에 또 다른 이름을 부여할때 사용. 별칭앞에 AS 생략가능

""를 반드시 써야하는 경우 : 별칭에 공백이나 특수문자, 명령문등이 들어갈때는 반드시!

별칭에 일반문자만 사용하면 ""안써도됨

 

- 테이블 명은 하나이상 반드시! 테이블명이 두개이상은 일반 SQL문이 아니라 JOIN연산

테이블 별칭쓸때는 AS 나 "" 쓰지않는다

 

**헷갈리기 쉬운것
group으로 나눴다는 얘기는 그 나뉜그룹에 대해 계산할거란뜻
sum count avg min max 다섯가지 함수가 사용되면 group을 해야한다고 생각하면 됨
where도 조건 having도 조건?? having은 특수한 조건!
위의 다섯가지가 적용되어진 컬럼에 조건을 부여할때 having을 씀
ex) 제품별로 판매금액 조사하는데 10000원 넘는것만 > 이럴때는 where절을 절대못씀
즉 그룹함수가 적용된 그룹에 조건이 부여될때는 having을 써야한다

 

order by > sort 정렬

컬럼인덱스 ? select절에 나온 컬럼의 순번(1번부터 시작)

 

****각 절이 실행되는 순서
select from where 중에 from -> where(행) -> select(컬럼) 

이게 왜 중요?? select문의 컬럼별칭은 from절이나 where절에 쓸 수 없음! 아직 순서가 안왔으니까

 

참고)

자바의 변수타입중 static이라는게있음 static은 생성전에 시행되기위해 클래스가 메모리로 올라올때 만들어짐

객체가 안만들어져도 실행가능 

 

 

 

(1) 연산자

 

 - 숫자 연산자 : +, -, *, /,()      <괄호는 연산순서를 지정하기위해 사용 

                    (%나머지연산자는 지원하지 않음 주의!)

 

- 문자열 연산자 : '||'   < 문자열을 합쳐 하나의 문자열을 반환할때 (자바의 + 연산자와 같다)

 

  EX ) 회원테이블에서 회원들에게 모두 50마일리지를 추가 지급하려고 한다.

        이를 조회하시오  (단, Alias는 회원번호 MEM_ID, 회원명 MEM_NAME,마일리지MEM_MILEAGE,추가된 마일리지)

 

SELECT MEM_ID AS 회원번호,
        MEM_NAME AS 회원명, 
        MEM_MILEAGE AS 마일리지, 
        MEM_MILEAGE + 50 AS "추가된 마일리지"
    FROM MEMBER;

 

 

EX ) 회원테이블에서 여성회원만 마일리지를 20% 추가지급하시오

      단, Alias는 회원번호, 회원명, 주민번호 뒷자리, 마일리지, 수정된 마일리지

SELECT MEM_ID AS 회원번호,
        MEM_NAME AS 회원명,
        MEM_REGNO1||'-'||MEM_REGNO2 AS 주민번호,
        MEM_MILEAGE AS 마일리지,
        MEM_MILEAGE + MEM_MILEAGE*0.2 AS "수정된 마일리지"
FROM MEMBER
WHERE MEM_REGNO2 LIKE '2%' OR MEM_REGNO2 LIKE '4%';

마지막 WHERE절은 

WHERE SUBSTR(MEM_REGNO2,1,1)='2' OR SUBSTR(MEM_REGNO2,1,1)='4'

또는

WHERE SUBSTR(MEM_REGNO2,1,1) IN ('2','4')

로 표현가능

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'학원수업_Oracle' 카테고리의 다른 글

201013 Oracle 표현식  (0) 2020.10.13
201013 Oracle 집합연산자  (0) 2020.10.13
201012 Oracle  (0) 2020.10.12
201007 Oracle DML  (0) 2020.10.07
201006 DDL 데이터 정의어 (CREATE ALTER DROP)  (0) 2020.10.06