함수
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;
댓글
댓글 쓰기