[Oracle/SQL] 오라클 내장 함수 완벽 정리 (숫자, 문자, 날짜, NVL)

2021. 5. 27. 22:33·Database/Oracle

SQL 쿼리를 작성할 때 함수를 적재적소에 사용하는 것은 매우 중요합니다. 오늘은 행 하나하나에 적용되는 단일행 함수부터 데이터를 묶어서 처리하는 집계 함수까지, 실무에서 자주 쓰이는 핵심 함수들을 정리해 보겠습니다.

 

1. 숫자 함수 (Numeric Functions)

숫자 데이터의 소수점을 처리하거나 절댓값을 구할 때 사용합니다.

  • ABS(n): 절댓값을 반환합니다.
  • CEIL(n) / FLOOR(n): 각각 올림과 내림(바닥) 값을 반환합니다.
  • ROUND(n, k): 반올림 함수입니다. k가 양수면 소수점 자리, 음수면 정수 자리에서 반올림합니다.
함수 예시 결과 설명
CEIL CEIL(15.7) 16 무조건 올림
FLOOR FLOOR(15.7) 15 무조건 내림
ROUND ROUND(5.36, 1) 5.4 소수점 첫째 자리까지 표시 (둘째에서 반올림)
ROUND ROUND(232.12, -2) 200 십의 자리에서 반올림하여 백의 자리까지 표시

 

실습 예제: 고객별 평균 주문 금액 구하기 (백 원 단위 반올림)

SELECT custid "고객번호", 
       ROUND(SUM(saleprice)/COUNT(*), -2) "평균금액"
FROM Orders
GROUP BY custid;

 

2. 문자 함수 (Character Functions)

문자열을 자르거나, 합치거나, 길이를 측정할 때 유용합니다.

  • REPLACE: 특정 문자열을 찾아 다른 문자로 치환합니다. (실제 데이터 조회 결과가 변경됨)
  • SUBSTR: 문자열의 일부만 추출합니다. SUBSTR(문자열, 시작위치, 길이)
  • LENGTH / LENGTHB: 문자의 개수와 바이트(Byte) 수를 반환합니다.
  • Tip: 오라클 XE 버전에서 한글은 보통 3바이트를 차지합니다.

실습 예제: 성씨별 인원수 파악하기

SQL
 
SELECT SUBSTR(name, 1, 1) "성", COUNT(*) "인원"
FROM customer
GROUP BY SUBSTR(name, 1, 1); -- 첫 번째 글자(성)만 잘라서 그룹화

 

3. 날짜 함수 (Date Functions)

오라클에서 DATE 타입은 산술 연산이 가능합니다. (+10은 10일 후를 의미)

  • SYSDATE: 현재 시스템의 날짜와 시간을 반환합니다.
  • TO_CHAR: 날짜나 숫자를 원하는 포맷의 문자열로 변환합니다.
  • TO_DATE: 문자열을 날짜 형식으로 변환합니다.

자주 쓰는 포맷: yyyy(년), mm(월), dd(일), dy(요일), hh24:mi:ss(시간)

실습 예제: 특정 날짜 주문 조회

SELECT orderid, TO_CHAR(orderdate, 'yyyy-mm-dd dy') "주문일"
FROM orders
WHERE orderdate = TO_DATE('20140707', 'yyyymmdd');

 

4. 일반 함수 (NVL)

데이터베이스의 NULL 값은 연산이 불가능하기 때문에, 이를 처리해주는 함수가 반드시 필요합니다.

  • NVL(컬럼, 치환값): 컬럼 값이 NULL일 경우 지정한 '치환값'으로 변환합니다.

실습 예제: 전화번호가 없는 고객 처리

SQL
 
SELECT name "이름", NVL(phone, '연락처없음') "전화번호"
FROM customer;

 

💡 Tip

  1. dual 테이블: 오라클에서 제공하는 가상 테이블로, 함수 계산 결과만 확인하고 싶을 때 FROM dual을 사용하면 편리합니다.
  2. 대소문자: SQL 예약어나 함수명은 대소문자를 구분하지 않지만, 가독성을 위해 대문자로 쓰는 습관을 들이면 좋습니다.
  3. GROUP BY 제약: GROUP BY를 사용할 때는 SELECT 절에 그룹화한 기준 컬럼이나 집계 함수(SUM, AVG 등)만 올 수 있다는 점을 주의하세요!

 

단일행 함수는 행 하나에 함수를 적용해 결과가 나옴, 집계 함수는 여러개의 튜플을 모아서 처리하는 함수

