조건분기/집합연산/윈도우함수/갱신
조건분기
SQL의 조건 분기는 특수한 값을 반환합니다.
SELECT name,address,
CASE WHEN address = '서울' THEN '경기'
WHEN address = '창원' THEN '경남'
ELSE 'NA'
END AS district
FROM Address;
위 코드는 기존 데이터를 교환하여 표현했다 라고 말할수 있습니다. 물론 기존 데이터를 수정한다란 의미는 아닙니다.
그러면, 위와같은 코드처리를 JPA에서는 어떻게 할까요?
@Entity
public class Address {
@Id
@GeneratedValue
@Column(name = "ADDRESS_ID")
private Integer id;
private String name;
private String address;
//Customer Property ( NotAccess DB)
public String getDistrict() {
String result="NA";
switch(address) {
case "서울": result = "경기";
break;
case "창원": result = "경남";
break;
}
return result;
}
//Setter,Getter 생략
}
이와 같은 단순 교환식은 JPA의Entity의 Get 퍼로퍼티 정의를 통해 기존 데이터 변환이 가능합니다.
DB를 접근하지 않는 getProperty는 우선, write할 멤버가 없기때문에 상태를 보관할 멤버변수가 없어도 되며
주석으로 구분하여 DB를 접근하지 않는 퍼로퍼티로 공간 분리를 합니다.
이렇게 사용했을 때 장점은 다음과 같습니다.
- district를 얻기위해 , 데이터베이스에게 일을 시키지 않습니다. 어플리케이션이 분산해서 연산할수 있음을 의미합니다.
- 조회가 100개가되었다고 해서, getDistrict() 를 호출하지 않으면(사용하는곳이없으면), 어플리케이션내에서 변환 연산조차 발생하지 않습니다.
- 다양한 자바 함수사용이 가능합니다.
위와같이 변환할수있다고 하더라도, SQL문의 CASE문은 여러요소에사용되는 식이기때문에,
모든 케이스에서 JAVA의 CASE문으로 변환할수 있다란 의미는 아닙니다. - 식과 문장의차이
이것은 단지 데이터베이스의 Entity모델내에, 자연스럽게 기존값을 특수변환 처리를 하는 로직을 이질성없이 결합할수 있다란것이며
SQL에서 조건문처리는 JAVA의 CASE문과 작동방식은 동일하지만 아주 큰차이가 있습니다.
SQL문에서 CASE는 식입니다. SQL문은 절차식 언어가 아니기때문에 반환값이 항상있으며 다양한 요소에 결합이 될수 있습니다.
JAVA에서 CASE는 문장입니다. 문장의 중간에 포함될수 있으며 절차식 흐름을 변경만하고 값자체를 반환하지는 않습니다.
절차식에 익숙해져 있다고하면 SQL에서는 성능좋은식을 만들기가 어렵습니다.
어플리케이션 내에서도 람다식을 활용하여 리스트와같은 데이터를 필터처리한다면 SQL과 비슷한 사고방식으로 데이터가공처리가 될것입니다.
집한연산
UNION
단일 테이블내의 WHERE 구에서 합집합을 OR,교집합을 AND가 담당하였습니다.
두 테이블의 합집합을 구할때는 UNION을 연산자를 사용합니다.