본문 바로가기

SQL

#44 [SQL] 문자열 함수, 숫자 함수, 날짜 함수, 자료형 변환 함수, 일반 함수

04_Function_1 : 오라클 내장 함수들 소개
#1 문자열 함수
1. 문자 함수

 

[사용법]

- 대문자 변환 : UPPER('문자열') 또는 UPPER(컬럼명) => SELECT UPPER(컬럼명) FROM 테이블명
- 소문자 변환 : LOWER('문자열') 또는 LOWER(컬럼명) => SELECT LOWER(컬럼명) FROM 테이블명
- 첫글자대문자 변환 : INITCAP('문자열') 또는 INITCAP(컬럼명) => SELECT INITCAP(컬럼명) FROM 테이블명

 

* 함수 뒤에는 항상 괄호

* 테스트 테이블 : DUAL

SELECT 'Oracle mania'
        ,UPPER('Oracle mania') AS 대문자
        ,LOWER('Oracle mania') AS 소문자
        ,INITCAP('Oracle mania') AS 첫글자대문자
FROM DUAL;

연습 1) 사원테이블(EMPLOYEE)에서 사원명(ENAME) 은 소문자, 직위(JOB) 은 첫글자만 대문자로 출력
SELECT LOWER(ENAME), INITCAP(JOB) FROM EMPLOYEE;

연습 2) SCOTT 사원을 조회해서 사원번호(ENO), 사원명(ENAME), 부서번호(DNO) 출력하기
단, 사원명이 대소문자 구분없이 조건절에 사용된다고 가정하고 작성하세요
SELECT ENO, ENAME, DNO FROM EMPLOYEE
WHERE ENAME = UPPER('SCOTT');  -- 만약 소문자 scott으로 들어오면 찾을수없어서 UPPER 사용


 

2. 문자의 길이를 출력하는 함수

 

[사용법]

LENGTH('문자열') 또는 LENGTH(컬럼명)

SELECT LENGTH('Oracle mania')
      ,LENGTH('오라클 매니아')
FROM DUAL;


 

3. 문자 조작 함수 : 문자열 붙이기 함수 또는 예약어

 

[사용법]

함수    : CONCAT('문자열1', '문자열2') 또는 CONCAT(컬럼명1, 컬럼명2)

예약어 : '문자열1' || '문자열2' 또는 컬럼명1 || 컬럼명2

SELECT 'Oracle'
    ,'mania'
    , CONCAT('Oracle','mania') AS 함수
    , 'Oracle' || 'mania'
FROM DUAL;


4. 문자 조작 함수 : 문자열 자르기 함수

 

SQL : 인덱스번호는 1부터 시작함

 

[사용법]

SUBSTR('문자열', 시작위치, 자를개수)
단, 시작위치가 음수이면 뒤에서 셈

SELECT SUBSTR('Oracle mania', 4, 3)
     , SUBSTR('Oracle mania', -1, 1)
FROM DUAL;


 

5. 문자열에서 대상 문자를 찾아서 인덱스번호를 출력하는 함수

 

[사용법]

INSTR('문자열', '특정문자') 또는 INSTR(컬럼명, '특정문자')

SELECT INSTR('Oracle mania', 'a')
      ,INSTR('오라클매니아', '라')
FROM DUAL;


 

6. 컬럼에 어떤 문자를 왼쪽/오른쪽 붙이기 함수

 

[사용법]

왼쪽 채움    : LPAD(컬럼명, 자리수, '채울문자')

오른쪽 채움 : RPAD(컬럼명, 자리수, '채울문자')

SELECT LPAD(SALARY, 10, '*')
FROM EMPLOYEE;

SELECT RPAD(SALARY, 10, '*')
FROM EMPLOYEE;


 

7. 문자열의 양옆에 공백 제거하기 함수

 

[사용법]

LTRIM(컬럼명) : 왼쪽 공백제거
RTRIM(컬럼명) : 오른쪽 공백제거
TRIM(컬럼명) : 양쪽 공백제거

SELECT 'Oracle mania'
    , LTRIM('  Oracle mania  ')
    , RTRIM('  Oracle mania  ')
    , TRIM('  Oracle mania  ')
FROM DUAL;


연습 3) SUBSTR 함수를 사용하여 사원들의 입사한 년도와(HIREDATE) 입사한 달만(HIREDATE) 출력하세요.
SELECT SUBSTR(HIREDATE, 1, 2), SUBSTR(HIREDATE, 4, 2)
FROM EMPLOYEE;


