728x90
728x90

* 이 글은 제가 공부하기 위해 최대한 사실에 입각해 내용을 적으려고 하지만 일부 내용들이 정확하지 않을 수 있습니다.

   혹시나 잘못된 부분이 있으면 너그럽게 이해해 주시고 피드백 부탁드려요!


1. SQL 함수의 개념

• SQL 함수

  – 칼럼의 값이나 데이터 타입의 변경하는 경우
  – 숫자 또는 날짜 데이터의 출력 형식 변경하는 경우
  – 하나 이상의 행에 대한 계(aggregation)를 하는 경우

• SQL 함수의 유형

  – 단일 행 함수 : 테이블에 저장되어 있는 개별 행을 대상으로 함수를 적용하여 하나의 결과를 반환하는 함수
  – 복수 행 함수: 조건에 따라 여러 행을 그룹화하여 그룹별로 결과를 하나씩 반환하는 함수

• 단일 행 함수

  – 데이터 값을 조작하는데 주로 사용
  – 행별로 함수를 적용하여 하나의 결과를 반환하는 함수

• 단일 행 함수의 종류

• 단일 행 함수의 사용법

  – function_name : 단일 행 함수 이름
  – column : 칼럼 이름
  – expression : 문자열 또는 표현식
  – arg1, arg2 : 함수의 인수(상수, 변수, 칼럼 이름, 표현식)

 

2. 문자 함수

• 문자 함수

  – 문자 데이터를 입력하여 문자나 숫자를 결과로 반환하는 함수

• 문자 함수의 종류

  – 대소문자 변환 함수
  – 문자조작 함수
  – 문자열 길이반환 함수

[표 6.1] 대소문자 변환 함수의 종류와 사용 예

대소문자 변환 함수 INITCAT 함수

• INITCAP 함수

  – 인수로 입력되는 칼럼이나 표현식의 문자열에서 첫 번째 영문자를 대문자로 변환하는 함수

• 사용법


• 사용 예

– 학생 테이블에서 "김영균" 학생의 이름, 사용자 아이디를 출력하여라. 

그리고 사용자 아이디의 첫 문자를 대문자로 변환하여 출력하여라

 

대소문자 변환 함수 LOWER, UPPER 함수

• LOWER, UPPER 함수

  – LOWER 함수 : 인수로 입력되는 칼럼이나 표현식의 문자열 전체를 소문자로 변환하는 함수
  – UPPER 함수 : 문자열 전체를 대문자로 변환하는 함수

• 사용법

• 사용 예

– 학생 테이블에서 학번이 "20101"인 학생의 사용자 아이디를 소문자와 대문자로 변환하여 출력하여라.

문자열 길이 반환 함수

• 문자열 길이 반환 함수

– LENGTH 함수는 인수로 입력되는 칼럼이나 표현식의 문자열의 길이를 반환하는 함수이고,
– LENGTHB 함수는 문자열의 바이트 수를 반환하는 함수이다. 

[표 6.2] 문자열 길이 반환 함수의 종류와 사용 예

문자열 길이 반환 함수 LENGTH, LENGTHB 함수

• 사용법


• 사용 예

– 부서 테이블에서 부서 이름의 길이를 문자 수와 바이트 수로 각각 출력하여라

 

문자조작 함수

[표 6.3] 문자 조작 함수의 종류와 사용 예

문자조작 함수 CONCAT함수

• CONCAT 함수

  – 첫 번째 문자와 두 번째 문자를 연결

• 사용법

문자조작 함수 SUBSTR 함수

• SUBSTR 함수

  – 문자열의 일부를 추출하는 함수

• 사용법

  – 문자열에서 m번째 문자부터 n개의 문자 추출
  – m이 음수이면 시작위치는 문자열의 마지막
  – n을 생략하면 m부터 마지막 문자까지 추출

• 사용 예

– 학생 테이블에서 1학년 학생의 주민등록 번호에서 생년월일과 태어난 달을 추출하여 이름, 주민번호, 생년월일, 태어난 달을 출력하여라.

문자조작 함수 INSTR 함수

• INSTR 함수

  – 문자열중에서 사용자가 지정한 특정 문자가 포함된 위치를 반환하는 함수
  – n번째 위치부터 m번째 char의 위치를 찾음
  – 만약 n이 음수이면 char의 뒤부터 찾음

• 사용법

• 사용 예

– 부서 테이블의 부서 이름 칼럼에서 "과" 글자의 위치를 출력하여라

문자조작 함수 LPAD, RPAD 함수

