평소 SQL 코테 문제를 풀 때, Join을 이용해서 푸는 편이다.
하지만, 최근 얼떨결에 서브쿼리로 문제를 풀었고, Join과 Sub Query의 정확한 차이가 무엇인지 의문이 들었다. 본 포스트에서는 그 차이를 알고자 한다.
* 조인과 서브쿼리의 자세한 설명은 본 포스트에서는 생략한다.
테이블 CAR
id | name | companyId |
---|---|---|
1 | 레이 | 1 |
2 | K3 | 1 |
3 | K5 | 1 |
4 | 아반떼 | 2 |
5 | 토레스 | 3 |
6 | 쏘나타 | 2 |
테이블 COMPANY
id | name | members |
---|---|---|
1 | 기아 | 30 |
2 | 현대 | 40 |
3 | 쌍용 | 20 |
조인은 2개 이상의 테이블을 연결하고 연결한 테이블에서 필요한 컬럼을 조회한다. 여러 개의 쿼리를 필요로 하지 않는다.
left, right, inner, outer, cross
에 따라 출력 데이터, Null 기준을 정할 수 있다.
SELECT c.name
FROM car c
(INNER) JOIN company cp
ON c.companyId = cp.id
WHERE cp.members >= 40;
결과
name |
---|
아반떼 |
쏘나타 |
서브 쿼리는 메인 쿼리 내부에 다른 쿼리를 작성하는 쿼리이다.
SELECT c.name
FROM car c
where c.companyId IN (SELECT id
FROM company
WHERE members >= 40);
결과
name |
---|
아반떼 |
쏘나타 |
1) 문법
2) 데이터의 접근 방식
3) 성능
👉 위 같은 이유로 대부분의 경우, 서브쿼리가 아닌 조인을 사용하도록 하자!
하지만, 조인으로 대체할 수 없는 경우가 있기에 서브 쿼리 또한 필요하다.
1) 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 절에 있을 때
SELECT name
FROM product
WHERE cost < ( SELECT AVG(price) FROM sale ); -- 평균값을 반환하고 비교
3) 서브 쿼리가 ALL 연산자에 있을 때
SELECT name
FROM product
WHERE cost > ALL(SELECT price FROM sale);