0. 수치 연산
SQL은 데이터베이스를 조작하는 언어이지만 컴퓨터를 조작하는 언어이기도 한 만큼 기본적으로 계산 기능을 포함한다. 계산하는 방법, 특히 수치의 연산 방법에 대해 배워보자.
어떤 계산을 할지는 연산자를 통해 지정한다. WHERE 구에서 조건을 지정할 때 사용했던 = 역시 연산자의 하나이다.
1. 사칙 연산
산순 연산이라고 생각하면 된다. 덧셈, 뺄셈, 곱셈, 나눗셈의 사칙 연산과 나눗셈의 나머지이다. 연산자는 기호로 표기하며 다음과 같다.
연산자 | 연산 | 예 |
+ | 덧셈 | 1+2 = 3 |
- | 뺼셈 | 1-2 = -1 |
* | 곱셈 | 1*2 = 2 |
/ | 나눈셋 | 1/2 = 0.5 |
% | 나머지 | 1/2 = 1 |
곱셈의 기호는 *을 사용한다. SQL에서 *은 모든 열을 의미하는 메타 문지이지만 연산자로도 사용할 수 있다.
연산자의 우선순위
연산자에는 우선순위가 존재한다. *,/,%은 1우선순위 이며 +/-는 2 우선순위이다. 같은 우선순위끼리는 먼저 나온 순서에 따라 계산한다.
2. SELECT 구로 연산하기
SELECT를 통해 연산이 가능하다. 다음은 sample34이다.
sample34 테이블을 이용해 가격과 수량으로 금액을 계산하는 경우를 생각해보자. 예를 들어 가격이 100원인 상품을 10개 주문하면 주문금액은 1000원이다. 즉 단가x개수라는 연산식으로 계산할 수 있다.
sample34에서는 price가 가격을, quantity가 수량을 의미한다. 따라서 금액을 계산하는 식은 price*quantity이며 SELECT 구로 계산할 수 있다.
SELECT*, price*quantity FROM sample34;
3. 열의 별명
SELECT 결과에서 price=quantity라고 명명된 열이 금액을 계산한 부분이다. 해당 열명은 알아보기 어렵고 길기때문에 별명을 붙여 열명을 재지정할 수 있다.
SELECT*, price*quantity AS amount FROM sample34;
별명은 예약어 AS를 사용해 지정한다. SELECT 구에서는 콤마를 통해 복수의 식을 지정할 수 있으며 각각의 식에 별명을 붙일 수 있다. 각 별명은 중복되지 않는 것을 권장한다. 또한 AS는 생략 가능하며 별명을 한글로 지정하는 경우 ""로 둘러싸서 지정한다.
별명으로 예약어를 사용할 수 없지만 ""로 둘러싸는 경우는 가능하다. 또한 별명은 숫자로 시작할 수 없다. 단 ""로 둘러싸면 가능하다.
4. WHERE 구에서 연산하기
이번에는 WHERE 구로 연산을 시도한다. sample34에서 금액이 2000 이상인 행만 검색해본다.
SELECT *,price*quantity AS amount FROM sample34 WHERE price*quantity >= 2000;
위와 같이 WHERE 구에서도 연산이 가능하다. 단 WHERE 구에서 price*quantity 대신 amount를 쓰면 에러가 발생한다.
WHERE 구와 SELECT 구의 내부처리 순서
WHERE 구에서의 행 선택, SELECT 구에서의 열 선택은 데이터베이스 서버 내부에서 WHERE->SELECT 순으로 처리된다. 즉 WHERE에서 amount라는 별명은 아직 생성되기 이전이므로 WHERE에서 별명을 사용하려고 시도하면 에러가 발생하는 것이다.
5. NULL 값의 연산
NULL 값을 이용해 NULL+과 같은 연산을 하면 어떤 결과가 나올까. SQL에서 NULL은 그저 NULL이다. 그러므로 NULL+1은 그저 NULL일 뿐이다. 연산에 NULL이 포함된다면 모든 결과는 NULL이 된다.
6. ORDER BY 구에서 연산하기
ORDER BY 구에서 연산을 통해 sample34를 amount를 기준으로 내림차순 정렬해보자.
SELECT *,price*quantity AS amount FROM sample34 ORDER BY price*quantity DESC;
추가로 ORDER BY는 서버에서 가장 나중에 처리된다. 즉 price*quantity 대신 별명인 amount를 사용하는 게 가능하다.
7. 함수
연산자 외에 함수를 사용해 연산할 수도 있다. 함수는 다음과 같은 문법으로 표기한다.
함수명(인수1,인수2...)
연산자는 기호에 따라 연산 방법이 결정되지만 함수는 함수명에 따라 연산 방법이 결정된다. 연산자는 좌우의 항목이 연산 대상이 되지만 함수는 계산 대상을 인수로 지정한다. 대부분의 함수는 1개 이상의 인수를 가지며 인수를 파라미터라고도 부른다. 또한 함수의 결괏값을 "함수의 반환 값"라고 한다.
예를 들어 나머지 함수 MOD가 존재한다.
10 % 3 = 1
MOD(10,3) = 1
사실상 연산자와 함수는 표기방법이 다를 뿐 같다고 할 수 있다.
8. ROUND 함수
ROUND함수는 반올림을 하는데 사용하는 함수이다. 다음 sample341을 보면 소수점까지 표시되어 있다.
ROUND 함수를 통해 소수점 아래는 반올림하여 표시할 수 있다.
SELECT amount, ROUND(amount) FROM sample341;
반올림 자릿수 지정
ROUND 함수는 기본적으로 소수점 첫째 자리를 기준으로 반올림한 값을 반환한다. ROUND 함수의 두 번째 인수로 반올림할 자릿수를 지정할 수 있다. 해당 인수의 디폴트 값은 0이며 소수점 첫째 자리를 반올림한다. 1로 두면 소수점 둘째 자리를 반올림하며 -1로 두면 1 단위를, 2로 두면 10 단위를 반올림한다.
SELECT amount, ROUND(amount,1) FROM sample341;
SELECT amount, ROUND(amount,-2) FROM sample341;
지금까지 소개한 함수 외에도 다양하고 복잡한 함수가 많이 존재한다.
'Languages > SQL' 카테고리의 다른 글
[SQL] 14. 날짜 연산 (0) | 2021.08.04 |
---|---|
[SQL] 13. 문자열 연산 (0) | 2021.07.22 |
[SQL] 11. 결과 행 제한하기 - LIMIT (0) | 2021.06.22 |
[SQL] 10. 복수의 열을 지정해 정렬하기 (0) | 2021.05.18 |
[SQL] 9. 정렬 - ORDER BY (0) | 2021.05.08 |