9.8 KiB
9.8 KiB
12강. 수치 연산
산술연산
+ - * / % MOD
- 어떤 계산을 할지는 연산자를 이용해 지정한다.
WHERE구에서 조건을 지정할 때 사용했던=역시 연산자의 하나이다.
1. 사칙연산
- 덧셈, 뺄셈, 곱셈, 나눗셈의 사칙 연산과 나눗셈의 나머지
| 연산자 | 연산 | 예 |
|---|---|---|
| + | 덧셈(가산) | 1+2 -> 3 |
| - | 뺄셈(감산) | 1-2 -> -1 |
| * | 곱셈(승산) | 1*2 -> 2 |
| / | 나눗셈(제산) | 1/2 -> 0.5 |
| % | 나머지 | 1%2 -> 1 |
- 곱셈은
x기호를 사용하지만 컴퓨터 언어에서는x기호가 존재하지 않아 대신애스터리스크(*)를 사용한다. *는모든 열을 의미하는 메타 문자이지만 연산자로도 사용할 수 있다.- 컴퓨터 언어에서는 나눗셈 기호로
슬래시(/)를 사용한다. - 나머지는 나눗셈을 한 후의 나머지를 계산하는 것으로
%기호를 사용한다. - 나머지 연산의 결과는 몫이 정수값이 되도록 계산하는 것이 특징이다.
- 제품에 따라서는
%대신MOD함수를 사용하는 경우도 있다.
연산자를 사용해 여러 가지 연산을 할 수 있다!
연산자의 우선순위
| 우선순위 | 연산자 |
|---|---|
| 1 | * / % |
| 2 | + - |
- 곱셈, 나눗셈, 나머지 그룹과 덧셈, 뺄셈 그룹으로 나뉜다.
- 같은 그룹 내 연산자의 우선 순위는 동일하다.
- 계산 순서는 연산자에 따라 관계없는 경우도 있지만 기본적으로 왼쪽에서 오른쪽으로 진행된다.
- 우선순위가 같은 연산자들끼리 연산하는 경우는 문제가 되지 않지만 우선순위가 다른 연산자들이 섞여있는 경우는 우선순위가 높은 쪽이 먼저 계산된다.
SQL명령에서는 여러 부분에서 산술 연산자를 사용해 연산할 수 있다.SELECT구나WHERE구 안에서도 연산할 수 있다.
2. SELECT 구로 연산하기
SELECT구에는 열명 외에도 여러 가지 식을 기술할 수 있다.- 이때의 식은 열명, 연산자, 상수로 구성된다.
SELECT 구
SELECT 식 1, 식 2 ... FROM 테이블명
- 식을 기술할 수 있다는 건 명령이 실행될 때 연산을 할 수 있다는 것을 의미한다.
SELECT *, price * quantity FROM sample34;
3. 열의 별명
- 만약 열 이름이 길고 알아보기 어려운 경우는 별명을 붙여 열명을 재지정할 수 있다.
SELECT 구에서 식에 별명 붙이기
SELECT *, price * quantity AS amount FROM sample34;
- 별명은
예약어(AS)를 사용해 지정한다. SELECT구에서는콤마(,)로 구분해 복수의 식을 지정할 수 있으며, 각각의 식에 별명을 붙일 수 있다.- 별명을 지정할 때는 기본적으로 중복되지 않게 지정해야 한다(프로그래밍 언어에서 결괏값의 처리 방식에 따라 문제가 발생할 수 있다).
- 키워드
AS는 생략할 수 있다.SELECT price * quantity amount라고 써도 무방하다. 에일리어스(alias)라고도 불리는 별명은 영어, 숫자, 한글 등으로 지정할 수 있다.- 단, 별명을 한글로 지정하는 경우에는 여러 가지로 오작동하는 경우가 많으므로
더블쿼트(MySQL에서는 백쿼트)로 둘러싸서 지정한다. - 이 룰은 데이터베이스 객체의 이름에
ASCII문자 이외의 것을 사용할 경우에 해당한다.
SELECT price * quantity "금액" FROM sample34;
이름에 ASCII 문자 이외의 것을 포함할 경우는 더블쿼트로 둘러싸서 지정한다!
- 더블쿼트로 둘러싸면 명령구문을 분석할 때 데이터베이스 객체의 이름이라고 간주한다.
- 싱글쿼트로 둘러싸는 것은 문자열 상수이다.
- 별명을
예약어와 같은 이름은 지정할 수 없다고 했지만 더블쿼트로 둘러싸서 지정하면 사용할 수 있다.
SELECT price * quantity AS "SELECT" FROM sample34;
- 이름을 붙일 때는 숫자로 시작할 수 없다.
- 수치형 상수를 명령 안에서 사용할 경우에는 쿼트로 묶지 않고 숫자만 입력한다.
- 이때 이름이 숫자로 시작한다면 그것이 수치형 상수를 의미하는 것인지 데이터베이스 객체명을 의미하는 것인지 구별할 수 없다.
- 그에 따라 데이터베이스 객체명은
숫자로 시작해서는 안 된다. - 물론 이름이 예약어와 겹칠 때와 마찬가지로 더블쿼트로 묶으면 피할 수 있다.
MySQL에서는 숫자로 시작하는 객체명이 허용된다.- 다만 숫자만으로 구성되는 객체명은 허용되지 않는다.
- 한편
Oracle에서는 숫자로 시작하는 이름은 허용되지 않는다. - 더블쿼트로 둘러싸면 객체명으로 간주하는 룰은 표준 SQL에 규정되어 있다.
이름을 지정하는 경우 숫자로 시작되지 않도록 한다!
4. WHERE 구에서 연산하기
SELECT구에 이어, 지금부터는WHERE구에서의 연산 또한 가능하다.WHERE구의 조건식은price * quantity일 때,price * quantity로 금액을 계산해 그 값이 2000 이상인 행을 검색하라는 뜻이다.- 여기서
price * quantity를 계산할 때SELECT구에서amount라는 별명을 붙였으므로WHERE구에도amount로 지정하면 될 것 같지만 실제로SELECT명령을 실행해보면amount라는 열은 존재하지 않는다는 에러가 발생한다.
SELECT *, price * quantity AS amount FROM sample34
WHERE amount >= 2000;
WHERE 구와 SELECT 구의 내부처리 순서
WHERE구에서의 행 선택,SELECT구에서의 열 선택은 데이터베이스 서버 내부에서WHERE 구 -> SELECT 구의 순서로 처리된다.- 표준 SQL에는 내부 처리 순서가 따로 정해져있지 않다. 하지만
WHERE 구 -> SELECT 구순서로 내부처리를 하는 데이터베이스가 많다. - 따라서
WHERE구로 행이 조건에 일치하는지 아닌지를 먼저 조사한 후에SELECT구에 지정된 열을 선택해 결과로 반환하는 식으로 처리한다. - 별명은
SELECT구문을 내부 처리할 때 비로소 붙여진다. - 즉,
WHERE구의 처리는SELECT구보다 선행되므로WHERE구에서 사용한 별칭은 아직 내부적으로 지정되지 않은 상태가 되어 에러가 발생하는 것이다.
SELECT 구에서 지정한 별명은 WHERE 구 안에서 사용할 수 없다!
5. NULL 값의 연산
NULL값을 이용해NULL + 1과 같은 연산을 하면 어떻게 될까요?- SQL에서는
NULL값이 0으로 처리되지 않는다. - 즉,
NULL + 1의 결괏값은 1이 아닌NULL이다. - 나눗셈을 할때도
NULL이 0으로 처리되지 않는다는 것을 알 수 있다. - 따라서
1 / NULL을 계산해도NULL이 0으로 처리되지 않아 에러가 발생하지 않고 결과는NULL이 된다.
NULL로 연산하면 결과는 NULL이 된다!
6. ORDER BY 구에서 연산하기
ORDER BY구에서도 연산할 수 있고 그 결괏값들을 정렬할 수 있다.
SELECT *, price * quantity AS amount FROM sample34 ORDER BY price * quantity DESC;
- 위 명령어를 실행하면
amount값이 내림차순으로 정렬된다. ORDER BY는 서버에서 내부적으로 가장 나중에 처리된다.- 즉,
SELECT구보다 나중에 처리되기 때문에SELECT구에서 지정한 별명을ORDER BY에서도 사용할 수 있다.
WHERE 구 -> SELECT 구 -> ORDER BY 구
ORDER BY 구에서는 SELECT 구에서 지정한 별명을 사용할 수 있다!
7. 함수
- 연산자 외에 함수를 사용해 연산할 수도 있다.
- 함수는 다음과 같은 문법으로 표기한다.
함수
함수명 (인수1, 인수2 ...)
- 연산자는 기호에 따라 연산 방법이 결정된다. 한편 함수는 함수명에 따라 연산 방법이 결정된다.
- 연산자는 좌우의 항목이 연산 대상이 된다.
- 함수는 계산 대상을 인수로 지정한다.
- 이때 인수는 함수명 뒤에 괄호로 묶어 표기한다.
- 인수의 수나 구분 방법은 함수에 따라 다르며, 대부분의 함수는 1개 이상의 인수를 가진다.
- 인수는 파라미터라고도 부르며, 연산자가 그러하듯 함수 역시 결괏값을 반환한다.
- 이를
함수의 반환값이라고 부른다.
10 % 3 -> 1
MOD(10, 3) -> 1
함수도 연산자도 표기 방법이 다를 뿐, 같은 것이다!
8. ROUND 함수
- 반올림을 하는데 이때 사용되는 것이
ROUND함수이다.
ROUND로 반올림하기
SELECT amount, ROUND(amount) FROM sample34;
INTEGER형의 경우는 정수밖에 저장할 수 없기 때문에 소수점이 포함되는 열은DECIMAL형으로 정의한다.DECIMAL형은 열을 정의할 때 정수부와 소수부의 자릿수를 지정할 수 있는 자료형이다. 다시 말해 소수점을 포함하는 수치를 저장하는 자료형이다.
반올림 자릿수 지정
ROUND함수는 기본적으로 소수점 첫째 자리를 기준으로 반올림한 값을 반환한다.- 이때
ROUND함수의 두 번째 인수로 반올림할 자릿수를 지정할 수 있다. - 해당 인수를 생략하는 경우는 0으로 간주되어, 소수점 첫째 자리를 반올림한다. 1을 지정하면 소수점 둘째 자리를 반올림한다.
SELECT amount, ROUND(amount, 1) FROM sample341;
- 음수로 지정해 정수부의 반올림할 자릿수도 지정할 수 있다.
-1을 지정하면 1단위,-2를 지정하면 10단위를 반올림할 수 있다.- 그 밖에도 반올림 외에
버림을 하는 경우도 있는데 이는TRUNCATE함수로 계산할 수 있다. - 이 외에도 다양한 함수가 존재한다(
SIN,COS,SQRT,LOG,SUM등).