04_Function_2 : 오라클 내장 함수들 소개
#2 숫자 함수

 

1. 반올림

 

[사용법]

ROUND(숫자, 자리수) 또는 ROUND(컬럼, 자리수)

- 자리수가 음수일 경우 정수 첫번째 자리부터 반올림이 됨

- 소수 첫째자리가 0이라고 생각하면 쉬움

SELECT 98.7654
    , ROUND(98.7654)     -- 소수점 1st 자리에서 반올림
    , ROUND(98.7654, 2)  -- 소수점 3rd 자리에서 반올림
    , ROUND(98.7654, 1)  -- 소수점 2nd 자리에서 반올림
    , ROUND(98.7654, -1) -- 정수 1st 자리에서 반올림
FROM DUAL;


2. 버림

 

[사용법]

TRUNC(숫자, 자리수) 또는 TRUNC(컬럼, 자리수)

SELECT 98.7654
    , TRUNC(98.7654)     -- 소수점 1st 자리부터 버림
    , TRUNC(98.7654, 2)  -- 소수점 3rd 자리부터 버림
    , TRUNC(98.7654, -1) -- 정수 1st 자리부터 버림
FROM DUAL;


3.  내림 (참고)

 

[사용법]

FLOOR(숫자) 

SELECT 98.7654
    , FLOOR(98.7654)
FROM DUAL;


4. 올림

 

[사용법]

CEIL(숫자) 또는 CEIL(컬럼)

SELECT 98.7654
    ,CEIL(98.7654)
FROM DUAL;


5. 나머지 연산 함수

 

[사용법]

MOD(숫자, 나눌값) 또는 MOD(컬럼, 나눌값)

SELECT MOD(31,2)
FROM DUAL;


연습 1) 모든 사원의 급여를(SALARY) 각각 500으로 나눈 나머지를 계산해서 출력하세요
SELECT MOD(SALARY, 500) FROM EMPLOYEE;


04_Function_2 : 오라클 내장 함수들 소개
#3 날짜 함수
1. 현재 날짜보기 함수 :      SYSDATE ★    
SELECT SYSDATE FROM DUAL;

예제 1) 오늘, 어제, 내일 날짜를 출력해보세요

 

★ 날짜형도 산술연산이 가능 

SELECT SYSDATE    AS 오늘
    , SYSDATE -1  AS 어제
    , SYSDATE +1  AS 내일
FROM DUAL;

예제 2) 사원테이블에서 근무일수 계산해서 조회하기 : 현재시간 - 입사일

 

날짜 : 시간이 들어가있어서 소수점이 나옴

  버림 또는 반올림 해야함 

SELECT ROUND(SYSDATE - HIREDATE) FROM EMPLOYEE;


2. 두 날짜 사이의 개월수를 출력하는 함수 : TRUNC ( MONTHS_BETWEEN (현재날짜, 과거날짜) )
예제 3) 각 사원들이 근무한 개월 수 구하기
SELECT ENAME, SYSDATE, HIREDATE,
    TRUNC(MONTHS_BETWEEN(SYSDATE, HIREDATE)) AS 개월수
FROM EMPLOYEE;


3. 개월수 더하기 함수 : ADD_MONTHS (날짜컬럼, 더할개월수)
예제 4) 입사일에서 6개월이 지난 시점에 날짜 구하기
SELECT ENAME, HIREDATE,
    ADD_MONTHS(HIREDATE, 6) AS 월더하기
FROM EMPLOYEE;


4. 날짜 컬럼에서 데이터가 최초로 도래하는 요일의 날짜 출력 : NEXT_DAY (날짜컬럼, '찾는요일')
예제 5) 오늘을 기준으로 최초로 도래하는 토요일의 날짜 구하기
SELECT SYSDATE,
    NEXT_DAY(SYSDATE, '토요일')
FROM DUAL;


5. 날짜컬럼의 그 달(월)의 마지막 날의 날짜를 구해주는 함수 : LAST_DAY(날짜컬럼)
예제 6) 입사한(HIREDATE)날 달의 마지막 날짜 구하기
SELECT ENAME, HIREDATE,
    LAST_DAY(HIREDATE)
FROM EMPLOYEE;


04_Function_3 : 오라클 내장 함수들 소개
#4 자료형 변환 함수

 

<DB 자료형>

 

