어제보다 더 나은 나

DBMS(오라클) : 숫자함수, 날짜함수, 일반함수, 그룹함수 본문

데이터분석 공부/DBMS 공부

DBMS(오라클) : 숫자함수, 날짜함수, 일반함수, 그룹함수

확인해볼까 2022. 6. 30. 16:52

* 숫자 함수

 

* ROUND : 지정한 소수점 자리 이하에서 결과 값을 반환하는 함수

 

 

* TRUNC : 지정한 소수점 자리 수 이하를 자른 결과를 반환하는 함수

 

* MOD : m을 n으로 나눈 나머지

 

NULL 값은 MOD를 적용해도 NULL

 

* CEIL : 지정한 값보다 큰 수 중에서 가장 작은 정수

* FLOOR : 지정한 값보다 작은 수 중에서 가장 큰 정수

 


* 날짜 함수 : 날짜 데이터 타입에 사용하는 함수

 

* 날짜 + 숫자 : 날짜에 일수를 더한 날짜 계산

* 날짜 - 숫자 : 날짜에 일수를 뺀 날짜 계산

* 날짜 - 날짜 : 날짜와 날짜를 뺀 일수를 계산

* 날짜 + 숫자 / 24 : 날짜에 시간을 가산하여 날짜 계산

 

 

 

* SYSDATE : 현재 시스템의 현재 날짜

어제, 오늘, 내일 날짜 출력

 

* MONTH_BETWEEN, ADD_MONTHS : 월 단위로 날짜 연산을 하는 함수

 

 

* LAST_DAY : 해당 날짜가 속한 달의 마지막 날짜를 반환하는 함수

* NEXT_DAY : 해당 일을 기준으로 명시된 요일의 다음 날짜를 변환하는 함수

오늘 날짜를 기준으로 LAST_DAY 함수와 NEXT_DAY 함수 적용

 

* 날짜 함수 + ROUND, TRUNC 함수

 


*  형 변환 함수

 

* TO_CHAR : 숫자/날짜 타입을 문자로 변환 후 출력 형식 변경

 

 

 

# 예제 : 보직수당을 받는 교수들의 이름, 급여, 보직수당 그리고 급여와 보직수당을 더한 값에 12를 곱합 결과를 연봉으로 출력하라.

 

문제_답안

 

# 예제 : 자신이 출생한 지 며칠째인지, 출생일로부터 현재일까지의 개월 수를 출력하라. (개월 수는 반올림을 사용)


* 일반 함수

 

* NVL 함수 : NULL을 0 또는 다른 값으로 변환하기 위한 함수

 

 

# 예제 : 사원의 이름과 보너스를 출력하고 사원이 보너스를 받지 않는다면 'No Commission'을 출력하라.

 

 

* NVL2 함수 : 첫 번째 인수 값이 NULL이 아니면 두 번째 인수 값을 출력하고, 첫 번째 인수 값이 NULL이면 세 번쨰 인수 값을 출력하는 함수

 

 

* NULLIF 함수 : 2개의 표현식을 비교하여 값이 동일하면 NULL을 반환하고, 일치하지 않으면 첫 번째 표현식의 값을 반환

 

* COALESCE 함수 : 인수 중에서 NULL이 아닌 첫 번째 인수를 반환하는 함수

 

* DECODE 함수 : IF문이나 CASE 문으로 표현되는 복잡한 알고리즘을 하나의 SQL 명령문으로 간단하게 표현할 수 있는 유용한 기능

 

# 예제 : 학생 테이블에서 학과번호와 이름, 학과명을 출력하되 101번 학과 학생들만 'Computer Science'로 출력하고 101번 아닌 학생들의 학과명을 'ETC'로 출력하세요 ('황보_정호' 학생은 제외할 것)

 

 

# 예제 : 학생 테이블에 주민등록번호를 참조하여 이름, 학번, 태어난 달, 분기를 출력하세요 (1/4, 2/4, 3/4, 4/4)


* Group 함수 : 전체 행을 하나 이상의 컬럼을 기준으로 그룹화하여 그룹별로 결과를 출력하는 함수

 

* GROUP BY : 전체 행을 일정 표현을 기준으로 그룹화

