SQL Server 基礎知識:使用 SQL SELECT 和 WHERE 及 HAVING 子句檢索數據

在本文中,我將介紹使用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
An example of a simple SQL SELECT statement (Image credit: Petri/Michael Otey)

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

USE AdventureWorksLT2019
SELECT * from SalesLT.Customer
You can use an asterisk (*) to retrieve all of the columns in the table (Image credit: Petri/Michael Otey)

SELECT *语句对于临时查询或检查您不熟悉的表的列和数据非常有用。但是,您不应该在生产代码中使用此语句——它通常检索比应用程序需要的更多数据,而您不希望增加SQL Server的工作负载。

Advertisement

如何使用 SQL WHERE 子句筛选行

SELECT 语句的真正威力在于其过滤和连接功能。SELECT 查询可以使用可选的 WHERE 子句来筛选将被返回的数据。

WHERE 子句 使用一個或多個 布林條件 來選擇所需的表格數據。WHERE 子句總是出現在 FROM 子句 之後,以及 GROUP BYHAVINGORDER 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';
Using the WHERE clause to filter data that will be returned (Image credit: Petri/Michael Otey)

过滤 包含字符串值的行

使用 WHERE 子句与 SELECT 语句的威力在于其灵活性。WHERE 子句远远超出了简单的相等性、“大于”和“小于”比较运算符。让我们更仔细地看一下可以使用 WHERE 子句做的一些事情,从使用 SQL LIKE 运算符开始

LIKE操作符用于确定特定字符串是否与指定模式匹配。在下面的示例中,我们检索包含“Bike”单词的Customer表中的所有行,该单词可以出现在CompanyName列的任何位置。在这里,我们需要在单词“Bike”之前和之后都使用%通配符字符

USE AdventureWorksLT2019
SELECT SalesPerson, CompanyName FROM SalesLT.Customer WHERE CompanyName LIKE('%Bike%');
Using the WHERE clause with the LIKE operator (Image credit: Petri/Michael Otey)

筛选满足三个条件之一的行

您还可以使用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; 
Filtering rows that meet different conditions with the WHERE clause (Image credit: Petri/Michael Otey)

筛选在值列表中的行

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

USE AdventureWorksLT2019
SELECT AddressID, AddressLine1, City FROM SalesLT.Address
WHERE City IN ('Bothell', 'Bellevue', 'Renton');
Filtering rows that are in a list of values with the IN operator (Image credit: Petri/Michael Otey)

过滤具有两个值之间值的行

您还可以使用 SELECT 语句的 WHERE 子句与 BETWEEN 操作符一起,选择特定列中落在某个预定义范围内的行值。以下示例显示了如何使用 BETWEEN 仅返回 Product 表中“ListPrice”列中值大于 10 且小于 50 的行。

USE AdventureWorksLT2019
SELECT ProductID, Name  FROM SalesLT.Product  WHERE ListPrice Between 10 AND 50; 
Filtering rows that have a value between two values (Image credit: Petri/Michael Otey)

使用 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 ;
Filtering rows with the HAVING clause (Image credit: Petri/Michael Otey)

摘要

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

相关文章:

  • SQL Server Essentials: 使用 SQL COALESCE</diy5

Source:
https://petri.com/sql-select-where-clause/