Cs

5. Subquery(서브쿼리) 부속질의

ITSEONG 2022. 3. 20. 22:46

서브쿼리는 sql 문 안에 다른 sql 문이 중첩된 질의를 말한다. 다른 테이블에서 가져온 데이터로 현재 테이블에 있는 정보를 찾거나 가공할 때 사용한다.

 

다른 테이블을 연관시킬 때는 조인 또는 서브쿼리를 사용한다. 허나 이 중 어떤걸 선태하느냐는 데이터의 형태와 양에 따라 달라진다.

일반적으로 데이터가 대량일 경우 데이터를 모두 합쳐서 연산하는 조인보다 필요한 데이터만 찾아서 공급해 주는 서브쿼리의 성능이 더 좋다. 서브쿼리는 위치와 역할에 따라 SELECT 서브쿼리, FROM 서브쿼리, WHERE 서브쿼리로 구분된다.

명칭 위치 영문 및 동의어 설명
중첩질의 WHERE 절  nested subquery,
predicate subquery
WHERE 절에 술ㄹ어와 같이 사용되며 결과를 한정시키기 위해 사용된다. 상관 혹은 비상관 형태이다.
스칼라 부속질의 SELECT 절 scalar subquery SELECT 절에서 사용되며 단일 값을 반환하기 때문에 스칼라 부속질의라고 한다.
인라인 뷰 FROM 절 inline view,
table subquery
 FROM 절에서 결과를 뷰(view)형태로 반화하기 때문에 인라인 뷰라고 한다.

중첩질의 - WHERE 서브쿼리

중첩질의는 WHERE 절에서 사용되는 부속질의를 말한다. WHERE 절은 보통 데이터를 선택하는 조건 혹은 술어predicate와 같이 사용된다. 그래서 중첩질의를 predicate subquery 라고도 부른다. 중첩질의는 main query에 사용된 자료 집합의 조건을 WHERE 절에 서술한다. main query의 자료집합에서 한 행씩 가져와 부속질의를 수행하며, 연산결과에 따라 WHERE 절의 조건이 참인지 거짓인지 확인하여 찹일 경우 main query의 해당 행을 출력한다. 중첩질의의 연산자는 아래와 같다.

술어 연산자 반환 행 반환 열 상관
비교 =,>,<,>=,<=,<> 단일 단일 가능
집합 IN, NOT IN 다중 다중 가능
한정 ALL, SOME(ANY) 다중 단일 가능
존재 EXISTS, NOT EXISTS 다중 다중 필수

스칼라 부속질의 - SELECT subquery

스칼라 부속질의는 SELECT 절에서 사용되는 부속질의로, 부속질의의 결과 값을 다일행, 당닐열의 스칼라 값으로 반환한다. 만약 결과 값이 다중 행이거나 다중 열이라면 DBMS는 그중 어떠한 행, 어떠한 열을 출력해야 하는지 알 수 없어 에러를 출력한다. 또 결과가 없는 경우에는 NULL값을 출력한다. 스칼라 부속질의는 원칙적으로 스칼라 값이 들어갈 수 있는 모든 곳에 사용 가능하며, 일반적으로 SELECT 문과 UPDATE SET 절에 사용된다.

 

SELECT ( SELECT name
	 FROM Customer cs
         WHERE cs.custid=od.custid)"name", SUM(saleprice)"total"
FROM	Orders od
ORDER BY od.custid;
UPDATE Orders
SET bookname=(SELECT bookname
	      FROM Book
              WHERE Book.bookid = Orders.bookid);

인라인 뷰 - FROM subquery

인라인 뷰는 FROM절에서 사용되는 부속질의를 말한다.  SQL문의 FROM절에는 테이블 이름이 위치하는데, 여기에 테이블 이름 대신 인라인 뷰 subquery를 사용하면 보통의 테이블과 같은 형태로 사용할 수 있다. subquery 결과 반환되는 데이터는 다중 행, 다중 열이어도 상관 없다. 다만 가상의 테이블인 뷰 형태로 제공되기 때문에 상관 부속질의로 사용될 수는 없다.

* 상관부속질의란 main query의 특정 컬럼 값을 subquery가 상속받아 사용하는 형태이다. 

 

SELECT cs.name, SUM(od.saleprice)"total"
FROM (SELECT custid, name
	  FROM Customer
      WHERE custid =< 2) cs,
      Orders od
WHERE cs.custid=od.custid
GROUP BY cs.name;

FROM 절에는 두 개의 테이블이 있다. CUStomer 테이블에서 고객번호가 2 이하인 행만,선택한 cs 테이블, 그리고 Orders 테이블 od이다. 실행 과정을 보면 먼저 cs테이블을 계산해서 가상의 테이블(뷰, view)을 만들고 od 테이블과 조인한다. 나머지는 일반적인 SQL문의 처리순서와 같다.

반응형