SQL

SQL 집계함수

봄다온 2025. 1. 23. 16:58

기본적인 집계함수

함수 출력내용 예시
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}

'SQL' 카테고리의 다른 글

SQL 테이블 행연결(INTERSECT, INTERSECT ALL)  (1) 2025.01.31
SQL 5장 실습문제  (1) 2025.01.23
SQL 명령어 우선순위  (0) 2025.01.23
SQL GROUP BY, HAVING  (0) 2025.01.23
SQL 4장 실습문제  (0) 2025.01.20