Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...


SQLJPA
<WHERE 44 < agefindByAgeGreaterThan(int age);
<=WHERE 44 <= agefindByAgeGreaterThanEqual(int age);
>WHERE age < 44findByAgeLessThan(int age);
범위WHERE age BEETWEEN 10 and 20findByAgeBetween(int low,int high);
부분범위WHERE age in ( 34,35,36)findByAgeIn(int age[]);
ANDWHERE 40 < age AND sex='남'findByAgeGreaterThanAndSex(int age,String sex);
ORWHERE 40 < age OR sex='여'findByAgeGreaterThanOrSex(int age,String sex);


GROUP BY

draw.io Diagram
bordertrue
viewerToolbartrue
fitWindowfalse
diagramNamegroupby2
simpleViewerfalse
width
diagramWidth271
revision2

Group By를 이용하면, 데이터를 이쁘게 조각낼수가 있으며

이 조각을 그룹이라고 부릅니다.  이렇게 했을때 이점은

다양한 함수를 이용하여, 그룹별 집계처리가 가능합니다.

집계함수

함수용도함수용도
AVGMIN평균COUNTMAXSUM최대값
COUNT_BIGSTDEVROW수GROUPINGSUMSTDEVPGROUPING_IDVARCHECKSUM_AGGVARPMAX
MIN최소값






집계 DTO정의

Address데이터를 가지고  특정집계 수행을 한다고 하면 , ex> 성별에따른 회원수 라고 한다면

...

Code Block
languagejava
themeEmacs
title사용예
		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
bordertrue
viewerToolbartrue
fitWindowfalse
diagramNamesql_having1
simpleViewerfalse
width
diagramWidth418
revision1

지역별로 특정 나이 x 이상만을 대상으로 평균나이를 구하되,

...

y조건은, 계산된 그룹집합에서 다시, 제거 조건을 걸어야하기때문에 having절에 추가합니다.

JPA에서 인자값 전달시 Type을 명시적으로 매칭시켜야하며 , 함수의 인자값이

having조건이 AVG(age) > 49 이상으로 하였다고 하면, 평균나이가 40인 경기지역의 그룹은 버려지게됩니다.

성능관점으로본다고 하면, 해당 평균을 구한후 버릴지 여부가 판단되기 때문에 , 각 Row별로 계산은 수행되지만

havaing의 경우 마지막 아웃풋으로 나오기 직전 필터가 작동됨을 의미합니다Param("minage") => :minage  , SQL문으로 전달될수 있음을 알게되었습니다.

SQLJPA

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(
@Param("minage") int minage,
@Param("filterage") double filterage
)

...