適用於:SQL Server
Azure SQL Database
Azure SQL 受控執行個體
Microsoft Fabric 中的 SQL 資料庫
本文提供使用 SELECT 語句的範例。
本文中的程式碼範例使用AdventureWorks2025了 or AdventureWorksDW2025 範例資料庫,你可以從 Azure Data SQL 範例倉庫的 GitHub 倉庫下載。
A. 使用 SELECT 擷取資料列和資料行
下列範例會顯示三個程式碼範例。 第一個程式碼範例會回傳資料庫中資料表WHERE中所有列(未*指定子句)及所有欄位(使用 )。ProductAdventureWorks2025
USE AdventureWorks2025;
GO
SELECT *
FROM Production.Product
ORDER BY Name ASC;
-- Alternate way.
USE AdventureWorks2025;
GO
SELECT p.*
FROM Production.Product AS p
ORDER BY Name ASC;
GO
此範例回傳所有列(未WHERE指定子句),且僅回傳資料庫中資料表Name中欄位(,ProductNumberListPrice , Product)AdventureWorks2025的子集。 另外,也會加入一個資料行標題。
USE AdventureWorks2025;
GO
SELECT Name,
ProductNumber,
ListPrice AS Price
FROM Production.Product
ORDER BY Name ASC;
GO
此範例僅回傳產品線為 且Product生產天數少R於 的列4。
USE AdventureWorks2025;
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 AdventureWorks2025;
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 AdventureWorks2025;
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. 使用 DISTINCT 與 SELECT
下列範例會利用 DISTINCT 來防止擷取重複的標題。
USE AdventureWorks2025;
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 AdventureWorks2025.Production.Product
WHERE ProductNumber LIKE 'BK%';
GO
第二個範例會建立永久資料表 NewProducts。
USE AdventureWorks2025;
GO
IF OBJECT_ID('dbo.NewProducts', 'U') IS NOT NULL
DROP TABLE dbo.NewProducts;
GO
ALTER DATABASE AdventureWorks2025 SET RECOVERY BULK_LOGGED;
GO
SELECT *
INTO dbo.NewProducts
FROM Production.Product
WHERE ListPrice > $25
AND ListPrice < $100;
GO
ALTER DATABASE AdventureWorks2025 SET RECOVERY FULL;
GO
E. 使用相互關聯的子查詢
這是一項相依於外部查詢來取得其值的相互關聯子查詢。 此查詢可重複執行,對外層查詢選擇的每一列執行一次。
第一個範例顯示語意相等的查詢,以說明使用 EXISTS 關鍵字和 IN 關鍵字之間的差異。 兩者都是有效子查詢,擷取產品模型是長袖標誌緊身內衣之各項產品名稱的單一執行個體的,ProductModelID 和 Product 資料表的 ProductModel 號碼相符。
USE AdventureWorks2025;
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 AdventureWorks2025;
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
下一個範例會使用 IN 並擷取數據表SalesPerson中5000.00獎金的每個員工名字和家族名稱的一個實例,以及員工標識碼與 和 Employee 數據表中SalesPerson相符的實例。
USE AdventureWorks2025;
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 AdventureWorks2025;
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 AdventureWorks2025;
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 AdventureWorks2025;
GO
SELECT SalesOrderID,
SUM(LineTotal) AS SubTotal
FROM Sales.SalesOrderDetail
GROUP BY SalesOrderID
ORDER BY SalesOrderID;
GO
由於該 GROUP BY 子句的關係,查詢只會回傳一列,包含每個銷售訂單所有銷售額的總和。
G. 使用 GROUP BY 與多個群組
下列範例會依照產品識別碼和特殊供應項目識別碼,來尋找平均價格和年初至今的銷售總和。
USE AdventureWorks2025;
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 AdventureWorks2025;
GO
SELECT ProductModelID,
AVG(ListPrice) AS [Average List Price]
FROM Production.Product
WHERE ListPrice > $1000
GROUP BY ProductModelID
ORDER BY ProductModelID;
GO
I. 使用 GROUP BY 與運算式
下列範例會依運算式來分組。 如果表達式不包含聚合函數,您可以依表示式分組。
USE AdventureWorks2025;
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 AdventureWorks2025;
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 資料表中的資料列,且會刪除平均訂單數量是五或更少的產品。 第二個範例顯示不含彙總函式的 HAVING 子句。
USE AdventureWorks2025;
GO
SELECT ProductID
FROM Sales.SalesOrderDetail
GROUP BY ProductID
HAVING AVG(OrderQty) > 5
ORDER BY ProductID;
GO
這個查詢在 LIKE 子句中使用 HAVING 子句。
USE AdventureWorks2025;
GO
SELECT SalesOrderID,
CarrierTrackingNumber
FROM Sales.SalesOrderDetail
GROUP BY SalesOrderID, CarrierTrackingNumber
HAVING CarrierTrackingNumber LIKE '4BD%'
ORDER BY SalesOrderID;
L. 使用 HAVING 和 GROUP BY
下列範例會顯示如何在單一 GROUP BY 陳述式中使用 HAVING、WHERE、ORDER BY 和 SELECT 子句。 它會產生群組和摘要值,但會先刪除價格超出 $25,且平均訂單數量在 5 之下的產品,再執行這個動作。 此外,它也會依照 ProductID 組織結果。
USE AdventureWorks2025;
GO
SELECT ProductID
FROM Sales.SalesOrderDetail
WHERE UnitPrice < 25.00
GROUP BY ProductID
HAVING AVG(OrderQty) > 5
ORDER BY ProductID;
GO
M. 搭配 SUM 和 AVG 使用 HAVING
下列範例會依產品識別碼來分組 SalesOrderDetail 資料表,且只會包括訂單總計超出 $1000000.00,平均訂單數量小於 3 的產品群組。
USE AdventureWorks2025;
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 AdventureWorks2025;
GO
SELECT ProductID, Total = SUM(LineTotal)
FROM Sales.SalesOrderDetail
GROUP BY ProductID
HAVING SUM(LineTotal) > $2000000.00;
GO
如果你想確保每個產品的計算至少包含1,500件商品,請用來 HAVING COUNT(*) > 1500 剔除那些以少 1500 於銷售商品回還總額的產品。 此查詢看起來像這樣:
USE AdventureWorks2025;
GO
SELECT ProductID, SUM(LineTotal) AS Total
FROM Sales.SalesOrderDetail
GROUP BY ProductID
HAVING COUNT(*) > 1500;
GO
N. 使用 INDEX 優化器提示
下列範例會顯示兩種使用 INDEX 最佳化工具提示的方法。 第一個範例示範如何強制優化器使用非叢集索引從數據表擷取數據列。 第二個範例會使用 0 的索引強制表掃描。
USE AdventureWorks2025;
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 AdventureWorks2025;
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
M. 使用 OPTION 和 GROUP 提示
下列範例會顯示如何搭配 OPTION (GROUP) 子句來使用 GROUP BY 子句。
USE AdventureWorks2025;
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
O. 使用 UNION 查詢提示
下列範例使用 MERGE UNION 查詢提示。
USE AdventureWorks2025;
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
P. 使用 UNION
在下列範例中,結果集包括 ProductModelID 和 Name 資料表之 ProductModel 和 Gloves 資料行的內容。
USE AdventureWorks2025;
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 AdventureWorks2025;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID NOT IN (3, 4)
UNION
SELECT ProductModelID, Name
FROM dbo.Gloves
ORDER BY Name;
GO
Q. 搭配 UNION 使用 SELECT INTO
在下列範例中,第二個 INTO 陳述式中的 SELECT 子句指定利用名稱為 ProductResults 的資料表,保留 ProductModel 和 Gloves 資料表的指定資料行之聯集的最終結果集。
Gloves 資料表是建立在第一個 SELECT 陳述式中。
USE AdventureWorks2025;
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 AdventureWorks2025;
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;
R. 搭配 ORDER BY 使用兩個 SELECT 語句的 UNION
與子句一起使用 UNION 的某些參數的順序很重要。 以下範例展示了在兩個UNION語句中錯誤與正確用SELECT法,即你在輸出中重新命名欄位。
USE AdventureWorks2025;
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 AdventureWorks2025;
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 AdventureWorks2025;
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 和括弧的效果
下列範例使用 UNION 來結合三個數據表的結果,這些數據表全都有相同的五個數據列。 第一個範例利用 UNION ALL 來顯示重複的記錄,以及傳回所有的 15 個資料列。 第二個範例使用 UNION ,而不 ALL 用 從三 SELECT 個語句的合併結果中排除重複的數據列,並傳回五個數據列。
第三個範例搭配第一個 ALL 來使用 UNION,並用括弧括住未使用 UNION 的第二個 ALL。 第二 UNION 個會先處理,因為它位於括弧中,並傳回五個數據列,因為 ALL 未使用 選項,而且會移除重複專案。 這五個數據列會結合第一個 SELECT 數據列的結果,方法是使用 UNION ALL 關鍵詞。 此範例並不會移除這兩組 5 個資料列之間的重複項目。 最終結果有 10 個資料列。
USE AdventureWorks2025;
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)
- 執行 (Transact-SQL)
- 運算式 (Transact-SQL)
- INSERT (Transact-SQL)
- 像(Transact-SQL)
- 集合運算子 - UNION (Transact-SQL)
- 集合運算子 - EXCEPT 和 INTERSECT (Transact-SQL)
- UPDATE (Transact-SQL)
- WHERE (Transact-SQL)
- 路徑名稱 (Transact-SQL)
- SELECT - INTO 子句 (Transact-SQL)