본문 바로가기
DataBase/E.T.C.

[SQL]SUBQUERY

by 오늘은강박사갈거야~~ 2021. 8. 30.
반응형

- 이 글은 제가 공부를 하며, 이해한 것을 바탕으로 작성하는 글입니다.

- 그렇기에 틀리거나 잘못된 부분이 있을 수 있습니다.

- 글의 오류를 발견하시면, 댓글로 말씀해 주시면 정말 감사하겠습니다.


서브 쿼리란, 쿼리 안에 작성하는 또 다른 쿼리로, 여러 곳에서 사용되며, 가독성이 좋다는 장점이 있습니다. 보통 복잡한 쿼리를 작성하는 데 사용됩니다.

 

사용법은 일반 쿼리 문의 SELECT, FROM, WHERE절 안에 괄호를 치고 쿼리를 또 작성하는 것입니다.

 

 

서브 쿼리의 규칙

■ 서브쿼리는 괄호( )로 묶어서 사용

■ 메인 쿼리(outer query)는 연산자의 왼쪽에 기술하고 서브 쿼리는 연산자의 오른쪽에 기술

■ 서브쿼리에서 메인 쿼리(outer query)의 순서로 SELECT 문이 실행

■ 서브쿼리의 서브 쿼리 형태로 중첩하여 작성

 

서브 쿼리의 예시는 다음과 같다.

이 전체 쿼리에서 where 절 쪽에 있는 괄호 내의 쿼리를 서브 쿼리라고 하고, 그 바깥의 나머지 쿼리를 메인 쿼리 또는 Outer 쿼리라고 한다.

 

SELECT
    order_id,
    order_date,
    customer_id
FROM
    sales.orders
WHERE
    customer_id IN (
        SELECT
            customer_id
        FROM
            sales.customers
        WHERE
            city = 'New York'
    )
ORDER BY
    order_date DESC;

 

SUBQUERY는 여러 기준으로 구분되는데 우선, SUBQUERY의 위치에 따른 구분으로 정리해 보자.

SUBQUERY 위치에 따른 구분으로는 SELECT, FROM, WHERE에 들어가는 쿼리 3가지로 나눌 수 있다.

 

- 스칼라 서브쿼리 (Scalar Subquery)

메인 쿼리의 SELECT에 칼럼이나 표현식처럼 사용하는 서브 쿼리

특징으로는 한 개의 값만 표현이 가능하다.

SELECT 이름,
       (SELECT 주소
        FROM 학생
        WHERE 학생부.학번 = 학생개인정보.학번) 주소
FROM 학생

우선 서브쿼리를 보면, 주소 칼럼을 결과로 도출하고 있다. 

메인 쿼리는 이름과 서브쿼리에서 나온 주소 칼럼을 가지고 오는 것이다. 

 

- 인라인 뷰 ( Inline View )

메인 쿼리의 FROM절에 나오는 서브 쿼리를 말한다.

FROM 절에 나오므로, 서브쿼리 자체가 하나의 테이블과 같은 역할을 수행하게 된다. 그렇기에 이를 가상 테이블과 같은 역할을 한다 하여, view를 붙여 인라인 뷰라고 부른다.

그 말인 즉, 테이블과 같은 역할을 수행하므로, 여러 개의 칼럼과 로우로 이루어있다고 할 수 있다.

그리고 테이블 역할이므로 Alias도 사용 가능하다.

 

  • 아래 예시를 보자. 직원 중, it 직무를 가지고 있는 사람을 찾아보는 sql를 작성한다고 해보자.
SELECT *
FROM 직원 as A , 
		(SELECT 부서_id
		 FROM 부서
		 WHERE 부서명 = 'IT') as B

WHERE A.부서_id = B.부서_id

 

우선, 서브 쿼리부터 해석하고, 다음 메인 쿼리로 넘어가야 한다.

서브 쿼리는 부서명이 IT인 부서 ID를 가지고 오는 쿼리이다. 이를 B라고 별명을 붙였다.

그리고, 메인 쿼리에서는 바로 위에서 가지고 온 부서 ID와 A 테이블에서의 부서 ID가 같은 값을 가지는 것을 가지고 오도록 되어있다.

 

- 중첩 서브 쿼리 ( Nested Subquery )

 

중첩 서브 쿼리는 WHERE절에서 나오는 서브 쿼리를 말한다.

WHERE 절은 특정 조건이 나올 수 있게 처리를 할 때 사용하는데,  이 중첩 서브 쿼리는 단일행을 가지고 올 수도 있고, 아니면 다중행을 가지고 올 수도 있다.

 

아래는 중첩 서브 쿼리의 예이다.

 

SELECT 이름
FROM 사원 
where 부서명=(SELECT 부서명 
		   FROM 부서 
           WHERE 거주지="서울");

서브 쿼리를 보면 서울에 거주하는 사람들의 부서명을 불러오고, 메인 쿼리에서는 그 사람들의 이름을 가지고 오는 것으로 되어있다.

 

 

반응형

댓글