서브 쿼리

일반적인 SQL 서브쿼리. 상위 쿼리의 Member m은 하위 where절에 없다! m2라고 새로 정의한 것을 사용하고 있다! =>메인 쿼리와 서브쿼리가 관계가 없다! 보통 이런 식으로 서브 쿼리를 작성해야 성능이 잘 나온다!

  • 나이가 평균보다 많은 회원

    select m from Member m

    where m.age > (select avg(m2.age) from Member m2)
  • 한건이라도주문한고객

    select m from Member m

    where (select count(o) from Order o where m = o.member) > 0

서브 쿼리 지원 함수

  • [NOT] EXISTS (subquery): 서브쿼리에 결과가 존재하면 참 {ALL | ANY | SOME} (subquery)

  • select m from Member m

    where exists (select t from m.team t where t.name = ‘팀A')
  • ALL 모두 만족하면 참

    ANY, SOME: 같은 의미, 조건을 하나라도 만족하면 참

  • select o from Order o 

    where o.orderAmount > ALL (select p.stockAmount from Product p)
    • select m from Member m 

      where m.team = ANY (select t from Team t)
  • [NOT] IN (subquery): 서브쿼리의 결과 중 하나라도 같은 것이 있으면

JPA 서브 쿼리 한계

  • JPA는 WHERE, HAVING 절에서만 서브 쿼리 사용 가능

  • SELECT 절도 가능(하이버네이트에서 지원)

  • FROM 절의 서브 쿼리는 현재 JPQL에서 불가능 =>조인으로 풀 수 있으면 풀어서 해결 그래도 안된다면 보통 from 절의 서브쿼리는 그 안에서 결과가 다 필터링이 된다. 애플리케이션에서 조작 및 처리하는 식으로 한다고 함. 또는 쿼리를 분해해서 날린다. 본 쿼리 결과 + 서브 쿼리 결과를 조합해서 애플리케이션에서 조합하는 형식으로 처리하기도 함. =>이 또한 서브쿼리에서 넘기는 데이터가 크다면 불가능. 통계성 쿼리라면 네이티브로 작성. 하지만 이러한 경우에도 네이티브 쓰지 않는다고 함!

    그 이유는,

    다 그런 건 아니지만 from 절의 서브 쿼리로 데이터를 여러 개 가져온 다음 안에서는 데이터를 줄이는 일만 하고 데이터 밖에서는 데이터 타입을 변경하거나 SQL에서 로직이 있는 경우(Vue에 대한 로직/Vue가 원하는 형식으로 데이터 변환 등) =>JPA를 쓴다면 이러한 작업들은 애플리케이션에서 한다! 그러면 from 절의 서브쿼리가 줄어들기도 한다!

Last updated