ORACLE

oracle06_함수1(문자함수, 날짜함수)

1. 정의

어떤 일을 수행하는 기능으로써 주어진 인수를 입력받아

처리하여 그 결과를 반환하는 일을 수행하는 것

 

 

2. 함수의 종류

1) 단일행 함수 : 하나의 행당 하나의 결과값을 반환하는 함수
 
 문자함수, 날짜함수, 문자변환함수, 숫자변환함수, 날짜변환함수, 시스템함수, 숫자함수

 

 


2) 복수행 함수[집계합수, 그룹함수] : 여러 개의 행당 하나의 결과값을 반환하는 함수

(예) count(), sum(), avg(), max(), min().....


3. 단일행 함수

1) 문자함수

chr(아스키코드) : 해당 아스키 코드값에 대한 문자 반환

(예)

select chr(65) from dual;

**dual : 오라클에서 제공하는 가상의 테이블


concat(컬럼명, '문자열') : 컬럼에 해당하는 문자열을 붙임

concat('문자열1', '문자열2') : 문자열1과 문자열 2을 붙여서 결과값 반환함

 

select concat(ename, 'is a'), job from emp;

select ename || ' is a ' || job from emp;

select concat('로미와', '줄리엣') from dual;

 

-- dual : 가상의 테이블

-- char(아스키코드 )  => 문자

 

select chr(65), chr(97) from dual;


-- concat(A, B) A 와 B를 연결시킴

select concat(ename, '의 직책은 '), job from emp;

select concat(ename, '의 직책은 ' ) , concat(job, '입니다') from emp;

select ename || '의 직책은 ' || job || '입니다' from emp;

 

 

initcap('문자열') : 시작 문자를 대문자로, 다른 문자는 소문자로 반환함

select initcap('abalfaoicFlaafiaf') from dual;

 

lower('문자열'), upper('문자열') : 문자열을 소문자로, 대문자로 반환함

 

