목차

함수(FUNCTION)

입력된 input을 특성에 맞추어 output 을 출력합니다.



대소문자 치환

  • INITCAP: 문장의 모든 단어의 첫 글자를 대문자로 치환
SELECT INITCAP('APPLE')
  FROM DUAL;

=> Apple

  • UPPER, LOWER: 대(소)문자 치환
SELECT UPPER('Apple'), lOWER('Apple')
  FROM DUAL;

=> APPLE / apple

  • length, lengthb (byte): 글자의 크기 출력

SELECT length('Apple'), lengthb('Apple')
  FROM DUAL;

=> 둘다 5

하지만 주의할 점이 있는데 한글은 1글자당 3byte를 잡아먹기 때문에 한글을 입력하는 경우 두 쿼리의 결과값이 달라진다.

SELECT length('한글 최고'), lengthb('한글 최고')
  FROM DUAL;

=> 5 / 13


문자에서 원하는 위치의 글자 추출

  • SUBSTR(X, a, b) : 입력된 글자(X)에서 원하는 위치(a)부터 시작해서 원하는 갯수(b)만큼 출력

​​

SELECT SUBSTR('MONETARY', 2,3)
  FROM DUAL;

=> ONE

주의사항 : 날짜 데이터 취급 시에 포맷(FORMAT)때문에 LIKE때도 주의해야하지만 SUBSTR을 사용할때도 주의를 해야합니다. 날짜 데이터는 하단 날짜함수에서 다루도록 하겠습니다.


  • INSTR(X, A, start, end) :
x : 원본 문자열 A : 찾을 문자열 start : 시작 위치 end : 몇 번째인지
강조된 변수는 생략이 가능합니다.

​​​

SELECT INSTR('BANANA', 'A', 1, 3)
  FROM DUAL;

=> 6

위의 쿼리에 경우는 BANANA에서 1번째 위치부터 탐색을 시작해서 3번째로 나온 A의 위치를 출력하는 것입니다.

찾는 문자열이 없을 경우에는 0이 나오며, SUBSTR과 다르게 시작 위치가 음수(마이너스)일 경우 스캔 방향이 역순으로 바뀝니다.

  • pad함수 : byte수에 맞춰서 특정 문자열을 삽입하는 함수이다. 보통 글자 수가 정해진 형식에 맞출 때 사용한다.

    r(l)pad(문자열 , byte 수, ‘문자열’)

​​​

SELECT rpad('a',5,'b')
  FROM DUAL;

​ => abbbb

공백 제거

  • trim함수 : 글자 양 옆의 공백을 제거하는 함수

기본 문법 : r(l)trim(문자열, 제거할 문자)

모든 데이터가 완벽히 전처리가 되어있지 않다보니 글자에 빈 칸( )이 들어가는 경우가 현업에서는 빈번하게 발생하는데, 이로 인해 '=' 연산자(equal)로 검색이 안되는 경우가 발생합니다. 이때, trim 함수를 사용하여 불필요한 문자열이나 공백을 지우면 검색이 되는 경우가 있습니다. 따라서 원인불명으로 검색이 안되는 경우에 trim함수를 사용해보는 것을 추천합니다.

육안으로는 확인할 수 없는 빈 칸을 제거하는 trim


치환함수

문자열 내의 글자를 다른 글자로 바꿔주는 함수로 REPLACE, TRANSLATE가 있습니다.

  • REPLACE : 특정 단어를 원하는 단어로 단어 단위로 치환하는 함수

​​​

SELECT REPLACE('ABCDE', 'ABC','FF')
  FROM DUAL;

​ => ‘FFDE’

‘ABC’를 ‘FF’로 통째로 바꿔버렸습니다. ​

  • translate : 글자 단위로 치환하는 함수. 즉, 순서상 매칭되어있는 글자와 1대1 치환이 이루어집니다.

백문이 불여일견이므로 예시를 통해 빠르게 보도록 하겠습니다.

​​​

SELECT TRANSLATE('ABCBA','AB','EF') 
  FROM DUAL;

​ => ‘EFCFE’

위 예시를 보시면 ‘ABCBA’에서 ‘A’는 'E'로 바뀌고 ‘B’는 'F'로 바뀐 것을 볼 수 있습니다. ​ 뒤에 오는 문자열이 앞의 문자열수보다 많아도 오류 발생은 하지 않으며 무시합니다.

치환함수가 중요한 이유는 SQL 뿐만 아니라 SQL 이후에 다루게 될 R, Python에서도 사용가능하기 때문입니다. 물론 정규 표현식(Regular expression)에 익숙하신 분들에게는 크게 문제 될 게 없어보입니다.


숫자함수

수학 용어에 대한 지식이 어느 정도 있어야 사용할 수 있고, 자세한 설명은 구글링을 통해 확인하시는 편이 정확하다고 생각하여 각 함수에 대한 설명은 따로 적지는 않았습니다.

  • ROUND(숫자,자리수) : 반올림

  • TRUNC(숫자,자리수) : 내림

  • MOD : 모듈로 함수

  • FLOOR : 입력값보다 작은 정수 중 최댓값

  • CEIL : 입력값보다 작은 정수 중 최댓값

  • ABS : 절댓값(absolute value)

  • SIGN : 양수면 1, 음수면 -1, 0일때는 0을 출력. 후에 조건문에 사용.

