All Articles

SQL 첫걸음 - 12강 수치 연산

12강 수치 연산

SELECT 구로 연산하기

예시를 보는 것이 이해가 빠르므로 예를 들어보겠다.

price_table

no price quantity
1 1000 10
2 230 24
3 1980 1
SELECT *, price*quantity FROM price_table;
no price quantity price*quantity
1 1000 10 10000
2 230 24 5520
3 1980 1 1980

price*quantity라는 필드가 새로 생겼고 price와 quantity를 곱한 값이 반환됐다.

별명 붙이기

price*quantity는 너무 기니까 다른 이름을 붙여보자.

SELECT *, price*quantity AS total FROM price_table;
no price quantity total
1 1000 10 10000
2 230 24 5520
3 1980 1 1980

SELECT 구에서는 콤마(,)로 구분해 식 여러 개를 지정할 수 있고 각 식에 별명을 붙일 수도 있다. 별명은 중복이어도 괜찮지만 처리 방식에 따라서 문제가 발생할 수도 있으므로 보통 중복은 피해서 지정한다.

또한 별명은 숫자로 시작할 수 없다. 숫자로 시작하는 별명을 사용하려면 더블쿼츠(“)로 묶어줘야 한다. MySQL에서는 숫자로 시작하는 별명을 허용하지만, 숫자로만 이루어진 별명은 안된다.

별명에 아스키 문자 이외의 것을 사용하고자 할 때는 더블쿼트(“)를 사용한다.

SELECT *, price*quantity AS "총액" FROM price_table;

참고) 명령구문을 분석할 때, 더블쿼트(“)로 둘러싼 것은 데이터베이스 객체 이름이라고 간주하고, 싱글쿼트(‘)로 둘러싼 것은 문자열 상수로 간주한다.

별명을 붙일 때 사용하는 예약어 AS는 생략해도 된다.

SELECT *, price*quantity total FROM price_table;

WHERE 구에서 연산하기

SELECT *, price*quantity AS total FROM price_table WHERE price*quantity >= 2000;
no price quantity total
1 1000 10 10000
2 230 24 5520

만약 WHERE 구에 열 별명을 쓴다면?

SELECT *, price*quantity AS total FROM price_table WHERE total >= 2000;

total 필드를 찾을 수 없다는 에러가 발생한다. 내부 처리 순서가 WHERE 구 -> SELECT 구이기 때문이다. 별명을 선언하는 SELECT 구가 처리되기 이전에 WHERE 구를 실행하기 때문에 별명이 아닌 연산 그대로를 사용해야 한다.

NULL 값 연산

  • NULL + 1
  • 1 + NULL
  • 1 + 2 * NULL
  • 1 / NULL

결과는 모두 NULL이다. NULL은 0이 아니라 값이 없는 상태이므로 NULL에다가 뭘 해봤자 NULL이다.

ORDER BY 구에서 연산하기

SELECT *, price*quantity AS total FROM price_table ORDER BY total ASC;
no price quantity total
3 1980 1 1980
2 230 24 5520
1 1000 10 10000

ORDER BY는 가장 나중에 처리되므로 SELECT 구에서 지정한 별명을 사용할 수 있다. 정리하자면, 서버에서 내부처리 순서는 WHERE 구 -> SELECT 구 -> ORDER BY 구다.

MOD 함수

연산자 말고도 함수를 사용해 연산할 수도 있다. 나머지를 계산할 때는 % 연산자를 써도 되지만 MOD 함수를 써도 된다. Oracle에서는 % 연산자를 사용할 수 없으므로 함수를 사용한다.

10 % 3
MOD(10, 3)

두 식 모두 값 1을 반환한다.

ROUND 함수

소수점 반올림 연산을 할 때 사용한다.

round_sample

total
5961.60
2138.40
1080.00
SELECT total, ROUND(total) FROM round_sample;
total ROUND(total)
5961.60 5962
2138.40 2138
1080.00 1080

ROUND 함수 사용 시, 반올림할 자릿수를 지정할 수 있으며 생략하면 소수점 첫째 자리에서 반올림한다.

SELECT total, ROUND(total, 1) FROM round_sample;
total ROUND(total, 1)
5961.60 5962.6
2138.40 2138.4
1080.00 1080.0

ROUND(열, 자릿수)에서 자릿수는 소수점 첫째 자리부터 0으로 센다. 0이면 소수점 첫째 자리에서 반올림, 1이면 둘째 자리에서 반올림, 2면 셋째 자리에서 반올림이다. 첫 번째 요소의 인덱스 값이 0부터 시작하는 리스트를 생각하면 덜 헷갈린다.

반대로 1, 10, 100단위 이상으로도 반올림할 수 있다. 자릿수에 -1을 지정하면 1 단위에서 반올림, -2면 10단위에서 반올림, -3이면 100단위에서 반올림한다.

SELECT total, ROUND(total, -1) FROM round_sample;
total ROUND(total, -1)
5961.60 5960
2138.40 2140
1080.00 1080

반올림 말고 버림을 하고싶다면 TRUNCATE() 함수를 사용한다.