[DataBase] 2장_단일행 함수

존진·2023년 10월 18일
0

📌 단일행 함수와 복수행 함수의 차이

✅ 복수행 함수

여러 개의 입력행수 -> 하나의 결과

Group 함수

  • COUNT
  • SUM
  • AVG
  • MAX
  • MIN
  • :

✅ 단일행 함수

1개의 입력행수 -> 하나의 결과

  • 문자 함수
  • 숫자 함수
  • 날짜 함수
  • 형변환 함수
  • 일반 함수
  • 정규식 함수

📌 문자 함수

✅ INITCAP

  • 입력 값의 첫 글자만 대문자로 변환

✅ LOWER

  • 입력 값을 전부 소문자로 변환

✅ UPPER

  • 입력 값을 전부 대문자로 변환

✅ LENGTH

  • 문자열의 길이 값 출력
SELECT ename, job, LENGTH(job) "직무명의 길이", LENGTHB(job) "바이트 수"
FROM emp;

LENGTHB

: 문자열 길이의 바이트 값 출력

⚠️
한글은 한 글자를 3byte로 쪼갬
LENGTH('홍길동') -> 3
LENGTHB('홍길동') -> 6


✅ CONCAT

  • 두 문자열을 결합해 출력( || 연산자와 동일 )

    A || B || C
    = CONCAT(CONCAT(A, B), C)

SELECT ename, job, LENGTH(job) "직무명의 길이", LENGTHB(job) "바이트 수"
FROM emp;


⭐ SUBSTR

  • 주어진 문자에서 특정 문자만 추출
  • SUBSTR('문자열' or 컬럼, '찾는 글자', 시작 위치, 시작 위치에서 추출할 문자까지의 위치)

    [학생 테이블에서 남자만 찾기]
    SELECT *
    FROM stu
    WHERE SUBSTR(jumin, 8, 1) = '1';

[🔎] 위치가 '-2'라면 오른쪽 자릿수부터 계산하여 추출함

SELECT profno, CONCAT(CONCAT(name,'-'), position) "이름및직급"
FROM professor;
----------------------------------------------------------
⚠️ 뒤에 공백이 있을 수도 있으니 제거 후 출력하는 것이 좋다.
SELECT ename, INITCAP(SUBSTR(ename,1,3))
FROM emp
WHERE LENGTH(rtrim(ename,' '))>=6;

✅ INSTR

  • 주어진 문자에서 특정 문자의 위치 추출
  • 형식: INSTR('문자열' or 컬럼, '찾는 글자', 시작 위치, 몇 번째인지)
1234567
A-B-C-D
SELECT 'A-B-C-D', INSTR('A-B-C-D', '-', 1, 3) 
FROM dual;

[위의 표 참고]
➡️ '-' 문자열을 처음 위치에서부터 찾는다. 3번째 나타나는 '-' 위치를 추출한다. 결과 값은 6이다.

[🔎] INSTR('A-B-C-D', '-', -1, 3)
위의 식일 때 결과 값은 2이다.
(-1의 위치는 오른쪽 자릿수부터 계산하기 때문임)


✅ LPAD

  • 주어진 문자열에서 왼쪽으로 특정 문자 채움
  • 형식: LPAD('문자열' or 컬럼, 자릿수, '채울 문자')

✅ RPAD

  • 주어진 문자열에서 오른쪽으로 특정 문자 채움
  • RPAD('문자열' or 컬럼, 자릿수, '채울 문자')

✅ LTRIM

  • 주어진 문자열에서 왼쪽의 특정 문자 삭제
  • LTRIM('문자열' or 컬럼, '제거할 문자')

✅ RTRIM

  • 주어진 문자열에서 오른쪽의 특정 문자 삭제
  • RTRIM('문자열' or 컬럼, '제거할 문자')

✅ REPLACE

  • 주어진 문자열에서 A를 B로 치환
  • REPLACE('문자열' or 컬럼, '문자1', '문자2')


📌 숫자 함수

✅ ROUND

  • 주어진 숫자를 반올림 후 출력
  • 형식: ROUND(숫자, 출력을 원하는 자릿수)

Q. 반올림하여 소수점 둘째자리까지 나타내라.

ROUND(987.657, 2)

🔎 결과 값: 987.66

✅ TRUNC

  • 주어진 숫자를 버림 후 출력
  • TRUNC(숫자, 원하는 자릿수)

Q. 소수점 둘째자리까지 나타내라.

TRUNC(987.657, 2)

