9월 7일 sql - 함수

함수



function


SELECT* 

FROM dual ; 



ORACLE 의 함수 분류 


*** 1. Single row function 

단일 행을 기준으로 작업하고, 행당 하나의 결과를 반환

특정컬럼의 문자열 길이 : length(ename) 


검색해보기! 

SELECT dummy 

FROM dual; 


SELECT * 

FROM emp 



SELECT empno, ename, LENGTH('hello), LENGTH(ename) 

FROM emp; 



SELECT LENGTH('hello')

FROM dual 





2. multi row function 

여러행을 기준으로 작업하고 하나의 결과를 반환

그룹함수

  count, sum, avg 



dual 테이블 


1. sys 계정에 존재하는 누구나 사용할 수 있는 테이블 

2. 테이블에는 하나의 컬럼, dummy 가 있다. 존재 값은 x 

3. 하나의 행만 존재 한다.



Function 함수 

 - character 

1) LOWER 

 문자열을 소문자로 

2) UPPER 

문자열을 대문자로

3) INITCAP 

첫단어만 대문자로 





where  절에서도 사용 가능 하다. 

 SELECT ename, LOWER(ename) 

FROM emp; 

WHERE ename = 'smith' ; 


-> 불가능 왜냐하면 한정해준게 ename이 smith라는 문자열을 갖을 때인데, 

ename은 전체 열은 대문자, 소문자인데 where은 ename 이 소문자smith인데만 한정하는데  찾는 select 열에서는 ename 대문자도 선택했으니까 오류가 일어남 



SELECT ename, LOWER(ename) 

FROM emp; 

WHERE LOWER(ename) = UPPER('smith'); 


-> ename 을 lower 로 해주면 ename을 전부 다 lower로 해주어야 하기 때문에 



* 좌변을 가공하지 말라 = 라는 뜻은 column 을 가공하지말라는 뜻 . 치환시켜 상수부분을 가공하라

테이블 column에 함수를 사용하지 말것 


-함수 실행 횟수

-인덱스 사용관련( 추후) 



SELECT ename, Lower(ename) 

FORM emp

WHERE ename = 'SMITH';


ename이 'SMITH' 즉 문자열이 대문자인 곳에서 뽑는데 위에 SELECT절에 LOWER(ename) 은 ename을 소문자처리(즉 문자데이터가 소문자처리 된애를 찾으라고 하니까 불가능 ) 



문자열 관련 함수 

-문자열 조작 

1) CONCAT : 문자열 결합 , 

2) SUBSTR : 문자열에서 일부분 추출 

3) LENGTH: 문자열 길이 

4) INSTR : 문자열에 특정 문자열이 들어있는지 ( 해당 문자열의 인덱스 반환)

5) LPAD/ RPAD : 문자열 왼쪽 오른쪽에 특정 문자열 삽입 

6) TRIM : 문자열 앞 뒤로 공백, 혹은 특정 문자 제거 

7) REPLACE : 문자열 치환 


EX


1) CONCAT ( ' ' , ' ' ) 

     CONCAT ('HELLO' , CONCAT( ', ' , 'WORLD') ) " concat "

2) SUBSTER ( '          ' ,    ,    ) "subster"

    SUBSTER ( 'HELLO, WORLD ' ,   1 ,  5 ) --> HELLO

3) LENGTH('HELLO, WORLD ') "length"  -> 문자열의 길이가 출력된다. 


4) INSTR ('HELLO, WORLD' , 'O') "instr" -> O( 뒤에 써준 문자열이) 가 처음등장하는 인덱스 

O 가 몇번쨰에 나오는지. 반복되는 것이 있으면 먼저 나오는 것의 숫자를 입력 

        INSTR('HELLO, WORLD' , 'O' , 6 )  여기서는  O가 5번쨰에있는데 그 뒤로 5번째 뒤로 O가나오는걸 찾으라는거니까 두번째로 O가 나오는 곳의 숫자를 입력해주기 

5) LPAD('HELLO, WORLD' , 15 , '*' ) "lpad" ->(문자열, 전체길이, 부족한 길이만큼 채울 문저

   LPAD(' ' , 15) "lpad2" ---> (문자열, 전체길이) 


6) RPAD( ' HELLO , WORLD ' , 15 , '*' ) "RPAD"


7) REPLACE ( 'HELLO, WORLD' , 'HELLO' , 'hello' ) "replace" 


