본문 바로가기
Study/JPA

조인과 서브쿼리

by _비니_ 2024. 7. 27.

 

📌 조인

 

  • 내부 조인
    • SELECT m FROM Member m [INNER] JOIN m.team t
    • inner는 생략 가능
  • 외부 조인
    • SELECT m FROM Member m LEFT [OUTER] JOIN m.team t
    • null값도 나옴 → 만약 team의 null값도 명시적으로 표현해줘야할 때 사용
    • outer는 생략 가능
  • 세타 조인
    • select count(m) from Member m, Team t where m.username = t.name
    • 막 조인
    • 연관관계 테이블도 조인. 카테시안 곱으로 모두 불러와 조회

📌 조인 - ON 절

  • ON절을 활용한 조인(JPA 2.1부터 지원)

1. 조인 대상 필터링

  • 회원과 팀을 조인하면서, 팀 이름이 A인 팀만 조인
//JPQL
SELECT m, t FROM Member m LEFT JOIN m.team t on t.name = 'A' 

//SQL
SELECT m.*, t.* FROM
Member m LEFT JOIN Team t ON m.TEAM_ID=t.id and t.name='A'

 

2. 연관관계 없는 엔티티 외부 조인(하이버네이트 5.1부터)

 **원래는 연관관계 없는 엔티티는 내부조인만 가능했었음.

  • 회원의 이름과 팀의 이름이 같은 대상 외부 조인
//JPQL
SELECT m, t FROM
Member m LEFT JOIN Team t on m.username = t.name 

//SQL
SELECT m.*, t.* FROM
Member m LEFT JOIN Team t ON m.username = t.name

 

 

📌 서브 쿼리

⇒ 쿼리 안에서 서브로 또 쿼리를 만드는 것.

 

EX )

  • 나이가 평균보다 많은 회원
select m from Member m
where m.age > (select avg(m2.age) from Member m2)
  • 메인쿼리 m을 서브쿼리에서 사용X (m2만 사용하고 있음) ⇒ 성능🔺

 

  • 한 건이라도 주문한 고객
select m from Member m
where (select count(o) from Order o where m = o.member) > 0
  • 메인쿼리 m을 서브쿼리에서 사용O ⇒ 성능🔻

 

⇒ SQL과 동일함. SQL에서 지원하는 서브쿼리가 가능하다!!

 

📌 서브 쿼리 지원 함수

  • [NOT] EXISTS (subquery): 서브쿼리에 결과가 존재하면 참
    • {ALL | ANY | SOME} (subquery)
    • ALL 모두 만족하면 참
    • ANY, SOME: 같은 의미, 조건을 하나라도 만족하면 참
//팀A 소속인 회원 (결과가 존재하면 참)
select m from Member m
where exists (select t from m.team t where t.name = ‘팀A')

//전체 상품 각각의 재고보다 주문량이 많은 주문들 (모두 만족하면 참)
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에서 불가능🌟
    • 조인으로 풀 수 있으면 풀어서 해결🌟
    • 그 외에도 .. (거의 안씀)
      • 쿼리 두 번 날려 해결?
      • native query
      • 애플리케이션에서 조작?

📝 하이버네이트6 부터는 FROM 절의 서브쿼리를 지원 🌟🌟🌟

반응형

'Study > JPA' 카테고리의 다른 글

객체지향 쿼리 언어) JPQL - 경로 표현식  (0) 2024.07.30
JPQL  (0) 2024.07.27
프로젝션과 페이징  (0) 2024.07.27
객체지향 쿼리 언어 소개  (0) 2024.07.27
값 타입 2  (0) 2024.07.27