분석함수는 쓸 일이 많지 않음.

 

CEILING (실링) = 천장이라는 뜻으로 올림 함수, 소수점 이하의 숫자가 있을 때만 올림 5.7 -> 6

FLOOR = 마룻바닥이라는 뜻으로 내림 함수 4.0 -> 4 , 4.8 ->4

ROUND = 5.36 , 1 = 1의 자리까지 나타내야 함. 2자리인 6에서 반올림 5.36 , 2 =  3자리에서 반올림 5.360 -> 5.36

round(, ) 소수점이하자리에서 반올림할거면 콤마 뒤 양수, 정수를 반올림할거면 콤마 뒤 음수

1   2   3  2  .12

-4  -3  -2 -1

대문자로 꼭 안쓰고 소문자로 써도 됨

LOG, SQRT, SIGN은 정말 잘 안 씀

 

[실습]

접속하기 위해 sqlplus scott으로 들어가고 비번을 입력하라는 메시지가 나오면 tiger치고 엔터

 

--SELECT 다음에 내가 알고 싶은 함수를 옆에다가 적음

--dual = 칼럼을 하나만 갖고 있는 오라클에서 제공하는 계산식. 테이블 이름

 

round = 반올림함수 콤마 뒤 숫자 소수점 자리까지

 

select round(5.36, 1)from dual;

select round(5.361, 2) from dual;

 

ABS = 절대값함수

--ABS함수 : 절댓값을 구하는 함수

--Q4-1. -78과 +78의 절댓값을 구하시오.

SELECT ABS(-78), ABS(+78)

FROM Dual;

 

--ROUND함수 : 반올림한 값을 구하는 함수

--Q4-2. 4.875를 소수 첫째 자리까지 반올림한 값을 구하시오

SELECT ROUND(4.875, 1)

FROM Dual;

 

--숫자 함수의 연산(음수는 정수 반올림, -1은 일의 자리에서 반올림)

-- ~ 별 : GROUP BY

-- GROUP BY  뒤에 나오는 필드만 SELECT 뒤에 나올 수 있음 다른 필드 SELECT뒤에 나오면 안됨

집계함수인 ROUND, SUM은 와도 상관없음 

 

--Q4-3. 중요! 고객별 평균 주문 금액을 백 원 단위로 반올림한 값을 구하시오.

SELECT custid "고객번호", ROUND(SUM(saleprice)/COUNT(*),-2)"평균금액"

FROM Orders

GROUP BY custid;

-- 주문 금액이므로 Orders테이블에 있음

-- “고객번호”, “평균금액”으로 테이블 헤더에 나올 명 정해줌. 이런거 안 적으면 

그냥 custid, ROUND(SUM(saleprice)/COUNT(*), -2)로 나옴 -> 지저분,,,

-- saleprice는 고객 한 명별로 주문금액이 있음 그래서 다 더한 후 행의 개수인count로 나눠줌

ROUND(232.12, -2) -> 200 

 

자주 사용 : CHR, CONCAT, LOWER, UPPER, LPAD, RPAD, LTRIM, RTRIM, REPLACE, SUBSTR, LENGTH

 

--REPLACE = 문자열을 치환하는 함수 -> 실제 값도 변경됨

--Q4-4. 도서제목에 야구가 포함된 도서를 농구로 변경한 후 도서 목록을 보이시오.

SELECT Bookid, REPLACE(bookname, '야구', '농구'), publisher, price

FROM book;

 

 

테이블 정리 안해서 사진으로 대체,,하하,, 실습하긴 햇다

 

---LENGTH = 글자의 수를 세어주는 함수(단위가 바이트(byte)가 아닌 문자 단위) -> 공백도 글자수에 포함됨

--LENGTHB = 바이트 글자수 세어줌, 띄어쓰기 하나는 1바이트

오라클 11g XE버전은 한글 한개가 3바이트 XE(학생버전)

--Q4-5. 굿스포츠에서 출판한 도서의 제목과 제목의 글자 수를 확인하시오.

--(한글은 2바이트 혹은 UNICODE경우는 3바이트를 차지함)

SELECT bookname"제목", LENGTH(bookname)"글자수", LENGTHB(bookname)"바이트수"

FROM book

 

 

WHERE publisher = '굿스포츠';

 

--SUBSTR = 지정한 길이만큼의 문자열을 반환하는 함수

--Q4-6. 마당서점의 고객 중에서 같은 성을 가진 사람이 몇 명이나 되는지 성별 인원수를 구하시오.

