[SQL] 단일 행 함수를 사용하여 출력 커스터마이즈

·2025년 5월 21일
0

SQL

목록 보기
3/126

단일 행 함수

  • 데이터 항목을 조작함
  • 인수를 사용하고 하나의 값을 리턴
  • 리턴되는 각 행에서 실행됨
  • 행당 하나의 결과를 리턴
  • 데이터 유형 수정 가능
  • 중첩 가능
  • 열이나 표현식을 인수로 사용할 수 있음

function namc | (arg1, arg2, ...) |

1. 문자 함수

1-1. 대소문자 변환 함수

LOWER: 소문자로 변환
UPPER: 대문자로 변환
INITCAP: 각 단어의 첫 글자만 대문자로 변환

LOWER('SQL Course') --> sql course
UPPER('SQL Course') --> SQL COURSE
INITCAP('SQL Course') --> Sql Course

SELECT last_name, UPPER(last_name), LOWER(last_name), INITCAP(last_name)
  FROM employees ;

1-2. 문자 조작 함수

CONCAT: 서로 연결된 결과 리턴(연결 연산자와 결과 동일함)
SUBSTR: 시작위치와 리턴할 문자 개수
LENGTH: 전체 길이 리턴
INSTR: 해당 문자가 몇번째에 위치하는지 리턴
LPAD
RPAD
L/RPAD(column명, 자릿수, 입력값)

CONCAT('Hello', 'World') --> HelloWorld
SUBSTR('HelloWorld', 1, 5) --> Hello
LENGTH('HelloWorld') --> 10
INSTR('HelloWorld', 'W') --> 6
LPAD(salary, 10, '*') --> *****24000
RPAD(salary, 10, '*') --> 24000*****
ㄴ salary컬럼의 자릿수를 10자리로 맞춰놓으면서 남는 오른쪽 자리에 *를 표시해라는 의미

