하위 쿼리를 사용하여 다른 쿼리 내부 또는 표현식에서 쿼리 중첩

쿼리 결과를 다른 쿼리의 필드로 사용하거나 쿼리 필드의 조건으로 사용해야 하는 경우도 있습니다. 예를 들어 각 제품의 주문 간격을 확인하려는 경우를 생각해 볼 수 있습니다. 이 간격을 보여 주는 쿼리를 만들기 위해서는 해당 제품에 대한 각각의 주문 날짜를 서로 비교해야 합니다. 이때 주문 날짜를 비교하기 위해서는 또 다른 쿼리가 필요하게 됩니다. <token>TE000126768</token>를 사용하면 이 쿼리를 주 쿼리에 중첩할 수 있습니다.

하위 쿼리는 <token>TE000127167</token> 또는 SQL(구조적 쿼리 언어) 문으로 표현할 수 있습니다. 이 중 SQL 문은 <token>TE000126761</token>에서 작성합니다.

이 문서의 내용

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#bm1">쿼리 결과를 다른 쿼리의 필드로 사용</link>

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#bm2">하위 쿼리를 쿼리 필드의 조건으로 사용</link>

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#bm3">하위 쿼리에 사용할 수 있는 일반적인 SQL 키워드</link>

쿼리 결과를 다른 쿼리의 필드로 사용

하위 쿼리를 필드 별칭으로 사용할 수 있습니다. 하위 쿼리 결과를 주 쿼리의 필드로 사용하려면 하위 쿼리를 필드 별칭으로 사용하십시오.

참고: 필드 별칭으로 사용하는 하위 쿼리에서는 필드를 하나만 반환할 수 있습니다.

하위 쿼리 필드 별칭을 사용하여 현재 행의 다른 값에 의해 결정되는 값을 표시할 수 있습니다. 하위 쿼리를 사용하지 않으면 이러한 값을 표시할 수 없습니다.

예를 들어 각 제품의 주문 간격을 확인하는 예제로 돌아가 보겠습니다. 이 간격을 확인하려면 해당 제품의 각 수주일을 서로 비교해야 합니다. Northwind 데이터베이스 서식 파일을 사용하여 이 정보를 표시하는 쿼리를 만들 수 있습니다.

  1. <ui>파일</ui> 탭에서 <ui>새로 만들기</ui>를 클릭합니다.

  2. <ui>사용 가능한 서식 파일</ui>에서 <ui>예제 서식 파일</ui>을 클릭합니다.

  3. <ui>Northwind</ui>를 클릭한 다음 <ui>만들기</ui>를 클릭합니다.

  4. <ui>시작 화면</ui> 개체 탭의 <ui>Northwind Traders</ui> 페이지에 나타나는 설명에 따라 데이터베이스를 연 다음 로그인 대화 상자 창을 닫습니다.

  5. <ui>만들기</ui> 탭의 <ui>쿼리</ui> 그룹에서 <ui>쿼리 디자인</ui>을 클릭합니다.

  6. <ui>테이블 표시</ui> 대화 상자에서 <ui>쿼리</ui> 탭을 클릭하고 <ui>제품 주문</ui>을 두 번 클릭합니다.

  7. <ui>테이블 표시</ui> 대화 상자를 닫습니다.

  8. <ui>제품 번호</ui> 필드와 <ui>수주일</ui> 필드를 두 번 클릭하여 쿼리 디자인 눈금에 추가합니다.

  9. 눈금에 있는 <ui>제품 번호</ui> 열의 <ui>정렬</ui> 행에서 <ui>오름차순</ui>을 선택합니다.

  10. 눈금에 있는 <ui>수주일</ui> 열의 <ui>정렬</ui> 행에서 <ui>내림차순</ui>을 선택합니다.

  11. 눈금의 세 번째 열에서 <ui>필드</ui> 행을 마우스 오른쪽 단추로 클릭하고 바로 가기 메뉴에서 <ui>확대/축소</ui>를 클릭합니다.

  12. <ui>확대/축소</ui> 대화 상자에 다음 식을 입력하거나 붙여 넣습니다.

    Prior Date: (SELECT MAX([Order Date]) 
    FROM [Product Orders] AS [Old Orders]
    WHERE [Old Orders].[Order Date] < [Product Orders].[Order Date]
    AND [Old Orders].[Product ID] = [Product Orders].[Product ID])

    이 식은 하위 쿼리입니다. 각 행에 대해 이 하위 쿼리는 해당 행과 이미 연결되어 있는 수주일보다 오래된 수주일 중 가장 최근의 수주일을 선택합니다. 여기에서 주 쿼리의 현재 행 값을 하위 쿼리 값과 비교하기 위해 AS 키워드를 사용하여 테이블 별칭을 만드는 방법을 자세히 살펴보세요.

  13. 눈금의 네 번째 열에 있는 <ui>필드</ui> 행에 다음 식을 입력합니다.

    <codeInline>Interval: [Order Date]-[Prior Date]</codeInline>

    이 식은 하위 쿼리를 사용하여 정의한 이전 날짜의 값을 사용하여 해당 제품의 각 수주일과 이전 수주일 사이의 간격을 계산합니다.<br />

  14. <ui>결과</ui> 그룹 내의 <ui>디자인</ui> 탭에서 <ui>실행</ui>을 클릭합니다.

    1. 이 쿼리를 실행하면 제품 이름, 수주일, 이전 수주일 및 수주일 사이의 간격이 목록으로 표시됩니다. 결과는 먼저 제품 번호(오름차순)를 기준으로 정렬된 다음, 수주일(내림차순)을 기준으로 다시 정렬됩니다.

    2. 참고: 기본적으로 제품 번호는 조회 필드이므로 실제 제품 번호 대신 조회 값(이 예제의 경우 제품 이름)이 표시됩니다. 이로 인해 표시되는 값이 바뀌지만 정렬 순서는 바뀌지 않습니다.

  15. Northwind 데이터베이스를 닫습니다.

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#__top">맨 위로 이동</link>

