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
);
반환되는 데이터의 형태로 분류.
단일 행 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 = '미국지점'
);
다중 행 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 위치에 대한 분류.
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 제약사항
- SubQuery는 괄호로 묶어서 사용해야 하며, Order By 절은 서브 쿼리 안에서 사용할 수 없습니다.
- SubQuery는 연산자 오른쪽에 사용하여야 합니다.
반응형