8) TRIM ('    HELLO, WORLD    ') "AFTER_TRIM" -- ( 문자열 앞뒤로 공백제거 )  

   TRIM( ' D ' FROM 'HELLO, WORLD') "AFTER_TRIM2" - 문자열 앞뒤로 특정 문자 제거 


FROM dual; 




SELECT CONCAT('Hello', ', world') concat,

       SUBSTR('Hello, world', 1, 5) substr

From dual;


숫자관련 함수 


ROUND 

TRUNC : 버림함수 

: 몇번째 자리에서 반올림, 버림을 할지? 

           두번째 인자가 0이거나 양수일때 : ROUND ( 숫자, 반올림 결과 자리수 결과 나오는 값까지) 

            두번째 인자가 음수 : ROUND (숫자, 반올림을 해야하는 위치 ) 

MOD : 나머지를 구하는 함수


SELECT ROUND ( 105.54 , 1) round,  --> 4자리에서 반올림 

          ROUND ( 105.55 , 1 ) round2  ---> 소숫점 두째자리에서 반올림

          ROUND( 105.55, -1 ) round 4    -----> 첫째 자리에서 반올림 

FROM dual ; 

  


-- 105. 54 

  -3 -2 -1 0 1 2 자리이다 소숫점 . 이 0의 자리 



TRUNC 


--TRUNC 함수는 버리는 수이다. 

SELECT TRUNC(105.54, 1) trunc,   --> 105.5 

       TRUNC(105.55, 1) trunc2,   ---> 105.5

       TRUNC(105.55, 0) trunc3, -----> 105

       TRUNC(105.55, -1) trunc4  -----> 100

       --양수일때랑 음수일때랑은 달라 음수가 나올때는 

FROM dual; 


MOD 함수 : 나머지를 구하는 함수 

피제수 - 나눔을 당하는 수 , 제수 - 나누는수


a/5 = c 

a - 피제수 

b - 제수


MOD ( birthday , 2 ) = 0 



SELECT mod ( birthday , 2 ) = 0 ---> 10을 3으로 나눈 나머지 

FROM dual; 


그러면 몫을 구하면 ? 

SELECT TRUCK ( 10/3 , 0 ) trunc 

FROM dual; 



날짜 관련 함수 


문자열 => 날짜타입으로 바꿔주는 것 TO_DATE 

SYSDATE : 오라클 서버의 현재 날짜, 시간을 돌려주는 특수함수 

               함수의 인자가 없다. 



SQL 에서는 


날짜타입 +- 정수 : 일자를 더하고 뺀것 : 날짜에서 정수만큼 더한(뺀) 날짜


ex) hiredate + 5 


SELECT SYSDATE, SYSDATE + 5, SYSDATE - 5, 

           SYSDATE + 1/24, SYSDATE + 1/24/60 

FROM dual; 


? 시간을 더하고 뺼 수는 없을까? 

하루 = 24 


1= 24 

1시간 = 1/ 24 


분 = 1/ 24/ 60 


1초 = 1/24/60/60 


SELECT TO_DATE('2019/12/31' , 'YYYY/MM/DD' ) lastday,

 TO_DATE ( '2019/12/31' , 'YYYY/MM/DD' ) - 5 lastday_before5,

SYSDATE now, SYSDATE - 3 now_before3


SELECT lastday + 5, lastday + 10, lastday - 5 

FROM 

         (SELECT TO_DATE(' 2019/12/31' , ' YYYY/MM/DD' ) lastday 

          FROM emp); 



















대형 예시 ) 


SELECT CONCAT('Hello', ', world') concat,

       SUBSTR('Hello, world', 1, 5) substr, 

       SUBSTR('Hello, world', 5) substr, 

       LENGTH('Hello, world' ) length,

       INSTR('Hello, World', 'o') instr,

       INSTR('Hello, World', 'o', 6) instr2,

        INSTR('Hello, World', 'o', INSTR('Hello, World', 'o') + 1 ) instr3,

        LPAD('Hello, World', 15 , '*') lpad,    

        LPAD('Hello, World', 15 ) lpad2,

        RPAD('Hello, world', 15, '*') rpad,

        REPLACE('Hello, World', 'Hello', 'Hell') replace,

        TRIM('Hello, World') trim,

        TRIM('        Hello, World    ') trim2,

        TRIM( 'H' FROM 'Hello, World') trim3 

From dual;









댓글