Database/MS-SQL

부속 질의 ( 스칼라 서브쿼리, 인라인 뷰)

ㅈㅣ니 2024. 9. 9.

 

2. 스칼라 부속질의 - SELECT 부속질의

 

스칼라 부속질의 Scalar Subquery는 SELECT 절에서 사용되는 부속질의로, 부속질의의 결과 값을

단일행, 단일열의 스칼라값으로 반환합니다. 만약 결과 값이 다중행이거나 다중열이라면

DBMS는 그 중 어떠한 행, 어떠한 열을 출력해야 하는지 알 수 없어 에러를 출력합니다.

또한 결과가 없는 경우에는 NULL 값을 출력합니다.

스칼라 부속질의는 원칙적으로 스칼라값이 들어갈 수 있는 모든 곳에 사용 가능하며,

일반적으로 SELECT 문과 UPDATE SET 절에 사용됩니다.

주 질의와 부속질의와의 관계는 상관/비상관 모두 가능합니다.

 

scalar subquery

 

예제 ) 고객별 판매액을 보이시오 (고객이름과 고객별 판매액 출력)

 

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

[ Customer 테이블 ] , [ Orders 테이블 ]

 

결과

 

Customer 테이블의 custid는 기본키이므로 Customer 테이블에서 유일한 값입니다.

그러므로 custid를 기준으로 결과를 가져오는 부속질의는 단일행을 반환합니다.

또한 부속질의의 SELECT 문에는 오직 name 열만 표시되어 있으므로 단일행, 단일열만 출력합니다.

 

스칼라 부속질의는 UPDATE 문에서도 사용할 수 있습니다

다음은 Order 테이블에 새로운 속성을 추가하는 예제입니다.

 

예제 ) Orders 테이블에 각 주문에 맞는 도서이름을 입력하시오

 

ALTER TABLE Orders Add bookname VARCHAR(40);
UPDATE Orders
SET bookname = (SELECT bookname
                FROM Book
                WHERE Book.bookid=Orders.bookid);

 

 

Orders 테이블
쿼리 수행 후 Orders 테이블

 

 

3. 인라인 뷰 - FROM 부속질의

 

인라인 뷰 inline view는 FROM 절에서 사용되는 부속질의를 말합니다.

뷰는 기존 테이블로부터 일시적으로 만들어진 가상의 테이블을 말합니다.

SQL 문의 FROM 절에는 테이블 이름이 위치하는데,

여기에 테이블 이름 대신 인라인 뷰 부속질의를 사용하면 보통의 테이블과 같은 형태로 사용할 수 있습니다.

부속질의 결과 반환되는 데이터는 다중행, 다중열이어도 상관없습니다.

다만 가상의 테이블인 뷰 형태로 제공되기 때문에 상관 부속질의로 사용될 수는 없습니다.

 

예제 ) 고객번호가 2 이하인 고객의 판매액을 보이시오 ( 고객이름과 고객별 판매액 출력)

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테이블을 계산해서 가상의 테이블을 만들고 od테이블과 조인을 하여 처리합니다.

 

이퀄 조인을 사용하여 고객번호가 2 이하인 고객만 출력하는 형태로 작성할 수 있지만,

조인 결과 테이블에서 필요 없는 데이터를 제가해야 하므로 성능 저하가 발생할 수 있습니다.

 

이럴 때 인라인 뷰를 사용하면 조인에 참여하기 직전에 Customer 테이블에서 필요한 데이터만 뽑아서 조인할 수 있기 때문에 성능을 높일 수 있습니다.

반응형

'Database > MS-SQL' 카테고리의 다른 글

격리수준 (ISOLATION)  (0) 2024.09.24
부속 질의 ( 서브 쿼리 )  (1) 2024.09.02
내장함수 (2) | Null 함수  (0) 2024.08.26
내장 함수  (0) 2024.08.15
[MS-SQL] 인덱스 (INDEX)란?  (4) 2024.08.12