정렬과 연산 - 날짜 데이터, CASE
SQL 첫걸음이란 책을 읽으면서 정리중.
날짜 연산
데이터베이스에선 날짜 DATE, 시간 TIME, 날짜와 시간 DATETIME 형이 있다.
표준 SQL에서는 'CURRENT_TIMESTAMP'라는 함수를 실행하면 현재 시간을 볼 수 있다.
SELECT CURRENT_TIMESTAMP;
위 함수를 시용하면 시간을 저장할 수 있다. 또 직접 시간을 지정해서 저장할 수 있는데, 대부분의 데이터베이스 제품은 날짜 서식을 임의로 지정, 변환하는 함수를 지원한다.
Oracle : 문자열 데이터를 날짜 데이터로 -> TO_DATE('2014/11/11', 'YYYY/MM/DD')
날짜시간 데이터와 기간형 수치데이터(1일, 2시간, ...)를 사용해 날짜에 덧셈, 뺄셈 연산을 할 수 있다. 또는 날짜에서 날짜를 빼서 기간을 구할 수도 있다.
SELECT CURRENT_DATE + INTERVAL 1 DAY; -> 내일 날짜가 찍힘
SELECT CURRENT_DATE - INTERVAL 1 DAY; -> 어제 날짜가 찍힘
SELECT DATEDIFF('2021-05-19', '2021-01-01'); -> '138'이 찍힘
프로그래밍 언어에서 CASE를 사용하면 특정 데이터의 값에 따라 다른 실행문을 실행할 수 있는데, SQL에서도 이것을 사용할 수 있다. 예를 들어 NULL을 0으로 간주하고 계산하기 위해서 CASE문을 사용한다.
CASE 문은 조건식을 기술하는 WHEN 절, 조건이 참일 때 실행되는 THEN 절이 1개 이상이 있고, 어떤 조건식도 만족하지 못했을 때 실행되는 ELSE 절이 있다. ELSE 절은 생략이 가능하고 이것은 ELSE NULL 과 같은 것이다. 그리고 마지막 END를 붙여 끝낸다.
SELECT a, CASE WHEN a IS NULL THEN 0 ELSE a END "a(null=0)" FROM sample;
-> SAMPLE 데이터에서 a와 a가 NULL인 경우에는 "a(null=0)" 컬럼에 0을, NULL이 아닌 경우에는 그냥 a값을 가져온다.
위 코드는 COALESCE 함수를 사용해 더 간단히 표현할 수 있다. 이 함수는 여러 인수를 지정하고, NULL이 아니라면 먼저 지정된 인수를 반환한다.
SELECT a, CASE WHEN a IS NULL THEN 0 ELSE a END "a(null=0)" FROM sample;
=> SELECT a, COALESCE(a, 0) FROM SAMPLE; -> a가 NULL이라면 0을 출력한다.
CASE 문은 검색 CASE와 단순 CASE로나눌 수 있다.
검색 CASE : 'CASE WHEN 조건 THEN 결과 WHEN ... TEHN ...' -> WHEN 절의 참, 거짓을 비교하며 CASE 문 실행.
단순 CASE : 'CASE 대상 WHEN 조건1 THEN 결과1 WHEN 조건2 THEN 결과2 ...' -> 특정 데이터를 선택하고, 그것을 조건들과 비교하며 CASE 문을 실행한다.
CASE 문은 SELECT 구, WHERE 구, ORDER BY 구에서 사용될 수 있다.
그리고 ELSE를 생략하면 ELSE NULL이 되기 때문에, 생략하지 않는 것이 좋다.
= 비교 연산자로는 NULL을 비교할 수 없다. 따라서 NULL인지 비교하라면 단순 CASE로는 비교할 수 없고 검색 CASE를 사용해서 IS NULL로 NULL값인지 비교해야 한다.