본문 바로가기
SQL(Oracle)/Oracle 이론 정리

[Oracle] 단일행 함수

by ProSeraphina 2020. 8. 6.

#단일행 함수

문자함수 변환함수   UPPER : 대문자로 변환
  LOWER : 소문자로 변환
  INITCAP : 맨 앞글자만 대문자 변환
  SELECT UPPER('ShIn'), LOWER('ShIn'), 
  INITCAP('ShIn') FROM DUAL;
  → SHIN, shin, Shin
  ***DUAL : 임시테이블
  REPLACE('원래 문자열',' 바꿀문자',
               '바뀔문자')
  SELECT ENAME, REPLACE(ENAME, 'A','M')
  FROM EMP;
  원래이름 ADAM→MDMM

제어함수   CONCAT('A','B') : 문자열 결합



  SELECT CONCAT('HELLO ','ORACLE'), 

  'HELLO '||'ORACLE' FROM DUAL;
  →HELLO ORACEL (동일한 문장)

  SUBSTR(문자열, 시작위치,
                    자를 개수)

  :문자열을 원하는만큼 자름
   (cf. substirng() in Java)

   →포함된 문자열 찾을때(cf. %)

  SELECT SUBSTR('HELLO ORACLE',7,3)
                       ('HELLO ORACLE',-6,3) 
  FROM DUAL;  →ORA(∵ -6→뒤에서 6번째부터)

  SELECT * FROM emp WHERE     
  SUBSTR(ename,3,1)='A';
  = SELECT * FROM emp WHERE ename
     LIKE '__A%';
  : 이름 세 번째 글자가 A인 사람

  INSTR(원래 문자열, 찾을 문자,
  시작글자, n번째 찾을 문자) 
  : 특정문자 위치 찾기

  (cf. Java: indexOf() )
  SELECT INSTR('A/B/C/D','/',3,2) FROM DUAL;
  →6
기타함수   LENGTH : 문자길이
  LENGTHB : Byte수





  SELECT LENGTH('홍길동') LENGTHB('홍길동')
  → 3, 9(원래 한글 각 2byte*3글자=6이지만
      컴퓨터 사양마다 다르게 출력되기도 함)

  SELECT ename FROM emp 
  WHERE LENGTH(ename)=5;
  →emp 파일에서 5자 이름을 가진 사람 모두 출력
  RPAD/LPAD(문자열, 전체 자리수,
  자리 수 부족할 때 채울 문자)
  (ex. ID/비밀번호 찾기할 때, ad***)

  SELECT RPAD('SCOTT',10,'*') FROM DUAL;
  → SCOTT*****
  (→ LPAD : *****SCOTT)

  SELECT ename, RPAD(SUBSTR(ename,1,2),
  LENGTH(ename),'*') FROM emp;
  →이름 2자만 노출
  TRIM('지울 문자' FROM '원래문자열')
  RTRIM/LTRIM('원래문자열', '
  지울 문자')
 : 지정 문자 제거
  SELECT LTRIM
  (LTRIM(' AAAAABBBAAAAA'),'A')

  FROM DUAL;
  SELECT TRIM('A' FROM 'AAAAABBBAAAAA')
  FROM
DUAL;
숫자함수   ROUND(실수, 원하는 자리수) :반올림   ROUND(987.654,2) → 987.65 소수점 2자리 
  ROUND(987.654,0) → 988, 소수점 0자리
  ROUND(987.654,-1) → 990, 1의자리 반올림
  TRUNC(실수, 원하는 자리수) :버림   TRUNC(987.654,2) → 987.65  
  TRUNC(987.654,0) → 987
  CEIL(실수)
  : 올림, 페이지 수 구할 때 사용
  CEIL(987.354) → 988 소수점 첫째자리에서 반올림
  SELECT CEIL(COUNT(*)/7) FROM genie_music;
  목록개수를 7로 나눠서 페이지수 출력
  MOD(a,b) :나머지, a%b in Java   SELECT empno, ename FROM emp
  WHERE MOD(empno,2)=0;
   emp에서 사번이 짝수인 사원의 사번, 이름 
날짜함수
 
  SYSDATE :시스템 날짜, 시간   SELECT SYSDATE-1, SYSDATE, SYSDATE+1
  FROM DUAL;  →어제, 오늘, 내일 날짜 출력
  MONTHS_BETWEEN :기간의 개월수   SELECT 
  ADD_MONTHS(날짜,개월)
  :입력한 날짜에 입력개월을 추가
  SELECT ADD_MONTHS(SYSDATE,6)
  FROM DUAL;

  → 오늘로부터 6개월 후
      '20/08/07'처럼 특정 날짜 입력가능.
  NEXT_DAY(날짜, '금')
  :오늘을 제외한, 가장 가까운 금요일 
  오늘: 20/08/07(금),
  SELECT NEXT_DAY(SYSDATE,'금')
  →2020/08/14
  LAST_DAY(날짜) :입력된달 마지막날짜   SELECT LAST_DAY(SYSDATE) FROM DUAL;
  →20/08/31
변환함수   TO_CHAR   문자열 변환
  *날짜: 문자열(대소문자 구분X)
   연도: YYYY/RRRR/YY/RR/YEAR(영문)
   월: MM / MON:영문3자(ex.AUG) / MONTH:전체영문
   일: DD / DAY(요일) / DDTH(00TH)
   시간: HH(12시간)/HH24/MI(분)/SS(초)
  SELECT TO_CHAR(SYSDATE,'YYYY-MM
  -DD HH24:MI:SS') FROM DUAL;
    →2020-08-07 17:42:05
 *정수 → 문자열
   9 : TO_CHAR(1234, '9,999') → 1,234
   $:  TO_CHAR(sal, '$9,999,999') → $월급
   L:  TO_CHAR(1234, 'L9,999') → \1,234
  TO_NUMBER(원래문자열, 문자열형태)   정수 변환
  TO_NUMBER('5,000','9,999') FROM DUAL; 
기타(일반)함수   NVL(null이 들어있는 칼럼명, 바꿀값)
  :  NULL값을 다른 값으로 변경
  SELECT ename,sal,comm,sal+NVL(comm,0)
  FROM emp;
  SELECT zipcode, sido, gugun, dong,
  NVL(bunji,' ') FROM zipcode;
  (단, 바꿀값에 공백 하나 이상은 무조건 줘야함)
  DECODE(컬럼명, 값, 출력값
                                    값, 출력값,
                                    값, 출력값) 
 : 다중 if ( CASE 선택문과 호환 )
SELECT title, DECODE(state,'유지','-',
                                                          '상승','▲',
                                                          '하강','▼',
          'new','new') AS 상태 
FROM genie_music;

SELECT title, CASE WHEN state='유지' THEN '-'
WHEN state='상승' THEN '▲'   콤마 없음!!
WHEN state='하강' THEN '▼'
END "상태"
FROM genie_music;
  RANK() OVER: 순위(일반적)
  DENSE_RANK() OVER: 공동순위
  발생시 순위 비우지 않고 출력
 ( 1등 2명 있어도 2등 출력)
  SELECT ename,sal,RANK() OVER(ORDER BY sal) 
  AS rank FROM emp;
  SELECT ename,sal,DENSE_RANK() OVER(ORDER BY
  sal DESC) as rank FROM emp;

 

끝.

댓글