부속질의

WooBuntu·2021년 1월 8일
0

데이터베이스

목록 보기
10/16

두 테이블을 연관시킬 때 조인을 선택할지 부속질의를 선택할지 여부는 데이터의 형태와 양에 따라 달라진다.

일반적으로 데이터가 대량일 경우 데이터를 모두 합쳐서 연산하는 조인보다 필요한 데이터만 찾아서 공급해주는 부속질의의 성능이 더 좋다
(조인한 뒤 필요 없는 정보를 가려내는 것보다 필요 없는 정보를 다 가려낸 뒤 조인하는 것이 더 성능이 좋다는 듯하다)

위치와 역할에 따른 분류

스칼라 부속질의(SELECT 부속질의)

부속질의의 결과 값을 단일 행, 단일 열의 스칼라 값으로 반환해야 한다

스칼라 부속질의는 원칙적으로 스칼라 값이 들어갈 수 있는 모든 곳에 사용할 수 있으며, 일반적으로 SELECT문과 UPDATE SET 절에 사용된다

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

스칼라 값 : 벡터 값에 대응되는 것으로 '단일 값'을 의미한다

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

인라인 뷰(FROM 부속질의)

말그대로 뷰를 인라인으로 작성하는 것

  • 가상의 테이블인 뷰 형태로 제공되기 때문에 상관 부속질의로 사용될 수는 없다
    (주질의의 특정 칼럼 값을 상속받아 사용하는 부속질의가 가상의 테이블이기 때문에 안 된다는 걸까)
SELECT cs.name, SUM(od.saleprice) AS 'total'
FROM (SELECT custid, name
      FROM Customer
      WHERE custid <= 2) AS cs,
      Orders AS od
WHERE cs.custid=od.custid
GROUP BY cs.name;

중첩질의(WHERE 부속질의)

WHERE절은 보통 데이터를 선택하는 조건 혹은 술어와 같이 사용되므로 중첩질의를 술어 부속질의(predicate subquery)라고도 부른다

  • 중첩질의는 주질의에 사용된 자료 집합의 조건을 WHERE절에 서술한다

  • 주질의의 자료 집합에서 한 행씩 가져와 부속질의를 수행하며, 연산 결과에 따라 WHERE 절의 조건이 참인지 거짓인지 확인하여 참일 경우 주질의의 해당 행을 출력한다

비교 연산자

비교 연산자는 부속질의가 반드시 단일 행, 단일 열을 반환해야 한다

주질의의 대상 열 값과 부속질의의 결과 값을 비교 연산자에 적용하여 참이면 주질의의 해당 열을 출력한다

SELECT orderid, saleprice
FROM Orders
WHERE saleprice < (SELECT AVG(saleprice) 
                   FROM Orders);
SELECT orderid, custid, saleprice
FROM Orders AS od1
WHERE saleprice > (SELECT AVG(saleprice)
                   FROM Orders AS od2
                   WHERE od1.custid=od2.custid);

IN, NOT IN

  • IN

    • IN연산자는 주질의의 속성 값이 부속질의에서 제공한 결과 집합에 있는지 확인하는 역할

    • IN연산자에서 사용 가능한 부속질의는 결과로 다중 행, 다중 열을 반환할 수 있다

    • WHERE절에 사용되는 속성 값을 부속질의의 결과 집합과 비교해 하나라도 있으면 참이 된다

SELECT SUM(saleprice) AS '총판매액'
FROM Orders
WHERE custid IN(SELECT custid
                FROM Customer
                WHERE Customer.address LIKE '%대한민국%');
-- address에 '대한민국'이 포함된 결과 테이블이 스칼라 값이 아니라면 비교 연산자를 쓸 수 없다

ALL, SOME(ANY)

비교 연산자와 함께 사용된다

  • ALL : 모든

  • SOME(ANY) : 최소한 하나 이상

scalar_expression { 비교연산자 } { ALL | SOME | ANY} (부속질의)
SELECT orderid, saleprice
FROM Orders
WHERE saleprice > ALL(SELECT saleprice
                      FROM Orders
                      WHERE custid=3);

EXISTS, NOT EXISTS

  • 데이터의 존재 유무를 확인하는 연산자

  • 주질의에서 부속질의로 제공된 속성의 값이 부속질의의 조건을 만족하면 참이 되고, 주질의는 해당 행의 데이터를 출력한다.

  • 다른 연산자와 달리 왼쪽에 스칼라 값이나 열을 명시하지 않는다
    (때문에 반드시 부속질의에 주질의의 열 이름에 제공되어야 한다)

WHERE [NOT] EXISTS (부속질의)
SELECT SUM(saleprice) AS '총판매액'
FROM Orders od
WHERE EXISTS (SELECT custid
              FROM Customer AS cs
              WHERE address LIKE '%대한민국%' AND od.custid=cs.custid);

동작 방식에 따른 분류

기준 : 부속질의가 주질의의 값을 참조하는가

  • 상관 부속질의

    주질의의 특정 열 값을 부속질의가 상속받아 사용하는 형태

  • 비상관 부속질의(일반 부속질의)

    독립된 질의를 수행해서 결과 값을 가져오는 형태

반환화는 결과의 형태에 따른 분류

기준 : 부속질의가 반환하는 행이 단일 행인가 다중 행인가

  • 단일행 부속질의

    비교 연산자의 수행이나 스칼라 부속질의

  • 다중행 부속질의

    IN 연산자를 사용하여 여러 행 처리

0개의 댓글

관련 채용 정보