Page History
...
SQL | JPA | |
---|---|---|
< | WHERE 44 < age | findByAgeGreaterThan(int age); |
<= | WHERE 44 <= age | findByAgeGreaterThanEqual(int age); |
> | WHERE age < 44 | findByAgeLessThan(int age); |
범위 | WHERE age BEETWEEN 10 and 20 | findByAgeBetween(int low,int high); |
부분범위 | WHERE age in ( 34,35,36) | findByAgeIn(int age[]); |
AND | WHERE 40 < age AND sex='남' | findByAgeGreaterThanAndSex(int age,String sex); |
OR | WHERE 40 < age OR sex='여' | findByAgeGreaterThanOrSex(int age,String sex); |
GROUP BY
draw.io Diagram | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
Group By를 이용하면, 데이터를 이쁘게 조각낼수가 있으며
이 조각을 그룹이라고 부릅니다. 이렇게 했을때 이점은
다양한 함수를 이용하여, 그룹별 집계처리가 가능합니다.
집계함수
함수 | 용도 | 함수 | 용도 | |||||
---|---|---|---|---|---|---|---|---|
AVG | MIN평균 | COUNTMAX | SUM최대값 | |||||
COUNT_BIG | STDEVROW수 | GROUPINGSUM | STDEVP합 | GROUPING_ID | VAR | CHECKSUM_AGG | VARP | MAX |
MIN | 최소값 | |||||||
집계 DTO정의
Address데이터를 가지고 특정집계 수행을 한다고 하면 , ex> 성별에따른 회원수 라고 한다면
...
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
List<AddressStatistics> addressStaticBySex = addressRepo.findSexCount(); addressStaticBySex.forEach(item -> { String itemString = String.format("%s %d", item.getFname(), item.getCnt()); System.out.println(itemString); }); |
HAVING 절
draw.io Diagram | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
지역별로 특정 나이 x 이상만을 대상으로 평균나이를 구하되,
...
y조건은, 계산된 그룹집합에서 다시, 제거 조건을 걸어야하기때문에 having절에 추가합니다.
JPA에서 인자값 전달시 Type을 명시적으로 매칭시켜야하며 , 함수의 인자값이
having조건이 AVG(age) > 49 이상으로 하였다고 하면, 평균나이가 40인 경기지역의 그룹은 버려지게됩니다.
성능관점으로본다고 하면, 해당 평균을 구한후 버릴지 여부가 판단되기 때문에 , 각 Row별로 계산은 수행되지만
havaing의 경우 마지막 아웃풋으로 나오기 직전 필터가 작동됨을 의미합니다Param("minage") => :minage , SQL문으로 전달될수 있음을 알게되었습니다.
SQL | JPA |
---|---|
SELECT address,AVG(age) FROM db_example.address WHERE age > x GROUP BY address HAVING AVG(age) > y | @Query("select new com.example.demo.data.AddressStatistics(t.address,AVG(t.age)) from Address t where t.age > :minage GROUP BY t.address HAVING AVG(t.age) > :filterage ") List<AddressStatistics> findRegionAvgage( |
...