하위 쿼리를 쿼리 필드의 조건으로 사용

하위 쿼리를 필드 기준으로 사용할 수 있습니다. 하위 쿼리의 결과를 사용하여 필드에 표시되는 값을 제한하려면 하위 쿼리를 필드 조건으로 사용하십시오.

예를 들어 영업 사원 <legacyItalic>이외의</legacyItalic> 직원이 처리한 주문 목록을 검토해야 할 수 있습니다. 이러한 목록을 생성하려면 영업 사원이 아닌 직원의 직원 번호 목록을 사용하여 각 주문에 대한 직원 번호를 비교해야 합니다. 이 목록을 만들어 필드 조건으로 사용하려면 다음 절차에 나와 있는 것과 같이 하위 쿼리를 사용하면 됩니다.

  1. Northwind.accdb를 열고 콘텐츠를 사용하도록 설정합니다.

  2. 로그인 폼을 닫습니다.

  3. <ui>만들기</ui> 탭의 <ui>쿼리</ui> 그룹에서 <ui>쿼리 디자인</ui>을 클릭합니다.

  4. <ui>테이블 표시</ui> 대화 상자의 <ui>테이블</ui> 탭에서 <ui>주문</ui> 및 <ui>직원</ui>을 두 번 클릭합니다.

  5. <ui>테이블 표시</ui> 대화 상자를 닫습니다.

  6. 주문 테이블에서 <ui>직원 번호</ui> 필드, <ui>주문 번호</ui> 필드 및 <ui>수주일</ui> 필드를 두 번 클릭하여 쿼리 디자인 눈금에 추가합니다. 직원 테이블에서 <ui>직위</ui> 필드를 두 번 클릭하여 디자인 눈금에 추가합니다.

  7. 직원 번호 열의 <ui>조건</ui> 행을 마우스 오른쪽 단추로 클릭한 다음 바로 가기 메뉴에서 <ui>확대/축소</ui>를 클릭합니다.

  8. <ui>확대/축소</ui> 상자에 다음 식을 입력하거나 붙여 넣습니다.

    IN (SELECT [ID] FROM [Employees] 
    WHERE [Job Title]<>'Sales Representative')

    이 식은 하위 쿼리입니다. 이 하위 쿼리는 직위가 영업 사원이 아닌 모든 직원 번호를 선택하여 해당 결과 집합을 주 쿼리에 제공합니다. 그러면 주 쿼리에서 주문 테이블의 직원 번호가 결과 집합에 있는지 확인합니다.

  9. <ui>디자인</ui> 탭의 <ui>결과</ui> 그룹에서 <ui>실행</ui>을 클릭합니다.

    이 쿼리를 실행하면 쿼리 결과에 영업 사원 이외의 직원이 처리한 주문이 목록으로 표시됩니다.

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#__top">맨 위로 이동</link>

하위 쿼리에 사용할 수 있는 일반적인 SQL 키워드

하위 쿼리에는 다음과 같은 몇 가지 SQL 키워드를 사용할 수 있습니다.

