> For the complete documentation index, see [llms.txt](https://heunnajo.gitbook.io/jpa-basic/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://heunnajo.gitbook.io/jpa-basic/10.-1/undefined-3.md).

# 서브 쿼리

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

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

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

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

서브 쿼리 지원 함수

* \[NOT] **EXISTS** (subquery): 서브쿼리에 결과가 존재하면 참\
  {ALL | ANY | SOME} (subquery)
* ```sql
  select m from Member m 
  where exists (select t from m.team t where t.name = ‘팀A')
  ```
* **ALL** 모두 만족하면 참

  **ANY, SOME**: 같은 의미, 조건을 하나라도 만족하면 참
* ```sql
  select o from Order o  
  where o.orderAmount > ALL (select p.stockAmount from Product p)
  ```
* * ```sql
    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 절의 서브쿼리는 그 안에서 결과가 다 필터링이 된다. 애플리케이션에서 조작 및 처리하는 식으로 한다고 함.\
  또는 쿼리를 분해해서 날린다. 본 쿼리 결과 + 서브 쿼리 결과를 조합해서 애플리케이션에서 조합하는 형식으로 처리하기도 함.\
  \=>이 또한 서브쿼리에서 넘기는 데이터가 크다면 불가능. 통계성 쿼리라면 네이티브로 작성.\
  하지만 이러한 경우에도 네이티브 쓰지 않는다고 함!&#x20;

  그 이유는,

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

![from 절의 서브쿼리 사용 불가](https://1863485745-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MeTGDBevaFvc3bwqqht%2F-Mej0qnFZfytqq_3SfZn%2F-Mej1YW6_mFufBQOi7s4%2Ffrom%20%E1%84%8C%E1%85%A5%E1%86%AF%E1%84%8B%E1%85%B4%20%E1%84%89%E1%85%A5%E1%84%87%E1%85%B3%E1%84%8F%E1%85%AF%E1%84%85%E1%85%B5%20%E1%84%89%E1%85%A1%E1%84%8B%E1%85%AD%E1%86%BC%20%E1%84%87%E1%85%AE%E1%86%AF%E1%84%80%E1%85%A1.png?alt=media\&token=815effea-2c8a-4994-9330-71a5f8af14c0)
