JPA/JPQL

[JPA] 서브쿼리 ( SubQuery )

IT록흐 2023. 6. 14. 20:30
반응형

 

SELECT [ 컬럼 ] FROM [ 테이블 ] WHERE [ 조건문 ]

 

SELECT문은 FROM 레코드집합에서 WHERE 조건으로 필터링 된 레코드 중 원하는 컬럼을 출력한다. 만약 다른 테이블의 데이터가 필요하면 JOIN 연산을 사용한다. JOIN연산으로 다른 테이블의 데이터에 접근 가능하다.  말그대로 '데이터'에 접근이 가능하다. 예를들어, 학생 테이블을 조회하는데 수학성적이 필요하면 수학테이블에 접근하여 학생의 수학점수(데이터)를 가져 올 수 있다. 

 

JPQL 코드 

SELECT s, m
FROM Student s
JOIN s.math m ON s.student_id = m.student_id

 

그런데 만약 '데이터'가 아니라 '정보'가 필요하다면 어떻게 할까?

데이터가 아니라 가공된 정보가 필요할 수 있다. 수학점수가 아니라 수학평균점수가 필요할 수 있다.

 

이때 필요한 것이 서브쿼리(SubQuery)이다. 

 

SELECT s
FROM students s
JOIN s.math m ON s.student_id = m.student_id
WHERE m.score > (SELECT AVG(m2.score) FROM Math m2);

 

AVG, COUNT,SUM,MAX 등등 SELECT문이 만드는 정보를 이용할 수 있다. 

 

서브쿼리 ( SubQuery )

 

 

 

 

서브쿼리의 장점은 하나의 레코드가 아니라 다수의 레코드를 토대로 생성된 정보를 추출할 수 있다는 점이다. 여기서 더 유의미한 정보를 얻을 수 있도록 서브쿼리를 지원하는 함수도 있다. 

 

[NOT] EXISTS ( SubQuery )

SELECT m 
FROM Member m 
WHERE EXISTS ( SELECT t FROM m.team t WHERE t.name = '드림팀')

소속된 팀이름이 드림팀인 회원을 조회하는 SELECT문이다.

 

ALL|ANY ( SubQuery )

SELECT o 
FROM Order o 
WHERE o.orderAmount > ALL( SELECT p.stockAmount FROM Product p )

주문 중에서 주문량이 모든 상품의 재고량보다 많은 주문을 조회하는 SELECT문이다.

 

SELECT m 
FROM Member m 
WHERE m.team = ANY( SELECT t FROM Team t )

어느 팀이든 소속된 회원을 조회하는 SELECT 문이다. 

 

[NOT] IN ( SubQuery )

SELECT s
FROM Student s
WHERE s.mathScore IN (SELECT m FROM MathScore m WHERE m.score > 90);

수학성적이 90점이상인 학생을 조회하는 SELECT문이다. 

 

 

 


 

 

참고자료

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런

www.inflearn.com

 

반응형

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

[JPA] 묵시적 조인보다는 명시적 조인  (0) 2023.06.15
[JPA] 쿼리결과 변환하기 ( JPQL 함수 )  (0) 2023.06.14
[JPA] JOIN 과 JOIN FETCH의 차이  (0) 2023.06.14
[JPA] 페이징 API  (0) 2023.06.13
[JPA] JPQL이란?  (0) 2023.06.13