SELECT 예제(Transact-SQL)

적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

이 문서에서는 SELECT 문을 사용하는 예제를 제공합니다.

이 문서에는 AdventureWorks2022 Microsoft SQL Server 샘플 및 커뮤니티 프로젝트 홈페이지에서 다운로드할 수 있는 샘플 데이터베이스가 필요합니다.

A. SELECT를 사용하여 행 및 열 검색

다음 예제에서는 세 가지 코드 예제를 보여 줍니다. 첫 번째 코드 예에서는 AdventureWorks2022 데이터베이스의 * 테이블에서 모든 행(WHERE 절이 지정되지 않음) 및 모든 열(Product 사용)을 반환합니다.

USE AdventureWorks2022;
GO

SELECT *
FROM Production.Product
ORDER BY Name ASC;

-- Alternate way.
USE AdventureWorks2022;
GO

SELECT p.*
FROM Production.Product AS p
ORDER BY Name ASC;
GO

이 예제에서는 데이터베이스의 테이블에서 AdventureWorks2022 모든 행(WHERE 절이 지정되지 않음)과 열(Name, ProductNumber, ListPrice)Product의 하위 집합만 반환합니다. 또한 열 머리글이 추가됩니다.

USE AdventureWorks2022;
GO

SELECT Name,
    ProductNumber,
    ListPrice AS Price
FROM Production.Product
ORDER BY Name ASC;
GO

이 예제에서는 제품 라인 R 이 있고 제조일이 1일 미만4인 행 Product 만 반환합니다.

USE AdventureWorks2022;
GO

SELECT Name,
    ProductNumber,
    ListPrice AS Price
FROM Production.Product
WHERE ProductLine = 'R'
    AND DaysToManufacture < 4
ORDER BY Name ASC;
GO

B. 열 머리글 및 계산과 함께 SELECT 사용

다음 예제에서는 테이블의 모든 행을 Product 반환합니다. 첫 번째 예제에서는 각 제품에 대한 총 판매액과 할인을 반환합니다. 두 번째 예제에서는 각 제품에 대한 총 수익이 계산됩니다.

USE AdventureWorks2022;
GO

SELECT p.Name AS ProductName,
    NonDiscountSales = (OrderQty * UnitPrice),
    Discounts = ((OrderQty * UnitPrice) * UnitPriceDiscount)
FROM Production.Product AS p
INNER JOIN Sales.SalesOrderDetail AS sod
    ON p.ProductID = sod.ProductID
ORDER BY ProductName DESC;
GO

각 판매 주문에서 각 제품의 수익을 계산하는 쿼리입니다.

USE AdventureWorks2022;
GO

SELECT 'Total income is',
    ((OrderQty * UnitPrice) * (1.0 - UnitPriceDiscount)),
    ' for ',
    p.Name AS ProductName
FROM Production.Product AS p
INNER JOIN Sales.SalesOrderDetail AS sod
    ON p.ProductID = sod.ProductID
ORDER BY ProductName ASC;
GO

C. SELECT에서 DISTINCT 사용

다음 예제에서는 중복된 타이틀 검색을 방지하는 데 사용합니다 DISTINCT .

USE AdventureWorks2022;
GO

SELECT DISTINCT JobTitle
FROM HumanResources.Employee
ORDER BY JobTitle;
GO

D. SELECT INTO를 사용하여 테이블 만들기

다음 첫 번째 예제에서는 에 이름이 지정된 #Bicyclestempdb임시 테이블을 만듭니다.

USE tempdb;
GO

IF OBJECT_ID(N'#Bicycles', N'U') IS NOT NULL
DROP TABLE #Bicycles;
GO

SELECT *
INTO #Bicycles
FROM AdventureWorks2022.Production.Product
WHERE ProductNumber LIKE 'BK%';
GO

이 두 번째 예제에서는 영구 테이블을 NewProducts만듭니다.

USE AdventureWorks2022;
GO

IF OBJECT_ID('dbo.NewProducts', 'U') IS NOT NULL
DROP TABLE dbo.NewProducts;
GO

ALTER DATABASE AdventureWorks2022 SET RECOVERY BULK_LOGGED;
GO

SELECT *
INTO dbo.NewProducts
FROM Production.Product
WHERE ListPrice > $25
    AND ListPrice < $100;
GO

ALTER DATABASE AdventureWorks2022 SET RECOVERY FULL;
GO

E. 상관 관계가 있는 하위 쿼리 사용

상관 하위 쿼리는 외부 쿼리에 따라 해당 값이 달라지는 쿼리입니다. 이 쿼리는 외부 쿼리에서 선택할 수 있는 각 행에 대해 한 번 반복적으로 실행할 수 있습니다.

