코딩하는 문과생

[SQL] 3. Additional SELECT 본문

프로그래밍/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;