평소 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);
This article is a valuable resource for learning SQL or preparing for coding tests, as it allows readers to immediately understand the differences and Retro Bowl 26 when to use them by reading the SQL code.