SQL查询中的WHERE子句

WHERE子句在SQL查询中扮演着至关重要的角色,因为它决定了哪些记录会被包含在查询结果中。本文将介绍WHERE子句的基本概念,以及如何使用它来过滤查询结果。将学习不同类型的条件,包括等值条件、范围条件和成员资格条件,并提供一个综合示例,展示如何结合使用SELECT、WHERE和ORDER BY子句。

WHERE子句的基本概念

WHERE子句是一个条件,只有满足这个条件的行才会被返回在查询结果中。例如,下面的SQL语句只选择位于密歇根州的客户:

SELECT CustomerName FROM Customers WHERE State='MI';

在这个例子中,只有当表达式State='MI'为真时,即State确实等于'MI',行才会被包含在结果中。通常,当WHERE子句的条件为真时,行就会被包含在结果中。WHERE子句的条件可以由一个或多个测试组成。通过使用布尔逻辑,可以组合这些测试来进行复杂的比较,无论是一个或多个列或表达式。在本课程中,将涵盖三种类型的条件:等值条件、范围条件和成员资格条件。

等值条件

等值条件测试列或表达式是否与值匹配。如所料,等号用于形成等值条件。在下面的SQL语句中,返回所有头衔为'Mr.'的人:

SELECT FirstName, LastName FROM Person.Person WHERE Title='Mr.';

其他等值条件的例子包括:

Quantity = 30 UnitPrice = .25 City = 'El Paso'

可能已经注意到,数字是直接写出来的,但是文本是用单引号括起来的。也可以将表达式包含在等值条件中。例如,如果数据不一致,数据库中的州以各种大写组合出现,如'mi'、'MI'和'mI',这些都是不同的值,就等值而言,可以比较大写版本以确保安全。要做到这一点,条件将是:

UPPER(State) = 'MI'

这样,无论州是如何大写的,它总是评估为全部大写,然后安全地与州的正确缩写进行比较。

不等条件

有时,需要排除一个值。为此,可以使用不等。这个操作符是<>。不等的例子包括:

State <> 'MI' Quantity <> 0

如果想返回所有头衔不是'Mr.'的人,那么查询将是:

SELECT FirstName, LastName FROM Person.Person WHERE Title <> 'Mr.';

提示!记得<>代表不等于,因为<和>彼此对立。

范围条件

有时,想知道一个值是否落在一个范围内,比如数量大于10。最感兴趣的范围条件是大于、小于和介于两者之间。执行各种测试的操作符是:

> (大于) >= (大于或等于) < (小于) <= (小于或等于) BETWEEN

考虑Purchasing.PurchaseOrderDetail表。如果想要知道订单数量超过10的订单,那么使用测试:

OrderQty > 10

要包括订单数量为10的情况,使用测试:

OrderQty >= 10

这同样适用于文本和数字。条件...

LastName < 'Nixon'

...返回所有姓氏在Nixon之前的人。要包括Nixon,将这样写:

LastName <= 'Nixon'

因此,要找到所有姓氏小于或等于Nixon的人,将这样写:

SELECT FirstName, LastName FROM Person.Person WHERE LastName <= 'Nixon'

也可以使用表达式。要找到所有TotalPrice超过100美元的OrderDetails,查询将是:

SELECT PurchaseOrderID, PurchaseOrderDetailID, ProductID, UnitPrice, OrderQty, UnitPrice * OrderQty AS TotalPrice FROM Purchasing.PurchaseOrderDetail WHERE UnitPrice * OrderQty >= 100

但是,如果想TotalPrices在100和200美元之间呢?如何实现这一点?实际上有几种方法,但现在要讨论的是BETWEEN操作符。BETWEEN操作符在条件中使用如下:

UnitPrice * OrderQty BETWEEN 100 AND 200

可能已经猜到了,也可以在测试中使用它。如果想找所有介于a和c之间的州,将:

States BETWEEN 'A' AND 'CZ'

回到TotalPrice示例,这个查询的完整语句是:

SELECT PurchaseOrderID, PurchaseOrderDetailID, ProductID, UnitPrice, OrderQty, UnitPrice * OrderQty AS TotalPrice FROM Purchasing.PurchaseOrderDetail WHERE UnitPrice * OrderQty BETWEEN 100 AND 200

请注意,BETWEEN操作符是包含性的,也就是说,它包括开始和结束值。

成员资格条件

这节课要学习的最后一个条件类型是成员资格类型。成员资格类型允许在一条语句中紧凑地进行多个匹配测试。例如,如果有几个JobTitles想要包含在查询结果中。在这种情况下,可以使用IN操作符来找到所有匹配:

JobTitle IN ('Accountant', 'Buyer', 'Stocker')

以上将匹配或返回JobTitle是'Accountant'、'Buyer'或'Stocker'的记录。要使用IN比较操作符,请用逗号分隔想要测试的项目,并确保将它们用括号括起来。示例的完整SQL语句是:

SELECT NationalIDNumber, OrganizationNode, JobTitle FROM HumanResources.Employee WHERE JobTitle IN ('Accountant', 'Buyer', 'Stocker')

综合示例

现在,让把所有的内容结合起来,通过一个示例来过滤和排序查询。SELECT语句的整体结构是:

SELECT columns FROM Table WHERE WhereClause ORDER BY Columns

在前面的部分,选择联系人谁是所有者的查询是:

SELECT NationalIDNumber, OrganizationNode, JobTitle FROM HumanResources.Employee WHERE JobTitle IN ('Accountant', 'Buyer', 'Stocker')

要按JobTitle排序,只需添加一个ORDER BY子句:

SELECT NationalIDNumber, OrganizationNode, JobTitle FROM HumanResources.Employee WHERE JobTitle IN ('Accountant', 'Buyer', 'Stocker') ORDER BY JobTitle
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485