본문 바로가기
공부/mysql

Mysql 기본명령어 8 (수치 연산)

by signature95 2022. 1. 27.
728x90
반응형

이전 포스트에 이어서 작성하는 내용입니다.

2022.01.27 - [공부/mysql] - Mysql 기본명령어 7 (LIMIT, OFFSET)

 

Mysql 기본명령어 7 (LIMIT, OFFSET)

이전 포스트에 이어서 작성하는 내용입니다. 2022.01.25 - [공부/mysql] - Mysql 기본명령어 6 (ORDER BY) Mysql 기본명령어 6 (ORDER BY) 이전 포스트에 이어서 작성하는 내용입니다. 2022.01.25 - [공부/mysql]..

signature95.tistory.com

 

이번에는 SQL을 이용한 기본적인 연산을 해보도록 하겠습니다.

 

산술 연산은 다음과 같습니다.

연산자 연산 수행 내용 예시
+ 덧셈 (2순위) 1+2 -> 3
- 뺄셈 (2순위) 2-1 -> 1
* 곱셈 (1순위) 1*2 -> 2
/ 나눗셈 (1순위) 1/2 -> 0.5
% or MOD 나머지 (1순위) 3 % 2 -> 1

 

위의 연산자는 SELECT, WHERE 명령어 내에서도 수행이 가능합니다.

 

SELECT 식1, 식2 … FROM table_name;

SELECT * FROM table_name WHERE 식1, 식2 … ;

 

그렇다면 예시 테이블을 먼저 살펴보겠습니다.

가격과 재고 데이터가 태이블 내에 있는 것을 확인할 수 있습니다.

 

그렇다면 총액을 한번 계산해보도록 하겠습니다. (총액 = 가격 * 재고)

 

SELECT price * quantity FROM sample34;

여기에는 총액만 출력된 것을 볼 수 있습니다. 모든 테이블을 보면서 총액까지 확인하고 싶다면, 명령어를 다음과 같이 입력하면 됩니다.

 

SELECT *, price * quantity FROM sample34;

이런 형태로 출력되게 됩니다. 

그런데 가격 * 재고같이 2개의 데이터 열을 곱하는 경우엔 큰 문제가 되지 않지만 여러개의 열을 통해 계산하게 된다면, 해당 열의 이름은 길어질 뿐더러 가독성도 떨어지게 됩니다.

 

따라서 이번에는 해당 열의 이름까지 지정해주는 작업을 해보도록 합니다.

 

SELECT *, price * quantity AS amount FROM sample34;

amount로 열의 이름을 지정하니 더 직관적으로 볼 수 있을 것입니다. 물론 alias(별칭) amount가 기존 데이터 열의 이름과 중복되더라도 에러는 발생하지 않지만, 파이썬 등 프로그래밍 언어에서는 오류가 발생할 수 있기에 이는 지양하는 편이 좋습니다. 

 

또한, AS 명령어를 생략해도 동일한 결과를 가져옵니다.

 

만약 amount 대신, 한글명으로 결과 값을 출력하게 된다면 오류가 발생할 수 있습니다. 따라서 이때는 더블쿼트(" ")로  문자열을 둘러싸서 입력하면 됩니다.

 

싱글 쿼트 (' ')로 둘러싸는 경우는 문자열 상수를 사용할 때 합니다. 하지만 데이터베이스의 객체명을 지정하는 경우 (위의 amount 같은 열의 이름을 설정해주는 경우)에는 더블 쿼트를 사용해야 하는 것을 명심하시면 됩니다. 

 

다음 예시를 살펴봅시다.

  1. 데이터베이스 객체 명을 지정할 때, 더블 쿼트 없이 숫자만 입력하는 경우에는 문법 에러가 발생합니다.
  2. 숫자로만 입력하는 경우에는 더블쿼트로 묶으면 출력이 가능합니다.
  3. 마지막으로 숫자로 시작하는 객체열을 지정할 때도 무리없이 출력이 가능합니다.

 