select concat(concat(last_name, '''s job category is '), job_id) "Job"
from employees
where substr(job_id, 4) = 'REP';
select employee_id, concat(first_name, last_name) NAME,
length(last_name), instr(last_name, 'a') "Contains 'a'?"
from employees
where substr(last_name, -1, 1) = 'n';

ㄴ 마지막 한자리의 문자가 n인 행들을 검색해라

함수 중첩

  • 단일 행 함수는 어떠한 레벨로도 중첩될 수 있음
select last_name,
    upper(concat(substr(last_name, 1, 8), '_US'))
from employees
where department_id = 60;

2. 숫자 함수

ROUND: 지정된 소수점 자릿수로 값을 반올림
TRUNC: 지정된 소수점 자릿수로 값을 truncate함(값을 버림)
CEIL: 지정된 수 이상인 가장 작은 정수 반환
FLOOR: 지정된 수 이하인 가장 큰 정수 반환
MOD: 나눈 나머지 반환

ROUND(45.926, 2) --> 45.93
TRUNC(45.926, 2) --> 45.92
CEIL(2.83) --> 3
FLOOR(2.83) --> 2
MOD(1600, 300) --> 100

2-1. ROUND 함수

SELECT 58.567
        ,ROUND(58.567, 2)
        ,ROUND(58.567, 0)
        ,ROUND(58.567, -1)
FROM dual;

하나의 행 결과만 필요할 때 -> from dual;
DUAL: 함수 및 계산의 결과를 볼 때 사용할 수 있는 공용(public) 테이블
ROUND(58.567, -1): 음수로 지정하면, 1의 자릿값을 이용해서 반올림

2-2. TRUNC 함수

SELECT 58.567
      ,TRUNC(58.567, 2)    
      ,TRUNC(58.567, 0)    
      ,TRUNC(58.567, -1)   
  FROM dual ;

TRUNC(58.567, -1): 1의 자릿값을 무조건 0으로 만듦

2-3. MOD 함수

employee_id가 짝수인 사원 레코드 표시

select employee_id as "Even Numbers", last_name
from employees
where mod(employee_id, 2) = 0;

3. 날짜

  • 오라클 DB는 내부 숫자 형식(세기, 년, 월, 일, 시, 분, 초)으로 날짜를 저장
ALTER SESSION SET nls_date_format = 'YYYY/MM/DD HH24:MI:SS' ;
SELECT TO_DATE('95/10/27','YY/MM/DD')
      ,TO_DATE('95/10/27','RR/MM/DD')
  FROM dual ;
  
/* 결과
2095/10/27 00:00:00
1995/10/27 00:00:00 */
  • YY: 현재 세기
    • 두 자리로 표현할 때는 절대 사용하면 X
  • RR: 현재에 근접한 세기
    • 두 자리로 표현할 때는 RR을 사용하는 편이 좋음

3-1. SYSDATE 함수

SYSDATE 함수는 날짜, 시간을 반환함

SELECT SYSDATE 
  FROM dual ;

3-2. CURRENT_DATE 및 CURRENT_TIMESTAMP 함수

  • CURRENT_DATE 유저 세션의 현재 날짜를 반환
SELECT SYSDATE, CURRENT_DATE 
  FROM dual ;
  • CURRENT_TIMESTAMP 유저 세션의 현재 날짜 및 시간을 반환
SELECT SYSTIMESTAMP, CURRENT_TIMESTAMP
  FROM dual ; 

3-3. 날짜 연산

  • 날짜에 숫자를 더하거나 빼서 결과 날짜 값을 구함 (곱셈, 나눗셈은 불가능)
  • 두 날짜 사이의 일 수를 알아내기 위해 빼기 연산을 함
  • 시간 수를 24로 나눠, 날짜에 시간을 더함
SELECT SYSDATE, SYSDATE + 10, SYSDATE - 10 
  FROM dual ;

SELECT SYSDATE, SYSDATE + 1/24, SYSDATE + 5/1440
  FROM dual ;

SELECT last_name, hire_date, SYSDATE - hire_date
  FROM employees ;
  • SYSDATE + 1/24: 현재 시간에 1시간 더함
  • SYSDATE + 5/1440: 현재 시간에 5분 더함 (60*24 = 1440)
  • SYSDATE + hire_date --> 오류남
    • ⚠️ 날짜에 날짜를 더하는 연산은 불가능 (빼기만 가능)

날짜에 산술 연산자 사용

select last_name, (sysdate - hire_date)/7 as WEEKS
from employees
where department_id = 90;

3-4. 날짜 조작 함수

MONTHS_BETWEEN: 두 날짜 간의 월 수
ADD_MONTHS: 날짜에 월 추가
NEXT_DAY: 지정된 날짜의 요일
LAST_DAY: 월의 마지막 날
ROUND: 날짜 반올림
TRUNC: 날짜 truncate(절삭)

SELECT hire_date
      ,ADD_MONTHS(hire_date, 2)
      ,MONTHS_BETWEEN(SYSDATE, hire_date)
  FROM employees ;
  
SELECT hire_date
      ,NEXT_DAY(hire_date, '금요일')
      ,LAST_DAY(hire_date)
  FROM employees ;

SELECT SYSDATE  
      ,ROUND(SYSDATE,'YYYY')
	  ,ROUND(SYSDATE,'MM')
	  ,ROUND(SYSDATE,'DD')
  FROM dual ; 
  
SELECT SYSDATE  
      ,TRUNC(SYSDATE,'YYYY')
	  ,TRUNC(SYSDATE,'MM')
	  ,TRUNC(SYSDATE,'DD')
  FROM dual ;
  • SYSDATE --> 2025/05/23 21:21:36
  • ROUND(SYSDATE,'YYYY') --> 2025/01/01 00:00:00
  • ROUND(SYSDATE,'MM') --> 2025/06/01 00:00:00
    • 12개월 중에 절반이상이 지났으면 반올림
  • ROUND(SYSDATE,'DD') --> 2025/05/24 00:00:00
    • 한달 중에 절반이상이 지났으면 반올림

MONTHS_BETWEEN('01-SEP-05', '11-JAN-04') --> 19.6774194
ADD_MONTHS('31-JAN-04', 1) --> '29-FEB-04'
NEXT_DAY('01-SEP-05', 'FRIDAY') --> '08-SEP-05'
LAST_DAY('01-FEB-05') --> '28-FEB-05'

0개의 댓글