기본적인 집계함수
함수 |
출력내용 |
예시 |
avg() |
null 값이 아닌 모든 입력 값의 평균 |
avg(컬럼명) |
count(*) |
입력한 행의 총 개수 |
count(*) |
count() |
null 값이 아닌 모든 입력 행 값의 개수 |
count(컬럼명) |
max() |
null 값이 아닌 모든 입력 값의 최댓값 |
max(컬럼명) |
min() |
null 값이 아닌 모든 입력 값의 최솟값 |
min(컬럼명) |
sum() |
null 값이 아닌 모든 입력 값의 합산값 |
sum(컬럼명) |
# 예시
select 집계함수 from 테이블명;
# 결과
계산값
빈테이블을 조회하면 결과로 아무값이 나오지 않는다. 웹과 db를 연동한다면 조회값이 없을경우에 대체메시지를 설정해주는것이 좋다.
boolean 연산 집계함수
데이터 타입이 boolean일때 사용가능
함수 |
출력내용 |
예시 |
bool_and() |
입력된 데이터가 모두 참이면 참을 출력 |
bool_and(컬럼명) |
bool_or() |
입력한 데이터 중 하나라도 참이면 참을 출력 |
bool_or(컬럼명) |
every() |
bool_and()함수와 같음 |
every(컬럼명) |
# 예시
select boolean 연산 집계함수 from 테이블명;
# 응용
select boolean 연산 집계함수 from 테이블명 where 조건;
# 결과
true of false
배열을 담는 집계함수
함수 |
출력내용 |
array_agg() |
배열로 연결된 null 값을 포함한 입력 값 |
더 높은 차원의 배열로 연결된 입력 배열 |
|
# 예시
select array_agg(컬럼명) from 테이블명
# 결과
배열 ㅡ> {값1,값2,값3...}
# 예시
select 컬럼명1, 컬럼명2, array_agg(컬럼명3) from 테이블명 group by 1,2;
id | weight | array_agg
----+--------+---------------
1 | 350 | {참치}
3 | 400 | {연어}
5 | 450 | {삼치}
4 | 400 | {"곰과 연어"}
2 | 200 | {고추참치}
JSON 집계함수
함수 |
출력내용 |
json_agg() |
null을 포함해 json배열로 집계한 값 |
jsonb_agg() |
null을 포함해 jsonb배열로 집계한 값 |
json_object_agg(name,value) |
name-value 쌍을 json개체로 집계 한 값 value은 null을 포함, name은 포함하지 않음 |
jsonb_object_agg(name,value) |
name-value 쌍을 json개체로 집계 한 값 value은 null을 포함, name은 포함하지 않음 |
json_agg는 데이터를 배열에 담아서 출력하고 jsonb_agg는 한줄로 배열에 담아서 출력한다.
단, jsonb 타입의 데이터는 json_agg()로 출력해도 한줄로 배열에 담겨서 출력된다.
# select json_agg(컬럼명) from 테이블명;
# select jsonb_agg(컬럼명) from 테이블명;
# select id, json_agg(information) from company_json group by 1;
1 | [{ +
| "회사이름" : "와따마시따", +
| "대표자" : "홍길동", +
| "설립년월" : 20200504, +
| "사이트" : { +
| "메인페이지" : "mainwm.com", +
| "홍보페이지" : "wmad.com" +
| }, +
| "제품 카테고리" : ["통조림", "라면", "음료"]+
| }]
# select id, jsonb_agg(information) from company_json group by 1;
1 | [{"대표자": "홍길동", "사이트": {"메인페이지": "mainwm.com", "홍보페이지": "wmad.com"}, "설립년월": 20200504, "회사이름": "와따마시따", "제품 카테고리": ["통조림", "라면", "음료"]}]
json_object_agg와 jsonb_object_agg는 name-value쌍으로 데이터를 입력받고 이를 json개체로 집계하여 출력한다.
jsonb_object_agg는 공백이 일부 사라져서 출력된다. 컬럼이 여러개일때 이를 묶어서 출력하는 용도로도 쓸수 있다.
공백의 차이는 나중에 결과가 다르게 출력되거나 오류를 발생시킬수 있으므로 유의해야한다.
# select json_object_agg(name, value) from 테이블명;
# select jsonb_object_agg(name, value) from 테이블명;
# select json_object_agg(id, name) from ramen;
{ "1" : "진라멘", "2" : "고추짜장면", "3" : "리얼짬뽕", "4" : "추풍라면", "5" : "겨울이라면" }
# select jsonb_object_agg(id, name) from ramen;
{"1": "진라멘", "2": "고추짜장면", "3": "리얼짬뽕", "4": "추풍라면", "5": "겨울이라면"}
# select * from ramen;
id | name | quantity | is_spicy | shelf_life
----+------------+----------+----------+------------
1 | 진라멘 | 2 | f | 90
2 | 고추짜장면 | 15 | f | 30
3 | 리얼짬뽕 | 47 | t | 40
4 | 추풍라면 | 18 | f | 90
5 | 겨울이라면 | 50 | t | 60
# select id, quantity, shelf_life, json_object_agg(name, is_spicy) from ramen group by 1,2,3 order by 1;
id | quantity | shelf_life | json_object_agg
----+----------+------------+--------------------------
1 | 2 | 90 | { "진라멘" : false }
2 | 15 | 30 | { "고추짜장면" : false }
3 | 47 | 40 | { "리얼짬뽕" : true }
4 | 18 | 90 | { "추풍라면" : false }
5 | 50 | 60 | { "겨울이라면" : true }
# select id, quantity, shelf_life, jsonb_object_agg(name, is_spicy) from ramen group by 1,2,3 order by 1;
id | quantity | shelf_life | jsonb_object_agg
----+----------+------------+-----------------------
1 | 2 | 90 | {"진라멘": false}
2 | 15 | 30 | {"고추짜장면": false}
3 | 47 | 40 | {"리얼짬뽕": true}
4 | 18 | 90 | {"추풍라면": false}
5 | 50 | 60 | {"겨울이라면": true}