이번에는 WHERE 구문에서 연산을 해보도록 하겟습니다.

 

명령어는 위와 동일하게 amount를 출력하지만 조건을 부여해서 시행해보겠습니다.

 

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

위 명령어와 같이 SELECT *, price * quantity AS amount FROM sample34 WHERE amount >= 2000; 로 입력하게 되면 에러가 발생합니다. 

 

서버 내에서 WHERE구는 SELECT보다 뒤에 위치하지만, 처리 순서는 WHERE 다음 SELECT가 수행됩니다. 따라서 AS amount부분이 SELECT가 처리될 때 시행됩니다. 그렇기 때문에 WHERE에서는 amount를 찾지 못하게 되고 에러가 발생하는 것입니다. 물론 이 순서는 표준 SQL에서 다루진 않지만, 대부분의 데이터베이스가 이런 순서를 따르는 것을 명심하시길 바랍니다.

 

참고)

NULL 데이터의 경우 연산하게 된다면 일반적으로는 연산 값이 그대로 입력되겠다 생각하지만 SQL에서는 NULL값에 어떤 연산을 취해도 NULL 데이터가 반환됩니다. 

 

그러면 이번에는 ORDER BY를 사용하여 amount를 내림차순 정렬하여 결과를 뽑아보도록 하겠습니다.

 

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

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

ORDER BY는 SELECT 명령어 뒤에 수행됩니다. 따라서 amount를 ORDER BY에 넣어도 동일한 결과 값을 출력하게 됩니다. 

 

즉 순서를 정리하면 다음과 같습니다.

 

WHERE -> SELECT(별칭 지정) -> ORDER BY

 

 

그럼 이번에는 amount가 1000원을 넘는 것을 내림차순으로 뽑아보도록 하겠습니다.

 

SELECT *, price * quantity AS amount FROM sample34 WHERE price * quantity > 1000 ORDER BY amount DESC;

추가로 연산자가 아닌 함수를 형성해도 연산이 가능합니다.

 

위에서 잠깐 언급한 MOD를 예시로 보겠습니다. (MOD = %, 나머지)

 

14 % 8 -> 6 의 형태로 반환됩니다.

MOD(14, 8) -> 6 과 같이 % 연산자를 MOD함수로 수행할 수도 있는 것입니다.

 

부가적으로 ROUND에 대해서도 살펴보도록 하겠습니다.

 

ROUND는 python에도 존재하는 함수로 반올림을 수행합니다.

 

# round(variable or float, number of decimal places)
round(10.145, 2)

>>>

10.15

ROUND는 SQL에서도 동일하게 수행됩니다.

 

먼저 테이블은 다음과 같습니다.

여기서 amount가 소수점 둘째 자리까지 있는 것을 볼 수 있는데요, 이것을 소숫점 1째 자리까지 출력해보겠습니다.

 

SELECT *, ROUND(amount, 1) FROM sample341;

물론 AS를 이용하여 별칭을 지정해줄 수도 있습니다.

 

소수점 반올림이 아닌 100의 자리 반올림을 하는 방법은 -3을 입력하면 됩니다.

기본값인 소수점 1째자리는 ROUND(amount, 0)이고 소수점 2째 자리 반올림은 1을 입력하는 것과 같이 1의자리 반올림은 -1이고 10은 -2 … 형태로 입력해주면 되는 것입니다.

 

예시를 보겠습니다.

 

SELECT *, ROUND(amount, -3) AS "반올림 값" FROM sample341;

덧붙여 반올림이 아닌 버림의 경우에는 TRUNCATE 함수를 이용하면 동일한 형식으로 명령을 수행합니다.

이런 ROUND외에도 SIN, COS 같은 삼각함수 혹은 루트(SQRT), 로그값 (LOG) 등 다양한 함수가 존재합니다. 

728x90

댓글