1. 문자열 : VARCHAR2(가변문자열) , CHAR(고정문자열)  
  예) 10자리 문자열 , 고정일때 : 가나다 , 가나다...카 => 남은 자리수는 공간낭비
  예) 10자리 문자열 , 가변일때 : 가나다 , 가나다...카 => 남은 자리수는 공간낭비 안함(자동축소)


2. 숫자  : NUMBER (실수, 정수) 

 

3. 날짜  : DATE 

 

4. 기타  : CLOB, BLOB 등


1. 날짜형 -> 문자열로 바꾸는 함수 : TO_CHAR(날짜컬럼명, '날짜포맷')

 

<날짜포맷>

ex) 'YYYY-MM-DD HH24:MI:SS'

 

YYYY (년도(4자리)), YY(년도(2자리))
MM     (월(2자리))
DD      (일(2자리))
HH      (시(1~12까지 시간, 2자리))
HH24  (시(1~24까지 시간, 2자리)) 
MI        (분(2자리))
SS       (초(2자리))

 

포맷을 제외한 / , -, : , ...   등등은 자유롭게 써도 됨

SELECT ENAME, HIREDATE,
    TO_CHAR(HIREDATE, 'YY-MM') AS 단축날짜,
    TO_CHAR(HIREDATE, 'YYYY-MM-DD HH24:MI:SS') AS 날짜
FROM EMPLOYEE;
연습 1) 현재 날짜와 시간을 표현하세요 (날짜 -> 문자열로 변환)
단, 출력날짜포맷 예) 2011/05/01, 15:07:43 으로 출력하세요
SELECT SYSDATE, 
    TO_CHAR(SYSDATE,'YYYY/MM/DD, HH24:MI:SS') 
FROM DUAL;

2. 숫자형 -> 문자형로 변환하는 함수 : TO_CHAR(숫자컬럼명, '숫자포맷')
예제 2) 급여를 출력하면서 통화기호를 (W, $ 등) 포함해서 출력하세요

 

<숫자포맷>

ex) 'L999,999', 'L000,000'


L : 각 나라별 통화 기호를(W, $ 등) 자동으로 붙여줌 (S/W 설치시 통화지정)
9 : 3자리를 잡고 자리수가 모자라면 0을 채워주지는 않음 
0 : 3자리를 잡고 자리수가 모자라면 0을 채움
, : 각 통화의 중간에 쉼표(,)를 자동으로 추가해줌

SELECT ENAME, SALARY,
    TO_CHAR(SALARY, 'L999,999'),
    TO_CHAR(SALARY, 'L000,000')
FROM EMPLOYEE;

3. 문자형 -> 날짜형으로 변환하는 함수 : TO_DATE('날짜', '날짜포맷') => 날짜포맷은 생략가능
 

얘는 WHERE절 써서 적어야함!

화면출력 : SELECT 위치에 작성

함수 사용 위치 : SELECT 다음, 또는 WHERE (조건절은 화면에 나타나는게 아님)

포맷이 YYYYMMDD 라도 데이터 자체가 이미 슬래쉬가 붙어있어서 슬래쉬가 붙어서 나옴

SELECT ENAME, HIREDATE
FROM EMPLOYEE
-- WHERE HIREDATE = '19810220';
WHERE HIREDATE = TO_DATE('19810220', 'YYYYMMDD');

 

4. 문자형 -> 숫자형으로 변환하는 함수 : TO_NUMBER('문자', '숫자포맷' = '999,999')
예제 4) 숫자형태의 통화(돈) 빼기
SELECT TO_NUMBER('100,000','999,999') - TO_NUMBER('50,000','999,999') 
FROM DUAL;


04_Function_3 : 오라클 내장 함수들 소개
#5 일반 함수

 

1. NULL -> 숫자(문자)로 변경하는 함수 NVL (NULL 포함된 컬럼, 특정숫자(문자))
SELECT ENAME, SALARY, COMMISSION
    , SALARY*12 + NVL(COMMISSION, 0) AS 연봉_보너스
FROM EMPLOYEE;


2. SQL에서 사용하는 조건문 함수 : DECODE

 

사용법) 

DECODE(컬럼, 값1, '결과1'
                        , 값2, '결과2'
                        ...
                        , '기본결과')    AS 부서명

: 컬럼이 값1이면 결과1이 나오고, 값2이면 결과2가 나오고, ... 모두 아니면 기본결과가 화면에 출력됨

