현재 선택한 SQL 과정

SQLD 이론 학습

이론 목록으로 돌아가기

Oracle 데이터 타입과 명시적 형변환

문자·숫자·날짜 타입과 DATE 연산, 묵시적 형변환의 결과·성능 위험을 정리한다.

예상 읽기 6

핵심 요약

문자·숫자·날짜 타입과 DATE 연산, 묵시적 형변환의 결과·성능 위험을 정리한다.

핵심 질문

  1. Oracle 데이터 타입과 명시적 형변환에서 반드시 구분해야 할 개념과 결과 규칙은 무엇인가?
  2. 0건·1건·여러 건과 NULL·동점·중복 데이터에서 결과가 어떻게 달라지는가?
  3. 비슷해 보이는 문법과 결과가 같아지는 조건, 달라지는 조건은 무엇인가?
  4. 작은 샘플 데이터를 이용해 결과를 실수 없이 예측하는 순서는 무엇인가?

학습 목표

  • CHAR, VARCHAR2, NUMBER, DATE, TIMESTAMP의 용도를 구분한다.
  • 명시적 형변환이 정확하고 예측 가능한 비교에 필요한 이유를 설명한다.

개념 지도

CODE코드 영역 안에서 좌우로 이동할 수 있습니다.
업무 사실 → 행과 열 → Key·제약조건 → 관계 연산 → 결과 집합

핵심 내용

Oracle의 DATE는 날짜뿐 아니라 시·분·초도 저장한다. 날짜에서 숫자를 더하면 일(day) 단위로 이동하고, 두 DATE를 빼면 일수 차이를 얻는다. TIMESTAMP는 더 정밀한 시간 정보를 다룬다.

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
WHERE order_dt >= TO_DATE('2026-07-01', 'YYYY-MM-DD')
  AND order_dt <  TO_DATE('2026-08-01', 'YYYY-MM-DD')

문자·숫자·날짜를 비교할 때 DBMS의 묵시적 형변환에 기대면 세션의 날짜 형식이나 값의 구성에 따라 오류 또는 의도하지 않은 비교가 발생할 수 있다. TO_CHAR, TO_NUMBER, TO_DATE로 변환 방향과 형식을 명시한다.

고정 길이 코드는 CHAR, 가변 문자열은 VARCHAR2가 기본 선택이지만 공백 비교 특성도 확인한다. 금액과 식별번호는 의미가 다르므로 숫자로 계산할 값인지, 앞자리 0을 보존할 코드인지 구분한다.

흔한 오해와 주의점

  • 날짜를 문자열처럼 비교하지 않는다.
  • 식별 코드는 숫자 모양이어도 산술 대상이 아니면 문자 타입이 더 적절할 수 있다.
  • 비교하는 두 값의 데이터 타입과 변환 방향을 먼저 확인한다.

문항 풀이 보강: 타입별 시험 포인트

타입핵심
CHAR(n)고정 길이, 비교 시 패딩 규칙 확인
VARCHAR2(n)가변 길이 문자열
NUMBER(p,s)전체 유효 자릿수와 소수 자릿수
DATE날짜와 시·분·초
TIMESTAMPDATE보다 정밀한 소수 초·시간대 변형 지원

Oracle에서는 날짜에 숫자를 더하면 일수 단위다.

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
TO_DATE('2015.01.10 10', 'YYYY.MM.DD HH24') + 1 / 24

위 식은 한 시간을 더한다. 월 단위 이동은 날짜 수가 다른 달을 고려하는 ADD_MONTHS를 사용한다.

숫자처럼 보이는 서비스번호가 VARCHAR2라면 숫자 상수와 비교할 때 묵시적 변환이 발생할 수 있다. 값에 숫자가 아닌 문자가 있으면 변환 오류가 나므로 문자 상수 또는 문자 Bind로 비교한다.

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
WHERE service_no = '1'  -- 타입에 맞는 문자 비교