첫 번째 예제에서는 키워드(keyword) 사용하는 EXISTS 것과 키워드(keyword) 간의 차이를 보여 주는 의미상 동일한 쿼리를 IN 보여 줍니다. 두 예는 모두 제품 모델이 긴 팔 로고 셔츠이고 ProductModelIDProduct 테이블 간에 ProductModel가 일치하는 각 제품 이름의 인스턴스 하나를 검색하는 유효한 하위 쿼리입니다.

USE AdventureWorks2022;
GO

SELECT DISTINCT Name
FROM Production.Product AS p
WHERE EXISTS (
    SELECT *
    FROM Production.ProductModel AS pm
    WHERE p.ProductModelID = pm.ProductModelID
        AND pm.Name LIKE 'Long-Sleeve Logo Jersey%'
);
GO

-- OR
USE AdventureWorks2022;
GO

SELECT DISTINCT Name
FROM Production.Product
WHERE ProductModelID IN (
    SELECT ProductModelID
    FROM Production.ProductModel AS pm
    WHERE p.ProductModelID = pm.ProductModelID
        AND Name LIKE 'Long-Sleeve Logo Jersey%'
);
GO

다음 예제에서는 테이블의 보너스 SalesPerson 가 있는 각 직원의 이름과 가족 이름 및 직원 ID 번호와 테이블의 직원 ID 번호가 일치하는 EmployeeSalesPerson 인스턴스 하나를 사용하고 IN 검색5000.00합니다.

USE AdventureWorks2022;
GO

SELECT DISTINCT p.LastName,
    p.FirstName
FROM Person.Person AS p
INNER JOIN HumanResources.Employee AS e
    ON e.BusinessEntityID = p.BusinessEntityID
WHERE 5000.00 IN (
    SELECT Bonus
    FROM Sales.SalesPerson AS sp
    WHERE e.BusinessEntityID = sp.BusinessEntityID
);
GO

이 문의 이전 하위 쿼리는 외부 쿼리와 독립적으로 평가할 수 없습니다. Employee.EmployeeID의 값이 필요하지만 이 값은 SQL Server 데이터베이스 엔진에서 Employee의 다른 행을 검사할 때 변경됩니다.

상관 하위 쿼리는 외부 쿼리의 HAVING 절에서도 사용할 수 있습니다. 다음 예에서는 최고 가격이 모델 평균 가격의 두 배 이상인 제품 모델을 찾습니다.

USE AdventureWorks2022;
GO

SELECT p1.ProductModelID
FROM Production.Product AS p1
GROUP BY p1.ProductModelID
HAVING MAX(p1.ListPrice) >= (
    SELECT AVG(p2.ListPrice) * 2
    FROM Production.Product AS p2
    WHERE p1.ProductModelID = p2.ProductModelID
);
GO

이 예제에서는 상관 관계가 있는 두 하위 쿼리를 사용하여 특정 제품을 판매한 직원의 이름을 찾습니다.

USE AdventureWorks2022;
GO

SELECT DISTINCT pp.LastName,
    pp.FirstName
FROM Person.Person pp
INNER JOIN HumanResources.Employee e
    ON e.BusinessEntityID = pp.BusinessEntityID
WHERE pp.BusinessEntityID IN (
    SELECT SalesPersonID
    FROM Sales.SalesOrderHeader
    WHERE SalesOrderID IN (
        SELECT SalesOrderID
        FROM Sales.SalesOrderDetail
        WHERE ProductID IN (
            SELECT ProductID
            FROM Production.Product p
            WHERE ProductNumber = 'BK-M68B-42'
        )
    )
);
GO

F. GROUP BY 사용

다음 예에서는 데이터베이스에서 각 판매 주문의 합계를 구합니다.

USE AdventureWorks2022;
GO

SELECT SalesOrderID,
    SUM(LineTotal) AS SubTotal
FROM Sales.SalesOrderDetail
GROUP BY SalesOrderID
ORDER BY SalesOrderID;
GO

GROUP BY 절을 사용했으므로 각 판매 주문에 대해 모든 판매의 합계를 포함하는 한 행만 반환됩니다.

G. 여러 그룹에서 GROUP BY 사용

다음 예제에서는 제품 ID 및 특별 제품 ID별로 그룹화된 평균 가격과 연간 매출 합계를 찾습니다.

USE AdventureWorks2022;
GO

SELECT ProductID,
    SpecialOfferID,
    AVG(UnitPrice) AS [Average Price],
    SUM(LineTotal) AS SubTotal
