오늘은 MSSQL 서브 쿼리(SubQuery) 사용법에 대해서 알아보고 Show 목차 1.MSSQL 서브쿼리(SubQuery) 란?
[주의사항] 2.MSSQL 서브쿼리(SubQuery) 문법
#서브쿼리를 이용한 업데이트 #서브 쿼리를 이용한 인설트 #'열명'에 해당하는 값중 가장 큰 값을 삭제하는 쿼리 3.MSSQL 서브쿼리(SubQuery) 사용법 #서브쿼리를 이용한 조회하기(from 절)
#서브쿼리를 이용한 조회하기(where 절) MSSQL 서브 쿼리(SubQuery) 사용법에 대한 포스팅을 마치겠습니다. 주요 콘텐츠로 건너뛰기 이 브라우저는 더 이상 지원되지 않습니다. 최신 기능, 보안 업데이트, 기술 지원을 이용하려면 Microsoft Edge로 업그레이드하세요. 하위 쿼리(SQL Server)
이 문서의 내용적용 대상: SQL Server(지원되는 모든 버전) Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System(PDW) 하위 쿼리는 하위 쿼리는 식이 허용되는 모든 위치에서 사용할 수 있습니다. 이 예제에서 하위 쿼리는 문에서 MaxUnitPrice라는 열 식으로
하위 쿼리 기본 사항하위 쿼리는 내부 쿼리 또는 내부 선택이라고도 하며 하위 쿼리가 포함된 문을 외부 쿼리 또는 외부 선택이라고 합니다. 하위 쿼리를 포함하는 많은 Transact-SQL 문을 조인으로 작성할 수도 있습니다. 다른 문제는 하위 쿼리에만 해당됩니다. Transact-SQL에서는 일반적으로 하위 쿼리를 포함하는 문과 그렇지 않은 의미상 동등한 버전 간에 성능 차이가 없습니다. SQL Server 쿼리를 처리하는 방법에 대한 아키텍처 정보는 SQL 문 처리를 참조하세요. 하지만 존재 테스트를 해야 할 경우 조인을 사용하면 성능이 향상될 수 있습니다. 그렇지 않으면 중복 값을 제거하기 위해 각 외부 쿼리 결과에 대해 중첩 쿼리를 처리해야 합니다. 이런 경우 조인을 사용하면 결과를 더 쉽게 얻을 수 있습니다. 다음 예제에서는 동일한 결과 집합 및 실행 계획을 반환하는 하위 쿼리
외부 SELECT 문에 중첩된 하위 쿼리는 다음과 같은 구성 요소를 갖습니다.
하위 쿼리의 SELECT 쿼리는 항상 괄호로 묶습니다. 또는 하위 쿼리는 외부 테이블이 외부 쿼리가 아닌 하위 쿼리에만 표시되는 경우 해당 테이블의 열을 출력(외부 쿼리의 선택 목록)에 포함할 수 없습니다. 하위 쿼리가 포함된 문은 다음 중 한 가지 형식을 취합니다.
일부 Transact-SQL 문에서 하위 쿼리는 독립적인 쿼리인 것처럼 평가할 수 있습니다. 개념적으로 하위 쿼리 결과는 외부 쿼리로 대체됩니다(SQL Server 실제로 하위 쿼리를 사용하여 Transact-SQL 문을 처리하는 방법은 아니지만). 하위 쿼리에는 다음과 같은 세 가지 기본 유형이 있습니다.
하위 쿼리 규칙하위 쿼리에는 다음과 같은 제한 사항이 있습니다.
하위 쿼리에서 열 이름 한정다음 예제에서는 외부 쿼리의
일반적으로 문의 열 이름은 같은 수준의 이러한 암시적 가정이 지정된 쿼리의 모양은 다음과 같습니다.
테이블 이름을 명시적으로 지정하는 것은 잘못된 일이 아닙니다. 명시적 자격으로 테이블 이름에 대한 암시적 가정을 항상 재정의할 수 있습니다. 중요 하위 쿼리에서 참조하는 열이 하위 쿼리의 다중 중첩 수준하위 쿼리에는 하나 이상의 하위 쿼리가 포함될 수 있습니다. 또한 문에 원하는 수만큼 하위 쿼리를 중첩시킬 수 있습니다. 다음 쿼리는 영업 사원이기도 한 직원의 이름을 찾습니다.
결과 집합은 다음과 같습니다.
가장 안쪽의 쿼리는 영업 사원 ID를 반환합니다. 이 쿼리보다 한 수준 위의 쿼리는 이러한 영업 사원 ID로 평가하여 직원의 연락처 ID 번호를 반환합니다. 마지막으로 외부 쿼리가 연락처 ID를 사용하여 직원 이름을 찾습니다. 위의 쿼리를 조인으로 표시할 수도 있습니다.
대부분의 쿼리는 하위 쿼리를 한 번 실행하고 그 결과 값을 외부 쿼리의
결과 집합은 다음과 같습니다.
이 문의 이전 하위 쿼리는 외부 쿼리와 독립적으로 평가할 수 없습니다. Employee.BusinessEntityID에 대한 값이 필요하지만 이 값은 SQL Server Employee의 다른 행을 검사할 때 변경됩니다. 이것이 바로 이 쿼리가 평가되는 방식입니다. SQL Server 각 행의 값을 내부 쿼리로 대체하여 Employee 테이블의 각 행을 결과에 포함시키는 것을 고려합니다. 예를 들어 SQL Server 먼저 행을
결과는
0.00(
이 값은 false이므로 상관 관계가 있는 하위 쿼리가 있는 이전 샘플 쿼리의 결과에 행 상관 하위 쿼리는 외부 쿼리의 테이블에 있는 열을 테이블 반환 함수의 인수로 참조함으로써 하위 쿼리 유형하위 쿼리는 다음과 같이 여러 위치에서 지정할 수 있습니다.
테이블 별칭이 있는 하위 쿼리하위 쿼리와 외부 쿼리가 동일한 테이블을 참조(테이블을 자기 자신에게 조인)하는 문을 대부분 자체 조인이라고 합니다. 예를 들어 다음과 같은 하위 쿼리를 사용하여 특정 주에 있는 직원의 주소를 찾을 수 있습니다.
결과 집합은 다음과 같습니다.
또는 자체 조인을 사용할 수도 있습니다.
테이블 별칭
명시적 테이블 별칭은 하위 쿼리의 Person.Address 에 대한 참조가 외부 쿼리의 참조와 동일한 것을 의미하지 않는다는 것을 분명히 합니다. IN이 있는 하위 쿼리
결과 집합은 다음과 같습니다.
이 문은 두 단계로 나누어서 계산됩니다. 먼저 내부 쿼리는 이름이 'Wheel'(17)인 하위 범주 ID를 반환합니다. 둘째, 이 값은 외부 쿼리로 대체됩니다. 이 쿼리는 하위 범주 식별 번호와 함께 사용되는 제품 이름을 찾습니다
이 경우 하위 쿼리 대신 조인을 사용하면 결과에 둘 이상의 테이블에 포함된 열을 보여 줄 수 있다는 점이 다릅니다. 예를 들어 결과에 제품 하위 범주의 이름을 포함하려면 조인 버전을 사용해야 합니다.
결과 집합은 다음과 같습니다.
다음 쿼리는 20개 이상의 Adventure Works Cycles 제품을 주문하고 평균 배달 리드 타임이 16일 미만으로 신용도가 좋은 모든 공급업체의 이름을 검색합니다.
결과 집합은 다음과 같습니다.
내부 쿼리를 계산하여 하위 쿼리 조건을 만족하는 공급업체의 ID를 반환한 후 외부 쿼리를 계산합니다. 내부 쿼리 및 외부 쿼리 모두에 있는 조인을 사용하면 동일한 쿼리를 다음과 같이 표시할 수 있습니다.
조인은 항상 하위 쿼리로 표시할 수 있지만 하위 쿼리를 항상 조인으로 표시할 수는 없습니다. 그 이유는 조인이 대칭적이기 때문입니다. 즉, 어떤 순서로 테이블 A를 테이블 B에 조인해도 같은 결과를 얻습니다. 하위 쿼리가 관련된 경우에도 마찬가지입니다. NOT IN이 있는 하위 쿼리
이 문을 조인으로 변환할 수 없습니다. 유사하지 않은 조인은 다른 의미를 가집니다. 완성된 자전거가 아닌 일부 하위 범주에 있는 제품의 이름을 찾습니다. , DELETE및 INSERT 문의 하위 쿼리 UPDATE
다음 예에서는 Production.Product 테이블의 ListPrice 열 값을 두 배로 만듭니다.
다음은 조인을 사용하여 동일한 기능을 수행하는
명확성을 위해 동일한 테이블이 다른 하위 쿼리에서 자체적으로 참조되는 경우에는 대상 테이블의 별칭을 사용합니다.
비교 연산자가 있는 하위 쿼리하위 쿼리는 비교 연산자( 수정되지 않은 비교 연산자(뒤에 수정되지 않은 비교 연산자로 시작하는 하위 쿼리를 사용하려면 하위 쿼리가 정확히 하나의 값만 반환한다는 것을 알 수 있도록 데이터와 문제의 특성을 충분히 이해해야 합니다. 예를 들어 각 영업 사원이 하나의 판매 지역만 담당한다고 가정하고 Linda Mitchell이라는 사원이 담당하는 지역에 있는 고객을 찾을 경우 간단하게
그러나 수정되지 않은 비교 연산자로 시작하는 하위 쿼리는 단일 값을 반환하므로 집계 함수가 포함되는 경우가 많습니다. 예를 들어 다음 문은 제품 가격이 평균 가격보다 비싼 모든 제품의 이름을 찾습니다.
수정되지 않은 비교 연산자를 사용하여 도입된 하위 쿼리는 단일 값을 반환해야 하므로 또는 절 자체가 단일 값을 반환한다는 것을 알지
에 의해 수정된 ANY비교 연산자 또는 SOMEALL하위 쿼리를 도입하는 비교 연산자는 수정된 비교 연산자로 시작하는 하위 쿼리는 0개 이상의 값 목록을 반환하고 비교 연산자를 > 예로
마찬가지로 다음은
각각의 Product 하위 범주마다 내부 쿼리는 최대 가격을 찾습니다. 외부 쿼리는 이러한 값 모두를 찾고 Product 하위 범주의 최대 가격보다 크거나 동일한 개별 제품의 가격을 확인합니다. 하위 쿼리에서 값을 반환하지 않으면 전체 쿼리에서 값을 반환하지 못합니다.
두 쿼리에 대한 결과 집합은 다음과 같습니다.
예를 들어 다음 쿼리는 영업 직원이 담당하지 않는 지역에 있는 고객을 찾습니다.
고객에게 할당된 모든 지역을 영업 직원이 담당하기 때문에 결과에는 영업 지역이 NULL인 고객을 제외한 모든 고객이 포함됩니다. 내부 쿼리는 영업 사원이 다루는 모든 판매 지역을 찾은 다음, 각 지역에 대해 외부 쿼리는 하나에 없는 고객을 찾습니다. 이와 같은 이유로 이 쿼리에서
EXISTS가 있는 하위 쿼리하위 쿼리가 EXISTS로 시작하는 하위 쿼리는 다음 구문을 사용합니다.
다음 쿼리는 Wheels 하위 범주에 있는 모든 제품의 이름을 검색합니다.
결과 집합은 다음과 같습니다.
각 제품의 이름을 차례로 고려하여 위 쿼리의 결과를 확인합니다. 이 값을 통해 하위 쿼리에서 하나 이상의 행을 반환하는지, 즉, 쿼리에서 존재 테스트의 결과가 EXISTS로 시작하는 하위 쿼리는 다음과 같은 점에서 다른 하위 쿼리와 다릅니다.
대부분 하위 쿼리를 사용하지 않는 대체 구문이 없으므로 예를 들어 앞의 쿼리는
NOT EXISTS가 있는 하위 쿼리
예를 들어 휠 하위 범주에 없는 제품의 이름을 찾으려면 다음을 수행합니다.
식 대신 사용되는 하위 쿼리Transact-SQL에서 하위 쿼리는 목록을 제외한 식, 다음은 이러한 향상된 기능을 사용하는 방법을 보여 주는 예입니다. 다음 쿼리는 모든 산악용 자전거의 가격, 평균 가격 및 각 산악용 자전거의 가격과 평균 가격 간의 차이를 검색합니다.
참고 항목Syntax
쿼리 성능 개념
추가 리소스추가 리소스이 문서의 내용 |