SQL

수치 연산

1space 2024. 7. 12. 22:41

오늘은 수치 연산에 대해 알아보려고 합니다. 

 

SELECT 구로 연산

 

전에 SELECT구 에는 열명을 지정한다고 배웠습니다만 이 외에도 여러가지 식을 기술할 수 있습니다. 식을 기술할 수 있다는 것은 명령이 실행될 때 연산을 할 수 있다는 것을 의미합니다. 예를 들기위해 예시 테이블을 살펴보겠습니다.

 

 

위 테이블을 보면 가격과 수량 열이 있습니다. 여기서 가격과 수량열을 이용해 금액을 계싼하는 경우를 생각해보겠습니다. 

 

SELECT price * quantity FROM sample34;

 

price * quantity라고 명명된 열이 금액을 계산한 부분입니다. 근데 위와같이 열 이름이 길고 알아보기 어려운 경우 별명을 붙여 열명을 재지정할 수 있습니다. 

 

SELECT price * quantity AS amount FROM sample34;

이렇게 price * quantity 뒤에 AS 를 활용하여 amount 라는 별명을 붙이면 조금더 알아보기 쉬울 것입니다.

 

지금은 amount열만 나오는데 모든 열을 한번에 보고 싶을 때는 어떻게 해야할까요?

SELECT *, price * quantity AS amount FROM sample34;

 

이렇게 SELECT 구에 ,로 구분해 복수의 식을 지정할 수 있으며 각각의 식에 별명을 붙일 수 있습니다. mysql에서는 별명을 중복해서 지정해도 에러는 발생하지 않지만 프로그래밍 언어에서 결괏값의 처리 방식에 따라 문제가 발생할 수 있기때문에 기본적으로 중복되지 않도록 지정합니다. 또한 별명을 한글로 지정하는 경우에는 여러 가지로 오작동하는 경우가 많으므로 더블쿼트(mysql에서는 백쿼트)로 둘러싸서 지정합니다.

 

SELECT *, price * quantity AS 금액 FROM sample34;

 

 

별명지정

 

더블쿼트로 둘러싸면 명령구문을 분석할 때 데이터베이스 객체의 이름이라고 간주합니다. 한편 신글쿼트로 둘러싸는 것은 문자열 상수입니다.

 

"sample21"  ,  "sample34"    ->   데이터베이스 객체명

'ABC'  ,  '한우주'   ->  문자열 상수

 

예약어와 같은 이름은 지정할 수 없지만 더블쿼트로 둘러싸서 지정하면 사용할 수 있습니다. 예를들어 SELECT는 예약어이므로

SELECT price * quantity AS SELECT FROM sample34;

이렇게 지정할 수 없지만

 

SELECT price * quantity AS "SELECT" FROM sample34;

이렇게 더블쿼트로 둘러싸면 문제없이 지정할 수 있습니다.

 

또한 이름을 붙일 때는 숫자로 시작할 수 없습니다. 수치형 상수를 명령 안에서 사용할 경우 쿼트로 묶지 않고 숫자만 입력합니다. 이때 이름이 숫자로 시작한다면 그것이 수치형 상수를 의미하는 것인지 데이터베이스 객체명을 의미하는 것인지 구별할 수 없기 때문입니다. 물론 이름이 예약어와 겹칠 때와 마찬가지로 더블쿼트로 묶으면 피할 수 있습니다.  그러나 MySQL의 경우 숫자로 시작하는 객체명이 허용됩니다. 다만 숫자만으로 구성되는 객체명은 허용되지 않습니다.

 

WHERE 구에서 연산

 

SELECT 구에 이어, WHERE 구에서의 연산 방법도 알아보겠습니다. 

 

 

여기서 합계가 2000이상인 행들만 검색해보겠습니다. 

SELECT *, price * quantity AS amount From sample34
WHERE amount >= 2000;

 

이렇게 실행하니 