참고: 이 목록에 사용 가능한 키워드가 모두 나와 있는 것은 아닙니다. 데이터 정의 키워드를 제외한 모든 유효한 SQL 키워드를 하위 쿼리에 사용할 수 있습니다.

  • <embeddedLabel>ALL</embeddedLabel> 하위 쿼리에서 반환한 모든 행을 대상으로 비교하여 조건에 맞는 행을 검색하려면 WHERE 절에 ALL 키워드를 사용합니다.

    대학에서 학생 데이터를 분석하는 경우를 예로 들어 보겠습니다. 모든 학생은 전공별로 다른 최소 평균 학점을 획득해야 합니다. 전공과 최소 평균 학점은 '전공'이라는 테이블에 저장되고 관련 학생 정보는 '학생_기록'이라는 테이블에 저장됩니다.

    전공을 이수하는 모든 학생이 최소 평균 학점을 초과하는 해당 전공 및 관련 최소 평균 학점에 대한 목록을 보려면 다음 쿼리를 사용하면 됩니다.

    SELECT [Major], [Min_GPA] 
    FROM [Majors]
    WHERE [Min_GPA] < ALL
    (SELECT [GPA] FROM [Student_Records]
    WHERE [Student_Records].[Major]=[Majors].[Major]);
  • <embeddedLabel>ANY</embeddedLabel> 하위 쿼리에서 반환한 하나 이상의 행을 대상으로 비교하여 조건에 맞는 행을 검색하려면 WHERE 절에 ANY 키워드를 사용합니다.

    대학에서 학생 데이터를 분석하는 경우를 예로 들어 보겠습니다. 모든 학생은 전공별로 다른 최소 평균 학점을 획득해야 합니다. 전공과 최소 평균 학점은 '전공'이라는 테이블에 저장되고 관련 학생 정보는 '학생_기록'이라는 테이블에 저장됩니다.

    전공을 이수하는 학생 중 최소 평균 학점에 미달하는 학생이 있는 해당 전공 및 관련 최소 평균 학점에 대한 목록을 보려면 다음 쿼리를 사용하면 됩니다.

    SELECT [Major], [Min_GPA] 
    FROM [Majors]
    WHERE [Min_GPA] > ANY
    (SELECT [GPA] FROM [Student_Records]
    WHERE [Student_Records].[Major]=[Majors].[Major]);

    참고: SOME 키워드를 같은 용도로 사용할 수도 있습니다. SOME 키워드는 ANY 키워드와 같습니다.

  • <embeddedLabel>EXISTS</embeddedLabel> 하위 쿼리에서 행을 최소한 하나 이상 반환하도록 지정하려면 WHERE 절에 EXISTS 키워드를 사용합니다. 또한 하위 쿼리에서 아무 행도 반환하지 않도록 지정하려면 EXISTS 앞에 NOT을 추가합니다.

    예를 들어 다음 쿼리를 실행하면 하나 이상의 기존 주문에 포함되어 있는 제품의 목록이 반환됩니다.

    SELECT *
    FROM [Products]
    WHERE EXISTS
    (SELECT * FROM [Order Details]
    WHERE [Order Details].[Product ID]=[Products].[ID]);

    NOT EXISTS를 사용하여 쿼리를 실행하면 하나 이상의 기존 주문에 포함되어 있지 않은 제품의 목록이 반환됩니다.

    SELECT *
    FROM [Products]
    WHERE NOT EXISTS
    (SELECT * FROM [Order Details]
    WHERE [Order Details].[Product ID]=[Products].[ID]);
  • <embeddedLabel>IN</embeddedLabel> 주 쿼리의 현재 행 값이 하위 쿼리에서 반환한 값 집합에 포함되어 있는지 확인하려면 WHERE 절에 IN 키워드를 사용합니다. 또한 주 쿼리의 현재 행 값이 하위 쿼리에서 반환한 값 집합에 없음을 확인하려면 IN 키워드 앞에 NOT을 추가합니다.

    예를 들어 다음 쿼리를 실행하면 영업 사원이 아닌 직원이 처리한 주문의 목록(수주일 포함)이 반환됩니다.

    SELECT [Order ID], [Order Date]
    FROM [Orders]
    WHERE [Employee ID] IN
    (SELECT [ID] FROM [Employees]
    WHERE [Job Title]<>'Sales Representative');

    NOT IN을 사용하여 동일한 쿼리를 다음과 같이 작성할 수도 있습니다.

    SELECT [Order ID], [Order Date]
    FROM [Orders]
    WHERE [Employee ID] NOT IN
    (SELECT [ID] FROM [Employees]
    WHERE [Job Title]='Sales Representative');

<link xlink:href="a8532322-e42f-4f94-bc38-ace7c182916a#__top">맨 위로 이동</link>

Office 기술 확장
교육 살펴보기
새로운 기능 우선 가져오기
Office Insider 참여

이 정보가 유용한가요?

의견 주셔서 감사합니다!

피드백을 주셔서 감사합니다. Office 지원 에이전트와 연락하는 것이 도움이 될 것 같습니다.

×