오라클에서는 연산자로 다루기 어려운 복잡한 데이터의
처리와 다양한 결과를 제공하기위해 내장함수를 제공한다
자주 쓰이는 것들을 보자면
문자 함수
LENGTH SUBSTR INSTR REPLACE TRIM
숫자 함수
ROUND TRUNC CEIL FLOOR MOD
날짜 함수
SYSDATE
NULL 관련 함수
NVL NVL2
DECODE함수, CASE문
이것들은 결과값이 1행으로 처리되는 단일행 함수이다
함수란?
사용자가 입력 값 X를 넣으면 정해 놓은 출력 값 Y가 나오는 개념
오라클 데이터베이스 시스템에서 쓰는 함수는
미리 정의된 기능을 통해 데이터를 좀 더 편리하게 조작할 수 있도록 도와준다
함수의 유형은 두가지로 나눌수 있다.
단일행 함수
단일 행만 연산하여 행 당 하나의 결과를 RETURN
다중행 함수
여러 행을 연산하여 그룹 당 하나의 결과를 RETURN
문자를 입력 값으로 받으면 문자 또는 숫자 값을 RETURN한다
단일행을 연산하는 단일행 함수다
1-1. UPPER(문자열) -> 괄호 안의 문자데이터를 모두 대문자로 변환후 RETURN
1-2. LOWER(문자열) -> 괄호 안의 문자데이터를 모두 소문자로 변환후 RETURN
1-3. INITCAP(문자열) -> 괄호 안의 첫번째 문자만 대문자로 변환후 RETURN
SELECT UPPER('문자열')
FROM 테이블
SELECT 절에서 사용
해당 컬럼에 있는 모든 데이터들이 대문자로 변경후 리턴된다
SELECT 게시판제목
FROM 게시판
WHERE 게시판제목 LIKE '%Oracle%'
OR 게시판제목 LIKE '%oracle%'
게시판제목에서 'Oracle', 'oracle'을 다 찾아야할 때 연산자로만 찾으려고 하면
불편해진다 하지만 함수를 사용하면
SELECT 게시판제목
FROM 게시판
WHERE UPPER(게시판제목) LIKE '%ORACLE%';
WHERE 조건절에서 사용
게시판제목을 UPPER로 대문자로 바꾸고
찾아야하는 데이터값도 대문자로 바꿔서 검색하면
Oracle, oracle, oRacle 전부 검색이 가능해진다
SELECT 에서 사용하는 UPPER와
WHERE 에서 사용하는 UPPER는 같은 기능이기도 하지만 결과값에는 차이가 있다
함수의 기능은 같아도 어디에 들어가느냐에 따라서 얻을수 있는 결과는 달라진다
차이점을 분명히 알고 써야한다
내가 리턴받아야 하는 데이터를 대문자로 받아야하는건지
검색하기 위해서 데이터를 대문자로 변환하는건지 이해하고 써야한다
문자열의 갯수를 숫자값으로 리턴한다
LENGTH(문자열)
SELECT LENGTH(문자열)
FROM DUAL;
국가이름의 문자열갯수를 숫자형태로 리턴받는다
문자열의 일부를 추출해서 리턴한다
SUBSTR(문자열, 시작위치, 추출길이)
-> 시작위치부터 시작하여 추출길이만큼 잘라서 리턴
SUBSTR(문자열, 시작위치)
-> 추출길이가 생략되면 마지막 문자까지 잘라서 리턴
SELECT SUBSTR(전화번호, 10, 4)
FROM 전화번호부 // 데이터는 '010-1234-5678' 형태로 들어가있다
// '-'도 문자열의 길이에 포함된다
// 시작위치가 10인 인덱스 번호 부터(= 10 이상)
// 추출길이는 총 4 가 될때까지(= 4 이하) 선택후 리턴
문자열에서 찾고자하는 문자열과 일치하는 위치를 RETURN한다
INSTR(문자열, 찾을문자열, 시작위치, 발생횟수)
시작위치를 명시하지않으면 DEFAULT값은 1
발생횟수는 몇 번째 일치하는 지를 명시하며 DEFAULT값 역시 1
SELECT INSTR('ABCD BCDE CDEF','CD', 4)
FROM DUAL;
이러면 4번째 인덱스 부터 CD위치의 첫번째 발생의 인덱스번호를 리턴한다
값이 7이 나오면 정상이다
SELECT INSTR(
'ABCD BCDE CDEF','CD', 4, 2
)
FROM DUAL;
이러면 값이 11 이 나오면 정상이다
FROM DUAL -> 더미 테이블이다
가상의 테이블을 만들어주어서 쿼리문 연습할때 쓰기 좋다
컬럼의 데이터들을 변환문자 = 찾을문자로 치환한다음 리턴한다
REPLACE('문자열', '찾을문자', '변환문자')
변환문자에 '' 아무것도 없는 값을 넣으면 찾을 문자를 제거한다음 리턴하라는 뜻이다
LPAD(문자열, 전체문자길이, '채움문자')
문자열데이터의 길이를 전체문자길이만큼 고정시키고
공간에 데이터가 없다면 채움문자로 채우는 함수
채움문자에 값이 없으면 DEFAULT값인 공백으로 채워진다
문자열의 현재 길이에 상관없이 전체문자길이 기준으로 빈공간이 생기면
채움문자로 채워지고 문자열의길이가 전체문자길이가 길면 총문자 길이만큼 잘라버린다
SELECT LPAD(NUMBER, 5, 0)
FROM DUAL;
데이터가 1, 10, 123이런 형태면
00001
00010
00123
이런식으로 보여지게 되면서 가독성이 좋아진다
사람 이름을 성만 표시하고 이름부분을 *로 숨겨서 데이터를 출력하시오
SELECT RPAD(SUBSTR(NAME, 1, 1), LENGTH(NAME), '*')
FROM LIST
문자열에 해당하는 부분에 SUBSTR을 써서 성만 나오게끔 하고
전체길이를 LENGTH를 활용해서 NAME의 길이를 숫자형태로 받아서 전체길이로 지정하면
빈공간이 2개가 생기는데 거기에 '*' 문자로 채운다 라는 의미다
SUBSTR은 특정 길이로 자른 값이 필요할때 주로 사용
LPAD RPAD함수와 연계해서 주민등록번호의 뒷자리는 * 형태로
숨겨서 출력하는 그런 상황에서 활용 가능하다
7-1. CONCAT(문자열1, 문자열2, ...)
문자열끼리 연결하는 함수
SELECT CONCAT('문자열1','문자열2','문자열3')
FROM DUAL;
각 컬럼에 데이터가 JAVA, ORACLE, DB 라면
JAVAORACLEDB 형태로 리턴한다
실무에선 || 로 이어붙이는걸 선호한다
확실히 가독성 면에서도 ||가 좋다
ORACLE SQL DEVELOPER 에서 기본제공하는 기능인
|| 연산자
CONCAT기능과 같고 직관적이기 떄문에 실무에서는 ||를 많이 사용한다.
SELECT '문자열1' || '문자열2' || '문자열3'
FROM DUAL;
/* [ABC] 이렇게 출력한다 */
SELECT TRIM('문자열')
-> 문자열의 공백을 지우는 함수
SELECT TRIM(' Sample ')
SELECT LTRIM(' Sample ')
SELECT RTRIM(' Sample ')
각각 양쪽, 왼쪽, 오른쪽 공백을 지우는 함수
REPLACE로도 공백을 지울수있지만 공백만 지우는게 필요하다면 TRIM이 더 편하다