ERROR 1054 (42S22): Unknown column 'amount' in 'where clause' 이런 오류가 나옵니다. amount라는 열이 없다고 하네요. 이유는 내부처리 순서에 있습니다. 데이터베이스 서버 내부에서 WHERE구 -> SELECT구 순으로 처리되기 때문입니다. 따라서 WHERE 구로 행이 조건에 일치하는지 아닌지를 먼저 조사한 후에 SELECT 구에 지정된 열을 선택해 결고로 반환하는 식으로 처리합니다. 별명은 SELECT 구문 내부 처리할 때 비로소 붙여집니다.

 

SELECT *, price * quantity AS amount From sample34
WHERE price * quantity >= 2000;

 

이렇게 WHERE 에서 별명대신 연산을하여 조건을 적용하면 위 처럼 조건에 맞는 행이 나옵니다.

 

 

ORDER BY 구에서 연산

 

ORDER BY 구에서도 연산을 할 수 있고 그 결괏값들을 정렬할 수 있습니다. 예를 들어 'price * quantity' 으로 금액을 계산해 값이 큰 순서대로 정렬해보겠습니다.

 

SELECT *, price * quantity AS amount From sample34
ORDER BY price * quantity DESC;

 

합계를 내림차순으로 정렬해보았습니다. 그런데 ORDER BY의 경우 내부처리에 가장 마지막 순서기 때문에

SELECT *, price * quantity AS amount From sample34
ORDER BY amount DESC;

 

이런식으로 SELECT 구에서 사용한 별명을 사용할 수 있습니다.

 

함수

 

연산자 외에도 함수를 사용해 연산할 수도 있습니다. 함수는 다음과 같은 문법으로 표기합니다.

 

함수명 (인수1, 인수2...)

 

연산자는 기호에 따라 연산 방법이 결정되는 반면 함수는 함수명에 따라 연산 방법이 결정됩니다. 또한 연산자는 좌우의 항목이 연산 대상이 되는반면 함수는 계산 대상을 인수로 지정합니다. 이때 인수는 함수명 뒤에 괄호로 묶어 표기합니다. 인수의 수나 구분 방법은 함수에 따라 다릅니다. 대부분의 함수는 1개 이상의 인수를 가지고 인수는 파라미터라고도 부릅니다. 함수 또한 결괏값을 반환하는데 이것을 '함수의 반환값'이라고 부릅니다.

 

간단한 예시로 나머지를 계산하는 연산자와 함수를 비교하여 설명하겠습니다.

 

10 % 3  ->  1

MOD(10,3) -> 1

 

% 연산자는 나머지를 뜻하므로 결과는 1이 됩니다. MOD함수는 함수명이 MOD이고 인수로는 나뉘어질 수와 나눌 수의 순으로 2개를 지정합니다. MOD함수 역시 나머지값을 반환합니다.

 

ROUND 함수

 

대표적인 산술함수로 ROUND 함수가 있는데 간단히 말하면 반올림하는 함수입니다.

 

여기 예시의 테이블이 있습니다. ROUND 함수를 이용해서 반올림 해보겠습니다.

 

 SELECT amount, round(amount) FROM sample341;

 

이렇게 반올림이 된 round(amount)열이 만들어진것을 볼 수 있습니다. ROUND 함수는 기본적으로 소수점 첫째 자리를 기준으로 반올림 합니다. ROUND 함수의 두 번째 인수로 반올림할 자릿수를 지정할 수 있습니다. 방금처럼 해당 인수를 생략하는 경우는 0으로 간주되어 소수점 첫째 자리를 반올림합니다. 1을 지정하면 소수점 둘째 자리를 반올림합니다.

 

 SELECT amount, round(amount,1) FROM sample341;

 

그 밖에도 반올림 외에 버림을 하는 경우도 있는데 이는 TRUNCATE함수로 계산할 수 있습니다.

 


참고자료 : <SQL 첫걸음(아사이 아츠시)>

'SQL' 카테고리의 다른 글

날짜 연산  (0) 2024.07.13
문자열 연산  (0) 2024.07.13
패턴 매칭 검색  (0) 2024.07.12
테이블 구조 참조  (0) 2024.07.11
데이터베이스와 SQL  (0) 2024.07.11