두 테이블을 연관시킬 때 조인을 선택할지 부속질의를 선택할지 여부는 데이터의 형태와 양에 따라 달라진다.
일반적으로 데이터가 대량일 경우 데이터를 모두 합쳐서 연산하는 조인보다 필요한 데이터만 찾아서 공급해주는 부속질의의 성능이 더 좋다
(조인한 뒤 필요 없는 정보를 가려내는 것보다 필요 없는 정보를 다 가려낸 뒤 조인하는 것이 더 성능이 좋다는 듯하다)
부속질의의 결과 값을 단일 행, 단일 열의 스칼라 값으로 반환해야 한다
스칼라 부속질의는 원칙적으로 스칼라 값이 들어갈 수 있는 모든 곳에 사용할 수 있으며, 일반적으로 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;
말그대로 뷰를 인라인으로 작성하는 것
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절은 보통 데이터를 선택하는 조건 혹은 술어와 같이 사용되므로 중첩질의를 술어 부속질의(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
IN연산자는 주질의의 속성 값이 부속질의에서 제공한 결과 집합에 있는지 확인하는 역할
IN연산자에서 사용 가능한 부속질의는 결과로 다중 행, 다중 열을 반환할 수 있다
WHERE절에 사용되는 속성 값을 부속질의의 결과 집합과 비교해 하나라도 있으면 참이 된다
SELECT SUM(saleprice) AS '총판매액'
FROM Orders
WHERE custid IN(SELECT custid
FROM Customer
WHERE Customer.address LIKE '%대한민국%');
-- address에 '대한민국'이 포함된 결과 테이블이 스칼라 값이 아니라면 비교 연산자를 쓸 수 없다
비교 연산자와 함께 사용된다
ALL : 모든
SOME(ANY) : 최소한 하나 이상
scalar_expression { 비교연산자 } { ALL | SOME | ANY} (부속질의)
SELECT orderid, saleprice
FROM Orders
WHERE saleprice > ALL(SELECT saleprice
FROM Orders
WHERE custid=3);
데이터의 존재 유무를 확인하는 연산자
주질의에서 부속질의로 제공된 속성의 값이 부속질의의 조건을 만족하면 참이 되고, 주질의는 해당 행의 데이터를 출력한다.
다른 연산자와 달리 왼쪽에 스칼라 값이나 열을 명시하지 않는다
(때문에 반드시 부속질의에 주질의의 열 이름에 제공되어야 한다)
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 연산자를 사용하여 여러 행 처리