• LPAD, RPAD 함수

  – LPAD와 RPAD 함수는 문자열이 일정한 크기가 되도록 왼쪽 또는 오른쪽에 지정한 문자를 삽입하는 함수

• 사용법

– m 폭만큼 공백을 왼쪽 또는 오른쪽에 char 문자 삽입, char가 없으면 공백 삽입

• 사용 예

– 교수테이블에서 직급 칼럼의 왼쪽에 "*" 문자를 삽입하여 10바이트로 출력하고 교수 아이다 칼럼은

오른쪽에 "+" 문자를 삽입하여 12바이트로 출력하여라

문자조작 함수 LTRIM, RTRIM 함수

• LTRIM, RTRIM 함수

  – LTRIM와 RTRIM 함수는 문자열에서 특정 문자를 삭제하기 위해 사용
  – 함수의 인수에서 삭제할 문자를 지정하지 않으면 문자열의 앞뒤 부분에 있는 공백 문자를 삭제

• 사용법

– 문자열의 왼쪽 또는 오른쪽에서부터 지정된 char 문자를 삭제

• 사용 예

• 사용 예

– 부서 테이블에서 부서 이름의 마지막 글자인 "과"를 삭제하여 출력하여라.

 

 

3. 숫자 함수

• 숫자 함수

  – 숫자 데이터를 처리하기 위한 함수

[표 6.4] 숫자 함수의 종류와 사용 예

숫자 함수 ROUND 함수

• ROUND 함수

  – 지정한 자리 이하에서 반올림한 결과 값을 반환하는 함수

• 사용법

– expr 또는 column값을 소수점 이하 n+1자리에서 반올림

• 사용 예

– 교수 테이블에서 101 학과 교수의 일급을 계산(월 근무일은 22일)하여 소수점 첫째 자리와 셋째 자리에서 반올림 한 값과 소수점 왼쪽 첫째 자리에서 반올림한 값을 출력하여라

 

숫자 함수 TRUNC 함수

• TRUNC 함수

  – 지정한 소수점 자릿수 이하를 절삭한 결과 값을 반환하는 함수

• 사용법

– expr 또는 column 값을 소수점 이하 n+1자리에서 절삭한 값

 

• 사용 예

– 교수 테이블에서 101 학과 교수의 일급을 계산(월 근무일은 22일)하여 소수점 첫째 자리와 셋째 자리에서 절삭 한 값과 소수점 왼쪽 첫째 자리에서 절삭한 값을 출력하여라

숫자 함수 MOD 함수

• MOD 함수

  – MOD 함수는 나누기 연산 후에 나머지를 출력하는 함수

• 사용법

– m을 n으로 나눈 나머지

 

• 사용 예

– 교수 테이블에서 101번 학과 교수의 급여를 보직수당으로 나눈 나머지를 계산하여 출력하여라

 

숫자 함수 CEIL, FLOOR 함수

• CEIL, FLOOR 함수

  – CEIL 함수는 지정한 숫자보다 크거나 같은 정수 중에서 최소 값을 출력하는 함수
  – FLOOR함수는 지정한 숫자보다 작거나 같은 정수 중에서 최댓값을 출력하는 함수

• 사용 예

• 사용 예

– 19.7보다 큰 정수 중에서 가장 작은 정수와 12.345보다 작은 정수 중에서 가장 큰 정수를 출력하여라

 

 

4. 날짜 함수

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

• 날짜 계산

  – 날짜 계산은 날짜 데이터에 더하기, 빼기의 연산을 하는 기능

[표 6.5] 날짜 타입의 연산

• 사용 예

– 교수 번호가 9908인 교수의 입사일을 기준으로 입사 30일 후와 60일 후의 날짜를 출력하여라

 

날짜 함수의 종류

[표 6.6] 날짜 함수의 종류

날짜 함수 SYSDATE 함수

• SYSDATE 함수

  – SYSDATE 함수는 시스템에 저장된 현재 날짜를 반환하는 함수로서, 초 단위까지 반환

• 사용 예

– 시스템의 현재 날짜를 출력하여라

날짜 함수 MONTHS_BETWEEN, ADD_MONTHS

• MONTHS_BETWEEN, ADD_MONTHS

  – MONTHS_BETWEEN과 ADD_MONTHS 함수는 월 단위로 날짜 연산을 하는 함수

• 사용법

– MONTHS_BETWEEN : date1과 date2 사이의 개월 수를 계산
– ADD_MONTHS : date에 개월 수를 더한 날짜 계산

• 사용 예

– 입사한 지 120개월 미만인 교수의 교수번호, 입사일, 입사일로 부터 현재일까지의 개월 수, 입사일에서 6개월 후의 날짜를 출력하여라