LPAD('문자열1', 자리수, '문자열2) : 문자열을 1을 자리수만큼 늘리는데 왼쪽으로

늘어난 자리수 공간에 문자열2를 채워서 반환함. 문자열2가 생략되면 공백으로 채워짐

<--> RPAD('문자열', 자리수, '문자열2) : 오른쪽으로 공간을 늘림


 

selectLPAD('abcd', 9, '*') from dual ;

selectLPAD('abcd', 9) from dual;

 


-- 첫글자를 대문자로 변환

select initcap('abcd'), initcap('best') from dual;

 

-- lower( ) 소문자로, upper() 대문자로

select lower('LEFT') , upper('best') from dual;

 


-- lpad(무자열, 자리수 , 공백대체문자 ) :왼쪽 공백
 


select lpad('adbc', 9, '*') from dual;

 


-- 공백대체문자가 없으면 공백이 입력됨

select lpad('adbc', 9) from dual;

 

 

-- rpad(무자열, 자리수 , 공백대체문자 ) :오른쪽 공백
 

select rpad('adbc', 9, '*') from dual;

 

-- 공백대체문자가 없으면 공백이 입력됨

select rpad('adbc', 9) from dual;

 

 

LTRIM('문자열1', '문자열2):문자열 1에서 문자열2를 왼쪽으로 

 제거한 결과값을 반환함 <--> RTRIM('문자열1', '문자열2') : 오른쪽에서 제거함

 

select LTRIM('ABCDEFACB', 'AB') from dual;

 


replace('문자열1', '문자열2', '문자열3) : 문자열 1중에 있는 문자열 2를

문자열3으로 바꾸어서 결과값 반환함

 
 

select replace('asiancup is international festival', 'asiancup', 'worldcup') from dual;

-- ltrim(문자열, 제거할단언)
-- 왼쪽의 문자가 제거됨
select ltrim('abcdefab', 'ab') from dual;


-- rtrim 오른쪽의 문자가 제거됨

select rtrim('abcdefab', 'ab') from dual;

 


substr('문자열', 자리수, 개수) : 문자열의 자리수부터 시작해서 지정된 개수만큼 

문자를 잘라내서 결과값을 반환함

 

select substr('자바개발자과정', 4,  3) from dual;

=>출력 : 발자과

 

select ename from emp where substr(ename, 2, 1) = 'L';

select LAST_NAME from emp where substr(LAST_NAME, 2, 1) = 'm';

=>출력 :
Smith
Smith

 


ascii('문자') : 문자의 아스키코드값을 반환함

select ascii('A') from dual;

 

instr('문자열1', '문자열2', 자리수1, 자리수2) :자리수 1부터 자리수 2번째의 

문자열2를 찾아서 시작위치를 반환함

-- instr(문자열, '찾는내용') 처음 찾은 위치

select instr('wow-wow-wow-wow', '-') from dual;
=>출력 : 4

-- instr(문자열, '찾는내용', 시작위치, 발견된순서)
select instr('wow-wow-wow-wow', '-', 10, 1) from dual;
=> 출력 :12

select instr('wow-wow-wow-wow-wow', '-', 10, 2) from dual;
// 10번째 부터 시작해서 - 를 2번째 발견된 곳의 위치
=> 출력 :16

 

 

length('문자열') : 문자열의 길이를 반환함


greatest('값', '값2', '값3'....) : 가장 큰 값을 반환함

 <-->

least('값', '값2', '값3'....) : 가장 작은 값을 반환함

select greatest('abc', 'abcd', 'abcdefga') from dual;

=>출력 : abcdefga

 


2)날짜 함수

 

sysdate : 시스템의 현재 날짜를 반환함 ** 의사컬럼이 아님

select sysdate from dual;

** 의사컬럼(모조컬럼) : 테이블에 있는 일반적인 컬럼처럼 행동하기는

하지만 실제로 테이블에 저장되어 있지 않은 컬럼.


1) rownum : 쿼리의 결과로 나오게 되는 각각의 row들에 대한 순서값을

    가리키는 의사컬럼


2) rowid: 테이블에 저장된 각각의 row들에 대한 주소값을 가진 의사컬럼.

    각각의 row들은 자신만의 rowid를 가짐
 

-- 의사컬럼

-- rowid : 레키도의 주소값

-- rownum : 레코드의 순번

select rownum, rowid, empno, ename from emp 

    where rownum <= 10;

-- sysdate 함수

select sysdate from dual;

create table test

 

 

 ****************  rownum *****************

select sysdate from dual;

-- create table 테이블이름 as select 문장 단, 제약조건은 빠짐

 

-- where 1=0;  테이블 복사( PK 는 복사 되지 않음 , 데이터 없음, 즉 구조만 복사) 

 

create table test01 as select * from emp where 1=0;

select * from test01;

create table test02 as select * from emp;

select * from test02;

 

-- PL/SQL
-- test01 테이블에 1000건의 레코드 입력

declare -- 선언부
 -- := 대입연산자
    i number :=1;
 begin
    while i <=1000 loop
       insert into test01(employee_id, last_name, email, job_id, hire_date)
       values (i, '사원'||i, 'email@'||i, 'job_id'||i, sysdate);
    i := i+1;  
 end loop;
end;
/

 

drop table test01;
desc test01;

select ROWNUM, employee_id, last_name  from test01 order by EMPLOYEE_ID;

 

-- Rownum 순서가 뒤섞임

-- 페이지 나누기 쿼리

select * from
 (
 select A.*, ROWNUM as rn from (
  select  employee_id, last_name  
  
   from test01 order by EMPLOYEE_ID) A
  
  ) where rn between 1 and 10
   ;

 

 


****  중요  날짜 계산 ******

add_months(날짜컬럼 or 날짜데이터, 숫자) : 날짜값에 개월 수를 더해서

결과값을 반환함

 


//ex) 오늘 날짜 기준으로  3개월 후 

select add_months(sysdate, 3) from dual;

select add_months('2013/01/26', 3) from dual;

 


//ex) 입사일자 기준으로 3개월 전 

 

select add_months('2013/01/26', -3) from dual;


select FIRST_NAME ,HIRE_DATE, add_months(HIRE_DATE, 3) from emp
    
    where HIRE_DATE between '1982/01/01' and sysdate ;


last_day(날짜컬럼 or 날짜데이터) : 파라미터 데이터와 같은 달의

마지막 날짜를 반환함

 

select last_day('2013/01/26) from dual;


months_between(날짜컬럼1 or 이후 날짜 데이터1, 날짜컬럼2 or 이전 날짜데이터2);

두 날짜 사이의 개월수를 반환함

 

select months_between('2013/05/25', '2013/01/05') from dual;


next_day(날짜컬럼 or 날짜데이터, 숫자 or 요일) : 날짜데이터 이후의 날짜 

중에서 숫자 or 요일로 명시된 첫번째 날짜를 반환함

select next_day('2013/01/26', '토') from dual;


 

-- last_day(날짜) => 날짜가 속한 달의 마지막 날

select sysdate, last_day(sysdate) from dual;

select last_day('2016-02-10') from dual;

=>2016/02/29

 


-- months_between(A, B) A 날짜 - B 날짜의 개월수

-- 입사 이후 몇개월 경과했는지 계산


select months_between(sysdate, HIRE_DATE )from emp;

 

-- 반올림 함수 round(값, 자리수), 자리수 생략시 전부 출력

select round(months_between(sysdate, HIRE_DATE ), 2) from emp;

 

-- next_day (날짜, 요일)

-- 오늘을 기준으로 가장 최근의 돌아오는 토요일

select next_day(sysdate, '토') from dual;

 

 

3) 문자 변환 함수 : to_char(날짜컬럼 or 날짜 데이터, '??')

*** "??" 에 올 수 있는 값들

가. d: 주중의 일(1~7)( 1 일요일 ~ 7토요일)

나. day : 일을 서술형 이름으로 표시

다. dd: 1~31 형태로 일을 표시

라. mm : 01~12 형태로 월을 표시

마. month, mon: 월을 서술형 이름으로 표시

바. yy:뒤의 두자리 연도 표시

사. yyyy:네자리 연도 표시

아. dd-mm-yy:일-월-연도

자. yyyy-mm-dd: 연도-월-일 (활용) yyyy/mm/dd

차. hh, hh12: 1~12형태로 시를 표시 (비교)hh24

카. mi: 0~59 형태로 분을 표시

타. ss: 0~59 형태로 초를 표시

파. am, pm : 오전, 오후 표시

하. yyyy-mm-dd am hh:mi:ss day

 

select to_char(sysdate, 'yyyy-mm-dd am hh:mi:ss day') from dual;

 

 

 

 

 

about author

PHRASE

Level 60  머나먼나라

게도 구럭도 다 잃었다 , 소득을 얻기는 커녕 가진 것마저 잃어버렸다는 말.

댓글 ( 4)

댓글 남기기

작성