본문 바로가기

SQLD · DB

[ SQLD ] Function 240817

 

함수의 유형

- SQL에서 함수란 특정한 기능을 수행하기 위한 일련의 연산들의 집합 또는 특정한 기능을 수행하는 단위다.

- 함수를 누가 만드냐에 따라 ( 생성 주체 ) 사용자 정의 함수와 내장 함수로 나뉘어진다

→ 함수를 정의한다는 것은 함수의 기능을 정의한다는것이다.

1) 사용자 정의 함수 ( User Definition Function ) 는 사용자가 정의하고 ( 우리가 직접 정의 ),

2) 내장 함수 ( Built-in Function ) 는 오라클 등의 벤더가 정의한다 → 미리 정의되어서 시스템에서 제공하는 함수

 

함수는 하나의 행 ( 하나의 인스턴스 ) 에 대해서 적용되는 경우가 많고,

적용 범위에 따라 단일 행 함수 ( Single-Row Function ) 와 다중 행 함수 ( Multi-Row Function ) 로 나뉜다.

- 단일 행 함수는 어떤 데이터 타입에 적용하느냐에 따라 문자형 / 숫자형 / 날짜형 함수로 나뉘어진다.

또는 역할에 따라 제어 / 변환 / NULL 관련 함수로 나뉘어진다.

- 다중 행 함수는 하나의 컬럼을 기준으로 여러 행의 값에 기반하여 평균이나 총점 등을 구하는 작업을 한다.

이 작업은 그룹 함수에 속하며 다중 행 함수는 그룹 함u수 ( Group Function ) 와

윈도우 함수 ( Window Function ) 로 구성되고, 그룹 함수는 집계 함수를 포함한다.

 

단일행 함수의 특징

- 각 행 ( ROW ) 에 대해 개별적으로 작용하고 그 결과를 반환한다.

단일 행 내에 있는 하나 또는 복수의 값을 인수로 사용한다 → ( 단일 행 ) 함수의 적용 범위는 하나의 레코드 ( 행 ) 가 기준이 된다는 것,

하나의 레코드에서 값 하나를 사용하든 여러 개를 사용하든 상관없다. 다만 여러 행에 걸친 값을 사용할 수 없다.

함수 중첩 ( 함수의 인자로 함수를 사용 ) 이 가능하다.

- SELECT, WHERE, ORDER BY 절에 사용이 가능하다.

 

 

문자형 함수

- LOWER(문자열) 함수는 문자열을 소문자로 바꾸어준다.

- UPPER(문자열) 함수는 문자열을 대문자로 바꾸어준다.

- ASCII(문자) 함수는 문자를 아스키코드로 바꾸어주고, CHAR(ASCII코드) 함수는 ASCII코드를 문자로 바꾸어준다.

- 인수로 전달한 두 개의 문자열을 합치는 CONCAT(문자열1, 문자열2) 함수

→ CONCAT 함수의 기능을 하는 || ( 파이프기호)

- SUBSTR 함수

1) SUBSTR( 문자열, m ) → SUBSTR('SQL Expert', 5) 는 주어진 문자열 ( SQL Expert ) 에서 5번째 자리부터 ( 5번째 자리를 포함하여 ) 문자열 끝까지 자른 것을 반환한다. 결과는 문자열 Expert 를 반환한다.

2) SUBSTR( 문자열, m, n ) → SUBSTR('SQL Expert', 5, 3) 는 주어진 문자열 ( SQL Expert ) 에서 5번째 자리에서 시작하여 3개를 반환한다. 결과는 문자열 Exp 를 반환한다. 주어진 문자열을 잘라서 반환할 건데 ( 자르기 ) 시작 문자열 자리수 ( m ) 에서 몇 개를 담아서 반환할 건지를 n이 결정한다.

- 사용 빈도 횟수가 높은 LENGTH(문자열) 함수는 주어진 문자열의 길이를 숫자로 반환한다.

 

숫자형 함수

ABS(숫자): ABS는 absolute의 약어, ABS 함수는 절댓값을 반환한다. 예를 들어 ABS ( -15 ) 는 15를 반환한다.

- SIGN(숫자) 는 주어진 숫자의 부호 ( 양인지 음인지 ) 를 판별하여 양인 경우 1, 음인 경우 -1, 0인 경우 0을 반환한다.

크기와 관계없이 숫자의 부호에 따라 값이 반환된다.

- MOD(숫자1, 숫자2) 는 숫자1을 숫자2로 나누었을 때 나머지를 반환한다.

- CEIL(숫자) 는 주어진 숫자보다 같거나 ( = ) 큰 숫자를 반환한다. 예를 들어 CEIL(38.2) 의 경우 38.2보다 같거나 큰 정수를 반환한다.

39를 반환한다. FLOOR(숫자)는 주어진 숫자보다 같거나 작은 최대의 수를 반환한다. FLOOR(32.8) 는 32를 반환한다.

ROUND(숫자), ROUND(숫자, n)

1) ROUND(숫자, n) → 주어진 숫자에서 소숫점을 남길건데 몇 자리까지 남길 것인가는 n에 의해 결정되고,

n이 2라면 소숫점 3번째 자리에서 반올림이 이루어진다.