FROM Sales.SalesOrderDetail
GROUP BY ProductID,
    SpecialOfferID
ORDER BY ProductID;
GO

H. GROUP BY 및 WHERE 사용

다음 예제에서는 목록 가격이 다음보다 $1000큰 행만 검색한 후 결과를 그룹에 배치합니다.

USE AdventureWorks2022;
GO

SELECT ProductModelID,
    AVG(ListPrice) AS [Average List Price]
FROM Production.Product
WHERE ListPrice > $1000
GROUP BY ProductModelID
ORDER BY ProductModelID;
GO

9\. 식과 함께 GROUP BY 사용

다음 예에서는 식으로 그룹화를 수행합니다. 식에 집계 함수가 포함되지 않은 경우 식별로 그룹화할 수 있습니다.

USE AdventureWorks2022;
GO

SELECT AVG(OrderQty) AS [Average Quantity],
    NonDiscountSales = (OrderQty * UnitPrice)
FROM Sales.SalesOrderDetail
GROUP BY (OrderQty * UnitPrice)
ORDER BY (OrderQty * UnitPrice) DESC;
GO

J. ORDER BY와 함께 GROUP BY 사용

다음 예제에서는 각 유형의 제품의 평균 가격을 찾아 평균 가격으로 결과를 주문합니다.

USE AdventureWorks2022;
GO

SELECT ProductID,
    AVG(UnitPrice) AS [Average Price]
FROM Sales.SalesOrderDetail
WHERE OrderQty > 10
GROUP BY ProductID
ORDER BY AVG(UnitPrice);
GO

11. HAVING 절 사용

다음의 첫 번째 예제에서는 집계 함수가 있는 HAVING 절을 보여 줍니다. SalesOrderDetail 테이블의 행을 제품 ID별로 그룹화하고 평균 주문 수량이 5개 이하인 제품을 제외시킵니다. 두 번째 예제에서는 집계 함수가 HAVING 없는 절을 보여 줍니다.

USE AdventureWorks2022;
GO

SELECT ProductID
FROM Sales.SalesOrderDetail
GROUP BY ProductID
HAVING AVG(OrderQty) > 5
ORDER BY ProductID;
GO

이 쿼리는 절의 LIKE 절을 HAVING 사용합니다.

USE AdventureWorks2022;
GO
SELECT SalesOrderID, CarrierTrackingNumber
FROM Sales.SalesOrderDetail
GROUP BY SalesOrderID, CarrierTrackingNumber
HAVING CarrierTrackingNumber LIKE '4BD%'
ORDER BY SalesOrderID ;
GO

12. HAVING 및 GROUP BY 사용

다음 예제에서는 한 SELECT 문에서 , HAVING, WHEREORDER BY 절을 사용하는 GROUP BY방법을 보여 줍니다. 그룹 및 요약 값을 생성하지만 가격이 $25 이상인 제품과 평균 주문 수량이 5 미만인 제품을 제거한 후에 생성됩니다. 또한 결과를 다음으로 ProductID구성합니다.

USE AdventureWorks2022;
GO

SELECT ProductID
FROM Sales.SalesOrderDetail
WHERE UnitPrice < 25.00
GROUP BY ProductID
HAVING AVG(OrderQty) > 5
ORDER BY ProductID;
GO

13. SUM 및 AVG와 함께 HAVING 사용

다음 예에서는 SalesOrderDetail 테이블을 제품 ID별로 그룹화하며 총 주문액이 $1000000.00 이상이며 평균 주문 수량이 3 미만인 제품의 그룹만 포함합니다.

USE AdventureWorks2022;
GO

SELECT ProductID,
    AVG(OrderQty) AS AverageQuantity,
    SUM(LineTotal) AS Total
FROM Sales.SalesOrderDetail
GROUP BY ProductID
HAVING SUM(LineTotal) > $1000000.00
    AND AVG(OrderQty) < 3;
GO

총 판매액이 더 $2000000.00큰 제품을 보려면 다음 쿼리를 사용합니다.

USE AdventureWorks2022;
GO

SELECT ProductID, Total = SUM(LineTotal)
FROM Sales.SalesOrderDetail
GROUP BY ProductID
HAVING SUM(LineTotal) > $2000000.00;
GO

각 제품의 계산에 1,500개 이상의 항목이 있는지 확인하려면 판매된 항목보다 1500 적은 수의 합계를 반환하는 제품을 제거하는 데 사용합니다HAVING COUNT(*) > 1500. 쿼리는 다음과 같습니다.

USE AdventureWorks2022;
GO

