SQL 比较运算符

SQL Server 比较运算符用于比较两个操作数或值,以筛选结果集。通常,我们使用它们将列值与有效表达式进行比较。结果将为 TRUE 或 FALSE,并根据结果获取特定的记录集。

在 SQL Server 中,我们可以在 WHERE 子句或 HAVING 子句中使用这些比较运算符(=、<>、>、<、<= 和 >=)来筛选数据。这意味着 SELECT 语句将只检索满足比较右侧给定条件的记录。此外,您还可以在 JOIN 中使用它们来执行不同类型的连接。

所有上述比较运算符都可以在 SQL SELECT 语句中用于检索表中的记录,在 UPDATE 命令中用于更新现有值,以及在 DELETE 语句中用于删除特定记录。因此,理解本文对于您的进一步学习非常重要且关键。例如,从表中检索居住在法国的客户记录。这里,我们使用了等于 (=) 运算符。

SELECT * FROM Customers
WHERE Country = 'France'

可用的 SQL 比较运算符

如前所述,SQL Server 比较运算符用于比较两个或多个表达式并返回布尔值 TRUE 或 FALSE。因此,如果表达式评估为 TRUE,它将返回与该表达式匹配的行;否则,它不返回任何内容(空结果集)。此外,如果任一表达式(左侧或右侧)中存在任何 NULL 记录,它还会返回 UNKNOWN。

下表显示了可用比较运算符的列表,其中包括 ISO 标准和非 ISO 标准运算符。其中,等于运算符是 WHERE 和 HAVING 子句中最常用的比较运算符。

SQL 比较运算符描述示例
= 等于检查两个操作数是否相等Age = 30
> 大于检查左操作数是否大于右操作数。Age > 25
>= 大于或等于检查左操作数是否大于或等于右操作数。Age >= 28
< 小于检查左操作数是否小于右操作数。Age < 18
<= 小于或等于检查左操作数是否小于或等于右操作数。Age <= 50
<> 不等于检查左操作数是否不等于右操作数。Age <> 60
!= 不等于(非 ISO 标准)与 <> 相同Age != 60
!> 不大于(非 ISO 标准)检查左操作数是否不大于右操作数。Age !> 18
!< 不小于(非 ISO 标准)检查左操作数是否不小于右操作数。Age !< 60

SQL 比较运算符示例

以下是比较运算符最常见和最简单的示例以及查询解释。为此,我们使用 AdventureWorks 2022 和 AdventureWorksDW 2022 数据库。

等于 (=) 运算符

在 SQL Server 中,等于运算符是最常用的比较运算符之一。= 运算符检查两个表达式(左和右)是否相等,并返回布尔值 TRUE 或 FALSE。如果为 TRUE,则它将显示其列值与给定表达式完全相等的记录。

在下面的查询中,我们使用 = 运算符检查 StateProvinceName 是否等于“New York”。这意味着以下 = 比较运算符查询将找到 DimCustomers 表中所有居住在纽约的客户。这里,Adventure Works 表中只有三个客户。

SELECT City, [FirstName],[LastName],[BirthDate]
,[Gender]
,[EmailAddress]
,[YearlyIncome]
FROM [DimGeography] JOIN DimCustomer ON
DimGeography.GeographyKey = DimCustomer.GeographyKey
WHERE [StateProvinceName] = 'New York'

同样,如果您想要部门为 HR 的员工。您可以编写以下查询,它将显示属于 HR 部门的员工。

SELECT * FROM Employee WHERE Department = 'HR'
SQL Comparison Operators - Equal and Not equal to

NULL 值和非 NULL 值的比较

在使用 SQL Server 比较运算符时,NULL 记录会产生奇怪的结果。因此,您应该小心处理 NULL 值。通常,人们倾向于使用 = 和 <> 比较运算符来检查列是否等于 NULL。当您与 NULL 比较时,结果将始终取决于服务器的 ANSI_NULLS 设置。

  • NULL 值是 UNKNOWN,不能与任何其他值(如 0 或空白)进行比较。如果您在查询之前显式设置 ANSI_NULLS ON,它将返回 UNKNOWN。
  • 通常,服务器的默认设置为 ANSI_NULLS OFF。它在 NULL 与 NULL 比较时返回 NULL,如果将 NULL 与非 NULL 值比较,则返回 FALSE(因此是空结果集)。

您可以尝试以下查询来理解上述两点。第一个查询返回一个空行集。

SELECT * FROM [DimCustomer]
WHERE MiddleName = NULL

以下查询返回表中所有中间名为 NULL 的客户。

SET ANSI_NULLS OFF

SELECT * FROM [DimCustomer]
WHERE MiddleName = NULL

或者,您可以使用 IS NULL 运算符,它更好并且会产生准确的结果。

SELECT * FROM [DimCustomer]
WHERE MiddleName IS NULL

大于 (>) 运算符

> 比较运算符比较两个操作数,如果左操作数大于右操作数,则返回 TRUE。否则,返回布尔值 FALSE。这意味着大于运算符将显示其列值高于给定表达式的行。例如,以下查询使用 SalesTerritory 表。

