[PostgreSQL] 함수(Function)의 정의 및 상세 사용법 (다양한 예제)

1. PostgreSQL Function이란? SQL 함수는 임의의 SQL문들을 실행하고 마지막 쿼리의 결과를 반환한다. 단순한 형태의 함수는 마지막 쿼리의 첫 번째 row가 리턴된다. (order by 를 사용하지 않는 경우 다중 row의 첫 번째 행은 별도 정의되지 않기에 결과 row가 매번 다를 수 있다.) 마지막 쿼리가 row를 하나도 반환하지 않을 경우 null이 리턴된다. SQL 함수는 함수의 리턴 유형을 특정 타입의 집합 (SET)으로 선언하거나, 테이블로 선언하여 반환할 수 있다. 이 경우에는 마지막 쿼리의 모든 ROW가 리턴된다. SQL함수의 body는 세미콜론(;)으로 구분된 SQL구문의 집합이어야만 한다. 마지막 구문 뒤의 세미콜론(;)은 생략하여도된다. 함수가 void를 리턴하는 것으로 선언되지 않았다면, 마지막 구문은 반환절이 존재하는 select, insert, update, delete 여야만 한다. 모든 종류의 SQL 언어의 명령 모음은 패키징 되어 함수로 정의될 수 있다. select쿼리 외에도 insert, update, delete, merge 등의 데이터 수정쿼리 및 기타 SQL을 포함할 수 있지만, 트랜잭션 제어 명령( ex. commit, savepoint) 및 vacutaion 등의 일부 유틸리티 명령은 사용할 수 없다. SQL이 작동은 하지만 특정 값을 리턴하지 않는 SQL 함수를 정의하고 싶다면, void를 리턴하는 것으로 정의할 수 있다. ▶ 1-1. Function 간단 예시 다음은 emp 테이블에서 음수의 salary를 삭제하는 함수이다. ...

November 15, 2023 · Jun Kang

[PostgreSQL] 명시적 JOIN 절로 플래너(Planner) 제어, 성능 향상

1. 개요 PostgreSQL은 쿼리 Planner가 가장 효율적인 쿼리 플랜을 세워 쿼리를 실행시킨다. 이번 포스트는 쿼리 Planner가 플랜을 검색하는 과정을 의도적으로 제한하여 플랜 검색 시간을 단축시키는 방법에 대한 내용이다. 쿼리 선택지를 제한함으로써 시간을 줄이지만, 그만큼 모든 경우를 비교하는 것이기 아니라서 최고의 플랜을 찾을 수 없기에, 테이블 scan 방식 및 인덱스 등 쿼리의 작동방식을 명확히 이해한 후 설정이 필요하며, 설정전 성능비교, 설정 후의 데이터 증감에 따른 지속적인 모니터링이 필요하다. 2. 플래너의 작동 2-1. JOIN Planner의 작동방식을 보기 위해 간단한 조인 쿼리를 확인해 보자 ...

November 8, 2023 · Jun Kang

[PostgreSQL] 윈도우 함수(Window Functions)의 개념, 성능 및 사용법 (over, sum/rank/ntitle/cume_dist 등...)

1. 윈도우 함수 (Window Functions)란? 윈도우 함수는 행과 행 간의 관계를 쉽게 정의하기 위해 만든 함수이다. 이 기능은 일반 집계함수의 연산과 유사하지만, 일반 집계함수가 행 각각을 단일 그룹화해서 출력하는 반면에, 윈도우 함수는 각각의 행들이 그룹화되지 않으며 별도의 ID를 가진다. 그렇기에 윈도우 함수는 현재 row의 정보보다 더 많은 정보에 접근이 가능하다. 예를 들면 다음과 같다. 일반집계함수 : COUNT() + GROUP BY-> 그룹별 1개의 행 출력 (그룹 개수만큼 출력, 자르기 + 집약) 윈도우집계함수 : COUNT() OVER (PARTITION BY) -> ID개수만큼 행 출력 (행의 개수가 줄어들지 않는다, 자르기) ...

October 31, 2023 · Jun Kang

[PostgreSQL] 데이터베이스 상속(Inheritance)의 개념과 사용법 및 성능비교 (Inherits, Only)

1. 데이터베이스 상속(Inheritance)이란? 상속은 객체지향 데이터베이스의 개념 중 하나이다. PostgreSQL은 테이블 생성 시 하나 이상의 다른 테이블로부터의 상속 기능을 제공하며, 이를 잘 활용하면 데이터베이스 설계에 새로운 가능성들을 열어준다. 데이터뿐만 아니라 부모 테이블의 컬럼 속성 및 인덱스 등의 특징들도 자식 테이블로 상속되기에 상황에 따라 효율적인 설계가 가능하다. 2.데이터베이스 상속(Inherits) 방법 다음 예제는 PostgreSQL 공식 문서의 예제이다. Capitals - 이름, 인구, 고도, 요약어를 포함한 수도의 정보가 포함된 테이블 Cities - 이름, 인구, 고도를 포함한 도시 정보가 포함된 테이블 ...

October 30, 2023 · Jun Kang

[PostgreSQL] 날짜 형태 검증하기 (ERROR: date/time field value out of range)

1. 날짜 형태로 형 변환 데이터 베이스에서 날짜형태로 형 변환을 하는 것은 다음과 같은 방법으로 쉽게 가능하다. -- Unix타임(int)형 변환 SELECT to_timestamp(1658792421) -- varchar 타입 변환 SELECT to_timestamp('20231026','yyyymmdd') -- 날짜형을 char로 변환 SELECT to_char(to_timestamp(1658792421), 'DD-MM-YYYY') 2. 유효한 날짜형태 검증 데이터 정제가 완료되지 않아 조회하려는 데이터에 날짜유형에서 벗어난 데이터 ('20231301',202301', '20231232' 등)가 하나라도 있을 경우 조회 자체가 안된다. 그럴 경우 날짜 규격에 맞지 않는 데이터를 보정 후 연산해야 하는 경우가 있는데 단순 월별 케이스문으로 분리하여 날짜 유형에 어긋나는 경우를 찾을 수도 있지만 row마다 날짜 유형이 다르거나 윤달을 체크할 수 없다. ...

October 26, 2023 · Jun Kang