DBMS별 타입 이름과 문자열 결합 연산도 구분한다. Oracle은 ||, SQL Server는 상황에 따라 + 또는 CONCAT을 사용하며 NULL 결합 규칙도 설정과 함수에 따라 다를 수 있다.

자주 혼동하는 타입 비교

타입핵심 특성주의점
CHAR(n)고정 길이 문자공백 Padding과 비교 의미 확인
VARCHAR2(n)가변 길이 문자Byte/Char 길이 단위 확인
NUMBER(p,s)정밀 숫자p는 전체 유효자리, s는 소수 자리
DATE날짜와 초 단위 시간날짜만 저장한다고 오해하지 않음
TIMESTAMPFractional SecondTime Zone 포함 타입과 구분
CLOB/BLOB대용량 문자/이진일반 문자열 함수·Network Fetch 비용 주의

명시적 변환

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
WHERE order_date >= TO_DATE(:from_ymd, 'YYYYMMDD')
  AND order_date <  TO_DATE(:to_ymd,   'YYYYMMDD') + 1

문자열을 날짜로 자동 변환하면 Session NLS_DATE_FORMAT에 따라 성공·실패·해석이 달라질 수 있다. Format Model과 타입을 명시한다.

SQL코드 영역 안에서 좌우로 이동할 수 있습니다.
-- customer_no가 VARCHAR2일 때 Bind도 문자열로 전달
WHERE customer_no = :customer_no

문자 컬럼을 숫자 Bind와 비교하면 Oracle이 문자 값을 숫자로 바꾸는 과정에서 숫자가 아닌 행 때문에 ORA-01722가 발생할 수 있다.

정밀도와 경계

NUMBER(5,2)는 최대 999.99 범위의 정밀도를 가진다. 금액·환율은 Binary Floating Type과 Decimal 의미가 다르므로 업무 오차 허용치를 정한다. Timestamp를 DATE로 변환하면 Fractional Second·Time Zone 정보를 잃을 수 있다.

설계 원칙

업무 의미에 맞는 타입을 원천부터 사용하고, 비교 시 Column 타입과 Bind 타입을 일치시킨다. 데이터를 잘못된 타입으로 저장한 뒤 SQL마다 변환하는 방식은 정확성과 성능 문제를 동시에 만든다.


결과를 검증하는 순서

  1. 각 Query Block이 만드는 한 행의 의미를 먼저 적습니다.
  2. 조건을 적용하기 전 원본 행과 적용 후 남는 행을 작은 표로 그립니다.
  3. NULL 비교가 TRUE, FALSE, UNKNOWN 중 무엇인지 구분합니다.
  4. 중복 제거, 그룹화, 정렬과 행 제한이 적용되는 순서를 확인합니다.
  5. 데이터가 0건·1건·여러 건일 때도 같은 규칙이 성립하는지 검증합니다.

실무와 시험에서 함께 확인할 항목

  • ORDER BY가 없다면 결과 순서를 가정하지 않습니다.
  • 문자열·숫자·날짜 비교에서는 데이터 타입과 명시적 형변환을 확인합니다.
  • 같은 결과처럼 보이는 SQL도 NULL과 중복이 있을 때 달라질 수 있습니다.
  • 문법을 외우기 전에 샘플 데이터 3~5행으로 결과를 직접 계산합니다.

마지막 점검

  • 작성 순서가 아니라 SQL의 논리적 처리 순서로 결과를 계산합니다.
  • NULL을 0이나 빈 값과 같은 것으로 취급하지 않습니다.
  • ORDER BY가 없는 결과 순서와 DISTINCT 없는 중복 제거를 가정하지 않습니다.
  • 비슷한 문법은 0건·다건·NULL 데이터를 넣어 결과가 정말 같은지 확인합니다.

복습 문제

  1. DATE + 1의 의미는?
  2. 문자 상수를 숫자 컬럼과 비교할 때 명시적 변환이 필요한 이유는?
  3. 샘플 데이터 3행으로 결과를 직접 계산할 수 있는가?
  4. NULL이 포함될 때 결과가 달라지는 지점은 어디인가?