在本文中,我將介紹使用SQL SELECT語句從一個或多個SQL Server表中檢索數據的基本知識。我還將詳細介紹如何檢索選定的列,以及如何使用SQL WHERE和HAVING子句來過濾行。
本文中的示例均使用AdventureWorksLT2019示例數據庫。在這一系列文章的前一篇文章中,我解釋了如何使用INSERT,UPDATE和DELETE語句填充SQL Server表。這些結構化查詢語言(SQL)語句修改表的內容,但SQL SELECT語句有不同的目的。
如何使用簡單的SQL SELECT語句
使用SQL SELECT語句從表中查詢數據。以下代碼說明了SELECT語句的最基本語法。
SELECT columns FROM schema_name.table_name;
正如您所知,表格資料是以列和欄的格式組織的。每一行代表表格中的一條獨特記錄,每一欄代表資料集中的一個欄位。
SELECT語句的第一個部分是一個將被檢索的欄位名稱列表。在這裡,您指定了一個用逗號分隔的欄位列表,您希望從中檢索資料。
接下來,FROM子句指定了來源表以及其架構名(如果需要的話)。SQL Server使用架構來邏輯上將表格和其他資料庫物件分組。每個資料庫的默認架構是dbo,因為這裡使用的就是這個架構,所以可以忽略它。
以下清單顯示了簡單SELECT語句的示例:
- 第一个USE命令将当前数据库设置为AdventureWorksLT2019。
- SELECT语句为将从SalesLT.Customer表检索到的结果集提供了列列表。
- 在本例中,AdventureWorksLT2019示例数据库使用模式名称‘SalesLT’(等等),因此您需要包括模式名称、一个点,然后是表名,即‘Customers’。
- ‘FirstName’和‘LastName’列检索客户的名字和姓氏。
USE AdventureWorksLT2019 SELECT FirstName, LastName from SalesLT.Customer

作为一种简写,您可以使用星号(*)来检索表中的所有列,而不管列数如何。您可以在下面看到一个例子:
USE AdventureWorksLT2019 SELECT * from SalesLT.Customer

SELECT *语句对于临时查询或检查您不熟悉的表的列和数据非常有用。但是,您不应该在生产代码中使用此语句——它通常检索比应用程序需要的更多数据,而您不希望增加SQL Server的工作负载。
如何使用 SQL WHERE 子句筛选行
SELECT 语句的真正威力在于其过滤和连接功能。SELECT 查询可以使用可选的 WHERE 子句来筛选将被返回的数据。
WHERE 子句 使用一個或多個 布林條件 來選擇所需的表格數據。WHERE 子句總是出現在 FROM 子句 之後,以及 GROUP BY、HAVING 和 ORDER BY 子句之前。
你可以在下方看到使用 SQL WHERE 子句的示例。在这里,WHERE 子句用于过滤包含“FirstName”、“LastName”、“Phone” 和“CompanyName” 列的选择列表,其中包含“CompanyName”列中值为“Sharp Bikes”的行。
USE AdventureWorksLT2019 SELECT FirstName, LastName, Phone, CompanyName FROM SalesLT.Customer WHERE CompanyName = 'Sharp Bikes';

过滤 包含字符串值的行
使用 WHERE 子句与 SELECT 语句的威力在于其灵活性。WHERE 子句远远超出了简单的相等性、“大于”和“小于”比较运算符。让我们更仔细地看一下可以使用 WHERE 子句做的一些事情,从使用 SQL LIKE 运算符开始
LIKE操作符用于确定特定字符串是否与指定模式匹配。在下面的示例中,我们检索包含“Bike”单词的Customer表中的所有行,该单词可以出现在CompanyName列的任何位置。在这里,我们需要在单词“Bike”之前和之后都使用%通配符字符。
USE AdventureWorksLT2019 SELECT SalesPerson, CompanyName FROM SalesLT.Customer WHERE CompanyName LIKE('%Bike%');

筛选满足三个条件之一的行
您还可以使用WHERE子句根据多个不同的值来过滤行。以下代码清单显示了如何使用带有WHERE子句的SELECT语句从Product表中选择三个不同的值。在这个例子中,WHERE子句与OR操作符一起使用,以选择其中‘ProductID’等于680、711或722的行。
USE AdventureWorksLT2019 SELECT Name, ProductID, ProductNumber FROM SalesLT.Product WHERE ProductID = 680 OR ProductID = 711 OR ProductID = 722;

筛选在值列表中的行
同样,您可以使用 WHERE 子句来选择通过使用 IN 操作符定义的列表中包含的行。在以下示例中,SELECT 语句将返回 SalesLT.Address 表中“City”列中包含值为 ‘Bothell’、’Bellevue’ 或 ‘Renton’ 的行。
USE AdventureWorksLT2019 SELECT AddressID, AddressLine1, City FROM SalesLT.Address WHERE City IN ('Bothell', 'Bellevue', 'Renton');

过滤具有两个值之间值的行
您还可以使用 SELECT 语句的 WHERE 子句与 BETWEEN 操作符一起,选择特定列中落在某个预定义范围内的行值。以下示例显示了如何使用 BETWEEN 仅返回 Product 表中“ListPrice”列中值大于 10 且小于 50 的行。
USE AdventureWorksLT2019 SELECT ProductID, Name FROM SalesLT.Product WHERE ListPrice Between 10 AND 50;

使用 HAVING 子句过滤行
您可以使用 HAVING 子句來篩選結果集中的行。HAVING 子句被添加到 SQL Server 中,因為 WHERE 關鍵字無法與諸如 GROUP BY 之聚合函數一起使用。它用於為一個組或一個包含一個或多個條件的聚合指定搜索條件,這些條件對不同組的記錄為真。
HAVING 子句始終位於 GROUP BY 子句之後並在 ORDER BY 子句之前,正如您在以下 SQL 陳述中所看到的。在此示例中,結果集包括 ‘SalesOrderID’ 和列別名 ‘SubTotal’。排序為升序(ascending),行是按 ‘SalesOrderID’ 分組的聚合。
USE AdventureWorksLT2019 ; SELECT SalesOrderID, SUM(LineTotal) AS SubTotal FROM SalesLT.SalesOrderDetail GROUP BY SalesOrderID HAVING SUM(LineTotal) > 5000.00 ORDER BY SalesOrderID ;

摘要
在這個教程中,我解釋了使用 T-SQL SELECT 语句以多种方式过滤行的基础知识。WHERE 子句提供了一组非常灵活的操作符,使您能够根据多种条件选择行。同样,HAVING 子句使您能够选择符合某种条件的行组。感谢阅读,请继续关注我在 SQL Server Essentials 系列中的下一篇文章。
相关文章:
- SQL Server Essentials: 使用 SQL COALESCE</diy5