SELECT 예제(Transact-SQL)
적용 대상: SQL ServerAzure SQL Database Azure SQL Managed Instance
이 문서에서는 SELECT 문을 사용하는 예제를 제공합니다.
이 문서의 Transact-SQL 코드 샘플은 Microsoft SQL Server 샘플 및 커뮤니티 프로젝트 홈페이지에서 다운로드할 수 있는 데이터베이스 또는 AdventureWorksDW2022
샘플 데이터베이스를 사용합니다AdventureWorks2022
.
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를 사용하여 테이블 만들기
다음 첫 번째 예제에서는 에 이름이 지정된 #Bicycles
tempdb
임시 테이블을 만듭니다.
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. 상관 관계가 있는 하위 쿼리 사용
상관 하위 쿼리는 외부 쿼리에 따라 해당 값이 달라지는 쿼리입니다. 이 쿼리는 외부 쿼리에서 선택할 수 있는 각 행에 대해 한 번 반복적으로 실행할 수 있습니다.
첫 번째 예제에서는 키워드와 키워드 사용의 차이점을 보여 주는 의미상 동일한 쿼리를 EXISTS
IN
보여 줍니다. 두 예는 모두 제품 모델이 긴 팔 로고 셔츠이고 ProductModelID
와 Product
테이블 간에 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 번호가 일치하는 Employee
SalesPerson
인스턴스 하나를 사용하고 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. GROUP BY 및 ORDER 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
K. 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
, WHERE
및 ORDER 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 사용
다음 예에서는 결과 집합에 ProductModelID
및 Name
테이블의 ProductModel
및 Gloves
열의 내용이 포함됩니다.
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개 행은 키워드를 사용하여 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
관련 콘텐츠
- CREATE TRIGGER(Transact-SQL)
- CREATE VIEW(Transact-SQL)
- DELETE (Transact-SQL)
- EXECUTE(Transact-SQL)
- 식(Transact-SQL)
- INSERT(Transact-SQL)
- LIKE(Transact-SQL)
- 집합 연산자 - UNION(Transact-SQL)
- 집합 연산자 - EXCEPT 및 INTERSECT(Transact-SQL)
- UPDATE(Transact-SQL)
- WHERE(Transact-SQL)
- PathName(Transact-SQL)
- SELECT - INTO 절(Transact-SQL)