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的工作负载。

广告

如何使用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';
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 子句来过滤结果集中的行。由于 WHERE 关键字不能与诸如 GROUP BY 这样的聚合函数一起使用,所以在 SQL Server 中添加了 HAVING 子句。它用于为包含一个或多个条件的组或聚合指定搜索条件,这些条件对不同组的记录为真。

HAVING 子句始终位于 GROUP BY 子句之后和 ORDER BY 子句之前,正如您在以下 SQL 语句中所见。在此示例中,结果集包括 ‘SalesOrderID’ 和列别名 ‘SubTotal’。顺序为升序,行是按 ‘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 Essential 系列中的下一篇文章。

相关文章:

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