23-02-01 (1) 데이터베이스 (날짜함수, 그룹함수)
※ 복습
null - is null, is not null
함수
문자함수 - 대상이 문자, 대소문자 관련
문자열 길이반환 함수 - length, lengthb
문자조작 함수 - lpad, rpad 지정문자 삽입 / ltrim, rtrim 지정문자 삭제
숫자함수 - round, trunc, mod, ceil, floor
날짜함수
2) 날짜 함수의 종류
종류 | 의미 | 결과 |
SYSDATE | 시스템의 현재 날짜 | 날짜 |
MONTHS_BETWEEN | 날짜와 날짜 사이의 개월을 계산 | 숫자 |
ADD_MONTHS | 날짜에 개월을 더한 날짜 계산 | 날짜 |
NEXT_DAY | 날짜후의 첫 요일의 날짜를 계산 | 날짜 |
LAST_DAY | 월의 마지막 날짜를 계산 | 날짜 |
ROUND | 날짜를 반올림 | 날짜 |
TRUNC | 날짜를 절삭 | 날짜 |
2-1) SYSDATE 함수
시스템에 저장된 현재 날짜를 반환하는 함수로서 초 단위까지 반환
시스템의 현재 날짜 출력
SELECT SYSDATE
FROM DUAL;
2-2) MONTHS_BETWEEN, ADD_MONTHS
입사한지 360개월 미만인 교수의 교수번호, 입사일, 입사일로부터 현재일까지의 개월수, 입사일에서 6개월후의 날짜를 출력
SELECT PROFNO, HIREDATE, TRUNC(MONTHS_BETWEEN(SYSDATE, HIREDATE)) TENURE, ADD_MONTHS(HIREDATE, 6)
FROM PROFESSOR
WHERE MONTHS_BETWEEN(SYSDATE, HIREDATE) < 360;
2-3) LAST_DAY, NEXT_DAY
NEXT_DAY에서 오늘 해당되는 요일을 생각하고 입력하면 다음주가 나옴
오늘이 속한 달의 마지막 날짜와 다가오는 일요일의 날짜를 출력
SELECT
SYSDATE
, LAST_DAY(SYSDATE)
, NEXT_DAY(SYSDATE, 1)
FROM DUAL;
2-4) ROUND, TRUNC
날짜를 반올림, 절삭
ROUND함수는 정오를 넘으면 다음날 출력
TRUNC함수는 시간정보와 상관없이 당일날을 출력
월시분초..등 도 반올림, 절삭 할 수 있으며 기준은 절반이다.
예) 월은 6월기준, 시간은 정오를 기준, 분은 30분을 기준
예제1)
SELECT
TO_CHAR(SYSDATE +3 /24, 'YYMMDD HH24MISS')
, TO_CHAR(ROUND(SYSDATE+3/24), 'YYMMDD HH24MISS')
, TO_CHAR(TRUNC(SYSDATE+3/24), 'YYMMDD HH24MISS')
FROM DUAL;
예제2)
SELECT ROUND(TO_DATE('231224', 'YYMMDD'),'MM')
FROM DUAL;
예제3)
SELECT TO_CHAR(HIREDATE, 'YYDDMM HH24MISS')
, TO_CHAR(ROUND(HIREDATE), 'YYDDMM HH24MISS')
, TO_CHAR(ROUND(HIREDATE, 'MM'), 'YYDDMM HH24MISS')
, TO_CHAR(ROUND(HIREDATE, 'YY'), 'YYDDMM HH24MISS')
FROM PROFESSOR
WHERE DEPTNO = 101;
3) 데이터 타입의 변환
- 숫자나 날짜 타입을 문자와 함께 결합하거나 보고서 양식에 맞추기 위해 주로 사용
3-1) 묵시적인 데이터 타입 변환
- 정확한 연산을 위하여 오라클에서 데이터 타입을 내부적으로 자동 형변환하는 경우
[표]WHERE A(칼럼)=B(상수)
A의 데이터 타입 | B의 데이터 타입 | 반환 결과 |
NUMBER | VARCHAR2 또는 CHAR | B가 NUMBER 타입으로 변환 |
VARCHAR2 또는 CHAR | NUMBER | A가 NUMBER 타입으로 변환 |
결과적으로 모두 NUMBER타입으로 변환된다.
문자타입의 숫자타입으로 변환은 문자열이 숫자로 구성된 경우에만 가능하다.
3-2) 명시적인 데이터 타입 변환
- 사용자가 데이터 타입 변환 함수를 이용하여 명시적으로 데이터 타입을 변환
4) TO_CHAR 함수
- 날짜나 숫자를 문자로 변환하기 위해 사용
- 날짜 출력 형식 변경
위의 표는 사용을 잘 안한다.
위의 표에서 자주 사용되는건
Q, MM, WW(연중 주 / 연간통계 등등),
W(달의 몇번째 주인지 / 1월1일이 시작요일이 기준점),
DD,D
DY,D
예제1) 학생테이블에서 전인하 학생의 학번과 생년월일 중에서 년, 월만 출력
SELECT STUDNO, TO_CHAR(BIRTHDATE, 'YYMM')
FROM STUDENT
WHERE NAME = '전인하';
5) 시간표현 형식의 종류
주로 사용되는 형식은 'HH24:MI:SS' 이다.
예제) 교수 테이블에서 101번 학과 교수의 이름과 입사일을 출력
SELECT NAME, TO_CHAR(HIREDATE, 'MONTH DD, YYYY HH24:MI:SS PM')
FROM PROFESSOR
WHERE DEPTNO = 101;
6) 기타 날짜 표현 형식
종류 | 의미 |
"TEXT" | 결과와 함께 출력할 문자열을 인용 부호로 표시 |
TH | 서수로 표시 |
SP | 숫자(기수)를 영문으로 표시 |
SPTH 또는 THSP | 서수를 영문으로 표시 |
7) 숫자를 문자 형식으로 변환
[표]TO_CHAR함수를 이용한 숫자 출력 형식 변환
종류 | 의미 | 사용 예 | 결과 |
9 | 한자리의 숫자 표시 | (1234, '99999') | 1234 |
0 | 앞부분을 0으로 표시 | (1234, '099999') | 001234 |
$ | 달러 기호를 앞에 표시 | (1234, '$99999') | $1234 |
. | 소수점을 표시 | (1234, '99999.99') | 1234.00 |
, | 특정위치에 ','표시 | (1234, '99,999') | 1,234 |
MI | 오른쪽으로 '-'기호 표시 | (1234, '99999MI') | 1234- |
PR | 음수값을 <>으로 표시 | (1234, '99999PR) | <1234> |
EEEE | 지수 표기법으로 표시 | (1234, '9.999EEEE(10의3승)') | 1.234E+03 |
V | 10N을 곱한값으로 표시 | (1234, '999V99') | 123400 |
B | 공백을 0으로 표시 | (1234, 'B9999.99') | 1234.00 |
예제)
SELECT NAME, SAL, COMM, TO_CHAR((SAL+COMM)*12, '9,999')
FROM PROFESSOR
WHERE COMM IS NOT NULL;
위 예제에서 '9,999'는 계산한 값에 , 를 붙이기 위해 사용했다.
사용시 주의점은 아래 예제를 보면서 설명하겠다.
SELECT TO_CHAR(1234567890, '999,999,999') FROM DUAL;
,를 사용하여 단위를 구분하려고 할때 좌측에 있는 입력값보다 범위가 작으면 결과값이 제대로 출력되지않는다.
SELECT TO_CHAR(1234567890, '9,999,999,999') FROM DUAL;
꼭 범위를 맞추거나 범위보다 높게 지정하자!
8) TO_NUMBER 함수
숫자로 구성된 문자열을 숫자 데이터로 변환하기 위한 함수 (보통 FORMAT와 같이 사용)
9) TO_DATE (FORMAT와 같이 사용)
숫자와 문자로 구성된 문자열을 날짜 데이터로 변환하는 함수
10) 중첩함수
F1함수의 결과값은 F2의 인수로, F2의 결과값은 F3의 인수로 사용된다.
예제)
11) 일반함수 NVL함수
- NVL함수는 NULL을 0또는 다른 값으로 변환하기 위한 함수
예제)201번학과 교수의 이름, 직급,급여,보직수당, 급여와 보직수당의 합계를 출력 단, 보직수당이 NULL인 경우에는 보직수당을 0으로 계산
SELECT NAME, POSITION, SAL, COMM, SAL+COMM, SAL+NVL(COMM, 0), NVL(SAL+COMM, SAL)
FROM PROFESSOR
WHERE DEPTNO = 201;
12) NVL확장함수 NVL2
첫번째값이 NULL이 아니면 두번째 인수값을 출력, 첤번째 인수값이 NULL이면 세번째 인수값을 출력
예제)
SELECT NAME, POSITION, SAL, COMM
, SAL+NVL(COMM, 0)
, NVL(SAL+COMM, SAL)
, NVL2(COMM, SAL+COMM, SAL)
FROM PROFESSOR
WHERE DEPTNO = 201;
13) NVL확장함수 NULLIF함수
두개의 값을 비교하여 같으면 NULL, 다르면 앞에값이다.
14) NVL확장함수 COALESCE함수
NULL을 만날때까지 찾는다 NULL을 만나면 첫번째 인수를 반환한다.
15) DECODE함수 (자주사용)
- JAVA의 SWITCH문이라고 생각하면 편하다.비교연산자는 '='만 사용가능, 일치하는 값이 없거나 NULL인 경우는 NULL반환
- 조건식이 짧을때만 사용
예제) 교수테이블에서 교수의 소속학과 번호를 학과 이름으로 변환하여 출력,
학과번호가 101번이면 '컴퓨터공학과' 102번'멀티미디어과' 201번'전자공학과', 나머지는'기계공학과'로 변환
SELECT NAME, DEPTNO
,DECODE(DEPTNO, 101, '컴퓨터공학과', 102, '멀티미디어학과', 201, '전자공학과', '기계공학과')
FROM PROFESSOR;
예제2)
SELECT
TO_CHAR(BIRTHDATE, 'MM') A
, TRUNC(TO_CHAR(BIRTHDATE, 'MM')/3) B
, DECODE(TRUNC(TO_CHAR(BIRTHDATE, 'MM')/3), 1,'봄', 2,'여름', 3, '가을', '겨울') C
, BIRTHDATE D
, ADD_MONTHS(BIRTHDATE, -2) E -- 풀이2
, TO_CHAR(ADD_MONTHS(BIRTHDATE, -2),'Q') F
, DECODE(TO_CHAR(ADD_MONTHS(BIRTHDATE, -2), 'Q'), 1, '봄', 2,'여름', 3, '가을', '겨울') G
FROM STUDENT;
15-1) DECODE사용시 주의사항
- SIGN, LEAST, GREATEST문을 사용하지말고 CASE문으로 대체해서 사용
- ELSE없는 IF를 사용하기 때문에 성능상의 이득이 있을수 있다.
16)CASE함수 (JAVA의 IF문과 비슷함)
- CASE함수는 DECODE함수의 기능을 확장한 함수
- 산술연산, 관계연산, 논리연산과 같은 다양한 비교가 가능
- WHEN절에서 표현식을 다양하게 정의
- 직관적인 문법체계와 다양한 비교 표현식 사용
예제)교수테이블에서 소속 학과에 따라 보너스를 다르게 계산하여 출력
학과 번호별로 보너스가 다르다 학과번호가 101이면 보너스는 급여의 10%, 102는 20%, 201이면 30%, 나머지는 0%
SELECT PROFNO, NAME, SAL, DEPTNO
, DECODE(DEPTNO, 101, SAL*.1, 102, SAL*.2,201, SAL*.3, 0) A,
CASE DEPTNO
WHEN 101 THEN SAL*.1
WHEN 102 THEN SAL*.2
WHEN 201 THEN SAL*.1
ELSE 0
END B,
CASE
WHEN DEPTNO = 101 THEN SAL*.1
WHEN DEPTNO = 102 THEN SAL*.2
WHEN DEPTNO = 201 THEN SAL*.3
ELSE 0
END C
FROM PROFESSOR;
첫번째 계산은 DECODE로 계산하였다.
16.DECODE사용시 주의사항 (p.276)
- DECODE함수 내부에서 DECODE문을 사용하는 경우에는 성능저하 발생
DECODE | CASE WHEN | |
기능 | 조건단위 분기 SWITCH문 대응 |
|
좋은점 | 코드의 함축성 | |
불편한점 | ||
사족 |
2. 그룹함수
1) 그룹함수의 개념
- 테이블의 전체 행을 하나 이상의 컬럼을 기준으로 그룹화 하여 그룹별로 결과를 출력하는 함수
- 그룹함수는 통계적인 결과를 출력하는데 자주 사용
2)사용법
- GROUP BY : 전체행을 그룹화
- HAVING : 그룹바이절에 의해 생성된 그룹별로 조건 부여
3) 그룹함수의 종류