예제 5) DECODE 를 이용해서 부서명을 출력하세요
10 '회계부', 20 '연구소', 30 '판매부', 40 '운영부'
SELECT ENAME, DNO
    ,DECODE(DNO, 10, '회계부'
               , 20, '연구소'
               , 30, '판매부'
               , 40, '운영부'
               , '디폴트')    AS 부서명
FROM EMPLOYEE;

 


3. SQL에서 사용하는 조건문 함수 : CASE WHEN 
장점) 조건식에 부등호 등 사용가능(DECODE 함수는 안됨)

 

사용법)

CASE WHEN 컬럼=값1 THEN '결과1'
           WHEN 컬럼=값2 THEN '결과2'
           ...
           ELSE '기본결과'
           END      
: 컬럼이 값1이면 결과1이 나오고, 값2이면 결과2가 나오고, ... 모두 아니면 기본결과가 화면에 출력됨

예제 6) CASE WHEN  을 이용해서 부서명을 출력하세요
10 '회계부', 20 '연구소', 30 '판매부', 40 '운영부'
SELECT ENAME, DNO
    ,CASE WHEN DNO=10 THEN '회계부'
        WHEN DNO=20 THEN '연구소'
        WHEN DNO=30 THEN '판매부'
        WHEN DNO=40 THEN '운영부'
        ELSE '디폴트'
    END                             AS 부서명
FROM EMPLOYEE;


<문자열 함수>

1. 대소문자 변경

- 대문자 변환 : UPPER('문자열') 
- 소문자 변환 : LOWER('문자열') 
- 첫글자대문자 변환 : INITCAP('문자열')

 

2. 문자 길이 : LENGTH('문자열')

 

3. 문자 붙이기

함수    : CONCAT('문자열1', '문자열2') 

예약어 : '문자열1' || '문자열2' 

 

4. 문자 자르기 : SUBSTR('문자열', 시작위치, 자를개수) (단, 시작위치가 음수이면 뒤에서 셈)

 

5. 인덱스번호 찾기 : INSTR('문자열', '특정문자')

 

6. 문자 채우기

왼쪽 채움    : LPAD(컬럼명, 자리수, '채울문자')

오른쪽 채움 : RPAD(컬럼명, 자리수, '채울문자')

 

7. 공백 제거

LTRIM(컬럼명) : 왼쪽 공백제거
RTRIM(컬럼명) : 오른쪽 공백제거
TRIM(컬럼명) : 양쪽 공백제거 

 

<숫자 함수>

 

1. 반올림 : ROUND(숫자, 자리수)

 

2. 버림 : TRUNC(숫자, 자리수)

 

3. 내림 : FLOOR(숫자)

 

4. 올림 : CEIL(숫자)

 

5. 나머지 연산 : MOD(수, 나눌값)

 

 

<날짜 함수>

 

1. 현재 날짜보기 함수 :  SYSDATE ★ 

 

2. 두 날짜 사이의 개월수를 출력하는 함수 : TRUNC ( MONTHS_BETWEEN (현재날짜, 과거날짜) )

 

3. 개월수 더하기 함수 : ADD_MONTHS (날짜컬럼, 더할개월수)

 

4. 날짜 컬럼에서 데이터가 최초로 도래하는 요일의 날짜 출력 : NEXT_DAY (날짜컬럼, '찾는요일')

 

5. 날짜컬럼의 그 달(월)의 마지막 날의 날짜를 구해주는 함수 : LAST_DAY(날짜컬럼)

 

 

<자료형 변환 함수>

 

1. 날짜형 -> 문자열로 바꾸는 함수 : TO_CHAR(날짜컬럼명, '날짜포맷') ★

 

2. 숫자형 -> 문자형로 변환하는 함수 : TO_CHAR(숫자컬럼명, '숫자포맷') ★

 

3. 문자형 -> 날짜형으로 변환하는 함수 : TO_DATE('날짜', '날짜포맷') => 날짜포맷은 생략가능

 

4. 문자형 -> 숫자형으로 변환하는 함수 : TO_NUMBER('문자열', '숫자')

 

 

<일반 함수>

 

1. NULL -> 숫자(문자)로 변경하는 함수 NVL (NULL 포함된 컬럼, 특정숫자(문자))

 

2. SQL에서 사용하는 조건문 함수

 

DECODE(컬럼, 값1, '결과1'
                        , 값2, '결과2'
                        ...
                        , '기본결과')    AS 부서명

 

CASE WHEN 컬럼=값1 THEN '결과1'
           WHEN 컬럼=값2 THEN '결과2'
           ...
           ELSE '기본결과'
           END