SELECT SUBSTR(name, 1, 1)"성", COUNT(*)"인원"

FROM customer

GROUP BY SUBSTR(name, 1, 1);

1, 1 제일 첫 번째에서 하나만 뽑아옴

 

 

 

 

                                                                 ADD_MONTHS 잘 안씀,,

 

 

 

 

hh, hh12, hh24, day, dd, month, mi, mm, ss, yyyy자주 사용 

 

--Q4-7. 마당서점은 주문일로부터 10일 후 매출을 확정한다. 각 주문의 확정일자를 구하시오.

SELECT orderid"주문번호", orderdate"주문일", orderdate+10"확정"

FROM orders;

orderdate타입은 date이기 때문에 더하기 10하면 자동으로 10일 뒤로 됨

 

 

--TO_DATE = 문자형으로 저장된 날짜를 날짜형으로 변환하는 함수

--TO_CHAR = 날짜형을 문자형으로 변환하는 함수

--Q4-8. 중요 마당서점이 2014년 7월 7일에 주문받은 도서의 주문번호, 주문일, 고객번호, 도서번호를 모두 보이시오. 

단 주문일을 'yyyy-mm-dd 요일' 형태로 표시된다.

SELECT orderid "주문번호", TO_C HAR(orderdate, 'yyyy-mm-dd dy')"주문일", custid "고객번호", bookid "도서번호"

FROM orders

WHERE orderdate=TO_DATE('20140707', 'yyyymmdd'); 

 

 

테이블 열 잘 맞지 않아 사진으로 대체.

--SYSDATETIME = 오라클의 현재 날짜와 시간을 반환하는 함수

--SYSTIMESTAMP = 현재 날짜, 시간과 함께 초 이하의 시간과 서버의 TIMEZONE까지 출력함

--Q4-8. DBMS 서버에 설정된 현재 시간과 오늘 날짜를 확인하시오.

SELECT SYSDATE, TO_CHAR(SYSDATE, 'yyyy/mm/dd dy hh24:mi:ss') "SYSDATE_1"

FROM dual;

 

 

 

 

 

 

 

 

 

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

--mybook테이블 만들기

 

 

 

create table mybook(

bookid number,

price number);

 

--추가

insert into mybook values(1, 10000);

insert into mybook values(2, 20000);

insert into mybook values(3, NULL);

 

--확인

SELECT* FROM mybook;

 

 

 

--price가 null이 아닌 것 확인

SELECT *

FROM mybook

WHERE price is not null;

 

--NVL ( Null Value ) = NULL 값을 다른 값으로 대치하여 연산하거나 다른 값으로 출력

NVL (속성, 값)  //속성 값이 NULL이면 '값'으로 대치한다. 값 - > 치환할 값

 

--Q4-10. 이름, 전화번호가 포함된 고객목록을 보이시오. 단, 전화번호가 없는 고객은 '연락처없음'으로 표시한다.

SELECT name"이름", NVL(phone, '연락처없음')"전화번호"

FROM customer;

 

 

 

 

 

 

 

 

 

 

 

--CEIL(15.7) : CEILING(숫자)함수와 같은 것으로 올림함수

SELECT CEIL(15.7)FROM dual;

 

--FLOOR(15.7) : 15.7 내림함수

SELECT FLOOR(15.7) FROM dual;

 

 

--ROUND(15.7) : 반올림함수

SELECT ROUND(15.7) FROM dual;

 

--CONCAT('HAPPY', 'Birthday') : 두 문자 연결함수

SELECT CONCAT('HAPPY', 'Birthday') FROM dual;

 

--LOWER('Birthday') : 소문자로 변환

SELECT LOWER('Birthday') FROM dual;

 

 

--REPLACE('JACK', 'J', 'BL') : 대상 문자열의 지정한 문자를 원하는 문자로 변경

SELECT REPLACE('JACK', 'J', 'BL') FROM dual;

 

--SUBSTR('ABCDEFG', 3, 4) : 대상 문자열의 지정된 자리에서부터 지정된 길이만큼 잘라서 반환

SELECT SUBSTR('ABCDEFG', 3, 4) FROM dual;

 

--UPPER('Birthday') : 대문자로 변경

SELECT UPPER('Birthday') FROM dual;

 

--LENGTH('Birthday') : 대상 문자열의 글자 수 반환

SELECT LENGTH('Birthday') FROM dual;

 

--SYSDATE : 오늘 날짜 반환하는 인자 없는 함수

