[DB/SQL] SQL 기본 및 활용 - Function

Joo·2024년 2월 22일

RDB & SQL

목록 보기
7/24

강의 링크 : https://www.youtube.com/watch?v=IFqbznohZSw&list=PLg_wJlcMiuKtGdlIaAZ0rOPPQuTDENnEQ&index=9


함수의 유형

  • 생성 주체
    • 사용자 정의 함수
    • 내장 함수
  • 적용 범위
    • 단일 행 함수 : 문자형 함수, 숫자형 함수, 날짜형 함수, 제어 함수, 변환 함수, NULL 관련 함수
      • 각 행(Row)에 대해 개별적으로 작용하고 그 결과를 반환함
      • 단일 행 내에 있는 하나 또는 복수의 값을 인수로 사용
      • 여러 행에 걸친 값을 사용할 수 없음
      • 함수 중첨(함수의 인자로 함수를 사용)이 가능함
      • SELECT, WHERE, ORDER BY 절에 사용 가능함
    • 다중 행 함수 : 그룹 함수(집계 함수 포함), 윈도우 함수

단일 행 함수

문자형 함수 - 단일 행 함수

⌨️ A)

SELECT PLAYER_NAME SUBSTR(PLAYER_NAME, 1, LENGTH(PLAYER_NAME)-1) || '*' AS 비식별화 
FROM PLAYER;

SELECT PLAYER_NAME CONTCAT(SUBSTR(PLAYER_NAME, 1, LENGTH(PLAYER_NAME)-1), '*' AS 비식별화
FROM PLAYER;

숫자형 함수 - 단일 행 함수

⌨️ A)

SELECT PLAYER_ID, MOD(PLAYER_ID, 4) # 암시적 데이터 타입 변환 (아래 참조)
FROM PLAYER;

SELECT PLAYER ID, MODE(TO_NUMBER(PLAYER_ID), 4) # 명시적 데이터 타입 변환 (아래 참조)
FROM PLAYER; 

변환형 함수 - 단일 행 함수

변환형 함수 - 단일 행 함수

  • 데이터 타입 변환
    • 명시적(Explicit) 데이터 타입 변환
      • 함수를 사용하여 명시적으로 데이터 타입을 변환
    • 암시적(Implicit) 데이터 타입 변환
      • 시스템이 자동으로 데이터 타입 변환
      • 예 : MOD(PLAYER_ID, 4) → 문자열을 숫자로 변환
      • 성능 저하 및 에러 발생의 가능성 존재

⌨️ TO_CHAR 예시

SELECT TO_CHAR(20)
FROM DUAL;

SELECT SYSDATE # 오늘 날짜
FROM DUAL;

SELECT SYSDATE + 1 # 암시적 데이터 타입 변환
FROM DUAL;

SELECT TO_CHAR(SYSDATE, 'YYYY.MM.DD.HH24.MI.SS')
FROM DUAL;

날짜형 함수 - 단일 행 함수

⌨️ A)

SELECT PLAYER_NAME, BIRTH_DATE, TRUNC(SYSDATE - BIRTH_DATE) AS "DAY_PASSED"
FROM PLAYER;



CASE Expression

  • 표현식이지만 함수의 성격을 갖고 있음

  • IF ~ THEN ~ ELSE 논리 흐름

  • Searched Case Expression만 가능한 경우의 예

    • 동등(=) 이외의 조건은 Simple Case Expression 또는 Decode 함수로 표현 불가
    • 변수가 먼저 나오면 simple case expression, WHEN이 먼저 나오면 searched case expression
SELECT PLAYER_NAME,
    CASE
        WHEN HEIGHT > 185 THEN '장신'
        WHEN HEIGHT BETWEEN 175 AND 185 THEN '평균'
        ELSE '단신'
    END AS 신장
FROM PLAYER;
  • CASE 표현식의 중첩
SELECT PLAYER_NAME,
    CASE
        WHEN HEIGHT > 185 THEN '장신'
        ELSE(
            CASE
                WHEN HEIGHT BETWEEN 175 AND 185 THEN '평균'      
                ELSE '단신'
            END)
    END AS 신장
FROM PLAYER;
  • DECODE
    • Oracle에서만 사용되는 함수 (표준 SQL에는 없음)
    • Simple case expression만 가능
    • DECODE(표현식, 기준값1, 출력값1, [, 기준값2, 출력값2, ... , 디폴트값])
    • 표현식의 값이 기준값1이면 값1을 출력, 기준값2이면 값2를 출력
    • 기준값이 없으면 디폴트값을 출력
SELECT PLAYER_NAME,
    DECODE(POSITION,
        'GK', '골키퍼',
        'DF', '수비수',
        'MF', '미드필더',
        'FW', '공격수',
        '그 외') AS POSITION
FROM PLAYER;

NULL이란?

  • 비어있는 값
  • 공백(space), 0과는 다른 의미
  • NULL을 포함하는 모든 산술 연산의 결과는 NULL
    • NULL + 0, NULL - 1, NULL * 0, NULL/0 → NULL
    • 논리 연산의 결과는 NULL이 아닐 수도 있음
  • NULL과 공집합도 역시 다른 의미

Q) 다음 두 문장의 실행 결과를 비교하시오.

⌨️```
SELECT POSITION FROM PLAYER
WHERE PLAYER_NAME = '남현우';

SELECT POSITION FROM PLAYER
WHERE PLAYER_NAME = '말도안되는이름';

⌨️ A)

위에 거 - NULL (결과가 존재함)
아래 거 - 공집합 (결과가 존재하지 않음)

  • NVL : 괄호안1이 NULL이 아니면 원래값, NULL이면 괄호안2 반환

  • NULLIF : 괄호안1 = 괄호안2이면 괄호안1 반환, 다르면 NULL 반환

  • COALESCE : 그 값이 없으면 딴 값이라도 반환

    COALESCE의 예시

  • NVL

    • NULL 값을 특정 값으로 변환할 때 사용
    • 선수명과 포지션을 출력하되, 포지션이 없는 경우는 '없음'으로 출력하는 예
      SELECT PLAYER_NAME, POSITION,
          NVL(POSITION, '없음') AS 포지션
      FROM PLAYER;
      
      # 위의 문장을 IS NULL과 CASE 구문으로 표현하시오.
      SELECT PLAYER_NAME, 
          CASE
              WHEN POSITION IS NULL THEN '없음'
              ELSE POSITION
          END AS 포지션
      FROM PLAYER;
      
      SELECT PLAYER_NAME, POSITION,
      CASE WHEN POSITION IS NULL THEN '없음'
          ELSE POSITION
      END AS 포지션
      FROM PLAYER;
profile
적당히 공부한 거 정리하는 곳

0개의 댓글