DataBase/MsSql

MSSQL SubQuery 사용법 및 특징, SubQuery 예제

아우럼 2024. 4. 2. 19:00
반응형

SubQuery 문은 하나의 메인 SQL 문 안에 포함된 또 다른 종속된 관계하는 SQL 문을 SubQuery입니다.
이해를 돕기 위해서 이야기하면은 query 문 안에 쿼리문을 또 쓴다고 생각하면 됩니다.

SubQuery 특징

  • SubQuery는 동작 방식에 따라 비연관 SubQuery (Un-Correlated)와 연관 SubQuery (Correlated) 구분합니다.
  • SubQuery는 반환 값에 따라 단일 행 SubQuery, 다중 행 SubQuery, 다중 칼럼 SubQuery 분류합니다.
  • 반복적인 query를 수행해야만 얻을 수 있는 결과를 하나의 중첩된 SQL 문장으로 간편하게 자료를 추출할 수 있는 장점이 있습니다.
  • SELECT, FROM, WHERE, HAVING 및 JOIN 절에서 사용할 수 있습니다.
  • SQL 연산사 =, <, >, IN, NOT IN, EXIST, NOT EXIST 등 대부분의 비교 연산자와 함께 사용할 수 있습니다.
  • Join, INSERT 문의 VALUE, UPDATE 문의 SET, 집계 함수 및 GROUP BY을 포함한 SELECT 문에서도 사용할 수 있으며, SubQuery를 중첩해서도 사용할 수 있습니다.

SubQuery 사용법

SubQuery는 동작하는 방식에 따라 두 가지로 분류.

  • 비연관 SubQuery (Un-Correlated SubQuery)는 SubQuery가 MainQuery 칼럼을 가지고 있지 않은 형태의 SubQuery입니다.
--  비연관 서브쿼리 (Un-Correlated 서브 쿼리)
SELECT main.EmpID,main.EmpName,main.Title, main.DeptID
 FROM UserInfoForSubQuery main
 WHERE DeptID = (
              SELECT DeptID  
              FROM DeptInfoForSubQuery  sub
             where sub.DeptName = '마케팅팀'
);

  • 연관 SubQuery (Correlated SubQuery)는 SubQuery가 MainQuery 칼럼을 가지고 있는 형태의 SubQuery입니다. 일반적으로 MainQuery가 먼저 수행되어 읽힌 데이터를 SubQuery에서 조건을 넣어서 자료를 찾을 때 주로 사용합니다.
-- 연관 서브쿼리 (Correlated 서브 쿼리)
SELECT main.EmpID,main.EmpName,main.Title, main.DeptID
 FROM UserInfoForSubQuery main
 WHERE DeptID  =  (
    SELECT DeptID  
     FROM DeptInfoForSubQuery  sub
     where sub.DeptName = '마케팅팀'
       and sub.DeptID  = main.DeptID  
);

Un-Correlated SubQuery vs Correlated SubQuery 비교 예제 입니다.

반환되는 데이터의 형태로 분류.

단일 행 SubQuery (Single Row SubQuery).

  • SubQuery의 실행 결과가 항상 1건 이하인 형태입니다.
  • 결과 건수가 2건 이상을 반환하면 SQL 문은 실행 시간 오류가 발생합니다.
  • 이 SubQuery는 단일 행 비교 연산자(=, <, >, <=, >=, <>)와 함께 사용됩니다.
-- 단일 행 서브쿼리 (Single Row 서브쿼리)
SELECT main.EmpID,main.EmpName,main.Title, main.DeptID
  FROM UserInfoForSubQuery main
 WHERE DeptID >= (
	SELECT DeptID  
	 FROM DeptInfoForSubQuery  sub
  --  where sub.DeptName = '미국지점'
);

-- 단일 행 서브쿼리 (Single Row 서브쿼리)
SELECT main.EmpID,main.EmpName,main.Title, main.DeptID
  FROM UserInfoForSubQuery main
 WHERE DeptID >= (
	SELECT DeptID  
	 FROM DeptInfoForSubQuery  sub
    where sub.DeptName = '미국지점'
);

Single Row SubQuery 사용법 입니다.

다중 행 SubQuery (Multi Row SubQuery).

  • 여러 개의 행이 검색되는 쿼리문입니다.
  • SubQuery는 메인 쿼리와 상관없이 독립적으로 실행되며, 다중 행 비교 연산자(IN, ALL, ANY, SOME, EXISTS)와 함께 사용됩니다.
-- 다중 행 서브쿼리 (Multi Row 서브쿼리)
SELECT main.EmpID,main.EmpName,main.Title, main.DeptID
  FROM UserInfoForSubQuery main
 WHERE exists (
	SELECT DeptID  
	 FROM DeptInfoForSubQuery  sub
     where  sub.DeptID  = main.DeptID  
	   and sub.DeptName = '마케팅팀'
);

-- 다중 행 서브쿼리 (Multi Row 서브쿼리)
SELECT main.EmpID,main.EmpName,main.Title, main.DeptID
  FROM UserInfoForSubQuery main
 WHERE DeptID >= ANY (
	SELECT DeptID  
	 FROM DeptInfoForSubQuery  sub
    --  where sub.DeptName = '미국지점'
);

SubQuery 의 Single Row SubQuery, Multi Row SubQuery 비교 사용법 입니다.

SubQuery 위치에 대한 분류.

SELECT에서의 SubQuery (스칼라 SubQuery).

  • SELECT 절에서 서브 쿼리를 사용할 경우, SubQuery의 출력 data는 하나만 출력되어야 합니다. 스칼라 SubQuery는 한 행, 한 칼럼만을 반환하는 SubQuery이다.
-- SELECT에서의 서브쿼리 (스칼라 서브 쿼리)
SELECT main.EmpID
      ,main.EmpName
	  ,main.Title
	  ,main.DeptID
	  ,( SELECT sub.DeptName 
          FROM DeptInfoForSubQuery sub 
          WHERE sub.DeptID = main.DeptID 
      ) as DeptName
 FROM UserInfoForSubQuery main

FROM에서의 SubQuery (인라인 뷰).

  • FROM 절에는 일반적으로 테이블 명이 와야 하지만, SubQuery를 사용하면 조회된 값을 테이블처럼 활용할 수 있습니다.
-- FROM에서의 서브쿼리 (인라인 뷰)
SELECT main.EmpID
      ,main.EmpName
	  ,main.Title
	  ,main.DeptID
	  ,sub.DeptName  DeptName
  FROM UserInfoForSubQuery main
   left outer join (
             SELECT DeptID,DeptName 
              FROM DeptInfoForSubQuery s 
     ) sub
   on main.DeptID =  sub.DeptID

WHERE에서의 SubQuery.

  • WHERE 절에서 서브쿼리를 사용하여 조건을 만족하는 값을 필터링할 수 있습니다.
--  WHERE에서의 서브쿼리:
SELECT main.EmpID,main.EmpName,main.Title, main.DeptID
  FROM UserInfoForSubQuery main
 WHERE DeptID = some(
	SELECT DeptID  
	 FROM DeptInfoForSubQuery  sub 
);

SubQuery 제약사항

  1. SubQuery는 괄호로 묶어서 사용해야 하며, Order By 절은 서브 쿼리 안에서 사용할 수 없습니다.
  2. SubQuery는 연산자 오른쪽에 사용하여야 합니다.

반응형