날짜함수

  • ROUND / TRUNC : 숫자함수에서처럼 사용 가능, 자리수에는 ‘YEAR’ 처럼 영어로 단위 표기

  • SYSDATE : 현재 날짜, 시간을 포맷에 맞춰서 출력

  • ADD_MONTHS(날짜,n) : n 개월 후의 날짜를 출력

  • MONTHS_BETWEEN : 두 날짜의 개월 수 차이 출력

  • NEXT_DAY : 바로 다음에 오는 지정한 요일의 날짜 출력

​​​

SELECT NEXT_DAY(SYSDATE,'월')
  FROM DUAL;

=> 포스트 작성 일자가 2020-09-16(수)이기 때문에 다음에 오는 월요일의 날짜는 2020-09-21(월)이 되겠습니다.

  • LAST_DAY : 그 날짜를 포함하는 달의 마지막 날
SELECT LAST_DAY(SYSDATE,'월')
  FROM DUAL;

=> 포스트 작성 일자가 2020-09-16(수)이기 때문에 9월의 마지막 날인 2020-09-30(수)이 되겠습니다.


형 변환 함수

자료형(Data type)은 컴퓨터 기억 장치에 저장된 값, 객체의 표현, 해석, 구조를 설명하면서 자료형 체계 안의 데이터의 해석에 사용된다. 여러 종류의 자료형 체계들은 다양한 범위의 자료형 안전을 보증하며, 자료형 정보를 사용하여 데이터에 접근하고 데이터를 이용하는 컴퓨터 프로그램의 유효성을 확인한다. 자료형은 “프로그램을 실행하지 않고도 결정할 수 있는 프로그램의 특성”으로 정의할 수 있다.

Programming Languages: Application and Interpretation, Shriram Krishnamurthi, Brown University


SQL에서는 컬럼 하나에 하나의 데이터 타입만 지원하고 데이터 타입이 다른 컬럼끼리 연산을 하다보면 오류가 발생할 수 있습니다. 이를 방지하기 위해 일시적으로 형을 변환시키는 함수가 있습니다.

  • TO_CHAR : 숫자, 날짜 -> 문자타입으로 변경

숫자-> 문자 : 천 단위 구분 기호 삽입, 달러 표시 등 날짜-> 문자

  • TO_NUMBER : 문자 -> 숫자타입으로 변경

아래에서 다룰 묵시적 형 변환이 일어나지 않습니다.

SELECT '2020/09/11' + 100
  FROM DUAL;

=> ORA-01722: invalid number


  • 묵시적 형 변환 : SQL에서는 숫자로 바꿀 수 있는 문자에 한해서 연산시 자동으로 숫자로 바꿔줍니다.
SELECT 1 + '1'
  FROM DUAL;

원래대로라면 '1'은 문자이기 때문에 숫자 1과 덧셈이 불가능합니다. 하지만 묵시적 형 변환으로 인해 자동으로 문자가 숫자로 바뀌면서 위 쿼리의 결과값은 2가 됩니다.

SQL에서는 묵시적 형 변환 덕분에 포맷에 크게 연연하지 않고 쿼리 조회가 가능합니다. 하지만 굳이 형 변환 함수를 공부하는 이유는 만약에 생길 오류를 방지하기 위함이고 다른 언어는 묵시적 형 변환을 허용하지 않는 경우가 많기 때문에 미리 묵시적 형 변환이 지원되지 않는 환경에 적응할 필요가 있기 때문입니다.


조건문

  • NVL : NULL을 다른 값으로 치환하는 함수로 두 종류가 있습니다.

NVL(데이터, NULL일 경우 출력값)

NVL2 (데이터, NULL이 아닐 경우 출력값, NULL일 경우 출력값)


하나의 컬럼에서는 하나의 데이터 타입만 취급하니 함수 사용시 이를 염두해 두시면 됩니다.


  • DECODE : SQL에서 지원하는 조건문 (1)
SELECT DECODE(원본, 조건1, 치환1, 조건2, 치환2,   ....    ,  치환)
  FROM DUAL;

ORACLE에는 if문이 없어서 사용하는 함수로 equal 연산자만 사용 가능하고 대소비교가 불가능하다는 단점이 있습니다.


  • CASE : SQL에서 지원하는 조건문 (2)
SELECT case when 조건1 then 출력1
            when 조건2 then 출력2
            ...
            else 치환 end
  FROM DUAL;

DECODE에 비해 쿼리가 길어지지만 >, < 연산자를 사용할 수 있기 때문에 대소 비교가 가능하다는 장점이 있습니다.

간혹 벌어지는 실수로 인해 CASE문이 실행되지 않는 경우가 있는데 ELSE 까지 작성 후 마지막에 END를 붙여주는 것을 잊지 맙시다.


다음 내용

GROUP BY, HAVING 그리고 대망의 JOIN을 다루려고 합니다. JOIN은 테이블과 테이블끼리 엮는 작업이기 때문에 데이터 분석에 있어서 매우 중요한 기능입니다.

  • GROUP BY
  • HAVING (vs WHERE)
  • 집합 연산자
  • JOIN
  • 서브쿼리(Subqeury)