2013년 2월 11일 월요일

[DB] 함수


1. 그룹함수(SUM, AVG, MAX, MIN, COUNT...)
- SUM() 인자값으로 컬럼을 지정. 해당컬럼의 합계 산출
SELECT SUM(salary) AS 인건비 FROM employees;

- AVG() 해당컬럼의 평균 산출
SELECT AVG(salary) AS 평균급여 FROM employees;

- MAX() 컬럼의 최대값
SELECT MAX(salary) AS 최대급여 FROM employees;

- MIN() 컬럼의 최소값
SELECT MIN(salary) AS 최소급여 FROM employees;

- COUNT() 컴럼의 수
SELECT COUNT(salary) AS 글로자 수 FROM employees;

GROUP BY (특정 컬럼의 값들을 각 값별로 묶어서 결과를 출력, 그룹함수를 적용할 때 사용한다. 단순히 group by에 기술된 컬럼만 출력한다면 distinct와 같은 결과.)
- 사원테이블에 부서별로 각 그룹의 부서 아이디와 평균 연봉 출력
SELECT department_id, AVG(salary) FROM employees GROUP BY department_id;

잘못된 출력명령
SELECT department_id, last_name, AVG(salary) FROM employees GROUP BY department_id;(부서별로 그룹을 묶었으나 출력하는 컬럼에 last_name이 존재한다. last_name을 어떠한 기준으로 출력할 방법이 없다.)

HAVING (특정 그룹의 조건을 지정)
- 그룹별로 부서 아이디와 연봉이 10000이상인 부서 출력
SELECT department_id, AVG(salary) FROM employees GROUP BY department_id
HAVING AVG(salary) >= 10000;

- 부서별로 사원의 수와 커미션을 받는 사원의 수를 카운트하여 출력
SELECT department_id, COUNT(department_id), COUNT(commission_pct)
FROM employees GROUP BY department_id HAVING COUNT(commission_pct) IS NOT NULL

2. 숫자함수
- MOD() 나머지값 리턴
SELECT MOD(1, 3) "나머지 값" FROM dual;(dual은 가상의 테이블)

- ROUND() 반올림
SELECT ROUND(899.2356, -2) "반올림" FROM dual;
(두 번쨰 인자가 -2변 소수점 위 2번째 자리 반올림, 2라면 소수점 아래 2번째 자리 반올림)

- TRUNC() 반올림 버림
SELECT TRUNC(899.2356, 2) "반올림버림" FROM dual;

3. 문자열함수
- LOWER() 대문자를 소문자로
SELECT LOWER('DataBase') FROM dual;

- UPPER() 소문자를 대문자로
SELECT UPPER('DataBase') FROM dual;

- SUBSTR() 부분문자열 추출
SELECT SUBSTR('Korea Economy', 3, 8) FROM dual;
3->추출문자 시작, 8->추출문자로부터 출력할 문자갯수

- LENGTH() 문자열길이 추출
SELECT LENGTH('DataBase') FROM dual;

4. 날짜함수
- SYSDATE
SELECT SYSDATE-1 AS 어제, SYSDATE AS 오늘, SYSDATE+1 AS 내일 FROM dual;

- 근무일수 구하기
SELECT last_name, SYSDATE - hire_date FROM employees;

5. 변환함수 (데이터형변환 + 포멧변경)
- TO_CHAR() 해당하는 숫자, 날짜 형태의 데이터를 문자열로 변환
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD DY') FROM dual;

숫자를 문자로
SELECT TO_CHAR(2000, '&999,999') FROM dual;

입사년도 출력
SELECT * FROM employees WHERE TO_CHAR(hire_date, 'YYY') = '1997';

- TO_DATE() 숫자, 문자형태의 데이터를 날짜형으로 변환
SELECT last_name, hire_date FROM employees
WHERE hire_date = TO_DATE(19970625, 'YYYY/MM/DD');

-TO_NUMBER() 정수형으로 변환
SELECT TO_NUMBER('10,000', '999,999') + TO_NUMBER('20,000', '999,999') FROM dual;

6. 기타함수
- DECODE() 케이스문처럼 사용
SELECT job_id, DECODE(job_id, 'ST_MAN', 'Salse DEPT', 'SH_CLERK', 'SALES DEPT', 'Another') FROM employees WHERE job_id LIKE 'S%';

문제) department_id가 80일 경우 Accounting, 50일 경우 Sales, 30일 경우 Invocation
SELECT department_id, DECODE(department_id, 80, 'Accounting', 50, 'Sales', 30, 'Invocation') FROM employees;

- NVL() 데이터값이 NULL인 경우 0 또는 다른 값으로 변환
SELECT employee_id, salary, NVL(commission_pct, 0) FROM employees;

문제) job_id순서로 사원의 연봉을 출력. 연봉 = (salary * 12) + commission_pct
SELECT last_name, salary * 12 + NVL(commission_pct, 0) AS 연봉 FROM employees
ORDER BY job_id ASC;

이상 몇가지 함수를 정리해 보았다. 더많은 함수들은 따로 더 찾아보고 공부하자

댓글 없음:

댓글 쓰기