본문 바로가기
프로그래밍/Oracle SQL 데이터베이스

[오라클 SQL 기초] 오라클 함수 - nvl() null 값 대체 함수, chr() ascii 문자 함수, || 결합 연산자 & concat() 결합 함수, sysdate 현재 날짜, months_between(), to_date() 등등

by nisne 2020. 9. 15.

모든 설명은 주석으로 확인할 수 있어요.

하나씩 따라해 보세요. ^^

 

lan이라는 테이블에
uname, kor, eng, mat, sum, avg, sno, wdate, addr 칼럼에
아래와 같은 값이 들어있다고 가정합시다앙

사랑해	90	85	95	270	90	1	20/09/15	Seoul
무궁화	40	50	20	110	37	2	20/09/15	Seoul
진달래	90	50	90	230	77	3	20/09/15	Jeju
개나리	20	50	20	90	30	4	20/09/15	Jeju
봉선화	90	90	90	270	90	5	20/09/15	Seoul
나팔꽃	50	50	90	190	63	6	20/09/15	Suwon
선인장	70	50	20	140	47	7	20/09/15	Seoul
소나무	90	60	90	240	80	8	20/09/15	Busan
참나무	20	20	20	60	20	9	20/09/15	Jeju
홍길동	90	90	90	270	90	10	20/09/15	Suwon
무궁화	80	80	90	250	83	11	20/09/15	Suwon

-----------------------------------------------------------------------

-- 오라클 함수!!!

-----------------------------------------------------------------------

-- nvl() 함수 - null 값을 다른 값으로 바꿈
--   nvl(a, b)  - a가 null일 때 b를 출력

-- 활용) 행을 추가하면서 nvl(), max()함수를 이용해서 sno 일련번호를 뒤어어 붙여보기
insert into lan(sno, uname, kor, eng, mat, addr)
values((select nvl(max(sno), 0) + 1 from lan), '사랑해', 90, 90, 90, 'Seoul');

--------------------------------------------------------------------

-- ASCII 문자 함수
select chr(65) from dual;   -- dual은 가상의 임시 테이블, 테이블 생성 없이 결과를 출력해보고 싶을 때 사용 
select chr(97) from dual;   

--------------------------------------------------------------------

-- || 결합 연산자
select uname || '의 평균은 ' || aver || '입니다'
from lan;

---------------------------------------------------------------------

-- concat 문자열을 붙이기, ||와 유사
select concat('로미오와 ', '줄리엣') from dual;
select concat(uname, '의 평균은'), aver from lan;

---------------------------------------------------------------------

-- 날짜 관련 함수

-- sysdate - 시스템 날짜 리턴 함수, 괄호가 ㅇ벗음
select sysdate from dual;
select sysdate+100 from dual;   -- date에 연산
select sysdate-366 from dual;   -- 366을 빼야 오늘 날짜가 나오는 거 보니 올해는 윤년이구만!

-- 두 날짜 사이의 개월 수 계산 함수
select months_between('2020-09-01', '2020-10-01') from dual;
select months_between('2020-10-01', '2020-09-01') from dual;
select months_between('2020-03-01', '2020-02-01') from dual;    -- 2월 28인 것도 한달 차이로 인식

-- to_date('날짜문자열')_ - 문자열을 날짜형으로 변환
select to_date('2020-10-05') from dual;
select to_date('20201005') from dual;
select to_date('2020 10 05') from dual;
select to_date('2020 / 10 / 05') from dual;

select to_date('2020-03-01') - to_date('2020-02-01') from dual;     -- 일수로 계산

------------------------------------------------------------------

-- row 관련 함수
--  rownum - 행 번호
--  rowid - 행 주소값

select uname, addr, rownum, rowid
from lan;

---------------------------------------------------------------------

-- to_number('숫자 형태의 문자열') - 정수 > 숫자 변환 함수
select to_number('100') + 1 from dual; 
select '100' + 1 from dual;     -- 에러 없음 > 오라클은 이 경우 to_number가 자동으로 붙음

----------------------------------------------------------------------

-- 올림, 반올림, 버림 함수
select avg(kor),
       round(avg(kor)),  -- 소수점 반올림
       ceil(avg(kor)),   -- 소수점 올림
       trunc(avg(kor))   -- 소수점 버림
from lan;

----------------------------------------------------------------------

-- substr() - 인덱스가 1부터 시작
select  substr('8712345', 7, 1) from dual;  -- '8912304'의 7번째 글자부터 1개 출력
select  substr('8712345', 6, 2) from dual;  -- '8912304'의 6번째 글자부터 2개 출력

select  substr('8712345', 5) from dual;     -- '8912304'의 5번째 글자부터 끝까지 출력
select  substr('8712345', 5, 100) from dual; -- '8912304'의 5번째 글자부터 100개까지 출력

-- lpad() - 출력서식 함수
select uname, lpad(kor, 5, '*')     -- kor의 값을 5 자리수로 하되 빈칸은 *로 채움
from lan;



commit;

 

영어를 어느 정도 잘하면 프로그래밍에도 많은 도움이 되더군요.

영어를 배울 수밖에 없다면... ^_^

 

 

댓글