Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
Tags
- Algorithm
- Graph
- buffer
- 이스케이프 문자
- 혼자 공부하는 C언어
- datastructure
- Serialization
- coding test
- R
- Selection Sorting
- JSON
- stream
- insertion sort
- C 언어 코딩 도장
- 알기쉬운 알고리즘
- ㅅ
- 이것이 자바다
- 윤성우의 열혈 자료구조
- list 컬렉션
- Stack
- s
- 윤성우 열혈자료구조
- 메모리구조
- C programming
Archives
- Today
- Total
Engineering Note
[Database] JOIN과 EXIST 차이 본문
1.JOIN과 EXIST 차이
JOIN의 핵심: "조건에 맞는 테이블을 이어준다."
EXISTS의 핵심: "데이터를 합치지 않는다"
보통 JOIN은 두 테이블을 가로로 이어 붙여서 커다란 종이를 만드는 작업입니다. 하지만 EXISTS는 메인 테이블을 한 줄씩 읽으면서, 서브쿼리에 물어만 보는 방식입니다.
예시
검색 조건 필터링에 따라 상품을 조회하는 동적쿼리
@Override
public Page<Item> findBySearchOption(ItemSearchDto itemSearchDto, Pageable pageable) {
// 1. 메인 쿼리 데이터 조회
List<Item> content =
jpaQueryFactory
.selectFrom(item)
.where(
itemNameStartsWith(itemSearchDto.getItemName()),
categoryFilter(itemSearchDto.getCategoryId()), //서브쿼리
isSellOrSoldOut(ItemSellStatus.SELL))
.offset(pageable.getOffset())
.limit(pageable.getPageSize())
.orderBy(item.regTime.desc())
.fetch();
return PageableExecutionUtils.getPage(content, pageable);
}
// 카테고리 필터링 조건 (서브쿼리)
private BooleanExpression categoryFilter(Long categoryId) {
if (categoryId == null) {
return null;
}
return JPAExpressions.selectFrom(itemCategory)
.where(
itemCategory
.item
.eq(item) // 외부 쿼리의 item과 연결
.and(itemCategory.category.id.eq(categoryId)))
.exists();
}
시나리오: 101번 상품이 '가전' 카테고리인지 확인하기
- 메인 쿼리: Item 테이블에서 첫 번째 줄(101번 냉장고)을 딱 집습니다.
- 질문 던지기: "야, ItemCategory 테이블! 너네 데이터 중에 item_id가 101이면서 category_id가 **'가전'**인 줄이 하나라도 있어?"
- 답변 받기:
- Yes! (한 줄이라도 찾으면 즉시 중단): 메인 쿼리는 101번 냉장고를 결과창에 포함시킵니다.
- No!: 101번 냉장고를 결과창에서 버립니다.
- 다음 줄로: 이제 102번 상품을 집고 똑같은 짓을 반복합니다.
2. EXISTS가 성능상 유리한 이유: "Short-Circuit"
JOIN은 조건에 맞는 모든 데이터를 다 찾아내서 합쳐야 합니다. 하지만 EXISTS는 아주 영리합니다.
"하나라도 찾으면 그 즉시 탐색을 종료한다."
예를 들어, 어떤 상품이 카테고리를 100개 가지고 있다고 해도, EXISTS는 첫 번째 카테고리만 확인하는 순간 "어, 있네! 통과!" 하고 바로 다음 상품으로 넘어갑니다. 100개를 다 뒤질 필요가 없죠.
3. JOIN vs EXISTS 결과의 차이 (중복 문제)
이게 가장 실무적으로 중요한 차이입니다.
- JOIN: Item(1) + Category(3개) = 결과 3줄 (상품이 중복되어 보임)
- EXISTS: Item(1)이 조건에 맞으면 = 결과 딱 1줄 (상품 엔티티 그 자체를 유지)
'Computer Science > Database' 카테고리의 다른 글
| [Database] MySQL 격리수준과 격리성 문제 용어정리 (0) | 2026.01.24 |
|---|---|
| [Database] 제약조건 공부, 유니크(복합 유니크) (0) | 2026.01.08 |
| [Database] 트랜잭션과 잠금(MySQL) (0) | 2026.01.01 |
| [Database] 중간테이블은 정규화의 결과다. 확장성은 덤. (0) | 2026.01.01 |
| [Database] 외래키(Foreign Key) (0) | 2025.12.26 |
Comments