example
문제
한번도 안 팔린 제품은 무엇인가?
Select Id, Name
from tblProducts
where Id NOT IN (Select distinct ProductId from tblProductsales)
Join
Select tblProducts.Id, Name
from tblProducts
left join tblProductSales
on tblProducts.Id = tblProductSales.ProductId
where tblProductSales.ProductId is null
문제
Name이랑 TotalQuantity sold 를 나타나게하는 쿼리가 필요
Subquery
Select Name,
(Select SUM(QuantitySold) from tblProductSales where ProductId = tblProducts.Id) as QtySold
from tblProducts
order by Name
Join
Select Name, SUM(QuantitySold) as QtySold
from tblProducts
left join tblProductSales
on tblProducts.Id = tblProductSales.ProductId
Group by Name
이 예시들로 알겠지만 , 서브쿼리는 그냥 간단히 단일 값을 리턴하고 SELECT, UPDATE, INSERT or DELETE 같은 그런 문법에 중첩될 수 있는 SELECT 문이다. 마소피셜 서브쿼리 32개까지 중첩가능!
From these examples, it should be very clear that, a subquery is simply a select statement, that returns a single value and can be nested inside a SELECT, UPDATE, INSERT, or DELETE statement. It is also possible to nest a subquery inside another subquery. According to MSDN, subqueries can be nested up to 32 levels.
Inner query = Sub query이다. 이 sub query 혹은 inner query를 가지고 있는 쿼리를 outer query라고 한다. 서브쿼리 내에서 존재하는 테이블의 열은 외부 쿼리 안에 있는 SELECT 절에 사용 될 수 없다.
Subqueries are always enclosed in paranthesis and are also called as inner queries, and the query containing the subquery is called as outer query. The columns from a table that is present only inside a subquery, cannot be used in the SELECT list of the outer query.
상관 하위 쿼리(Correlated sub query)
: 이해하기 쉽게 서브쿼리가 독자적으로 쓸 수 있으면 노 상관 하위 쿼리이고 외부쿼리의 열을 하나라도 참조하고 있으면 상관 하위 쿼리이다.
If the subquery depends on the ourter query for its values, then that sub query is called as correlated subquery.
Correlated subqueries get executed, once for every row that is selected by the outer query.
Correlated subquery, can not be executed independently of the outer query.
Select Name,
(Select SUM(QuantitySold) from tblProductSales where ProductId = tblProducts.Id)
from tblProducts
'Database > SQL Server' 카테고리의 다른 글
SQL Server - 모든 테이블의 리스트 T-SQL query (0) | 2020.12.10 |
---|---|
SQL Server - 무작위 데이터로 큰 테이블 만들기 Creating a large table with random data (0) | 2020.12.09 |
SQL Server - 트랜잭션 (Transaction) (0) | 2020.12.09 |
SQL Server - 에러 처리 Error handling(@@ERROR, TRY...CATCH) (0) | 2020.12.09 |
SQL Server - 피벗 오퍼레이터 (PIVOT Operator) (0) | 2020.12.09 |