다음을 통해 공유


WHERE 및 HAVING을 사용하여 행 필터링

SELECT 문에서 WHERE 절과 HAVING 절은 원본 테이블에서 결과 집합을 작성하는 데 사용되는 행을 제어합니다. WHERE와 HAVING은 필터이며 일련의 검색 조건을 지정하며 이 조건에 맞는 행으로만 결과 집합이 작성됩니다. 검색 조건에 맞는 행은 결과 집합에 포함될 자격이 있는 것으로 간주됩니다. 예를 들어 다음 SELECT 문의 WHERE 절은 특정 판매 구역으로만 행을 한정합니다.

USE AdventureWorks2008R2;
GO
SELECT c.CustomerID, s.Name
FROM AdventureWorks2008R2.Sales.Customer c
JOIN AdventureWorks2008R2.Sales.Store s
ON s.BusinessEntityID = c.CustomerID
WHERE c.TerritoryID = 1;

HAVING 절은 대개 GROUP BY 절과 함께 집계 값의 결과를 필터링하는 데 사용됩니다. 그러나 GROUP BY 없이 HAVING을 지정할 수 있습니다. HAVING 절은 WHERE 절이 필터링한 후에 적용되는 추가 필터를 지정합니다. 이러한 필터는 SELECT 목록에 사용되는 집계 함수에 적용할 수 있습니다. 다음 예에서 WHERE 절은 단가가 $100를 넘는 제품 판매 주문으로 한정하고 HAVING 절은 이 중 수량이 100개를 넘는 주문으로 결과를 다시 제한합니다.

USE AdventureWorks2008R2;
GO
SELECT OrdD1.SalesOrderID AS OrderID,
       SUM(OrdD1.OrderQty) AS "Units Sold",
       SUM(OrdD1.UnitPrice * OrdD1.OrderQty) AS Revenue
FROM Sales.SalesOrderDetail AS OrdD1
WHERE OrdD1.SalesOrderID in (SELECT OrdD2.SalesOrderID
    FROM Sales.SalesOrderDetail AS OrdD2
    WHERE OrdD2.UnitPrice > $100)
GROUP BY OrdD1.SalesOrderID
HAVING SUM(OrdD1.OrderQty) > 100;

WHERE 절 및 HAVING 절의 검색 조건

WHERE 절과 HAVING 절의 검색 조건이나 제한에는 다음이 포함될 수 있습니다.

  • 비교 연산자(예: =, < >, < 및 >

    예를 들어 다음은 Product 테이블에서 H 클래스의 제품에 대한 행을 검색하는 쿼리입니다.

    SELECT ProductID, Name
    FROM AdventureWorks2008R2.Production.Product
    WHERE Class = 'H'
    ORDER BY ProductID;
    
  • 범위(BETWEEN 및 NOT BETWEEN)

    예를 들어 다음은 Product 테이블에서 제품 가격이 100달러에서 500달러 사이인 행을 검색하는 쿼리입니다.

    SELECT ProductID, Name
    FROM AdventureWorks2008R2.Production.Product
    WHERE ListPrice BETWEEN 100 and 500
    ORDER BY ListPrice;
    
  • 목록(IN, NOT IN)

    예를 들어 다음은 특정 색상 목록에 해당하는 제품을 검색하는 쿼리입니다.

    SELECT ProductID, Name
    FROM AdventureWorks2008R2.Production.Product
    WHERE Color IN ('Multi', 'Silver')
    ORDER BY ProductID;
    
  • 패턴 일치(LIKE 및 NOT LIKE)

    예를 들어 다음은 Product 테이블에서 제품 이름이 Ch로 시작하는 행을 검색하는 쿼리입니다.

    SELECT ProductID, Name
    FROM AdventureWorks2008R2.Production.Product
    WHERE Name LIKE 'Ch%'
    ORDER BY ProductID;
    

    [!참고]

    text 열에서 유일하게 사용할 수 있는 WHERE 조건은 PATINDEX() 등의 다른 데이터 형식을 반환하는 함수나 IS NULL, IS NOT NULL, LIKE, NOT LIKE 등의 연산자입니다.

  • Null 값(IS NULL 및 IS NOT NULL)

    예를 들어 다음은 Customer 테이블에서 고객의 영업 사원 ID가 NULL이 아닌 행을 검색하는 쿼리입니다.

    SELECT s.Name
    FROM AdventureWorks2008R2.Sales.Customer c
    JOIN AdventureWorks2008R2.Sales.Store s
    ON c.CustomerID = S.CustomerID
    WHERE c.CustomerID IS NOT NULL
    ORDER BY s.Name;
    

    [!참고]

    Null 값을 비교할 때는 주의해야 합니다. 예를 들어 = NULL을 지정하는 것은 IS NULL을 지정하는 것과 다릅니다. 자세한 내용은 Null 값을 참조하십시오.

  • 모든 레코드(=ALL, >ALL, <= ALL, ANY)

    예를 들어 다음은 SalesOrderDetail 테이블에서 제품 출하 수량이 H 클래스에 속하는 제품의 출하 수량보다 큰 주문과 제품 ID를 검색하는 쿼리입니다.

    USE AdventureWorks2008R2;
    GO
    SELECT OrdD1.SalesOrderID, OrdD1.ProductID
    FROM Sales.SalesOrderDetail OrdD1
    WHERE OrdD1.OrderQty > ALL
          (SELECT OrdD2.OrderQty
           FROM Sales.SalesOrderDetail OrdD2 JOIN Production.Product Prd
                 ON OrdD2.ProductID = Prd.ProductID
           WHERE Prd.Class = 'H');
    GO
    
  • 여러 조건의 조합(AND, OR, NOT)

    예를 들어 다음은 제품 가격이 500달러 미만이거나 제품 클래스가 L이고 제품 라인이 S인 제품을 모두 검색하는 쿼리입니다.

    SELECT ProductID, Name
    FROM AdventureWorks2008R2.Production.Product
    WHERE ListPrice < 500
       OR (Class = 'L' AND ProductLine = 'S');
    

    WHERE 절에서 유니코드 문자열을 검색하는 경우 다음과 같이 검색 문자열 앞에 N 문자를 넣습니다.

    SELECT BusinessEntityID 
    FROM AdventureWorks2008R2.Sales.Store 
    WHERE Name = N'Riders Company';