조건자를 사용하여 데이터 필터링
SELECT 및 FROM 절만 있는 가장 간단한 SELECT 문은 테이블의 모든 행을 평가합니다. WHERE 절을 사용하여 처리할 행을 결정하고 결과 집합을 잠재적으로 줄일 수 있는 조건을 정의합니다.
WHERE 절의 구조
WHERE 절은 하나 이상의 검색 조건으로 구성되며, 각 검색 조건은 테이블의 각 행에서 TRUE, FALSE, ‘unknown’으로 평가되어야 합니다. 행은 WHERE 절이 TRUE로 평가되는 경우에만 반환됩니다. 개별 조건은 데이터에 대한 필터 역할을 하며 '조건자'라고 합니다. 각 조건자는 일반적으로 기본 비교 연산자를 사용하여 테스트되는 조건을 포함합니다.
- =(같음)
- <>(같지 않음)
- >(보다 큼)
- >=(보다 크거나 같음)
- <(보다 작음)
- <=(보다 작거나 같음)
예를 들어 다음 쿼리는 ProductCategoryID 값이 2인 모든 제품을 반환합니다.
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID = 2;
마찬가지로 다음 쿼리는 ListPrice가 10.00 미만인 모든 제품을 반환합니다.
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ListPrice < 10.00;
IS NULL/IS NOT NULL
IS NULL 또는 IS NOT NULL을 사용하여 'unknown' 또는 NULL 값을 허용하거나 제외하도록 쉽게 필터링할 수도 있습니다.
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductName IS NOT NULL;
여러 조건
여러 조건자를 AND 및 OR 연산자와 괄호로 결합할 수 있습니다. 그러나 SQL Server는 한 번에 두 조건만 처리합니다. AND 연산자와 여러 조건을 연결할 때는 모든 조건이 TRUE여야 합니다. OR 연산자를 사용하여 두 조건을 연결하는 경우 결과 집합에 대해 하나 또는 둘 다 TRUE일 수 있습니다.
예를 들어 다음 쿼리는 범주 2의 제품 중 10.00보다 저렴한 제품을 반환합니다.
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID = 2
AND ListPrice < 10.00;
AND 연산자는 괄호를 사용하지 않는 한 OR 연산자보다 먼저 처리됩니다. 두 개 이상의 조건자를 사용할 때는 괄호를 사용하는 것이 좋습니다. 다음 쿼리는 범주 2 OR 3 AND 비용이 10.00 미만인 제품을 반환합니다.
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE (ProductCategoryID = 2 OR ProductCategoryID = 3)
AND (ListPrice < 10.00);
비교 연산자
Transact-SQL은 WHERE 절을 간소화하는 데 도움이 되는 비교 연산자를 포함합니다.
IN
IN 연산자는 OR로 연결된 동일한 열의 여러 같음 조건을 간소화합니다. 다음 예제와 같이 쿼리에서 여러 OR 조건을 사용하는 데 문제가 없습니다.
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID = 2
OR ProductCategoryID = 3
OR ProductCategoryID = 4;
그러나 IN을 사용하는 것은 명확하고 간결하며 쿼리 성능에는 영향을 주지 않습니다.
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ProductCategoryID IN (2, 3, 4);
BETWEEN
BETWEEN은 AND 연산자와 함께 두 조건을 사용하는 대신 값의 상한 및 하한을 필터링할 때 사용할 수 있는 또 다른 바로 가기입니다. 다음 두 쿼리는 동일한 의미를 갖습니다.
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ListPrice >= 1.00
AND ListPrice <= 10.00;
SELECT ProductCategoryID AS Category, ProductName
FROM Production.Product
WHERE ListPrice BETWEEN 1.00 AND 10.00;
BETWEEN 연산자는 포괄적 경계 값을 사용합니다. 따라서 가격이 1.00 또는 10.00인 제품이 결과에 포함됩니다. BETWEEN은 날짜 필드를 쿼리할 때도 유용합니다. 예를 들어 다음 쿼리에는 2012년 1월 1일부터 2012년 12월 31일 사이에 수정된 모든 제품 이름이 포함됩니다.
SELECT ProductName, ModifiedDate
FROM Production.Product
WHERE ModifiedDate BETWEEN '2012-01-01' AND '2012-12-31';
ProductName
ModifiedDate
Mountain Bike Socks, M
2012-01-01 00:00:00.000
HL Mountain Frame - Silver, 42
2012-03-05 00:00:00.000
HL Mountain Frame - Silver, 38
2012-08-29 00:00:00.000
Mountain-100 Silver, 38
2012-12-31 00:00:00.000
그러나 시간 범위를 지정하지 않으므로 2012-12-31 00:00:00.000 이후에 결과가 반환되지 않습니다. 날짜 및 시간을 정확하게 포함하려면 조건자에서 시간을 포함해야 합니다.
SELECT ProductName, ListPrice, ModifiedDate
FROM Production.Product
WHERE ModifiedDate BETWEEN '2012-01-01 00:00:00.000' AND '2012-12-31 23:59:59.999';
Greater Than(>) 및 Equals(=)과 같은 기본 비교 연산자는 날짜별로만 필터링할 때도 정확합니다.
SELECT ProductName, ListPrice, ModifiedDate
FROM Production.Product
WHERE ModifiedDate >= '2012-01-01'
AND ModifiedDate < '2013-01-01';
LIKE
문자 데이터에만 사용할 수 있는 이 최종 비교 연산자를 통해 와일드카드 문자와 정규식 패턴을 사용할 수 있습니다. 와일드카드를 사용하면 부분 문자열을 지정할 수 있습니다. 예를 들어 다음 쿼리를 사용하여 이름에 “mountain” 단어가 포함된 모든 제품을 반환할 수 있습니다.
SELECT Name, ListPrice
FROM SalesLT.Product
WHERE Name LIKE '%mountain%';
% 와일드카드는 0자 이상의 문자열을 나타내므로 다음과 같이 이름의 어디에서나 “mountain” 단어가 있는 제품이 결과에 포함됩니다.
Name
ListPrice
Mountain Bike Socks, M
9.50
Mountain Bike Socks, L
9.50
HL Mountain Frame - Silver, 42
1364.0
HL Mountain Frame - Black, 42
1349.60
HL Mountain Frame - Silver, 38
1364.50
Mountain-100 Silver, 38
3399.99
_(밑줄) 와일드카드를 사용하면 다음과 같이 단일 문자를 나타낼 수 있습니다.
SELECT ProductName, ListPrice
FROM SalesLT.Product
WHERE ProductName LIKE 'Mountain Bike Socks, _';
다음 결과에는 "Mountain Bike Socks"로 시작하는 제품과 다음의 단일 문자만 포함됩니다.
ProductName
ListPrice
Mountain Bike Socks, M
9.50
Mountain Bike Socks, L
9.50
찾으려는 복잡한 문자열 패턴도 정의할 수 있습니다. 예를 들어 다음 쿼리는 "Mountain-"으로 시작하는 이름을 가진 제품을 검색한 다음, 다음을 수행합니다.
- 0~9 사이의 3자
- 공백
- 모든 문자열
- 쉼표
- 공백
- 0~9 사이의 두 문자
SELECT ProductName, ListPrice
FROM SalesLT.Product
WHERE ProductName LIKE 'Mountain-[0-9][0-9][0-9] %, [0-9][0-9]';
이 쿼리의 결과는 다음과 같을 수 있습니다.
ProductName
ListPrice
Mountain-100 Silver, 38
3399.99
Mountain-100 Silver, 42
3399.99
Mountain-100 Black, 38
3399.99
Mountain-100 Black, 42
3399.99
Mountain-200 Silver, 38
2319.99
Mountain-200 Silver, 42
2319.99
Mountain-200 Black, 38
2319.99
Mountain-200 Black, 42
2319.99