SELECT ProductID, SUM(LineTotal) AS Total
FROM Sales.SalesOrderDetail
GROUP BY ProductID
HAVING COUNT(*) > 1500;
GO

14. INDEX 최적화 프로그램 힌트 사용

다음 예에서는 INDEX 최적화 프로그램 힌트를 사용하는 두 가지 방법을 보여 줍니다. 첫 번째 예제에서는 최적화 프로그램에서 비클러스터형 인덱스를 사용하여 테이블에서 행을 검색하도록 강제하는 방법을 보여 줍니다. 두 번째 예제에서는 인덱스 0을 사용하여 테이블 검사를 강제로 수행합니다.

USE AdventureWorks2022;
GO

SELECT pp.FirstName,
    pp.LastName,
    e.NationalIDNumber
FROM HumanResources.Employee AS e WITH (INDEX (AK_Employee_NationalIDNumber))
INNER JOIN Person.Person AS pp
    ON e.BusinessEntityID = pp.BusinessEntityID
WHERE LastName = 'Johnson';
GO

-- Force a table scan by using INDEX = 0.
USE AdventureWorks2022;
GO

SELECT pp.LastName,
    pp.FirstName,
    e.JobTitle
FROM HumanResources.Employee AS e WITH (INDEX = 0)
INNER JOIN Person.Person AS pp
    ON e.BusinessEntityID = pp.BusinessEntityID
WHERE LastName = 'Johnson';
GO

13. OPTION 및 GROUP 힌트 사용

다음 예에서는 OPTION (GROUP) 절과 함께 GROUP BY 절을 사용하는 방법을 보여 줍니다.

USE AdventureWorks2022;
GO

SELECT ProductID, OrderQty, SUM(LineTotal) AS Total
FROM Sales.SalesOrderDetail
WHERE UnitPrice < $5.00
GROUP BY ProductID, OrderQty
ORDER BY ProductID, OrderQty
OPTION (HASH GROUP, FAST 10);
GO

15. UNION 쿼리 힌트 사용

다음 예에서는 MERGE UNION 쿼리 힌트를 사용합니다.

USE AdventureWorks2022;
GO

SELECT BusinessEntityID,
    JobTitle,
    HireDate,
    VacationHours,
    SickLeaveHours
FROM HumanResources.Employee AS e1

UNION

SELECT BusinessEntityID,
    JobTitle,
    HireDate,
    VacationHours,
    SickLeaveHours
FROM HumanResources.Employee AS e2
OPTION (MERGE UNION);
GO

16. UNION 사용

다음 예에서는 결과 집합에 ProductModelIDName 테이블의 ProductModelGloves 열의 내용이 포함됩니다.

USE AdventureWorks2022;
GO

IF OBJECT_ID('dbo.Gloves', 'U') IS NOT NULL
DROP TABLE dbo.Gloves;
GO

-- Create Gloves table.
SELECT ProductModelID, Name
INTO dbo.Gloves
FROM Production.ProductModel
WHERE ProductModelID IN (3, 4);
GO

-- Here is the simple union.
USE AdventureWorks2022;
GO

SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID NOT IN (3, 4)

UNION

SELECT ProductModelID, Name
FROM dbo.Gloves
ORDER BY Name;
GO

17. UNION에서 SELECT INTO 사용

다음 예제 INTO 에서 두 번째 SELECT 문의 절은 명명된 ProductResults 테이블이 지정된 열과 Gloves 테이블의 합합에 대한 최종 결과 집합을 ProductModel 보유하도록 지정합니다. Gloves 테이블은 첫 번째 SELECT 문에서 생성됩니다.

USE AdventureWorks2022;
GO

IF OBJECT_ID('dbo.ProductResults', 'U') IS NOT NULL
DROP TABLE dbo.ProductResults;
GO

IF OBJECT_ID('dbo.Gloves', 'U') IS NOT NULL
DROP TABLE dbo.Gloves;
GO

-- Create Gloves table.
SELECT ProductModelID, Name
INTO dbo.Gloves
FROM Production.ProductModel
WHERE ProductModelID IN (3, 4);
GO

USE AdventureWorks2022;
GO

SELECT ProductModelID, Name
INTO dbo.ProductResults
FROM Production.ProductModel
WHERE ProductModelID NOT IN (3, 4)

UNION

SELECT ProductModelID, Name
FROM dbo.Gloves;
GO

SELECT ProductModelID, Name
FROM dbo.ProductResults;

18. ORDER BY와 함께 두 SELECT 문의 UNION 사용

