Database

[MySQL] SubQuery - 스칼라 서브 쿼리

비번변경 2022. 12. 7. 16:42

SubQuery

서브 쿼리란 다른 쿼리 내에 포함되어 있는 SELECT 쿼리문을 의미한다.

서브쿼리를 포함하고 있는 쿼리를 외부 쿼리, 부모 쿼리, 메인 쿼리라고 부르고 서브 쿼리를 내부 쿼리, 자식 쿼리라고 부른다. 서브 쿼리는 괄호로 감싸서 표현된다.

 

예시 )

SELECT name, height 
FROM userTbl
WHERE height > (SELECT height 
                FROM userTbl 
                WHERE name in ('김경호')
                );

서브쿼리에서는 메인 쿼리의 컬럼을 사용할 수 있지만, 메인 쿼리에서는 서브 쿼리의 컬럼을 사용할 수 없다.

 

 

서브 쿼리 장점

  • 쿼리를 구조화하여, 쿼리의 부분을 명확히 구분할 수 있다.
  • 복잡한 JOIN, UNION과 같은 동작을 수행할 수 있는 방법을 제공한다.
  • 복잡한 JOIN, UNION보다 가독성이 좋다.

 

조건

SELECT문으로만 사용할 수 있다.

  • 괄호 내에 존재해야 한다.
  • 괄호가 끝나고 세미콜론을 쓰지 않는다.
  • ORDER BY를 사용할 수 없다.

 

서브쿼리 위치에 따른 이름

SELECT col1, (SELECT ...) -- 스칼라 서브쿼리(Scalar SubQuery): 하나의 컬럼처럼 사용 (표현)
FROM (SELECT ...)         -- 인라인 뷰(Inline View): 하나의 테이블처럼 사용 (테이블 대체)
WHERE col = (SELECT ...)  -- 일반 서브쿼리: 하나의 변수(상수)처럼 사용 (서브쿼리의 결과에 따라 달라지는 조건절)

 

서브 쿼리는 SELECT, FROM, WHERE절 이외에도 HAVING ORDER BY, INSERT VALUES, UPDATE SET 구문에서 사용할 수 있다.

 

이 글에서는 SELECT문에 위치한 서브 쿼리인 스칼라 서브 쿼리에 대해 정리하려고 한다.

 

 

Scalar SubQuery

SELECT절에 위치한 서브쿼리로 테이블에서 값을 가져올 때 사용한다. Scalar는 '한 번에 한 가지만 처리하는'이라는 뜻을 가지고 있으며 하나의 행만 반환해야 한다.

SELECT D.DEPTNO, 
       (SELECT MIN(EMPNO) FROM EMP WHERE DEPTNO = D.DEPTNO) as EMPNO 
FROM DEPT D 
ORDER BY D.DEPTNO

 

특징

  • 최대 메인쿼리의 결과 건 수만큼 반복 실행된다.
  • 동일한 input에 대한 결괏값은 캐싱하여 반환하기 때문에 최초 1회는 스칼라 서브 쿼리가 직접 수행되지만, 그 이후에 동일한 값에 대해서는 실행되지 않고 스킵한다.
  • 결괏값은 1건이거나 NULL이어야 한다.

 

 

참고 문서

[MYSQL] 📚 서브쿼리 개념 & 문법 💯 정리

[SQL] 스칼라란 무엇인가 그리고 성능 및 성능 문제 간단한 해결방안

https://kimdubi.github.io/mysql/subquery_tuning/