231102 TIL #232 SQL #7 COALESCE / CAST

김춘복·2023년 11월 1일
0

TIL : Today I Learned

목록 보기
232/543
post-custom-banner

Today I Learned

저번에 면접봤던 S모 기업 필기에 다시 합격해 다시 면접을 볼 기회가 주어졌다. 저번엔 아쉽게 안되었으니 이번엔 이 악물고 준비해봐야 겠다. 오늘은 7장 NULL대응과 CAST 데이터 형변환을 공부했다.


COALESCE

코어레스. NULL을 다른 값으로 변환하기 위해 CASE나 IF를 쓰지 않고 더 간단하게 변환해주는 함수

  • 사용법
COALESCE(인수1, 인수2, ..., 인수N)

인수1이 NULL이 아니면 인수1을 반환한다. NULL이면 인수2가 NULL이 아니면 인수2를 반환한다.
NULL이면 .... 인수N이 NULL이면 NULL을 반환한다.

  • 인수의 왼쪽부터 순서대로 처음에 NULL이 아닌 값이 나오면 그걸 반환하면 된다.
    모두 NULL이면 NULL을 반환한다.

  • 특정 컬럼의 레코드가 NULLl일때 그 값을 0으로 변환하려면 아래처럼 쓰면 된다.

COALESCE(컬럼명,0)
  • 활용 예시
    평균을 구할 때 null값을 0으로 처리
    그냥 평균을 쓰면 null값은 제외되어 1.75가 되지만 COALESCE를 사용하면 0으로 처리해 1.4로 반환
SELECT AVG(COALESCE(delivery_time,0))
FROM delivery;

IFNULL

인수가 2개인 COALESCE라고 생각하면 된다.

  • 사용법
IFNULL(인수1,인수2)
  • 인수1이 NULL이아니면 인수1을, NULL이면 인수2를 반환한다.

  • IFNULL(컬럼명,0)으로 활용하면 편리하다.

NULLIF

다른 값을 NULL로 바꿔놓는 함수

  • 사용법
NULLIF(인수1, 인수2)
  • 인수1 == 인수2 면 NULL을 반환한다. 인수1 != 인수2면 인수1을 그대로 반환한다.

  • 특정 컬럼의 역수를 구할 때 레코드가 0이면 분모로 들어갈 수 없으므로 아래처럼 활용한다.

SELECT 1 / NULLIF(컬럼명,0)
FROM 테이블명;

데이터 형변환(캐스트)

SELECT
 123 + 1,
 '123' + 1,
 '123' + '1';
  • 문자열과 정수의 합이기때문에 성립하지 않아야하지만 위의 결과는 모두 124이다.

  • + 연산자에서는 변환할 수 있는 건 자동으로 데이터 형변환이 일어나는데 이를 캐스트라 한다.

CAST

자동 형변환이 아닌 명시적인 형변환은 CAST 함수를 사용하면 된다.

CAST(변환하려는 데이터 AS 변환 후 데이터형)
  • 문자열 -> 정수형 변환은 SIGNED를 사용한다.
SELECT CAST('123' AS SIGNED) + 1;

변환 가능한 데이터형 목록

사용법의미
BINARYBINARY, BINARY(a)바이너리, a바이트의 바이너리
CHARCHAR, CHAR(a)문자, a문자
DATEDATE날짜
DATETIMEDATETIME일시
TIMETIME시간
DECIMALDECIMAL, DECIMAL(a), DECIMAL(a,b)소수, 전체가 a자리의 소수, 전체가 a자릿수면서 소수부가 b자릿수의 소수
SIGNEDSIGNED, SIGNED INTEGER부호 있는 정수
UNSIGNEDUNSIGNED, UNSIGNED INTEGER부호 없는 정수
  • 예시
SELECT
 CAST('123.45' AS SIGNED),
 CAST('123.45' AS DECIMAL(5,1));

  • 예시2(문자열->정수 랭킹)
    rank_value 컬럼의 데이터 형이 VARCHAR(2)일 때, 오름차순으로 정렬 시 20이 앞에 2때문에 맨 뒤로 가지 않고 2번째로 오게 된다.
SELECT *
FROM ranking
ORDER BY rank_value;

이를 고치려면 CAST를 써서 SIGNED 정수로 변환하면 된다.

SELECT *
FROM ranking
ORDER BY CAST(rank_value AS SIGNED);

profile
Backend Dev / Data Engineer
post-custom-banner

0개의 댓글