[DB] 조인과 서브쿼리의 차이점

김진회·2023년 2월 16일
0

DB

목록 보기
8/8

0. 개요

평소 SQL 코테 문제를 풀 때, Join을 이용해서 푸는 편이다.
하지만, 최근 얼떨결에 서브쿼리로 문제를 풀었고, Join과 Sub Query의 정확한 차이가 무엇인지 의문이 들었다. 본 포스트에서는 그 차이를 알고자 한다.
* 조인과 서브쿼리의 자세한 설명은 본 포스트에서는 생략한다.

테이블 CAR

idnamecompanyId
1레이1
2K31
3K51
4아반떼2
5토레스3
6쏘나타2

테이블 COMPANY

idnamemembers
1기아30
2현대40
3쌍용20

1. Join

조인은 2개 이상의 테이블을 연결하고 연결한 테이블에서 필요한 컬럼을 조회한다. 여러 개의 쿼리를 필요로 하지 않는다.
left, right, inner, outer, cross에 따라 출력 데이터, Null 기준을 정할 수 있다.

회원수가 40 이상인 회사의 자동차의 이름 출력

SELECT c.name
FROM car c
(INNER) JOIN company cp
ON c.companyId = cp.id
WHERE cp.members >= 40;

결과

name
아반떼
쏘나타

2. Sub Query

서브 쿼리는 메인 쿼리 내부에 다른 쿼리를 작성하는 쿼리이다.

회원수가 40 이상인 회사의 자동차의 이름 출력

SELECT c.name
FROM car c
where c.companyId IN (SELECT id 
	FROM company 
    WHERE members >= 40);

결과

name
아반떼
쏘나타

3. 차이점

1) 문법

  • 서브쿼리는 여러 계층에 걸쳐 만들어 지면서 가독성이 나쁜 편이다.

2) 데이터의 접근 방식

  • 서브쿼리는 테이블 형태의 결과 값을 만들어 내지만, 실제 데이터를 저장하지 않는다.
  • 조인은 DB 딕셔너리에 새로운 테이블이 저장된다.

3) 성능

  • 서브 쿼리의 성능은 조인에 비해 매우 좋지 않다.
  • 이 때문에, 최신 MySQL은 서브쿼리를 자동으로 조인문으로 변환을 해준다.
  • MySQL 5.5 까지는 서브쿼리 최적화가 되지 않아, 메인 테이블의 row 수만큼 서브 쿼리를 반복 수행했다. 하지만, 5.6버전 부터는 최적화되었지만 적용 안되는 조건들이 일부 존재한다.

👉 위 같은 이유로 대부분의 경우, 서브쿼리가 아닌 조인을 사용하도록 하자!


4. 조인으로 대체할 수 없는 경우

하지만, 조인으로 대체할 수 없는 경우가 있기에 서브 쿼리 또한 필요하다.

1) GROUP BY 를 사용한 서브 쿼리가 FROM 절에 있을 때

  • 집계된 값들을 구하고자 GROUP BY 를 사용한 서브 쿼리가 FROM 절에 들어 있을 때 (스칼라 서브쿼리) 조인으로 변환이 불가능하다.
    SELECT city, sum_price
    FROM
    ( 
      SELECT city, SUM(price) AS sum_price 
      FROM sale
      GROUP BY city -- group by 를 쓴 스칼라 서브쿼리
    ) AS s
    WHERE sum_price < 2100;

2) 집계된 값을 반환하는 서브 쿼리가 WHERE 절에 있을 때

  • 서브 쿼리가 집계된 하나의 값을 반환하고 그 값을 WHERE 절에서 외부 쿼리의 값과 비교할 때 변환이 불가능하다.
    SELECT name
    		FROM product
    		WHERE cost < ( SELECT AVG(price) FROM sale ); -- 평균값을 반환하고 비교

3) 서브 쿼리가 ALL 연산자에 있을 때

  • 서브쿼리를 IN 이나 EXISTS 연산자를 사용할 경우 변환이 가능했지만, 서브 쿼리가 ALL 연산자 안에 들어 있는 경우 변환이 불가능하다.
    SELECT name
    FROM product
    WHERE cost > ALL(SELECT price FROM sale);

Reference

https://inpa.tistory.com
https://jojoldu.tistory.com/520

profile
SSAFY 7기. HMG. 협업, 소통, 사용자중심

0개의 댓글