날짜 함수 LAST_DAY, NEXT_DAY

• LAST_DAY, NEXT_DAY

  – LAST_DAY 함수는 해당 날짜가 속한 달의 마지막 날짜를 반환하는 함수
  – NEXT_DAY 함수는 해당 일을 기준으로 명시된 요일의 다음 날짜를 변환하는 함수

• 사용법

– NEXT_DAY : date 날짜 이후의 첫 번째 "day" 요일의 날짜를 계산
– LAST_DAY : date 날짜가 속한 달의 마지막 날짜를 계산

• 사용 예

– 오늘이 속한 달의 마지막 날짜와 다가오는 일요일의 날짜를 출력하여라

날짜 함수 ROUND, TRUNC 함수

• ROUND, TRUNC 함수

  – 날짜를 반올림 또는 절삭

• 사용법


– ROUND : 날짜를 반올림
– TRUNC : 날짜를 절삭

• 사용 예

– 시간 정보를 생략한 경우, ROUND 함수와 TRUNC 함수의 결과를 비교한 예이다.

• 사용 예

– 101번 학과 교수들의 입사일을 일, 월, 년을 기준으로 반올림하여 출력하여라.

 

5. 데이터 타입의 변환

• 데이터 타입의 변환

  – 숫자나 날짜 타입을 문자와 함께 결합하거나 보고서 양식에 맞추기 위해 주로 사용

• 묵시적인 데이터 타입 변환

  – 묵시적인 데이터 타입 변환은 정확한 연산을 위하여 오라클에서 데이터 타입을 내부적으로 변환하는 경우

[표 6.7] 묵시적 데이터 타입 변환: WHERE A=B 일 때(A는 칼럼, B는 상수)

– 문자 타입의 숫자타입으로 변환은 문자열이 숫자로 구성된 경우에만 가능

 

묵시적인 데이터 타입 변환

  – studno 가 NUMBER 데이터 타입이고 "10102" 데이터가 문자인 경우에는 "10102"가 NUMBER

     데이터 타입으로 묵시적인 변환 발생

  – grade가 VACHAR2 데이터 타입이고 상수값이 숫자인 경우 grade 칼럼의 데이터 타입이 NUMBER

     데이터 타입으로 묵시적인 변환 발생
  – grade 칼럼에 인덱스가 생성되어 있더라도 묵시적인 변환에 의해 인덱스 사용이 불가능하여 처리

     속도가 느려질 수 있음

 

묵시적인 데이터 타입 변환 성능영향

명시적인 데이터 타입 변화

 

• 명시적인 데이터 타입 변환

  – 사용자가 데이터 타입 변환 함수를 이용하여 명시적으로 데이터타입을 변환

[표 6.8] 명시적 데이터 타입 변환 함수

 

TO_CHAR함수

• TO_CHAR 함수

  – TO_CHAR 함수는 날짜나 숫자를 문자로 변환하기 위해 사용

  – 날짜 출력 형식 변경

• 사용법

날짜 출력 형식의 종류

[표 6.9] 날짜 출력 형식의 종류

TO_CHAR함수 예

• 사용 예

– 학생 테이블에서 전인하 학생의 학번과 생년월일 중에서 년월만 출력하여라

• 사용 예

– 학생 테이블에서 102번 학과 학생의 이름, 학년, 생년월일을 출력하여라

시간 표현 형식의 종류

[표 6.10] 시간 표현 형식의 종류

시간 표현 형식 예

• 사용 예

– 교수 테이블에서 101번 학과 교수의 이름과 입사일을 출력하여라.

기타 날짜 표현 형식

[표 6.11] 기타 날짜 표현 형식의 종류

기타 날짜 표현 형식 예

• 사용 예

– 교수 테이블에서 101번 학과 교수들의 이름, 직급, 입사일을 출력하여라

숫자를 문자 형식으로 변환

[표 6.12] TO_CHAR 함수를 이용한 숫자 출력 형식 변환

숫자를 문자 형식으로 변환 예

• 사용 예

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

TO_NUMBER 함수

• TO_NUMBER 함수

  – TO_NUMBER 함수는 숫자로 구성된 문자열을 숫자 데이터로 변환하기 위한 함수

• 사용법

• 사용 예

TO_DATE 함수

• TO_DATE 함수

  – TO_DATE 함수는 숫자와 문자로 구성된 문자열을 날짜 데이터로 변환하는 함수

• 사용법

– format : 날짜 포맷의 종류는 표 6-9 참조

• 사용 예

