본문 바로가기
데이터 모델과 SQL

[SQL 이해하기] - 8.2. SQL: SELECT II

by 영바이트 2023. 6. 30.

 

SELECT 구문 자체는 어렵지 않지만 다양한 상황에서 출력 결과물을 가공하기 위한 다양한 함수들이 사용된다. 이들 함수들은 사용 방법이 정해져 있기 때문에 어떤 함수들이 있고 그 역할이 무엇인지 알아놓으면 복잡한 SELECT 구문을 구성하느라 고생하지 않고 원하는 결과를 얻을 수 있을 때가 많다. 앞의 포스팅에 이어 숫자, 날짜, NULL 관련 처리 등을 하는 함수들 중 자주 사용되는 것들을 살펴보자.

 

2023.06.29 - [데이터 모델과 SQL] - [SQL 이해하기] - 8.1. SQL: SELECT I

 

[SQL 이해하기] - 8.1. SQL: SELECT I

데이터는 데이터베이스(Database, DB)라는 저장소에 용도와 목적에 맞는 데이터들끼리 모여서 저장된다. 가장 널리 사용되고 이해하기 쉬운 구조의 DB는 관계형 DB(Relational DB, RDB)인데 2차원 테이블

youngbyte.tistory.com

 

● 숫자 함수

- ROUND(숫자, [, 소수점 자리수])

'숫자'를 반올림하여 '소수점 자리수'까지 남겨준다. '소수점 자리수'를 생략할 경우 소수 부분에서 반올림된 정수가 반환된다.

예) SELECT ROUND(163.76, 1) FROM DUAL;

→ 163.8

 

- TRUNC(숫자, [, 소수점 자리수])

'숫자'를 '소수점 자리수'까지 남기고 나머지는 버린다. '소수점 자리수'를 생략할 경우 정수만 남긴다.

예) SELECT TRUNC(54.29, 1) FROM DUAL;

→ 54.2

 

- CEIL(숫자)/FLOOR(숫자)

CEIL은 '숫자'를 자기 자신보다 큰 정수로 만들어주고, FLOOR는 '숫자'를 자기 자신보다 작은 정수로 만들어준다. CEIL이 '천장', FLOOR가 '바닥'이라는 뜻이기 때문에 중간 어딘가에 있는 숫자를 천장에 해당하는 값에 붙이거나(CEIL) 바닥에 해당하는 값으로 내려놓는다(FLOOR)고 생각하면 좀 더 직관적으로 기억할 수 있을 것이다.

예 1) SELECT CEIL(72.86) FROM DUAL;

→ 73

 

예 2) SELECT FLOOR(72.86) FROM DUAL;

→ 72

 

72.86은 72(바닥)와 73(천장) 사이의 값이라고 생각하면 어렵지 않게 이해할 수 있다.

 

- MOD(수 1, 수 2)

'수 1'을 '수 2'로 나눈 나머지를 반환해준다.

예) SELECT MOD(15, -4) FROM DUAL;

→ 3

 

● 날짜 함수

- SYSDATE: 연, 월, 일, 시, 분, 초를 반환해준다.

예) SELECT SYSDATE FROM DUAL;

* SYSDATE 형식은 nls_date_format 설정 값에 따라 달라진다.

 

- ADD_MONTHS(날짜 데이터, 개월 수)

날짜 데이터에 개월 수가 더해진 날짜를 반환해준다.

예) SELECT ADD_MONTHS(TO_DATE('2021-12-31'), 2) FROM DUAL;

→ 22/02/28

* 개월 수가 더해진 날짜가 없을 경우 해당 달의 마지막 일자를 반환해준다.

 

변환 함수

- TO_NUMBER(문자열)

'문자열'을 숫자로 변환해준다.

예) SELECT TO_NUMBER('1234') FROM DUAL;

→ 1234

 

- TO_CHAR(숫자)

'숫자'를 문자열로 변환한다.즉, TO_NUMBER() 함수와 반대 기능을 수행한다.

예) SELECT TO_CHAR(1234) FROM DUAL;

→ '1234'

 

- TO_DATE(문자열, 형식)

문자열 형태의 날짜를 형식에 지정한 형태의 날짜 데이터로 변환해준다.

예) SELECT TO_DATE('20150131', 'YYYY-MM-DD') FROM DUAL;

→ 2015/01/31

 

NULL 처리함수

- NVL(인자 1, 인자 2)

IF 인자 1 == NULL THEN RETURN 인자 2 ELSE RETURN 인자 1

예) SELECT NVL(NULL, 1) FROM DUAL;

→ 1

 

- NULLIF(인자 1, 인자 2)

IF 인자 1 == 인자 2 THEN RETURN NULL ELSE RETURN 인자 1

예) SELECT NULLIF(1, 1) FROM DUAL;

→ NULL

 

- COALESCE(인자 1, 인자 2, 인자 3, ...)

NULL이 아닌 최초의 인자를 반환한다.

예) SELECT COALESCE(NULL, NULL, 3) FROM DUAL;

→ 3

* Coalesce는 '합치다'라는 뜻이다.

 

CASE 구문

CASE는 함수라기 보다는 구문(phrase)이다. 경우에 따라 값을 변경시켜 준다. 예를 통해 살펴보자.

 

예 1) CASE WHEN MONTH=1 THEN 'JAN'

        WHEN MONTH=2 THEN 'FEB'

        WHEN MONTH=3 THEN 'MAR'

        ELSE 'APR'

        END

 

위 CASE WHEN 구문을 아래와 같이 다른 표현으로 바꿀 수 있다.

예 2) CASE MONTH

        WHEN 1 THEN 'JAN'

        WHEN 2 THEN 'FEB'

        WHEN 3 THEN 'MAR'

        ELSE 'APR'

        END

 

*CASE 구문에서 만약 별도로 ELSE 절이 없는 경우 NULL 값이 기본값(default)이 된다.

 

ORACLE 데이터베이스에서는 CASE 구문과 함께 DECODE() 함수가 CASE 구문과 같은 역할을 한다.

예) DECODE(MONTH, 1, 'JAN', 2, 'FEB', 3, 'MAR', 'APR')

* DECODE 함수에서 인자의 개수가 짝수일 때 가장 마지막 값이 기본값이 된다.

 

SELECT 구문은 기본적으로 FROM 구문 아래의 목표 테이블에서 모든 데이터를 꺼내서 보여준다. 하지만 보통 테이블에 데이터들이 많기 때문에 특정 조건을 만족시키는 데이터만 꺼내서 보여주는 경우가 대부분이다. 이와 같이 특정 조건을 만족하는 데이터만 꺼내서 보여주는 것을 '필터링(filtering)'이라고 한다. 이어지는 포스팅에서는 필터링을 위해 SELECT 구문 안에서 사용되는 WHERE 표현을 살펴보도록 하겠다.

 

 

 

 

 

댓글