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;
댓글 ( 4)
댓글 남기기