[Basic] SQL 데이터 타입

고보·2024년 1월 23일

1 데이터 타입

  • 데이터베이스 설계 단계에서 신중하게 고려해야 함. => 잘못 선정하면 성증 저하.
  • 결정 전략
    • 문자형: 실제 업무에선 가변형(Varchar2)만 고려
    • 숫자형
      • 금액, 수량 등 사칙연산 필요 => 숫자형
      • 부서코드, 학년 등 분류형 자료 => 가변형 문자
    • 데이터
      • 단독 사용 => Date
      • 자료분류 목적, 인덱스 => 가변형 문자데이터 타입으로 선언 => 날짜, 시간 분리해서 사용

2 문자형 데이터

2-1 CHAR

CHAR(10)

  • 고정 길이 문자. 길이가 지정되어, 그것보다 짧으면, 나머지는 공백으로 채워짐.
  • 편차가 큰 데이터를 입력하면 저장공간 낭비 => 비슷비슷한 길이의 데이터
    but 사실 실무에선 VARCHAR2만 사용
  • 지정된 길이보다 긴 데이터 입력하면 에러 발생
  • 데이터 입력하지 않으면 NULL 입력
  • 최대 2000byte까지 저장 가능

2-2 VARCHAR2

VARCHAR2(10)

  • 가변 길이 문자열. 지정 길이보다 짧은 문자열이 입력되면 뒷부분 NULL처리.
  • 지정된 길이보다 긴 데이터 입력하면 에러 발생
  • 데이터 입력하지 않으면 NULL 입력
  • 최대 4000byte까지 저장 가능

2-3 NVARCHAR2

  • VARCHAR2는 ASCII만 가능 => 이건 모든 유니코드 가능

2-3 문자 비교

  • 문자 상수(데이터)는 타입에 맞춰 내부 변환 후 각 문자 타입의 비교 방식에 의해 처리
    즉, CHAR 타입으로 지정된 칼럼과 비교하면 CHAR로 내부변환 되서 비교, VARCHAR2로 지정된 칼럼과 비교하면 VARCHAR2로 내부변환 되서 비교
    - CHAR과 비교하면 => CHAR타입으로 내부 변환 후 비교
    - VARCHAR2과 비교하면 => VARCHAR2타입으로 내부 변환 후 비교
create table ex_type
(c char(10), 
v varchar2(10));

insert into ex_type
values('sql', 'sql');

(char과 비교하면 'sql'이라는 문자 상수는 char로 내부 변환)
(결과적으로 TRUE가 된다)
select * 
from ex_type
where c = 'sql';

(varchar2와 비교하면 'sql'이라는 문자 상수는 varchar2로 내부 변환)
(결과적으로 TRUE가 된다)
select * 
from ex_type
where  v = 'sql';

(같은 'sql'이라도 char과 varchar2는 서로 다르다)
(같게 하려면 char쪽의 뒤의 공백을 다 지우면 같아진다 -> RTRIM(c))
select * 
from ex_type
where c = v;

3 숫자형 데이터

3-1 NUMBER

NUMBER(5, 2)

  • 앞의 숫자는 precision으로 전체 자릿수(소수점 포함), 뒤의 숫자는 scale로 소수점 자릿수
    • presicion 지정 않고 숫자 입력하면, 입력되는 숫자 크기만큼 저장공간 자동 할당
    • scale 지정 않고 숫자 입력하면, 정수값만 저장
  • 숫자 저장. 가변 길이. 최대 38자리까지 가능.
  • 저장 가능 범위는 10^-130 ~ 96.9*10^125
  • BIGINT: 64비트 크기의 부호 있는 정수.

3-2 DATE

DATE

  • 세기, 년도, 월, 일, 시간, 분, 초의 날짜와 시간 정보 저장
  • 7비트 고정 길이 필드에 저장
  • 오라클 기본 형식은 YY/MM/DD 형식
  • TO_DATE('24/01/24', 'YY/MM/DD'): 문자 데이터를 날짜 형식으로 변환
  • SYSDATE: 현재 날짜와 시간을 반환
  • 월 지정하지 않으면 해당월, 일 지정하지 않으면 1일, 시간 지정하지 않으면 12:00:00 입력

3-3 TIMESTAMP

  • DATE의 확장. milli second 단위까지 표현. milli second의 기본값은 6, 최대 9자리까지 가능.
  • 종류
    • TIMESTAMP WITH LOCAL TIME ZONE: 사용자의 지역 시간대 저장
    • TIMESTAMP WITH TIME ZONE: 사용자의 지역 시간대 저장하면서, 표준 시간을 함께 저장. 환산한 것 보여줌. (+09:00 이런 식으로. 한국은 9시간 더 빨라서)

4 LOB 데이터 타입

  • 텍스트, 그래픽, 이미지, 동영상, 사운드 등 구조화되지 않은 대용량 텍스트나 멀티미디어 데이터
  • 최대 4GB 저장
  • 종류
    • BLOB: 이미지, 동영상, 사운드 같이 구조화되지 않은 바이너리 데이터
    • CLOB: 대용량 텍스트
    • NCLOB: 국가별 문자셋(유니코드) 데이터
    • BFILE: 바이너리 데이터지만 읽기 전용으로 내용 변경 불가능

5 ROWID

  • 테이블 행 위치 지정하는 논리적 주소값. 데이터베이스 전체에서 중복되지 않는 유일한 값.
    테이블에 새로운 행 삽입되면, 의사칼럼(pseudo column)형태로 자동으로 생성
  • 특정 레코드를 랜덤 엑세스하기 위한 가장 빠른 방법. 인덱스로 데이터에 빠르게 접근할 때 ROWID 사용.
  • ROWID는 데이터베이스에 저장되지 않는다.
    SELECT문으로 조회는 가능하지만, DML문으로 임의 변경 불가능하다.
  • ex) AAAL+Z.AAE.AAAAAd.AAN
    데이터 객체 번호(Data object number. 데이터 객체 생성 시 할당)
    상대적 파일 번호(Relative file number. 테이블스페이스의 물리적인 데이터 파일 번호)
    블록 번호(block number, 파일 내에서 행을 포함하는 블록 위치)
    행 번호(row number, 블록 헤더 내에서 행 슬롯 위치)

6 ROWNUM

  • Query에서 추출되는 결과 행들을 1부터 시작하는 순차 값을 할당한 일련번호.
  • ORDER BY절에 의한 정렬 전단계에 부여.
  • ROWNUM을 WHERE절에 걸고 싶으면 <, <= 조건을 사용한다.
    예외적으로 첫행만 확인할 일 많아서, =1만 가능. =2는 한 건도 추출되지 않는다.
    즉, 1부터 무조건 시작된다.

7 DUAL

  • 하나의 행, 하나의 열, 즉 하나의 값이 들어갈 수 있는 공간.
  • 데이터 사전(데이터 딕셔너리)과 함께 oracle에서 자동으로 생성되는 테이블로
    사용자 SYS의 스키마에 있지만, 모든 사용자가 DUAL이라는 이름으로 엑세스 가능한 공용 동의어다.
  • 계산식의 실행, 각종 함수, sequence 테스트 등에 이용.
SELECT USER INTO <변수> 
FROM DUAL
profile
일본에서 일하는 게임 기획자. 시시해서 죽어버리지 않게, 재밌고 의미 있는 컨텐츠에 관심 있습니다. 그 도구로 데이터, AI도 찝적댑니다.

0개의 댓글