这里,SQL Server 比较运算符检查 SalesYTD(年初至今销售额)是否大于 6000000。如果为 True,则打印区域名称、组和销售信息。如果表达式评估为 FALSE,则返回空结果集。

SELECT [TerritoryID],[Name],[CountryRegionCode]
,[Group],[SalesYTD],[SalesLastYear]
FROM [Sales].[SalesTerritory]
WHERE SalesYTD > 6000000

同样,您可以尝试以下查询来查找当年销售额大于去年销售额的销售区域。

SELECT [TerritoryID],[Name],[CountryRegionCode]
,[Group],[SalesYTD],[SalesLastYear]
FROM [Sales].[SalesTerritory]
WHERE SalesYTD > SalesLastYear

小于 (<) 运算符

SQL Server < 比较运算符测试左操作数是否小于(值更小)右操作数,并返回布尔值 TRUE 或 FALSE。如果为 TRUE,则返回结果集。例如,查找今年销售额低于去年销售额的产品或区域。

以下小于比较运算符查询检查 Sales YTD 是否小于去年销售额。接下来,它将显示 SalesYTD 列值小于 SalesLastYear 的记录。

SELECT [TerritoryID],[Name],[CountryRegionCode]
,[Group],[SalesYTD],[SalesLastYear]
FROM [Sales].[SalesTerritory]
WHERE SalesYTD < SalesLastYear
Similarly, you can use the following query to show the salesperson's information.
SELECT [TerritoryID],[SalesQuota],[Bonus]
,[CommissionPct],[SalesYTD],[SalesLastYear]
FROM [Sales].[SalesPerson]
WHERE SalesYTD < SalesLastYear

大于或等于 >=

SQL 大于或等于 (>=) 比较运算符测试左操作数是否大于或等于右操作数。如果更高,则返回 TRUE 并显示结果集。否则,返回 FALSE 并显示空表。例如,查找用户的年龄是否大于或等于 18 岁。

SELECT * FROM people WHERE age >= 18

以下查询将从销售人员表中查找销售配额大于或等于 300000 的销售信息。

SELECT [TerritoryID],[SalesQuota],[Bonus]
,[CommissionPct],[SalesYTD],[SalesLastYear]
FROM [Sales].[SalesPerson]
WHERE SalesQuota >= 300000

同样,以下查询将返回订单数量大于或等于 6000 的产品的采购订单详细信息。

SELECT [PurchaseOrderID],[OrderQty],[ProductID]
,[UnitPrice],[LineTotal],[ReceivedQty],[StockedQty]
FROM [Purchasing].[PurchaseOrderDetail]
WHERE OrderQty >= 6000

小于或等于 (<=) 运算符

SQL 小于或等于 (<=) 比较运算符将测试左操作数值是否小于或等于右操作数。如果为 TRUE,则查询将显示记录;否则,它显示一个空集。例如,查找年龄小于或等于 60 岁以退休的员工。

以下查询将查找所有病假小时数小于或等于 20 的员工详细信息。

SELECT [LoginID],[JobTitle],[BirthDate],[MaritalStatus]
,[Gender],[HireDate],[SickLeaveHours]
FROM [HumanResources].[Employee]
WHERE SickLeaveHours <= 20

同样,以下示例查找奖金 <= 500 的销售人员信息。

SELECT [TerritoryID],[SalesQuota],[Bonus]
,[CommissionPct],[SalesYTD],[SalesLastYear]
FROM [Sales].[SalesPerson]
WHERE Bonus <= 500

不等于 (<>) 运算符

在执行比较时,SQL <> 不等于运算符与 = 运算符完全相反。<> 运算符比较两个操作数,并测试左操作数是否不等于右操作数。如果两者不相等,则返回 TRUE,因此返回结果集。否则,返回 FALSE 和空集。例如,查找除特定颜色以外的所有产品的销售额,不包括欧洲地区的销售信息等。

以下查询将查找每个区域的销售额以及其他信息,其中区域组不等于北美。

SELECT [TerritoryID],[Name],[CountryRegionCode]
,[Group],[SalesYTD],[SalesLastYear]
FROM [Sales].[SalesTerritory]
WHERE [Group] <> 'North America'

同样,您可以使用此不等于比较运算符 (<>) 将列值与数值进行比较。例如,以下查询显示配额不等于 250000 的销售人员信息。

SELECT [BusinessEntityID],[TerritoryID],[SalesQuota]
,[Bonus],[CommissionPct],[SalesYTD],[SalesLastYear]
FROM [Sales].[SalesPerson]
WHERE SalesQuota <> 250000
SQL Comparison Operators - Greater than, less than or equal to

以下三个是非标准 ISO 运算符,用于执行比较。

不等于 (!=) 运算符

SQL 不等于 (!=) 比较运算符与上述 <> 相同,并返回相同的结果。但是,!= 不是标准 ISO 运算符。

为了演示这一点,我们使用带有简单连接的 DW 数据库。以下查询将显示每个国家的销售信息总和。WHERE 子句中的 != (不等于) 运算符将从显示中过滤掉美国。因此,它显示除美国以外的每个国家的总销售额。

