수치 연산

유석현(SeokHyun Yu)·2022년 8월 8일
0

SQL

목록 보기
12/45
post-thumbnail

서론

어떤 계산을 할지는 연산자를 이용해 지정한다.

WHERE 구에서 조건을 지정할 때 사용했던 = 역시 연산자 중의 하나이다.

여기에서는 수치를 연산하는 산술 연산에 관해 설명하겠다.


1. 사칙 연산

산술 연산이라고 해도 그리 어렵지 않다.

덧셈(+), 뺄셈(-), 곱셈(*), 나눗셈(/)의 사칙 연산과 나눗셈의 나머지(%), 크게 이 두 가지를 기본적으로 익혀두면 된다.


2. SELECT 구로 연산하기

지금까지는 'SELECT 구에는 열명을 지정한다'라고 배웠지만 이 외에도 여러 가지 을 기술할 수 있다.

식을 기술할 수 있다는 것은 '명령이 실행될 때 연산을 할 수 있다'는 것을 의미한다.

SELECT *, price * quantity FROM sample_table;

위의 명령을 실행하면 price 열과 quantity 열이 곱해진 값이 새로운 'price * quantity' 라는 열에 담겨 출력된다.


3. 열의 별명

SELECT 결과에서 'price * quantity'와 같이 열 이름이 길고 알아보기 어려운 경우는 별명을 붙여 열명을 재지정 할 수 있다.

예를 들어 price * quantity에 amount라는 별명을 붙이고 싶다면 다음과 같이 실행하면 된다.

SELECT *, price * quantity AS amount FROM sample_table;

별명은 예약어 AS를 사용해 지정한다.

AS는 생략할 수 있어서 'SELECT price * quantity amount'라고 써도 무방하다.

에일리어스(alias)라고도 불리는 별명은 영어, 숫자, 한글 등으로 지정할 수 있다.

단, 별명을 한글로 지정하는 경우에는 여러 가지로 오작동하는 경우가 많으므로 더블쿼트(MySQL에서는 백쿼트)로 둘러싸서 지정한다.

이 룰은 데이터베이스 객체의 이름에 ASCII 문자 이외의 것을 사용할 경우에 해당한다.

SELECT prict * quantity "금액" FROM sample_table;

더블쿼트로 둘러싸면 명령구문을 분석할 때 데이터베이스 객체의 이름이라고 간주한다.

한편 싱글쿼트로 둘러싸는 것은 문자열 상수이다.

앞서 '예약어와 같은 이름은 데이터베이스 객체의 이름으로 지정할 수 없다'고 설명했지만 더블쿼트로 둘러싸서 지정하면 사용할 수 있다.


이름을 붙일 때는 숫자로 시작할 수 없다.

물론 이름이 예약어와 겹칠 때와 마찬가지로 더블쿼트로 묶으면 피할 수 있다.

MySQL에서는 숫자로 시작하는 객체명이 허용된다.

다만 숫자만으로 구성되는 객체명은 허용되지 않는다.

데이터베이스 제품에 따라 미묘한 차이가 있으니 주의하자.

더블쿼트로 둘러싸면 객체명으로 간주하는 룰은 표준 SQL에 규정되어 있다.


4. WHERE 구에서 연산하기

SELECT 구에 이어, 지금부터는 WHERE 구에서의 연산 방법을 알아보자.

위에서 사용했던 테이블을 이용해 'price * quantity'으로 금액을 계산하여 8000원 이상에 해당하는 행을 검색해보겠다.

SELECT *, price * quantity AS amount FROM sample_table WHERE price * quantity >= 8000;

WHERE 구의 조건식은 'price * quantity >= 8000'이다.

price * quantity로 금액을 계산해 그 값이 8000 이상인 행을 검색하라는 뜻이다.

그 결과 금액이 8000원 이상인 행은 id가 2인 행 뿐이었다.

여기에서 price * quantity를 계산할 때 SELECT 구에서 amount라는 별명을 붙였으므로 WHERE 구에도 amount로 지정하면 되지 않을까 생각될 수도 있다.

하지만 실제로 다음과 같이 SELECT 명령을 실행해 보면 amount라는 열은 존재하지 않는다는 에러가 발생한다.

그 이유를 지금부터 설명하겠다.

SELECT *, price * quantity AS amount FROM sample_table WHERE amount >= 8000;

WHERESELECT는 데이터베이스 서버 내부에서 'WHERE 구 => SELECT 구'의 순서로 처리된다.

서버 내부의 처리 순서까지 고려할 필요가 있는 것인지 의문을 가질 수도 있다.

하지만 SELECT 명령을 이해하기 위해서는 중요한 부분이므로 서버의 처리순서와 관련이 있다는 것만이라도 알아두기를 바란다.

표준 SQL에는 내부처리 순서가 따로 정해져 있지 않다.

하지만 'WHERE 구 => SELECT 구'의 순서로 내부 처리를 하는 데이터베이스가 대부분이다.

따라서 WHERE 구로 행이 조건에 일치하는지 아닌지를 먼저 조사한 후에 SELECT 구에 지정된 열을 선택해 결과를 반환하는 식으로 처리한다

별명SELECT 구문 내부를 처리할 때 비로소 붙여진다.

즉, WHERE 구의 처리는 SELECT 구보다 선행되므로 WHERE 구에서 사용한 별칭은 아직 내부적으로 지정되지 않은 상태가 되어 에러가 발생하는 것이다.


5. NULL값의 연산

NULL 값을 이용해 사칙연산을 하면 결과는 모두 NULL이다.

다음 연산결과는 모두 NULL이 된다.

  • NULL + 1

  • NULL - 1

  • NULL * 1

  • NULL / 1


6. ORDER BY 구에서 연산하기

ORDER BY 구에서도 연산할 수 있고 그 결괏값들을 정렬할 수 있다.

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

그런데 ORDER BY는 서버에서 내부적으로 가장 나중에 처리된다.

즉, SELECT 구보다 나중에 처리되기 때문에 SELECT 구에서 지정한 별명을 ORDER BY에서도 사용할 수 있다.

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

이처럼 SELECT 구에서 지정한 별명을 마치 그런 열이 존재하는 것처럼 ORDER BY 구에서 사용할 수 있다.

profile
Backend Engineer

0개의 댓글