ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SQL 연산
    Database 2021. 3. 2. 15:20
    728x90

    사칙 연산

    덧셈 , 뺄셈, 곱셉, 나눗셈 + 나눗셈의 나머지 크게 이 두가지를 다룬다고 생각하면 된다.

    당연히 수학에서와 동일하게 연산자의 우선순위가 있다.


    SELECT 구로 연산하기

    select 구에는 열명을 지정한다 라고 알아보았었다. 이외에도 여러가지 "식"을 기술할 수 있다.

    SELECT 식1, 식2... FROM 테이블명;

    아래의 가격 테이블로 예를 들어보자.

    price * 100 연산을 진행해보자

    100이라는 값 대신 열을 지정하여 연산할수도있다.

    (price * quantity)

    SELECT price * 100 FROM prices;
    
    SELECT *, price * 100 FROM prices; 전체 열 추가 지정


    열의 별명 지정하기

    위 예제에서 price * 100이라는 열의 별명을 지정해보자

    별명은 예약어 AS를 이용해 지정하며, 생략이 가능하다.

    SELECT *, price * 100 AS amount FROM pirces;
    
    SELECT *, price * 100 amount FROM pirces; # AS 생략가능

     

    별명 지정

    별명으로는 영어, 숫자, 한글 등으로 지정할 수 있으며, 예약어(as, select, where)과 같은 명으로는 지정할 수 없다.

    (더블쿼트 ""로 지정할 수 있으나 오작동을 유발하는 경우가 있어 예약어와 같은 명으로 지정하지 않는다.)

    단, 한글로 지정하는 경우 더클쿼트("")로 감싸줘야 한다.

    데이터베이스 객체의 이름에 ASCII문자 이외의 것을 포함할때는 더블쿼트로 감싸줘야 한다.

    더클쿼트로 지정한 것은 데이터베이스 객체로 간주하며

    싱글쿼트로 지정한 것은 문자열 상수로 간주한다.

    "ABC"
    
    'sample24'

     

    이름을 지정하는 경우 숫자로 시작할 수 없다.

    숫자로 지정할 경우 

    데이터베이스 객체인지, 수치형 상수인지 구별할 수 없다.

    따라서, 데이터베이스 객체는 숫자로 시작해서는 안된다라는 제약이 생겼다.

    물론 더블쿼트로 묶으면 지정할 수는 있지만 (숫자만을 이용해 지정하지 않도록 하자)


    WHERE 구 연산하기

    위의 예제에서 사용한 조건식을 활용해 

    where 구에 pirce * 100 > 3000000 조건식을 걸어 보자.

    select *, price * 100 as amount from prices where price * 100 > 3000000;

     

    한가지 이상한점이 보이지 않은가?

    앞에서 amount라는 열을 하나 지정해줬는데 왜 price * 100 을 준것일까

    아래와 같이 다시 입력해보자

    select *, price * 100 as amount from prices where amount > 3000000;

    이 처럼 에러가 발생하는데

    왜 에러가 발생하는 걸까?

    이유는 데이터베이스 서버 내부에서 SELECT 구와 WHERE 구의 처리 순서의 차이 때문이다.

    SELECT가 먼저 처리되는 것이 아니고 WHERE이 먼저 처리된다.

    따라서, WHERE 입장에서는 amount라는 열을 찾을 수 없는 상태이므로 에러가 발생하게 되는것이다.

    Database 처리 순서
    
    WHERE 구 ==> SELECT 구

     

    표준 SQL에서는 내부처리 순서가 따로 정해져있지 않지만, 위와 같은 순서로 처리하는 데이터베이스가 많다고 한다.

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

    SELECT 구에서 지정한 별명은 WHERE 구에서 사용 할 수 없다.

    ORDER BY 구 연산하기

    내림차순 정렬하기

    select *, price * 100 as amount from prices order by amount DESC;

     

    한가지 이상한점이 또 보이지 않는가?

    왜 order by에서는 amount를 사용할 수 있을까? 

    위처럼 데이터베이스 내부 처리 순서 때문이다.

    Database 처리 순서
    
    WHERE 구 ==> SELECT 구 ==> ORDER BY 구
    SELECT 구에서 지정한 별명은 ORDER BY 구에서 사용이 가능하다.

    NULL 연산

    C 또는 PHP에서는 NULL이 유효한 값이 없는 상태로 0 으로 간주된다고 한다.

    하지만, SQL에서는 NULL 값은 0으로 처리 되지 않는다.

    NULL을 연산하면 결과는 NULL이다.

    1 + NULL = NULL
    NULL + 1 = NULL
    1 + 2 * NULL = NULL
    1/NULL = NULL

    함수 ( Ex : MOD ) 

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

    함수는 계산 대상을 인수로 지정한다. 인수는 함수명 뒤에 괄호로 묶어 표기하며 대부분의 함수는 1개 이상의 인수를 갖는다. 

    이러한 인수를 받아 함수의 결과값이 반환된다. 이를 함수의 반환값이라고도 부른다.

     

    크게 어렵게 생각할 필요 없이

    +,- 같은 연산자와 함수 둘 다 같다고 표현 할 수 있다. 단지 표기 방법만 다를 뿐.

    나머지를 계산하는 % 연산자와 MOD 함수를 비교해보자.

    MOD는 MySQL과 Oracle 등에서 사용할 수 있는 함수로 인수는 나뉘어질 수와 나눌 수 2개를 받는다.

    MOD(나뉘어질 수, 나눌 수)
    MOD(분자, 분모)
    10%3 => 1
    MOD(10,3) => 1

     

    실제로 연산자와 함수가 같다는 의미는 아니지만 SQL에서는 같다고 생각해도 무방할 것이다.

    단지 표기 방법만 다를뿐이라는 걸 기억하자.


    ROUND 함수

    지정한 자리에서 반올림하는 함수이다. 반올림할 자리 값은 생략할 수 있으며 기본값은 0이다.

    select *, round(price) from prices;

     

    아래와 같은 자리수를 지정하여 반올림하려하는 자리수를 지정할 수 있으며

    Decimal, interger 필드 모두 사용이 가능하다.

    https://thebook.io/006977/ch04/02/02/01/

     

    1000단위 반올림하기 예제

    select *, round(price, -4) from prices;

     

    출처 :

    출처 : SQL 첫걸음/ 아사이 아츠시 지음/ 한빛미디어

    thebook.io/006977/ch04/02/02/01/

    728x90

    'Database' 카테고리의 다른 글

    SQL 날짜연산  (0) 2021.03.17
    SQL 문자열 연산  (0) 2021.03.08
    SQL 정렬  (0) 2021.02.22
    데이터베이스와 SQL 기초  (0) 2021.02.18
    데이터 테이블 작성 Tip  (0) 2020.11.24
Designed by Tistory.