본문 바로가기

오라클

SQL에서 산술 연산자 종류, 우선순위, 팁(암시적 변환, 정밀도 및 배율, 오버플로, 언더플로)

목차

    산술연산자를 통한 데이터를 가공하거나 가정해 볼 수 있습니다.

    산술식에는 열이름, 상수 및 산술 연산자를 포함할 수 있습니다.

    산술 연산자로 사용할 수 있는 연산자는 아래와 같이 5개가 있습니다.

    DATE 및 TIMESTAMP 데이터 유형은 더하기(+)/빼기(-)만 사용 가능합니다.

     


    1. 산술연산자 종류

    더하기 연산자(+): 더하기 연산자는 두 개의 숫자 값을 더하는 데 사용됩니다. 

    SELECT 2 + 3 FROM dual;

    결과: 5


    빼기 연산자(-): 빼기 연산자는 하나의 숫자 값에서 다른 값을 빼는 데 사용됩니다. 

    SELECT 10 - 5 FROM dual;

    결과: 5


    곱셈 연산자(*): 곱셈 연산자는 두 개의 숫자 값을 곱하는 데 사용됩니다. 

    SELECT 2 * 3 FROM dual;

    결과: 6


    나누기 연산자(/): 나누기 연산자는 하나의 숫자 값을 다른 값으로 나눌 때 사용합니다. 

    SELECT 10 / 2 FROM dual;

    결과: 5
    참고: 0으로 나누면 오류가 발생합니다.


    계수 연산자(%): 계수 연산자는 나누기 연산의 나머지를 구하는 데 사용됩니다.

    SELECT 10 % 3 FROM dual;

    결과: 1

    즉, 10을 3으로 나눈 값은 3이고 나머지는 1입니다.

     

     

     


    2. 연산 우선순위

    연산에는 우선순위가 있습니다.

    곱하기, 나누기가 먼저 실행되고 우선순위가 동일한 경우 왼쪽이 먼저 실행됩니다.

    • 곱하기와 나누기는 더하기와 빼기보다 먼저 수행됩니다.
    • 동일한 우선 순위를 갖는 연산자는 왼쪽에서 오른쪽으로 평가됩니다.
    • 괄호는 기본 우선 순위를 재정의하거나 표현식을 명확히 하기 위해 사용됩니다.

     

    이에 따라 아래와 같은 예시는 14가 나옵니다.

    SELECT 2 + 3 * 4 FROM dual;

    결과: 14

    곱셈 연산(3 * 4)을 먼저 수행한 다음 덧셈 연산(2 + 12)을 수행합니다.

     

     

     


    3. 연산에서 알고 있으면 좋은 팁

     

    3-1. 암시적 변환

    데이터 유형이 다른 열 또는 리터럴에서 계산을 수행할 때 피연산자가 동일한 데이터 유형이 되도록 암시적 변환을 수행할 수 있습니다. 예를 들어 숫자 열과 문자열 리터럴을 추가하려는 경우 문자열을 숫자로 변환할 수 있습니다.

    이로 인해 때때로 예기치 않은 결과가 발생할 수 있으므로 피연산자의 데이터 유형을 인식하는 것이 중요합니다.

     

    SELECT 5 / 2 FROM dual;

    정수 5를 정수 2로 나누고 있습니다. 

    그러나 나누기 결과가 정수가 아니므로 나누기를 수행하기 전에 피연산자를 숫자로 암시적으로 변환합니다.

    쿼리 결과는 2.5입니다.

     

    SELECT '5' + 2 FROM dual;

    문자열 '5'를 정수 2에 추가합니다. 

    그러나 피연산자의 데이터 유형이 서로 다르기 때문에 문자열 5를 정수로 변환합니다.

    결과는 7입니다.


    3-2. 정밀도 및 배율

    나누기 연산을 수행할 때 피연산자의 데이터 유형에 따라 결과를 특정 정밀도 및 배율로 반올림할 수 있습니다.

    예를 들어 정밀도가 10이고 소수 자릿수가 2인 숫자를 정밀도가 5이고 소수 자릿수가 1인 숫자로 나누면 결과는 정밀도가 12이고 소수 자릿수가 3이 될 수 있습니다. 예기치 않은 결과가 발생할 수 있으므로 피연산자의 정밀도와 배율을 인식하는 것이 중요합니다.

    number(정밀도, 배율)

    정밀도: 소수점의 왼쪽과 오른쪽에 저장될 수 있는 전체 자릿수의 최대 값

    배율: 소수점의 오른쪽에 저장될 수 있는 최대 자릿수


    3-3. 오버플로 및 언더플로

    매우 크거나 작은 숫자에 대해 계산을 수행할 때 오버플로 또는 언더플로 오류가 발생할 수 있습니다. 연산 결과가 데이터 타입에 저장할 수 있는 최대값보다 큰 경우 오버플로가 발생하고, 저장할 수 있는 최소값보다 작은 경우 언더플로가 발생한다. 두 경우 모두 결과가 잘리거나 반올림되어 부정확한 결과가 나올 수 있습니다.

    SELECT 1e1000 * 1e1000 FROM dual;
    SELECT 1e-1000 / 1e1000 FROM dual;

     

    위 두 수식은 오라클에서 다루는 수를 벗어나기 때문에 아래와 같은 오류가 발생합니다.

     

    오라클 오버플로, 언더플로
    오라클 오버플로, 언더플로

     

    그래서 개발할 때는 피연산자의 크기를 가늠할 수 있어야 합니다.