UNION 절과 함께 사용되는 특정 매개 변수의 순서는 중요합니다. 다음 예에서는 출력 시 이름이 바뀌는 열이 있는 두 UNION 문에서 SELECT을 잘못 사용한 경우와 올바르게 사용한 경우를 보여 줍니다.

USE AdventureWorks2022;
GO

IF OBJECT_ID('dbo.Gloves', 'U') IS NOT NULL
DROP TABLE dbo.Gloves;
GO

-- Create Gloves table.
SELECT ProductModelID, Name
INTO dbo.Gloves
FROM Production.ProductModel
WHERE ProductModelID IN (3, 4);
GO

/* INCORRECT */
USE AdventureWorks2022;
GO

SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID NOT IN (3, 4)
ORDER BY Name

UNION

SELECT ProductModelID, Name
FROM dbo.Gloves;
GO

/* CORRECT */
USE AdventureWorks2022;
GO

SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID NOT IN (3, 4)

UNION

SELECT ProductModelID, Name
FROM dbo.Gloves
ORDER BY Name;
GO

S. 세 개의 SELECT 문의 UNION을 사용하여 ALL 및 괄호의 효과를 표시합니다.

다음 예제에서는 모두 동일한 5개의 데이터 행을 가진 세 테이블의 결과를 결합하는 데 사용합니다 UNION . 첫 번째 예에서는 UNION ALL을 사용하여 중복 레코드를 보여 주고 15개 행을 모두 반환합니다. 두 번째 예제에서는 세 SELECT 문의 결합된 결과에서 중복 행을 제거하지 않고 ALL 사용하고 UNION 5개의 행을 반환합니다.

세 번째 예에서는 첫 번째 ALL에서 UNION을 사용하고 UNION을 사용하지 않는 두 번째 ALL은 괄호로 묶습니다. 두 번째는 UNION 괄호 안에 있으므로 먼저 처리되고, 옵션이 사용되지 않고 중복 항목이 제거되므로 5개의 행 ALL 을 반환합니다. 이러한 5개 행은 키워드(keyword) 사용하여 UNION ALL 첫 번째 SELECT 행의 결과와 결합됩니다. 이 예제에서는 5개 행으로 된 두 집합 간의 중복 항목을 제거하지 않습니다. 따라서 마지막 결과에는 10개의 행이 포함됩니다.

USE AdventureWorks2022;
GO

IF OBJECT_ID('dbo.EmployeeOne', 'U') IS NOT NULL
DROP TABLE dbo.EmployeeOne;
GO

IF OBJECT_ID('dbo.EmployeeTwo', 'U') IS NOT NULL
DROP TABLE dbo.EmployeeTwo;
GO

IF OBJECT_ID('dbo.EmployeeThree', 'U') IS NOT NULL
DROP TABLE dbo.EmployeeThree;
GO

SELECT pp.LastName, pp.FirstName, e.JobTitle
INTO dbo.EmployeeOne
FROM Person.Person AS pp
INNER JOIN HumanResources.Employee AS e
    ON e.BusinessEntityID = pp.BusinessEntityID
WHERE LastName = 'Johnson';
GO

SELECT pp.LastName, pp.FirstName, e.JobTitle
INTO dbo.EmployeeTwo
FROM Person.Person AS pp
INNER JOIN HumanResources.Employee AS e
    ON e.BusinessEntityID = pp.BusinessEntityID
WHERE LastName = 'Johnson';
GO

SELECT pp.LastName, pp.FirstName, e.JobTitle
INTO dbo.EmployeeThree
FROM Person.Person AS pp
INNER JOIN HumanResources.Employee AS e
    ON e.BusinessEntityID = pp.BusinessEntityID
WHERE LastName = 'Johnson';
GO

-- Union ALL
SELECT LastName, FirstName, JobTitle
FROM dbo.EmployeeOne

UNION ALL

SELECT LastName, FirstName, JobTitle
FROM dbo.EmployeeTwo

UNION ALL

SELECT LastName, FirstName, JobTitle
FROM dbo.EmployeeThree;
GO

SELECT LastName, FirstName, JobTitle
FROM dbo.EmployeeOne

UNION

SELECT LastName, FirstName, JobTitle
FROM dbo.EmployeeTwo

UNION

SELECT LastName, FirstName, JobTitle
FROM dbo.EmployeeThree;
GO

SELECT LastName, FirstName, JobTitle
FROM dbo.EmployeeOne

UNION ALL

(
    SELECT LastName, FirstName, JobTitle
    FROM dbo.EmployeeTwo

    UNION

    SELECT LastName, FirstName, JobTitle
    FROM dbo.EmployeeThree
);
GO