SELECT SYSDATE FROM dual;

 

--TO_CHAR(SYSDATE) : 날짜형 데이터를 문자열로 반환

SELECT TO_CHAR(SYSDATE) FROM dual;

 

--TO_DATE('12 05 2014', 'DD MM YYYY') : 문자형 데이터를 날짜형 데이터로 변환

SELECT TO_DATE('12 05 2014', 'DD MM YYYY') FROM dual;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

--SELECT 다음에 내가 알고 싶은 함수를 옆에다가 적음
--dual = 칼럼을 하나만 갖고 있는 오라클에서 제공하는 계산식. 테이블 이름
select round(5.36, 1)from dual;

select round(5.361, 2) from dual;

select abs(-3.74)from dual;

--ABS함수 : 절댓값을 구하는 함수
--Q4-1. -78과 +78의 절댓값을 구하시오.
SELECT ABS(-78), ABS(+78)
FROM Dual;

--ROUND함수 : 반올림한 값을 구하는 함수
--Q4-2. 4.875를 소수 첫째 자리까지 반올림한 값을 구하시오
SELECT ROUND(4.875, 1)
FROM Dual;

--숫자 함수의 연산(음수는 정수 반올림, -1은 일의 자리에서 반올림)
--~ 별 : GROUP BY
--Q4-3. 고객별 평균 주문 금액을 백 원 단위로 반올림한 값을 구하시오.
SELECT custid "고객번호", ROUND(SUM(saleprice)/COUNT(*),-2)"평균금액"
FROM Orders
GROUP BY custid;

--REPLACE = 문자열을 치환하는 함수 -> 실제 값도 변경됨
--Q4-4. 도서제목에 야구가 포함된 도서를 농구로 변경한 후 도서 목록을 보이시오.
SELECT Bookid, REPLACE(bookname, '야구', '농구'), publisher, price
FROM book;

--LENGTH = 글자의 수를 세어주는 함수(단위가 바이트(byte)가 아닌 문자 단위)
--Q4-5. 굿스포츠에서 출판한 도서의 제목과 제목의 글자 수를 확인하시오.
--(한글은 2바이트 혹은 UNICODE경우는 3바이트를 차지함)
SELECT bookname"제목", LENGTH(bookname)"글자수", LENGTHB(bookname)"바이트수"
FROM book
WHERE publisher = '굿스포츠';


--SUBSTR = 지정한 길이만큼의 문자열을 반환하는 함수
--Q4-6. 마당서점의 고객 중에서 같은 성을 가진 사람이 몇 명이나 되는지 성별 인원수를 구하시오.
SELECT SUBSTR(name, 1, 1)"성", COUNT(*)"인원"
FROM customer
GROUP BY SUBSTR(name, 1, 1);

--Q4-7. 마당서점은 주문일로부터 10일 후 매출을 확정한다. 각 주문의 확정일자를 구하시오.
SELECT orderid"주문번호", orderdate"주문일", orderdate+10"확정"
FROM orders;

--TO_DATE = 문자형으로 저장된 날짜를 날짜형으로 변환하는 함수
--TO_CHAR = 날짜형을 문자형으로 변환하는 함수
--Q4-8. 마당서점이 2014년 7월 7일에 주문받은 도서의 주문번호, 주문일, 고객번호, 도서번호를 모두 보이시오. 단 주문일을 'yyyy-mm-dd 요일' 형태로 표시된다.
SELECT orderid "주문번호", TO_CHAR(orderdate, 'yyyy-mm-dd dy')"주문일", custid "고객번호", bookid "도서번호"
FROM orders
WHERE orderdate=TO_DATE('20140707', 'yyyymmdd'); 


--SYSDATETIME = 오라클의 현재 날짜와 시간을 반환하는 함수
--SYSTIMESTAMP = 현재 날짜, 시간과 함께 초 이하의 시간과 서버의 TIMEZONE까지 출력함
--Q4-8. DBMS 서버에 설정된 현재 시간과 오늘 날짜를 확인하시오.
SELECT SYSDATE, TO_CHAR(SYSDATE, 'yyyy/mm/dd dy hh24:mi:ss') "SYSDATE_1"
FROM dual;

--mybook테이블 만들기
create table mybook(
bookid number,
price number);

--추가
insert into mybook values(1, 10000);
insert into mybook values(2, 20000);
insert into mybook values(3, NULL);

--확인
SELECT* FROM mybook;

--price가 null이 아닌 것 확인
SELECT *
FROM mybook
WHERE price is not null;