SELECT [SalesTerritoryRegion],[SalesTerritoryCountry],
SUM([OrderQuantity]) AS Orders,
SUM(TotalProductCost) AS Cost,
SUM([SalesAmount]) AS Sales
FROM DimSalesTerritory JOIN [FactInternetSales]
ON DimSalesTerritory.SalesTerritoryKey = FactInternetSales.SalesTerritoryKey
WHERE [SalesTerritoryCountry] != 'United States'
GROUP BY[SalesTerritoryRegion],[SalesTerritoryCountry]

不大于 (!>) 运算符

SQL Server 不大于比较运算符 (!>) 与 > 完全相反。它比较两个操作数,并检查左操作数是否不大于右操作数。如果为 TRUE,则显示这些行。这里,它返回与小于或等于 (<=) 运算符相同的结果。

以下查询连接 Adventure Works DW 2022 数据库的 Fact Internet Sales 表和 Dim Products 表。接下来,它将显示订单数量总和不大于 45 的产品。这意味着订单小于或等于 45 的产品。

SELECT [EnglishProductName], Color,
SUM([OrderQuantity]) AS Orders,
SUM(DealerPrice) AS DealerCost
,SUM([SalesAmount]) AS Sales
FROM DimProduct JOIN [FactInternetSales]
ON DimProduct.ProductKey = FactInternetSales.ProductKey
GROUP BY [EnglishProductName], Color
HAVINg SUM(OrderQuantity) !> 45

不小于 (!<) 运算符

SQL Server 不小于运算符 (!<) 与 < 比较运算符完全相反。在比较两个操作数时,它测试左操作数是否不小于右操作数。如果为 TRUE,则显示这些行。这里,它返回与大于或等于 (>=) 运算符相同的结果。

如下所示的查询将显示所有产品及其产品名称和颜色组,以及销售额和订单总和。这里,WHERE 子句中的比较运算符检查订单数量总和是否不小于 2200。因此,它显示总订单大于或等于 2200 的记录。

SELECT [EnglishProductName], Color,
SUM([OrderQuantity]) AS Orders,
SUM(DealerPrice) AS DealerCost
,SUM([SalesAmount]) AS Sales
FROM DimProduct JOIN [FactInternetSales]
ON DimProduct.ProductKey = FactInternetSales.ProductKey
GROUP BY [EnglishProductName], Color
HAVINg SUM(OrderQuantity) !< 2200

使用 AND 或 的多个 SQL 比较运算符

在服务器中,您可以使用逻辑运算符,如 AND、OR 和 NOT 来组合多个比较运算符,以进一步检查表。这对于向最终用户显示精确的结果集非常有帮助。

以下查询将显示 DimCustomer 表中所有教育程度为学士、婚姻状况为单身、性别不等于 M(即只有女性)、收入大于 120000 且出生年份大于 1970 的客户。

在这里,我们使用了多个比较运算符来让您了解如何使用它们。我建议您尝试更多组合以更好地理解它们。

SELECT [FirstName],[LastName],[BirthDate],[MaritalStatus]
,[Gender],[EmailAddress],[YearlyIncome],[EnglishEducation]
FROM [DimCustomer]
WHERE EnglishEducation = 'Bachelors' AND MaritalStatus = 'S' AND Gender <> 'M'
AND YearlyIncome > 120000 AND YEAR(BirthDate) > 1970

UPDATE 和 DELETE 中的 SQL 比较运算符

在所有上述查询中,我们使用比较运算符来过滤 SELECT 语句返回的数据。但是,您可以在 UPDATEDELETE 命令中使用它们来限制要更新或删除的数据。

例如,以下 SQL 查询将更新销售订单大于 2000 的员工的工资,增加 20%(涨薪)。

UPDATE Employee 
SET YearlyIncome = YearlyIncome + YearlyIncome * 0.20
WHERE Sales > 2000

同样,您可以使用比较运算符对一组值而不是所有值执行删除操作。

DELETE FROM [Employee]
WHERE [Status] = 'Terminated'

SQL 比较运算符最佳实践

  • WHERE 子句中使用比较运算符有助于过滤结果集并查看所需的行。
  • 这些比较运算符可以处理数字、文本和日期字段进行数据过滤。
  • 始终使用 = 运算符进行精确比较。
  • 使用逻辑 AND、OR 和 NOT 运算符组合多个比较运算符以进行更复杂的查询。
  • 在测试多个条件时,请检查范围值是否从最小值开始。
  • 始终优先使用索引列进行比较,以提高查询性能。
  • 在比较文本信息时,请注意区分大小写。
  • 不要对 NULL 值使用 SQL 比较运算符。请使用 IS NULLIS NOT NULL 将 NULL 值与常规值进行比较。
  • 使用 BETWEEN 运算符显示范围内的记录。不要编写 <= 和 >= 的组合,而是使用简单的 BETWEEN 运算符
  • 同样,尽可能使用 IN 运算符。
  • 在测试多个条件时,使用括号。

评论已关闭。