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