* HAVING : GROUP BY 절에 의해 생성된 그룹별로 조건 부여

COUNT 함수는 NULL을 제외하므로 WHERE절에 'comm IS NOT NULL'을 추가한 것과 결과가 같다.

 

 

 

* AVG 함수

* SUM 함수

AVG 함수, SUM 함수

 

 

* MAX 함수

* MIN 함수

MAX 함수, MIN 함수

 

* STDDEV 함수

* VARIANCE 함수

표준편차를 구하는 STDDEV 함수, 분산을 구하는 VARIANCE 함수

 

 

 

# 예제 : 모든 사원의 최대 급여, 최저 급여, 합계 그리고 평균 급여를 출력하세요. 열 레이블은 Maximum, Minimum, Sum 그리고 Average 입니다. 소수점에서 결과를 반올림 하십시오.

 

 


* GROUP BY 절 : 특정 칼럼 값을 기준으로 테이블의 전체 행을 그룹별로 나누기 위한 절

=> 그룹핑 전에 WHERE 절을 사용하여 그룹 대상 집합을 먼저 선택

=> GROUP BY 절에는 반드시 칼럼 이름을 포함해야 하며 칼럼 별명은 사용할 수 없음

=> 그룹별 출력순서는 오름차순

=> SELECT 절에서 나열된 칼럼이나 표현은 반드시 GROUP  BY 절에 명시

=> GROUP BY 절에서 명시한 칼럼 이름은 SELECT절에서 명시하지 않아도 된다.

=> GROUP BY 절에서 대문자로 칼럼이름을 표기하고 SELECT 절에서 소문자로 칼럼 이름을 표기하여도 오류가 발생!!

 

* 다중 컬럼을 이용한 그룹핑 : 하나 이상의 카럼을 사용하여 그룹을 나누고, 그룹별로 다시 서브 그룹을 나눔.

학과별 소속 교수들의 평균 급여, 최소 급여, 최대 급여를 출력

 

* ROLLUP 연산자 : GROUP BY 절의 그룹 조건에 따라 전체 행을 그룹화하고 각 그룹에 대해 부분합을 구하는 연산자

=> GROUP BY 절에 칼럼의 수가 n개 이면 ROLLUP 그룹핑 조합은 n+1개

 

 

* CUBE 연산자 : ROLLUP에 의한 그룹 결과와 GROUP BY 절에 기술된 조건에 따라 그룹 조합을 만드는 연산자

=> GROUP BY 절에 칼럼의 수가 n개 이면 CUBE 그룹핑 조합은 2n개

* GROUPING 함수 : 인수로 지정된 칼럼이 ROLLUP 이나 CUBE 연산자로 생성된 그룹 조합에서 사용되었는지 여부를 1 or 0으로 반환 (사용하면 0, 아니면 1)

 

 

* GROUPING SETS 함수 : GROUP BY 절에서 그룹 조건을 여러 개 지정할 수 있는 함수. 각 그룹 조건에 대해 별도로 GROUP BY한 결과를 UNION ALL한 결과와 동일

GROUP BY 한 결과를 UNION ALL 한 결과
GROUPING SETS 함수를 사용한 결과 (위 쿼리의 결과와 동일)


# 예제 1 : 사원 테이블(EMP)에서 최대 급여와 최소 급여 사이의 차이를 출력하는 질의를 작성하세요.

예제1_답안

 

# 예제 2 :  사원명, 입사일 그리고 입사한 요일을 출력하세요. 열 레이블은 DAY 입니다.
(***결과는 월요일부터 시작하는 요일 순으로 정렬하세요.)

ENAME HIREDATE DAY
-------------------- -------- ------------------------
ADAMS 87/07/13 월요일
SCOTT 87/07/13 월요일
MARTIN 81/09/28 월요일
CLARK 81/06/09 화요일

예제2_답안

# 예제 3 : 1980, 1981, 1982, 1987년에 입사한 사원에 대해 전체 사원 수와 연도별 사원 수를 출력하세요.

TOTAL 1980 1981 1982 1987
---------- ---------- ---------- ---------- ----------
14 1 10 1 2

 

예제3_답안

 

Comments