개발/기타
nullable한 값을 반환하는 집계함수
hamcheeseburger
2022. 10. 14. 11:12
학습 주제
- Mysql 집계함수 중 null을 반환하는 것들
학습 동기
- 팀원들이랑 페어 프로그래밍 중, AVG 키워드가 null을 반환하여 primitive 타입에 바인딩이 되지 않는 문제가 발생했다.
학습 내용
MySql 집계함수
COUNT
- 데이터 행의 개수를 추출하는 키워드
- NULL 이 반환되지 않음
public class Keyboard {
// ...
@Formula("(SELECT COUNT(1) FROM review r WHERE r.product_id = id)")
private int reviewCount;
}
@Test
void COUNT_키워드는_NULL을_반환하지_않는다() {
// given
Keyboard keyboard = 키보드_저장("키보드1", "이미지 URL");
entityManager.flush();
entityManager.refresh(keyboard);
// when
final Keyboard savedKeyboard = keyboardRepository.findById(keyboard.getId())
.orElseThrow(IllegalArgumentException::new);
// then
assertThat(savedKeyboard.getReviewCount()).isEqualTo(0);
}
AVG
- 데이터 특정 값들의 평균을 추출하는 키워드
- NULL이 반환될 수 있음
public class Keyboard {
// ...
@Formula("(SELECT AVG(r.rating) FROM review r WHERE r.product_id = id)")
private Double rating;
}
@Test
void AVG_키워드는_NULL을_반환한다() {
// given
Keyboard keyboard = 키보드_저장("키보드1", "이미지 URL");
entityManager.flush();
entityManager.refresh(keyboard);
// when
final Keyboard savedKeyboard = keyboardRepository.findById(keyboard.getId())
.orElseThrow(IllegalArgumentException::new);
// then
assertThat(savedKeyboard.getRating()).isEqualTo(null);
}
MIN
- 데이터 특정 값들의 최소값을 추출하는 키워드
- NULL 이 반환될 수 있음
public class Keyboard {
// ..
@Formula("(SELECT MIN(r.rating) FROM review r WHERE r.product_id = id)")
private Integer minimumRating;
}
@Test
void MIN_키워드는_NULL을_반환한다() {
// given
Keyboard keyboard = 키보드_저장("키보드1", "이미지 URL");
entityManager.flush();
entityManager.refresh(keyboard);
// when
final Keyboard savedKeyboard = keyboardRepository.findById(keyboard.getId())
.orElseThrow(IllegalArgumentException::new);
// then
assertThat(savedKeyboard.getMinimumRating()).isEqualTo(null);
}
MAX
- 데이터 특정 값들의 최대값을 추출하는 키워드
- NULL 이 반환될 수 있음
public class Keyboard {
// ..
@Formula("(SELECT MAX(r.rating) FROM review r WHERE r.product_id = id)")
private Integer maximumRating;
}
@Test
void MAX_키워드는_NULL을_반환한다() {
// given
Keyboard keyboard = 키보드_저장("키보드1", "이미지 URL");
entityManager.flush();
entityManager.refresh(keyboard);
// when
final Keyboard savedKeyboard = keyboardRepository.findById(keyboard.getId())
.orElseThrow(IllegalArgumentException::new);
// then
assertThat(savedKeyboard.getMaximumRating()).isEqualTo(null);
}
SUM
- 데이터 특정 값들의 합을 추출하는 키워드
- NULL 이 반환될 수 있음
public class Keyboard {
// ..
@Formula("(SELECT SUM(r.rating) FROM review r WHERE r.product_id = id)")
private Integer sumRating;
}
@Test
void SUM_키워드는_NULL을_반환한다() {
// given
Keyboard keyboard = 키보드_저장("키보드1", "이미지 URL");
entityManager.flush();
entityManager.refresh(keyboard);
// when
final Keyboard savedKeyboard = keyboardRepository.findById(keyboard.getId())
.orElseThrow(IllegalArgumentException::new);
// then
assertThat(savedKeyboard.getSumRating()).isEqualTo(null);
}
결론
- COUNT 를 제외한 집계함수들은 NULL 이 반환될 수 있다.
- NULL 이 반환될 수 있는 집계함수에서 primitive로 받고 싶다면 IFNULL 키워드를 사용할 수 있다.