학습 주제
- 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 키워드를 사용할 수 있다.
'개발 > 기타' 카테고리의 다른 글
Mockito verify()에서 파라미터 까지 검증하고 싶은 경우 (4) | 2024.05.29 |
---|---|
Ubuntu 서버에 Docker로 스프링부트 Jar 배포 (feat Redis) (0) | 2022.01.06 |
[erwin] forward engineering (0) | 2021.07.02 |
[Maven/JSP/파이썬] 파이썬 Client에서 JSP Server로의 파일 데이터 전송(feat. MultipartRequest) (0) | 2021.03.27 |
aws 우분투 리눅스 tomcat9 서버에 war 파일 배포하기 (0) | 2021.01.22 |
이전 댓글