🔎 결과 값: 987.65

✅ MOD

  • 주어진 숫자를 나눈 후 나머지 값 출력
  • MOD(숫자, 나눌 수)
MOD(123, 10)

🔎 결과 값: 3

✅ CEIL

  • 주어진 숫자와 근접한 큰 정수 출력(올림)
  • CEIL(숫자)
CEIL(123.45)

🔎 결과 값: 124

✅ FLOOR

  • 주어진 숫자와 근접한 작은 정수 출력(내림)
  • FLOOR(숫자)
FLOOR(123.45)

🔎 결과 값: 123 (TRUNC와 유사함)

✅ POWER

  • 주어진 숫자 1의 숫자 2승을 출력
  • POWER(숫자1, 숫자2)
POWER(2, 3)

🔎 결과 값: 8


📌 날짜 함수

✅ SYSDATE

  • 시스템의 현재 날짜와 시간
  • SELECT SYSDATE FROM ...;

✅ MONTHS_BETWEEN

  • 두 날짜 사이의 개월 수
  • MONTHS_BETWEEN('날짜', '날짜')

✅ ADD_MONTHS

  • 주어진 날짜에 개월을 더함
  • ADD_MONTHS('날짜', 더할 숫자 및 날짜)

✅ NEXT_DAY

  • 주어진 날짜를 기준으로 돌아오는 날짜 출력
  • NEXT_DAY('날짜', '돌아올 요일')

✅ LAST_DAY

  • 주어진 날짜가 속한 달의 마지막 날짜 출력
  • LAST_DAY('날짜')

✅ ROUND

  • 주어진 날짜를 반올림
  • ROUND('날짜')

✅ TRUNC

  • 주어진 날짜를 버림
  • TRUNC('날짜')

📌 형변환 함수

✅ TO_CHAR

  • 주어진 날짜가 속한 달의 마지막 날짜 출력
  • TO_CHAR('원래날짜', '원하는 모양')
종류의미예시결과
99의 개수만큼 자리수TO_CHAR(1234, '99999')1234
0빈자리를 0으로 채움TO_CHAR(1234, '099999')001234
$$ 표시를 붙여서 표시TO_CHAR(1234, '$9999')$1234
.소수점 이하를 표시TO_CHAR(1234, '9999.99')1234.00
,단위 구분 기호 표시TO_CHAR(12345, '99,999')12,345

✅ TO_NUMBER

  • 숫자가 아닌 숫자처럼 생긴 문자를 숫자로 바꾸어줌
  • TO_NUMBER('숫자처럼 생긴 문자')

⭐ TO_DATE

  • 문자로 되어 있는 날짜를 날짜 형식으로 바꿔줌
  • TO_DATE('문자')


📌 일반 함수

✅ NVL

  • NULL 값을 만나면 다른 값으로 치환해서 출력
  • NVL(컬럼, 치환할 값)

NVL(sal, 0): sal 컬럼 값이 null일 경우 null 대신 0으로 치환한다.
NVL(position, '사원'): position 컬럼 값이 null일 경우 null 대신 '사원'으로 치환한다.


✅ NVL2

  • 컬럼1의 값이 NULL이 아니면 컬럼2를, NULL이면 컬럼3을 출력
  • NVL2(컬럼1, 컬럼2, 컬럼3)

⭐ DECODE

- DECODE(A, B, '1', '2'): A가 B일 경우 '1' 출력, 아닐 경우 '2' 출력

- DECODE(A, B, '1', C, '2', '3'): A가 B일 경우 '1' 출력, A가 C일 경우 '2' 출력, 둘 다 아닐 경우 '3' 출력

- DECODE(A, B, DECODE(C, D, '1', '2')): A가 B일 경우 중 C가 D를 만족하면 '1' 출력, C가 D가 아닐 경우 '2' 출력

- DECODE(A, B, DECODE(C, D, '1', '2'), '3'): A가 B일 경우 중 C가 D를 만족하면 '1' 출력, C가 D가 아닐 경우 '2' 출력, A가 B가 아닐 경우 '3' 출력


✅ CASE

  • CASE 조건 WHEN 결과1 THEN 출력1
    [WHEN 결과2 THEN 출력2]
    ELSE 출력3
    END "컬럼명"

CASE 지역번호 WHEN '02', 서울
WHEN '031', 경기
=> CASE WHEN 지역번호 = '02' THEN 서울
     WHEN 지역번호 = '031' THEN 경기


0개의 댓글