함수
자주 사용되는 SQL 내장 함수 소개 및 활용
- SQL 내장 함수: DBMS가 기본적으로 제공하는 유용한 기능들로, 데이터 처리 및 분석을 용이하게 함.
- DBMS별 함수 차이: 표준 SQL 함수 외에 DBMS 제조사마다 고유한 함수나 동일 기능의 다른 함수명을 가질 수 있음. (예: Oracle은
SUBSTR,SYSDATE)
문자열 함수
- 결합:
CONCAT(str1, str2)또는str1 || str2(Oracle)
SELECT COMPANY_NM, CEO_NM, COMPANY_NM || ' (' || CEO_NM || ')' AS "회사명(대표)" FROM TB_COMPANY_MASTER;
- 부분추출:
SUBSTR(str, start_position, length)(Oracle)
SELECT SUBSTR(BIZ_REG_NO, 1, 3) AS "사업자번호 앞3자리" FROM TB_COMPANY_MASTER;
- 길이:
LENGTH(str)
SELECT COMPANY_NM, LENGTH(COMPANY_NM) AS "회사명 길이" FROM TB_COMPANY_MASTER;
- 대/소문자:
UPPER(str),LOWER(str)
SELECT UPPER(COMPANY_ENG_NM) FROM TB_COMPANY_MASTER WHERE COMPANY_ENG_NM IS NOT NULL;
- 공백제거:
TRIM(str),LTRIM(str),RTRIM(str)DUAL은 Oracle의 가상 테이블로, 임시 데이터 조회에 사용
SELECT TRIM(' 123 ') FROM dual;
- 치환:
REPLACE(str, search_str, replace_str)
SELECT REPLACE(COMPANY_NM, '(주)', '주식회사 ') FROM TB_COMPANY_MASTER;
숫자 함수
- ABS: 절댓값
- ACOS: 역 코사인 함수
- ASIN: 역 사인 함수
- ATAN: 역 탄젠트 함수
- ATAN2: (y, x) 좌표를 받아 각도를 반환
- CEIL: 올림
- COS: 코사인
- COSH: 쌍곡코사인
- EXP: 지수 함수
EXP(n)= - FLOOR: 내림
- LN: 자연 로그
- LOG: 로그
LOG(a,b)= - MOD: 나머지
MOD(a,b) = a-b * FLOOR(a/b) - POWER: 거듭제곱
POWER(a,b)= - REMAINDER: 나머지
REMAINDER(a,b) = a-b * ROUND(a/b) - ROUND: 반올림
- SIGN: 음수면 -1, 0이면 0, 양수면 +1
- SIN: 사인
- SINH: 쌍곡 사인
- SQRT: 제곱근
- TAN: 탄젠트
- TANH: 쌍곡 탄젠트
- TRUNC: 특정 자릿수를 자름
TRUNC(15.79) = 15,TRUNC(15.79,1) = 15.7 - WIDTH_BUCKET: 뒤에서 설명
- 이자를 0.0에서 10.0까지 5구간으로 나눴을 때 그룹
SELECT INTEREST_RATE, WIDTH_BUCKET(INTEREST_RATE, 0.0, 10.0, 5) AS "분위"
FROM TB_LOAN_ACCOUNT;
숫자를 문자로 변환하기
SELECT TO_CHAR(LOAN_AMT, 'FM999,999,999,999') as 잔액 FROM TB_LOAN_ACCOUNT;
FM이 없으면 앞에 공백이 채워짐- 형식의 자릿수가 초과하면(위에서는 1조가 넘으면)
###으로 표시됨
- 반대로 문자를 숫자로 변환하려면 TO_NUMBER 사용
SELECT TO_NUMBER('123,456', '999,999') AS 숫자 FROM DUAL;
날짜/시간 함수
- 현재시간:
SYSDATE(날짜+시간),CURRENT_DATE(날짜)
SELECT SYSDATE AS "현재시간", CURRENT_DATE AS "현재날짜" FROM DUAL;
- 부분추출:
EXTRACT(YEAR FROM date_col),EXTRACT(MONTH FROM date_col),EXTRACT(DAY FROM date_col)
SELECT ESTABLISH_DT,
EXTRACT(YEAR FROM ESTABLISH_DT) AS "설립년도",
EXTRACT(MONTH FROM ESTABLISH_DT) AS "설립월",
EXTRACT(DAY FROM ESTABLISH_DT) AS "설립일"
FROM TB_COMPANY_MASTER;
- 형식변환:
TO_CHAR(date_col, 'YYYY-MM-DD HH24:MI:SS')(날짜->문자),TO_DATE('string', 'format')(문자->날짜)
SELECT COMPANY_NM, TO_CHAR(ESTABLISH_DT, 'YYYY"년" MM"월" DD"일"') AS "설립일" FROM TB_COMPANY_MASTER;
- 날짜 연산: 날짜 간 뺄셈 (일수 차이),
ADD_MONTHS(date_col, num_months),MONTHS_BETWEEN(date1, date2)
SELECT LOAN_ACCT_NO, MATURITY_DT, ADD_MONTHS(MATURITY_DT, 3) AS "3개월 연장 만기일" FROM TB_LOAN_ACCOUNT;
SELECT LOAN_ACCT_NO, MATURITY_DT, START_DT, MATURITY_DT - START_DT AS "대출기간(일)" FROM TB_LOAN_ACCOUNT;
날짜에 TRUNC
TRUNC 함수를 날짜에 적용하면 뒷자리를 자름
현재 날짜와 시각
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') FROM DUAL;
현재 날짜(시각은 0시 0분 0초)
SELECT TO_CHAR(TRUNC(SYSDATE), 'YYYY-MM-DD HH24:MI:SS') FROM DUAL;
이번 달 1월 1일
SELECT TO_CHAR(TRUNC(SYSDATE, 'MM'), 'YYYY-MM-DD HH24:MI:SS') FROM DUAL;
올해 1월 1일
SELECT TO_CHAR(TRUNC(SYSDATE, 'YEAR'), 'YYYY-MM-DD HH24:MI:SS') FROM DUAL;