SQL 쿼리문을 작성하면서 고민해야하는 부분 중 하나는 서브쿼리와 조인 중 어떤 것을 사용할 것인지 판단하는 것이다. 상황에 따라 둘 중 더 적합한 것을 골라야하는 경우가 자주 있기 때문에 둘의 특징과 차이점을 비교하여 개념을 정리하고 실무에 사용할 수 있도록 정리해보고자 한다.
SUBQUERY와 JOIN은 모두 여러 개의 테이블로부터 데이터를 추출하기 위한 복잡한 쿼리문에 사용될 수 있다. 하지만 이 둘의 데이터를 추출하기 위한 접근방식은 상이하다. 둘 중 무엇을 사용해도 상관없는 경우도 있고 둘 중 하나만 사용해야하는 경우도 있다.
SUBQUERY는 복잡한 SQL 쿼리문에 많이 사용된다.
보통은 메인쿼리라고 불리는 외부쿼리가 있고, 외부쿼리 내에 다른 쿼리문, 즉 내부 쿼리가 있는 구조이다.
서브쿼리의 구조는 단순한 것부터 복잡한 것까지 다양하다. 간단한 구조의 서브쿼리의 경우 내부쿼리만으로도 충분히 쿼리가 실행 가능하여 내부쿼리가 외부쿼리에 의존하지 않지만 복잡한 구조의 서브쿼리의 경우 내부쿼리가 외부쿼리에 의존하여 내부쿼리만으로 쿼리가 실행이 어렵다.
JOIN의 경우 서브쿼리와 달리 여러 개의 쿼리가 불필요하다.
조인은 2개 이상의 테이블을 연결하고 연결한 테이블로부터 필요한 열을 조회할 수 있도록 하는 역할을 한다.
SUBQUERY란 쿼리 안에 또 다른 쿼리가 들어간 것을 의미한다.
상황에 따라 메인 쿼리의 FROM, WHERE, SELECT 절에 새로운 쿼리를 넣을 수 있다.
SELECT * , (SELECT dept_name FROM Departments d WHERE d.dept_id=e.dept_id)
FROM Employees e;
SELECT e.* , d.dept_name
FROM Employees e, (SELECT dept_id, dept_name FROM Departments d)
WHERE e.dept_id = d.dept_id;
SELECT e.*, d.dept_name
FROM Employees e, (SELECT dept_id, dept_name FROM Departments) d
WHERE e.dept_id = d.dept_id;
SELECT *
FROM Employees e
WHERE e.dept_id IN
(SELECT d.dept_id FROM Departments d WHERE dept_name IN ('개발','재무'));
SUBQUERY의 위치뿐만 아니라 반환값에 따라서도 종류를 나눌 수 있다.
이 중 스칼라 서브쿼리(Scalar Subquery)는 SELECT 절에서 사용하며 결과값을 1행 반환하는 서브쿼리를 의미한다. scalar는 한 번에 한 가지만 처리한다는 뜻을 가지고 있는데 하나의 행을 반환하는 스칼라 서브쿼리의 특성을 보여준다.
일반적으로 서브쿼리보다는 JOIN을 사용하는 것이 성능이 더 좋다고 한다.
하지만 서브쿼리가 조인에 비해 좀 더 직관적이라서 이해하기 쉽다는 장점을 가지고 있고 조인은 쿼리문이 복잡해지더라도 서브쿼리에 비해 값을 추출하기 용이할 때가 있다.
참고자료
mysql 서브쿼리 종류: 스칼라 서브쿼리, 인라인뷰, 서브쿼리
What Are the Different Types of SQL Subqueries?
SUBQUERY와 JOIN의 차이