– 교수 테이블에서 입사일이 "june 01,01"인 교수의 이름과 입사일을 출력하여라.

중첩 함수

• 사용법

– F1함수의 결과 값은 F2의 인수로, F2의 결과 값은 F3의 인수로 사용된다.

• 사용 예

– 주민등록번호에서 생년월일을 추출하여 "YY/MM/DD" 형태로 출력하여라.

 

 

6. 일반 함수

일반 함수 NVL 함수

• NVL 변환 함수 : NVL

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

• 사용법

– expression1 : NULL을 포함하는 칼럼 또는 표현식
– expression2 : NULL을 대체하는 값
– 주의 : expression1과 expression2는 반드시 동일한 데이터 타입 이어야 한다.

• 사용 예

– 201번 학과 교수의 이름, 직급, 급여, 보직수당, 급여와 보직수당의 합계를 출력하여라.

단, 보직수당이 NULL인 경우에는 보직수당을 0으로 계산한다.

일반 함수 NVL 확장 함수 : NVL2 함수

• NVL2 함수

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

     NULL이면 세 번째 인수 값을 출력하는 함수

• 사용법

– expression1 : NULL을 포함하는 칼럼 또는 표식
– expression2 : expression1이 NULL이 아닌 때 반환되는 값
– expression3 : expression1이 NULL일 때 대체되는 값

 

• 사용 예

– 102번 학과 교수 중에서 보직수당을 받는 사람은 급여와 보직수당을 더한 값을 급여 총액으로 출력하여라. 단, 보직수당을 받지 않는 교수는 급여만 급여 총액으로 출력하여라.

일반 함수 NVL 확장 함수 : NVL2 함수 예

• SELECT ENAME , SAL, COMM , SAL+COMM , NVL2(COMM, SAL+COMM, SAL) ,

   SAL+NVL(COMM,0) FROM EMP ;

일반 함수 NVL 확장 함수 : NULLIF 함수

• NULLIF 함수

  – NULLIF 함수는 두 개의 표현식을 비교하여 값이 동일하면 NULL을 반환하고, 일치하지 않으면

     첫 번째 표현식의 값을 반환

• 사용법

– expression1 : expression2와 비교하는 값

NULLIF(expression1, expression2)

  – 표현식 1이 표현식 2와 같으면 NULL 값을 반환하는 함수

  – 같지 않으면 표현식 1 값을 반환

    예) SELECT NVL(NULLIF('A', 'A'), '널값') FROM emp; => 결과: '널값'
    SELECT NVL(NULLIF('A', 'B'), '널값') FROM DUAL; => 결과 : 'A'

• 사용 예

– 교수 테이블에서 이름의 바이트 수와 사용자 아이디의 바이트 수를 비교해서 같으면 NULL을 반환하고 같지 않으면 이름의 바이트 수를 반환하여라

 

일반 함수 NVL 확장 함수 : COALESCE 함수

• COALESCE 함수

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

• 사용법


– expression-1 : expression-1이 NULL이 아니면 expression-1을 반환
– expression-2 : expression-1이 NULL이고 expression-2가 NULL이 아니면 expression-2를 반환
– expression-n : expression-1부터 expression-n-1까지의 값이 NULL이고 expression-n이 NULL이 아니면 expression-n을 반환

COALESCE(expression-1, expression-2, … , expression-n)

NVL(표현식 1, NVL(표현식 2, … NVL(표현식 n-1, 표현식 n)…))와 유사
예) SELECT COALESCE(NULL, NULL, 10, 100, NULL) FROM DUAL; => 결과 :10
SELECT NVL(표현식 1, NVL(표현식 2, NVL(표현식 3, … NVL(표현식 n-1, 표현식 n)…)))

• 사용 예

– 교수 테이블에서 보직수당이 NULL이 아니면 보직수당을 출력하고, 보직수당이 NULL이고 급여가 NULL이 아니면 급여를 출력, 보직수당과 급여가 NULL이면 0을 출력하여라.

 

일반 함수 DECODE 함수

• DECODE 함수

  – DECODE 함수는 기존 프로그래밍 언어에서 IF문이나 CASE 문으로 표현되는 복잡한 알고리즘을

     하나의 SQL 명령문으로 간단하게 표현할 수 있는 유용한 기능

  – DECODE 함수에서 비교 연산자는 "="만 가능

• 사용법


– 표현식 또는 칼럼의 값이 SEARCH1 값과 일치하면 RESULT1 값을 반환, SEARCH2 값과 일치하면 RESULT2 값 반환
– 일치하는 값이 없거나 NULL인 경우에는 기본값 반환
– 기본값이 없는 경우에는 NULL 반환

 

