12강 수치 연산
SELECT 구로 연산하기
예시를 보는 것이 이해가 빠르므로 예를 들어보겠다.
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 함수
소수점 반올림 연산을 할 때 사용한다.
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()
함수를 사용한다.