본문 바로가기

CS+/SQL

Mysql - 수치 연산, 문자 연산, IFNULL

select 구에서 열을 선택한다고 지난 번에 말했습니다. 

이번에는 열끼리의 연산을 통해 나오는 결과를 열로 선택해보겠습니다.

 

직접 예로 보겠습니다.

 

위 테이블을 쓰겠습니다.

 

1) 수치 연산을 통한 열 선택

 

금액이라는 열을 다른 열끼리의 연산을 통해 선택했습니다. 

 

as "원하는 열명"을 쓰면 그 이름으로 열이 생성되는데요. 이 때 키워드 as 는 안쓰고 그냥 띄워쓰기 한칸 하고 써도 됩니다. 

그리고 한글을 열명으로 하려면 더블 쿼트로 둘러싸주셔야 합니다. (위 쿼리 참고) 

 

하나 알고 계실건 Mysql 에서는 숫자로 시작하는 이름을 붙일 수 있습니다. 이 때 객체명을 숫자로만 해서는 안됩니다. 숫자+문자 이런 형식으로 객체명이 가능합니다. 하지만, Oracle 에서는 허용되지 않습니다. 

 

이번에는 where 구에서 조건에 수치 연산을 넣어보겠습니다. 

위에서 amount열을 where 구에서 쓰지 않았습니다. 해보시면 알겠지만 그럴 경우 에러가 발생합니다. 이는 내부처리 순서때문입니다. 

 

+) where 구와 select 구의 내부처리 순서

 

where 구에서 행 선택, select 구에서의 열 선택은 db 서버 내부에서 where 구 -> select 구 순서로 처리됩니다.

표준 SQL에서는 내부처리 순서가 따로 정해져 있지 않습니다. 하지마 WHERE 구 -> SELECT 구의 순서로 내부 처리를 하는 데이터베이스가 많습니다. 

 

+) NULL 연산 

 

SQL 에서는 NULL값이 0으로 처리되지 않습니다. 따라서, NULL+5 의 결괏값은 NULL입니다. 

즉, NULL 로 연산하면 결과는 NULL이 된다!

+) where 구, select 구, order by 의 내부처리 순서

where 구는 select 구보다 먼저 처리되기에 여기서 생긴 별명을 쓰지 못했습니다. 하지만...

order by 는 다릅니다. select 구보다 나중에 처리되기에 select 구에서 생긴 열의 이름을 쓸 수 있습니다. 

 

where 구 -> select 구 -> order by 구

의 순서로 내부처리가 이루어집니다. 내부 처리순서를 알고 있습니다. 각 구에서 select에서 쓰인 별명을 쓸 지 말지 알 수 있을겁니다. 그러니 내부처리 순서를 꼭 기어해주세요!

 

에러 발생하는 이유 이해되시죠? 

2) 문자 연산(concat, substring, left,right) 

위 테이블을 통해서 concat 함수를 사용해보겠습니다. 

 

concat 함수는 단순합니다. 해당 문자열 값들을 붙여서 표기해줍니다. 

 

문자추출 함수들을 살펴보겠습니다. 

 

substring 은 특정 칼럼을 선택 후, 거기서 시작위치를 잡고, 원하는 길이만큼 추출해주는 함수입니다. 

 

left 와 right 함수는 각각 왼쪽 끝, 오른쪽 끝에서 원하는 길이만큼 추출해줍니다. 

 

이번에는 공백제거함수인 TRIM을 보겠습니다.

 

결과 표기를 보면 공백의 제거 유무가 느껴지시나요?

좌측 공백만 제거할 때는 LTRIM, 우측 공백만 제거할 때는 RTRIM 을 써주시면 됩니다. 

 

3) IFNULL - 중요함!

NULL 값이 있을 때 출력을 어떻게 할 지를 정해주는 함수라고 생각하시면 됩니다. 

 

MY SQL, MS-SQL 에서는 

IFNULL(필드, 처리할값) 으로 입력하면 됩니다.

 

ORACLE에서는

NVL(필드,처리할값)으로 입력합니다. 

 

문제를 보겠습니다. 

 

NULL 값을 'No name'으로 표기해달라고 하네요. sql 문제 푸시면 많이 만나게 되는 문제입니다.

 

이 때, IFNULL함수를 통해서 해결할 수 있습니다.

ifnull(NAME,'No name')

NULL이 아니면 NAME 열 그대로 출력해! 근데 NULL이라면 'No name'으로 출력해줘!

로 이해하시면 됩니다. 

 

sql 문제 풀 때 항상 나오니깐 기억해주세요!