
본 강의는 메타코드M에서 진행되는 이상훈 강사님의 실무에 적합한 SQL역량을 키우기 위해 준비된 강의입니다.
강의 정보는 아래 이미지 링크를 클릭해 주세요

Sub-query는 강사님의 설명으로는 '가상의 테이블'을 만들어서 활용하는 방법이라고 해서 처음에는 막 와닿지는 않았다.
하지만 공부를 하니 뭔지 딱 이해가 되긴 했다.
중첩 의문문, 중첩 반복문에서 안쪽에 씌여지는 조건 혹은 반복문이 Sub-Query가 된다 라고 이해했다.
대신에 이 중첩된 구문에서 안쪽에 해당하는 구문이 '데이터셋'이 되기에 이걸 서브 쿼리라 생각하면 되는 것 같다.
이 안쪽에 해당하는 구문이 1개의 값만 반환하면 Scalar SubQuery가 되는 것이고
데이터 셋을 반환하면 Table SubQuery가 되는 것이다.
그냥 Return에서 변수 한개, 아니면 배열같이 리스트 반환 이 차이라 보면 될 듯 하다.

스칼라 서브 쿼리는 return이 1개의 값(변수)만을 반환할 때 사용되며
당연히 해당 구문은 where, having과 같이 조건문을 만드는 구문에서 주로 사용된다 볼 수 있다.

예를 들어 위의 예제처럼
ProductName, BuyPrice 컬럼의 데이터셋을 조사하는데 이때, BuyPrice 컬럼의 데이터를 평균을 낸 뒤 이 평균값보다 더 비싼 BuyPrice컬럼만 조사하고 싶다.
이러면 스칼라 서브쿼리를 사용하는 것이다.

이러면 WHERE구문에 적용된 서브쿼리의 값을 조사해 본다면 위 사진처럼 1개의 값 하나만 갖게 된다

이를 WHERE조건문에 scalar-subQuery형식으로 적용한다 볼 수 있다.

다음으로 테이블 서브쿼리는 스칼라 서브쿼리와는 다르게 return값이 하나의 테이블로 활용 가능한 데이터셋 형태로 출력된다는 것이다.
따라서 하나의 계산된 테이블을 따로 만든 것이니 이것은 추로 from 구문에서 사용되며
사용 시 from구문에 서브쿼리를 적용하면 무조건 AS (서브쿼리명)으로 재 명기를 해줘야 한다.
이 서브쿼리명은 볼 수는 없지만 코드의 순서를 확인하기 위해 무조건 기재를 해야한다.

예제 문제처럼 주문을 5번 이상 주문한 고객의 고객 번호를 조회한다 쳐보자

이럴때는 첫번째로 고객의 번호(customerNumber)과 해당고객 별로 그룹화된 order count 정보가 필요하다
이를 하나의 테이블로 두고

이 테이블을 from구문으로 서브쿼리로 불러온 뒤 해당 테이블에서 조건식을 적용하여 주문을 5회 이상 주문한 고객의 고객번호를 추출해낸다.

최대 주문 개수를 가진 고객의 ID정보를 추출하자 -> 스칼라 서브쿼리 문제



customers, order테이블을 join한 뒤

의미있는 컬럼 3개만을 색인한다.

다음 orderNumber을 group by :count구문을 통해 그룹화 한 뒤

여기서 max값을 추출하는 스칼라 서브쿼리를 생성한다.

이 스칼라 서브쿼리를 customerNumber 컬럼만 선택한 테이블에서 Having 조건문의 조건 값으로 활용한다.



강사님은 3중첩 쿼리 구성을 통해 문제를 풀이하셧다...

Products와 Orderdetails 테이블을 이용해 각 제품별로 총 주문금액(quantity Ordered * PriceEach)를 계산하고, 그 결과를 기반으로 상위 5개의 제품만 조회




Join후 의미있는 컬럼만 선택 색인

위 선택 색인한 데이터셋에서 '총 주문 금액'을 계산한 컬럼 생성

위 '총 주문금액'이 담긴 컬럼이 있는 데이터셋을 '서브쿼리'로 사용하여 제품 이름 별 총 주문금액을 group by : sum조건을 통해 데이터셋의 그룹화

이후 order by, limit함수로 상위 5개 제품만 조건 색인


이 서브쿼리를 적용하여 문제를 풀이하는 방법은
그 절차가 무한이 많아 질 수 있다.
따라서 문제에 대한 독해를 잘 해야 할거 같다...

이거는 좀 이해가 안되긴 하는데
내가 이해한 바로는 WHERE 조건문으로 측정 조건이 걸리면 대략 스칼라 서브쿼리나 아니면 1개의 데이터만 갖는 값이 걸리지만,
여기에 데이터셋(배열) 같이 테이블 서브쿼리 같은게 걸리면
그 조건문을 for : if 이런 식으로 반복하여 해당 조건문을 수행한다 라고 생각하면 된다.


강사님은 from에 2개의 테이블을 걸었지만
동일한 결과값을 출력하는 Join구문으로 설명하자면

이렇게 WHERE구문으로는 조건문은 스칼라 서브쿼리가 오는게 일반적인데 여기에 데이터셋이 와도 반복 조건문 수행을 통해 데이터를 찾아낸다.. 뭐 이런것이다...
아무튼 서브쿼리는 사용방식이 꽤 유연하다.. 뭐 이렇게 이해하면 될 듯하다...