• DECODE 함수의 개념을 도식적으로 표현한 것이다.

• 사용 예

– 교수 테이블에서 교수의 소속 학과 번호를 학과 이름으로 변환하여 출력하여라. 학과 번호가 101이면 "컴퓨터공학과", 102이면 "멀티미디어학과", 201이면 "전자공학과", 나머지 학과 번호는 "기계공학과"(default)로 변환한다.

일반 함수 CASE 함수

• CASE 함수

  – CASE 함수는 DECODE 함수의 기능을 확장한 함수
  – DECODE 함수는 표현식 또는 칼럼 값이 "=" 비교를 통해 조건과 일치하는 경우에만 다른 값으로

     대치할 수 있지만, CASE 함수에서는 산술 연산, 관계 연산, 논리 연산과 같은 다양한 비교가 가능

  – 또한 WHEN 절에서 표현식을 다양하게 정의
  – 8.1.7에서부터 지원되었으며, 9i에서 SQL, PL/SQL에서 완벽히 지원
  – DECODE 함수에 비해 직관적인 문법체계와 다양한 비교 표현식 사용

• 사용법

• 사용 예

– 교수 테이블에서 소속 학과에 따라 보너스를 다르게 계산하여 출력하여라. 학과 번호별로 보너스는 다음과 같이 계산한다. 학과 번호가 101이면 보너스는 급여의 10%, 102이면 20%, 201이면 30%, 나머지 학과는 0%이다.

DECODE 사용 시 주의사항

 

 

 

--23.02.01
----------------------------------------------------------------------------
-- 229 페이지
-- 시스템의 현재 날짜를 출력하여라.
SELECT SYSDATE FROM DUAL;

-- 231 페이지
-- 입사한지 360개월 미만인 교수의 교수번호, 입사일, 입사일로부터 현재일까지의 개월 수,
-- 입사일에서 6개월 후의 날짜를 출력하여라.
SELECT 
    PROFNO, HIREDATE, 
    MONTHS_BETWEEN(SYSDATE, HIREDATE), 
    ADD_MONTHS(HIREDATE, 6)
FROM PROFESSOR
WHERE MONTHS_BETWEEN(SYSDATE, HIREDATE) < 360;

-- 233페이지
-- 오늘이 속한 달의 마지막 날짜와 다가오는 일요일의 날짜를 출력하여라
-- KST 적용된 상태(KOREA STANDARD TIME), 다른 시간이면 한국어 안먹힘.
SELECT SYSDATE
    , LAST_DAY(SYSDATE)
    , NEXT_DAY(SYSDATE, '일요일')
FROM DUAL;

-- 같은 값(밑에것이 더 좋음)
SELECT SYSDATE
    , LAST_DAY(SYSDATE)
    , NEXT_DAY(SYSDATE, 1)
FROM DUAL;

-- 235페이지
-- 시간 정보를 생략한 경우, ROUND 함수와 TRUNC 함수의 결과를 비교한 예이다.
SELECT TO_CHAR(SYSDATE, 'YY/MM/DD HH24:MI:SS')
    , TO_CHAR(TRUNC(SYSDATE), 'YY/MM/DD HH24:MI:SS')  
    , TO_CHAR(ROUND(SYSDATE), 'YY/MM/DD HH24:MI:SS')
FROM DUAL;

SELECT TO_CHAR(SYSDATE + 3 / 24, 'YY/MM/DD HH24:MI:SS')
    , TO_CHAR(TRUNC(SYSDATE + 3 / 24), 'YY/MM/DD HH24:MI:SS')  
    , TO_CHAR(ROUND(SYSDATE + 3 / 24), 'YY/MM/DD HH24:MI:SS')
FROM DUAL;

-- 월기준 반올림할 때
SELECT ROUND(TO_DATE('231224', 'YYMMDD'), 'MM') FROM DUAL;

-- 236 페이지
-- 101번 학과 교수들의 입사일을 일, 월, 년을 기준으로 반올림하여 출력하여라.
SELECT TO_CHAR(HIREDATE, 'YY/MM/DD HH24:Mi:SS') A
    , TO_CHAR(ROUND(HIREDATE, 'DD'), 'YY/MM/DD HH24:Mi:SS') B
    , TO_CHAR(ROUND(HIREDATE, 'MM'), 'YY/MM/DD HH24:Mi:SS') C
    , TO_CHAR(ROUND(HIREDATE, 'YY'), 'YY/MM/DD HH24:Mi:SS') D
FROM PROFESSOR
WHERE DEPTNO =101;
728x90
300x250