- TRUNC(숫자) 는 주어진 숫자를 절삭하여 정수를 반환하는 함수다.

TRUNC(숫자, n) 의 경우 주어진 숫자를 소숫점 n의 자리까지 절삭하여 반환한다.

 

변환형 함수는 데이터의 타입을 변환하는 것이다.

- TO_CHAR 는 문자열이 아닌 숫자나 날짜를 문자열로 변환하는 것이다. TO_CHAR(숫자 또는 날짜),

TO_CHAR(숫자 또는 날짜, FORMAT)

- TO_NUMBER(문자열) 은 날짜가 아닌 문자열을 숫자로 바꾸는 것이다.

- TO_DATE(문자열), TO_DATE(문자열, FORMAT) 또한 문자열을 날짜형으로 바꾸는 것이다.

문자열 타은 숫자형, 날짜형으로 변환이 가능하고, 숫자형 / 날짜형 문자열 타입으로 변환이 가능하다.

 

- 데이터 타입 변환에는 ( 함수를 이용한 ) 명시적 데이터 타입 변환과 암시적 데이터 타입 변환이 있다.

1) 명시적 데이터 타입 변환은 데이터 타입을 변환할 것을 명시적으로 작성하는 것

→ 예를 들어 문자열 타입인 PLAYER_ID의 컬럼에 입력되어 있는 데이터 값을 숫자로 변환할 때

명시적으로 작성하려면 다음과 같이 작성할 수 있다. SELECT TO_NUMBER(PLAYER_NEW_ID) FROM OLD_PLAYER;

 

2) 암시적 데이터 타입은 시스템이 자동으로 데이터 타입을 변환하는 것이다.

예를 들어 나머지를 구하는 함수인 MOD를 사용할 때 인수로 PLAYER_ID ( PLAYER_ID 데이터 타입은 문자열 ) 와 4를 주었을 때

MOD(PLAYER_ID, 4) PLAYER_ID 데이터 타입이 문자열이지만 시스템이 나머지를 구하기 위해 문자열을 숫자형으로 변환하고,

변환된 숫자를 4로 나누는 연산을 진행한다. 이런 경우 성능 저하 및 에러 발생의 가능성이 존재한다.

 

날짜형 함수

SYSDATE는 함수라기보다는 현재 날짜와 시각 정보를 담고 있는 변수다.

 

제어함수

CASE Expression

- 표현식이지만 함수의 성격을 갖고 있다.

- IF ~ THEN ~ ELSE 논리 흐름

 

조건식의 주어가 ( POSITION ) 모두 동일하고, = ( 동등 비교 ) 시에만 Simple Case Expression 이 가능하다.

CASE 뒤에 WHEN 이 먼저 나오면 복잡한 방식, 변수 ( ex. POSITION ) 가 먼저 나오면 간단한 방식

 

동등 ( = ) 이외의 조건은 Simple Case Expression  또는 Decode 함수로 표현이 불가하다. 

CASE문에 또 CASE문이 존재할 수 있다. CASE문은 중첩이 가능하다.

 

표준 SQL이 아닌 오라클 벤더에서만 지원되는 DECODE 함수

 

NULL이란 비어있는 값을 의미한다. 공백(space), 0과는 다른 의미다. NULL을 포함하는 모든 산술 연산의 결과는 NULL 이다.

어떤 숫자와 NULL을 사칙연산했을 때 모든 결과는 NULL이 나온다. 논리연산의 경우는 좀 다르다. TRUE OR NULL의 논리연산 결과는 TRUE가 나온다. NULL과 공집합 역시 다른 의미다. 컬럼에 대응하는 값으로 NULL 이 출력되는 것과 결과가 아예 안나오는 것 ( 공집합 ) 은 의미가 다른 것이다.

 

- NVL ( 표현식의값, 표현식의 값이 NULL인 경우 대체할 값 )

예를 들어 NVL(POSITION, '없음') 의 경우 컬럼명 POSITION에 대응하는 데이터의 값을 반환하되 그 값이 NULL 인 경우 문자열 없음으로 대체한다. POSITION 컬럼의 데이터 타입에 따라 대체할 값의 데이터 타입을 고려한다. POSITION 컬럼의 데이터 타입이 문자열이라 대체 값도 문자열로 제공한 것이다. 사칙연산에 사용될 필드에는 NULL 값이 있을 경우 NVL 함수를 사용해 대체할 값을 적용해준 뒤 사칙연산을 수행한다.

- NULLIF ( 표현식1, 표현식2 )

예를 들어 표현식1의 값이 표현식2의 값과 같다면 NULL 을 반환한다. 표현식1의 값과 표현식2의 값이 같지 않다면 표현식1의 값을 반환한다.

'SQLD · DB' 카테고리의 다른 글

[ SQLD ] SQL - Join & Set Operation 240818  (0) 2024.08.18
[ SQLD ] SQL - TCL / DCL 240817  (0) 2024.08.17
[ SQLD ] DDL 240816  (0) 2024.08.16
[ SQLD ] SQL - DDL 240815  (0) 2024.08.16
[ SQLD ] SQL_Basic DML 240814  (0) 2024.08.15