프로그래머스 SQL/DB Essentials - 내장함수

mohadang·2022년 7월 4일
0

SQL/DB Essentials

목록 보기
6/7
post-thumbnail
  • 단일행 내장 함수 : 함수의 입력이 단일 행
    • 문자형, 숫자형, 날짜형, 변환형, NULL, 정규식
  • 다중행 내장 함수 : 함수의 입력이 여러 행
    • 집단 함수
    • 윈도우 함수
    • 그룹 함수
  • 내장 함수는 중첩이 가능하다

단일행 내장 함수

ASCII, LOWER, LENGTH, CONCAT ...

날짜형 함수

  • SQL에서 날짜를 표현하는 방식

  • 문자형 : 'YYYY-MM-DD HH:NN:SS'

  • 숫자형 : 'YYYYMMDDHHNNSS.uuuuuu'

  • 출력 시에 컨텍스트에 다라 문자열 혹은 숫자로 출력

    • 기본은 문자형
  • 내부적으로는 숫자형으로 저장

    • 산술 연산이 가능
    • 공간 절약
  • DBMS 마다 날짜형 함수의 기능적 차이가 존재할 수 있음.

    • 사용하는 DBMS의 날짜형 함수를 숙지 필요
  • SYSDATE, NOW
    SYSDATE : 현재 시간
    NOW : 명령어가 실행된 시간

SELECT NOW()     //2021-05-15 14"41"46
SELECT NOW() + 0 //20210515144146

SELECT SYSDATE(), SLEEP(5), SYSDDATE(); //첫번째와 두번째가 다른 시간
SELECT NOW(), SLEEP(5), NOW();          //첫번째와 두번째가 같은 시간

NOW 함수는 날짜형 컬럼의 기본값을 할당하는데 주로 사용

  • NOW를 이용해 새로운 로우를 입력(INSERT) 할 때마다 create_on에 입력된 시간을 기록
CREATE TABKE movie(
  id INT PRIMARY KEY AUTO_INCREMENT,
  title VARCHAR(255) NOT NULL,
  created_on DATETIME NOT NULL DEFAULT NOW() // CURRENT_TIMESTAMP()
)

날짜에 대한 산술 연산을 할 경우 주의

SELECT status, shippedDate, orderDate, shippedDate - orderDate AS diff
FROM orders
ORDER BY diff DESC;

2003-12-26 - 2003-10-22 : 204 // 정확한 일수 차이가 나오지 않는다. 그 이유는 산술 연산으로 처리 되어서
20031226 - 20031022 = 204  // 실제 처리는 이렇게 산술식으로 캐스팅 된뒤 처리

이 문제를 해결하기 위해서는 INTERVAL, TIMESTAMPDIFF 사용

INTERVAL 표현식

  • 날짜형(DATE, TIME, DATETIME) 컬럼에 임의의 날짜/시간 값을 더하거나 뺄 수 있음
SELECT DATE(NOW()) + INTERVAL 5 MONTH AS 테스트1
       MONTH(NOW()) + INTERVAL 5 MONTH AS 테스트1 // 오동작, NULL 값 나옴
       TIME(NOW()) + INTERVAL 5 MONTH AS 테스트1 // 오동작, NULL 값 나옴 
...
FROM employees
WHERE birthDate > DATE(NOW()) - INTERVAL 20 YEAR;20세 미만의 직원 검색

TIMESTAMPDIFF 함수

  • 두 날짜형 값의 차이를 주어진 단위로 계산(end - begin)
  • TIMESTAMPDIFF() 함수는 기준 단위를 모두 채워야만 값이 1 증가함
    • YEAR 단위의 경우 365일을 채워야만 1 증가함
SELECT 
	TIMESTAMPDIFF(YEAR, '200-08-02', '2021-05-15')  // 20
    TIMESTAMPDIFF(YEAR, '200-08-02', '2021-08-02')  // 21
    TIMESTAMPDIFF(YEAR, '200-08-02', '2021-09-15')  // 21

SELECT TIMESTAMPDIFF(YEAR, birthDate, DATE(NOW())) AS 만나이

DATE_FORMAT

  • 날짜와 시간의 출력 형식을 지정
  • format specifier
    • %Y, %M, %D, %H, %i %S
    • %y, %m, %d, %h, %i %s, %p
  • GET_FORMAT
    • 미리 정의된 시간 포맷을 가져옴
    • GET_FORmAT(DATE, 'USA')
    • GET_FORmAT(TIME, 'EUR')

클라우드 DBMS에서 응용 프로그램이 시간을 저장하면, 사용자의 현지 시간(클라이언트의 시간)이 아니라 서버의 시간이 저장됨.
서버와 클라이언트가 다른 시간대에 있는 경우, 서버에 저장된 시간은 현지 시간으로 변환하여 출력해야함
EX) 서버에서 UTC 시로 저장하고 클라이언트에서 클라이언트 시간대에 맞게 변환(한국 KST)

타입 변환

CATE() 함수를 사용하여 형변환 가능

SELECT CAST(NOW() AS DATE); DATETIMEDATE로 변환

NULL

COALESCE() 함수

  • 임의 개수의 expr에서 NULL 값이 아닌 최초의 expr을 리턴
SELECT COALESCE(1, NULL)
SELECT COALESCE(NULL, NULL, NULL)

SELECT COALESCE(desc, "*****")
SELECT COALESCE(price, 0)
  • IFNULL(e1, e2) - MySQL 전용
    0
profile
mohadang

0개의 댓글