집 >데이터 베이스 >MySQL 튜토리얼 >하위 쿼리에 NULL 값이 있을 때 내 SQL 'NOT IN' 쿼리가 결과를 반환하지 않는 이유는 무엇입니까?
SQL의 NOT IN
절과 NULL 값 문제
SQL의 NOT IN
연산자는 열의 값이 지정된 값 집합 내에서 발견되지 않은 행을 선택하도록 설계되었습니다. 그러나 이 연산자는 비교 집합에 NULL
값이 포함되어 있으면 예기치 않게 동작합니다. 이 문서에서는 이 동작에 대해 설명하고 해결 방법을 제공합니다.
문제:
하위 데이터베이스(Inventory
)에는 없는 제품을 하나의 데이터베이스(Subset
)에서 찾으려는 시나리오를 생각해 보세요. NOT IN
을 사용하는 일반적인 접근 방식은 다음과 같습니다.
<code class="language-sql">SELECT stock.IdStock, stock.Descr FROM [Inventory].[dbo].[Stock] stock WHERE stock.IdStock NOT IN (SELECT foreignStockId FROM [Subset].[dbo].[Products]);</code>
하위 쿼리(SELECT foreignStockId FROM [Subset].[dbo].[Products]
)가 NULL
값을 반환하면 전체 NOT IN
조건이 불확정 상태가 되어 빈 결과 집합이 생성됩니다. IdStock
에 [Inventory].[dbo].[Stock]
값이 에는 없습니다.[Subset].[dbo].[Products]
이런 일이 발생하는 이유:
SQL은, TRUE
, FALSE
의 세 가지 값 논리를 사용합니다. 값을 UNKNOWN
과 비교하면 결과는 항상 NULL
입니다. UNKNOWN
은 기본적으로 NOT IN
모든FALSE
비교에 대해 값이 인지 확인합니다. 은 UNKNOWN
이 아니므로 하위 쿼리 결과 집합의 모든 FALSE
은 전체 NULL
조건을 빈 집합으로 평가합니다.NOT IN
해결책:
이 문제를 방지하려면 다음 방법 중 하나를 사용하세요.
1. 명시적으로 NULL 제외: 값을 필터링하도록 하위 쿼리 수정:NULL
<code class="language-sql">SELECT stock.IdStock, stock.Descr FROM [Inventory].[dbo].[Stock] stock WHERE stock.IdStock NOT IN (SELECT foreignStockId FROM [Subset].[dbo].[Products] WHERE foreignStockId IS NOT NULL);</code>
2. 사용:NOT EXISTS
일반적으로 이 접근 방식은 명확성과 효율성 때문에 선호됩니다.
<code class="language-sql">SELECT stock.IdStock, stock.Descr FROM [Inventory].[dbo].[Stock] stock WHERE NOT EXISTS (SELECT * FROM [Subset].[dbo].[Products] p WHERE p.foreignStockId = stock.IdStock);</code>
절은 조건과 일치하는 하위 쿼리에 NOT EXISTS
없음 행이 있는지 확인합니다. 명시적인 제외 없이 값을 올바르게 처리합니다.NULL
값과 NULL
연산자 간의 상호 작용을 이해하면 더욱 강력하고 안정적인 SQL 쿼리를 작성할 수 있습니다. NOT IN
대안은 비교 집합의 잠재적인 NOT EXISTS
값을 처리할 때 더 깨끗하고 효율적인 솔루션인 경우가 많습니다.NULL
위 내용은 하위 쿼리에 NULL 값이 있을 때 내 SQL 'NOT IN' 쿼리가 결과를 반환하지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!