--NVL = NULL 값을 다른 값으로 대치하여 연산하거나 다른 값으로 출력
NVL(속성, 값)  //속성 값이 NULL이면 '값'으로 대치한다.

--Q4-10. 이름, 전화번호가 포함된 고객목록을 보이시오. 단, 전화번호가 없는 고객은 '연락처없음'으로 표시한다.
SELECT name"이름", NVL(phone, '연락처없음')"전화번호"
FROM customer;



--CEIL(15.7) : CEILING(숫자)함수와 같은 것으로 올림함수
SELECT CEIL(15.7)FROM dual;

--FLOOR(15.7) : 15.7 내림함수
SELECT FLOOR(15.7) FROM dual;


--ROUND(15.7) : 반올림함수
SELECT ROUND(15.7) FROM dual;

--CONCAT('HAPPY', 'Birthday') : 두 문자 연결함수
SELECT CONCAT('HAPPY', 'Birthday') FROM dual;

--LOWER('Birthday') : 소문자로 변환
SELECT LOWER('Birthday') FROM dual;


--REPLACE('JACK', 'J', 'BL') : 대상 문자열의 지정한 문자를 원하는 문자로 변경
SELECT REPLACE('JACK', 'J', 'BL') FROM dual;

--SUBSTR('ABCDEFG', 3, 4) : 대상 문자열의 지정된 자리에서부터 지정된 길이만큼 잘라서 반환
SELECT SUBSTR('ABCDEFG', 3, 4) FROM dual;

--UPPER('Birthday') : 대문자로 변경
SELECT UPPER('Birthday') FROM dual;

--LENGTH('Birthday') : 대상 문자열의 글자 수 반환
SELECT LENGTH('Birthday') FROM dual;

--SYSDATE : 오늘 날짜 반환하는 인자 없는 함수
SELECT SYSDATE FROM dual;

--TO_CHAR(SYSDATE) : 날짜형 데이터를 문자열로 반환
SELECT TO_CHAR(SYSDATE) FROM dual;

--TO_DATE('12 05 2014', 'DD MM YYYY') : 문자형 데이터를 날짜형 데이터로 변환
SELECT TO_DATE('12 05 2014', 'DD MM YYYY') FROM dual;









'Database > Oracle' 카테고리의 다른 글

[DBXSpring] DB 생성 / hr유저 비밀번호 변경  (0) 2022.01.28
[설치] 오라클 ojdbc6.jar  (0) 2022.01.27
[DB] Toad data modeler 사용 / 모델링 하는 방법  (0) 2021.11.10
사원 DB구축  (0) 2021.09.08
[DB] 디비버의 오라클로 쿼리 생성  (0) 2021.05.16
'Database/Oracle' 카테고리의 다른 글
  • [설치] 오라클 ojdbc6.jar
  • [DB] Toad data modeler 사용 / 모델링 하는 방법
  • 사원 DB구축
  • [DB] 디비버의 오라클로 쿼리 생성
min_sol
min_sol
  • min_sol
    비글개발연구소🐾
    min_sol
  • 전체
    오늘
    어제
    • 분류 전체보기 (278)
      • Programming (128)
        • Algorithm (52)
        • JAVA (40)
        • GIS (5)
        • PyQt (10)
        • C# (11)
        • Mobile (6)
        • AI (4)
      • Backend (36)
        • Spring (14)
        • JSP (11)
        • Network (5)
      • Frontend (29)
        • React (11)
        • Vue (13)
        • Next.js (4)
      • Database (10)
        • PostgreSQL (1)
        • Oracle (8)
        • Elasticsearch (1)
      • DevOps (8)
        • Linux (7)
        • Mac (1)
      • Tools (31)
        • IntelliJ (1)
        • GitHub (10)
        • RPA (20)
      • Security (9)
      • etc (21)
        • ERROR (5)
        • 세미나 | 교육 (10)
        • 자격증 (1)
        • 일상 (2)
        • 2021 (2)
  • 인기 글

  • 태그

    자동화
    백준
    스윙
    이클립스
    Java
    vue.js
    자료구조
    생능출판
    자바
    PyQt
    PyQt5
    spring
    jsp
    계산기
    알고리즘
    연습문제
    RPA
    VUE
    명품자바에센셜
    코딩테스트
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
min_sol
[Oracle/SQL] 오라클 내장 함수 완벽 정리 (숫자, 문자, 날짜, NVL)
상단으로

티스토리툴바