프로그래밍/SQL
[SQL] 3. Additional SELECT
코딩하는 문과생
2020. 1. 20. 15:34
[단일함수와 그룹함수]
- 단일 행 함수: input n개, output n개
- 그룹 함수: input n개, output 1개
# select와 where절에 함수 적용이 가능하다.
[단일함수의 예]
# 문자열 함수:
- NUMBER LENGTH(string),
- <중요> NUMBER INSTR( string, substring, [ position, [ occurrence ] ] ) - position은 index or 찾는 방향, occurence는 찾는 횟수
SELECT INSTR(EMAIL, '.')
FROM EMPLOYEE;
SELECT INSTR(EMAIL, 'c', -1, 2)
FROM EMPLOYEE;
SELECT INSTR(EMAIL, 'c', INSTR( EMAIL, '.')-1 )
FROM EMPLOYEE;
// 두번째와 같은 결과
// 함수가 함수를 중첩시킨다.
- LPAD(): 왼쪽에 패딩 주기
- RPAD(): 오른쪽에 패딩 주기
SELECT EMAIL AS 원본데이터,
LENGTH(EMAIL) AS 원본길이,
LPAD(EMAIL, 20, '.') AS 적용결과,
LENGTH(LPAD(EMAIL, 20, '.')) AS 결과길이
FROM EMPLOYEE ;
//*********************************
SELECT EMAIL AS 원본데이터,
LENGTH(EMAIL) AS 원본길이,
RPAD(EMAIL, 20, '.') AS 적용결과,
LENGTH(RPAD(EMAIL, 20, '.')) AS 결과길이
FROM EMPLOYEE ;
- LTRIM(string, str): 왼쪽 자르기
- RTRIM(string, str): 오른쪽 자르기
- TRIM( LEADING|TRAILING|BOTH trim_char from trim_source): 양쪽 자르기
SELECT LTRIM('xyxzyyTech', 'xyz')
FROM DUAL;
//Dual은 더미테이블
//결과 : Tech
//CharType에서 공백 제거 후 문자열 비교시 사용
//****************************************
SELECT TRIM(BOTH '1' FROM '123Tech111')
FROM DUAL;
//결과: 23Tech
- <중요>CHRACTER SUBSTR(string, position, [length])
SELECT SUBSTR('This.is.a.test', 6, 2)
FROM DUAL;
//결과: is
SELECT SUBSTR('This.is.a.test', 6)
FROM DUAL;
//결과: is.a.test
# 숫자 함수:
- ROUND( number, [decimal_places] ) : 반올림
SELECT ROUND(125.315, 1)
FROM DUAL;
//125.3
SELECT ROUND(125.315, -1)
FROM DUAL;
//130
- TRUNC( number, [decimal_places] ) : 단순 절삭
SELECT TRUNC(125.315, 1)
FROM DUAL;
//125.3
SELECT TRUNC(125.315, -1)
FROM DUAL;
//120
# 날짜 함수:
- SYSDATE: 지정된 형식으로 현재 날짜와 시간을 표시하는 함수
- ADD_MONTH( date, N ): 지정한 만큼의 달 수를 더한 날짜를 반환하는 함수
SELECT EMP_NAME, HIRE_DATE, ADD_MONTHS(HIRE_DATE, 240)
FROM EMPLOYEE;
- MONTHS_BETWEEN(date1, date2) : 지정한 두 날짜 사이의 월 수를 반환하는 함수
// 오늘 날짜를 기준으로 근속년수가 20년이상인
// 사원의 이름, 입사일, 근속년수, 직급, 부서를 조회하라.
SELECT EMP_NAME AS "이름",
HIRE_DATE AS "입사일",
ROUND(MONTHS_BETWEEN(SYSDATE, HIRE_DATE) / 12) AS "근속년수",
JOB_ID AS "직급",
DEPT_ID AS "부서"
FROM EMPLOYEE
WHERE MONTHS_BETWEEN(SYSDATE, HIRE_DATE) > 240;