在SQLServer数据库的WHERE语句中使用子查询

更新时间:2023-07-29 04:19:44 阅读: 评论:0

在SQLServer数据库的WHERE语句中使⽤⼦查询
这是中的第三篇。在这篇⽂章中我们将讨论WHERE语句中的⼦查询语句。其他的⽂章讨论了其他语句中的⼦查询语句。
本次课程中的所有例⼦都是基于Microsoft SQL Server Management Studio和AdventureWorks2012数据库的。读者可以阅读我的学习使⽤这些免费的⼯具。
在WHERE语句中使⽤⼦查询
在WHERE语句中使⽤⼦查询是⾮常常见的。常见的⽤法是⽤EXISTS或IN测试存在性。在某些情况下重新考虑查询语句并且使⽤JOIN是有意义的,但是在最终决定之前,应该好好学习⼀下这两种通过查询优化的形式。
⽐较修饰符ANY和ALL可以和greater than,less than,或者equals操作符⼀起使⽤。这样就提供了⼀种⽅式⽐较⼀个单值,例如⼀个列,⼀个或更多的⼦查询返回的结果。
现在我们详细讨论这些。翻译于 2个⽉前
0⼈顶翻译的不错哦!
Exist和Not Exists
EXISTS条件结合⼦查询使⽤.当⼦查询返回⼀个或多个记录的时候,它返回TRUE.
高中学生自我评价EXISTS条件最简单的语法形式如下:
1WHERE EXISTS (sub query)
假设我们需要返回,所有由销售⼈员记录的,从年初⾄今,⼤于三百万美元的销售订单.为了达到这个效果,我们可以使⽤如下例⼦中的EXISTS⼦句:
1 2 3 4 5 6 7 8 9SELECT SalesOrderID,
RevisionNumber,
OrderDate
FROM Sales.SalesOrderHeader
WHERE EXISTS (SELECT1
FROM sales.SalesPerson
WHERE SalesYTD > 3000000
AND SalesOrderHeader.SalesPersonID                        = Sales.SalesPerson.BusinessEntityID)
执⾏这条SQL语句的时候,会作如下的对⽐:
会议记录如何写1. WHERE⼦句返回所有EXISTS⼦句为TRUE的记录.
2. EXIST⼦句使⽤. 外部查询通过SalesPersonID关联到内部查询.
3. 只有SalesYTD⼤于三百万美元的SalesPersons才会包含在结果之中.
4. 如果⼦查询返回⼀⾏或多⾏记录,EXISTS⼦句返回TRUE.
EXISTS条件是⼀种成员条件,即只有返回结果它才返回TRUE.相反的,如果我们要测试⾮成员条件,我们可以使⽤NOT EXISTS.
当⽆记录返回时,NOT EXISTS返回TRUE.这样,如果我们想找出,所有由销售⼈员记录的,从年初⾄今,⼩于等于三百万美元的销售订单,我们可以使⽤如下的查询:
1 2 3 4 5 6 7 8 9SELECT SalesOrderID,
RevisionNumber,
OrderDate
FROM Sales.SalesOrderHeader
WHERE NOT EXISTS (SELECT1
FROM sales.SalesPerson
WHERE SalesYTD > 3000000
AND SalesOrderHeader.SalesPersonID
= Sales.SalesPerson.BusinessEntityID)
翻译于 2个⽉
0⼈顶
翻译的不
错哦!
NULL是怎么回事?
当⼀个⼦查询返回null值的时候,EXISTS会返回什么:  NULL, TRUE,还是 FALSE?
坦⽩讲,我也很吃惊.
我很确信它会返回NULL,但让⼈吃惊的是,我获知它返回TRUE。因此,如果你的⼦查询返回null值,EXISTS⼦句会返回TRUE。下⾯的例⼦会返回所有的SalesOrderHeader⾏,因为WHERE⼦句返回TRUE:翻译于 2个⽉前
0⼈顶翻译的不错哦!啜的读音
1 2 3 4 5SELECT SalesOrderID,
RevisionNumber,
OrderDate
FROM Sales.SalesOrderHeader WHERE EXISTS (SELECT NULL)
当我们学习IN操作符的时候,我们会发现,这是EXISTS⼦句所独有的特性.
IN 和 NOT IN
我们⾸先在的课程中学习IN操作符。在⼦查询中使⽤的时候,IN 和 NOT IN ⼦句是⼀样的。下⾯是那篇⽂章的⼩结。
IN 和 NOT IN 回顾
IN操作符被看作是⼀个成员类型。成员类型允许在⼀条语句中进⾏多次匹配测试。例如,假如有公司领导的多个拼写形式,
如“Owner”,“President”,和“CEO”。在这种情况下,你可以使⽤IN操作符来找到所有的匹配形式:
1ContactTitle IN ('CEO', 'Owner', 'President')
如果ContactTitle是“CEO”,“Owner"或者“President",上⾯的语句将匹配或者返回TRUE。为了使⽤IN操作符,需要使⽤逗号分隔测试项,并括在括号中。例⼦中完整的语句是:
1 2 3 4 5 6SELECT CompanyName, ContactName, ContactTitle
FROM Customers
WHERE ContactTitle IN('CEO', 'Owner', 'President');
Note:  The above query isn't meant for
the adventure works databa
翻译于 2个
⽉前
0⼈顶
翻译的
不错哦!
在⼦查询中使⽤IN
当在⼦查询中使⽤的时候,数据列表可以⽤⼦查询来代替。在这种情况下,使⽤⼦查询的优势是,它有助于让查询处于数据驱动的状态,同时更易于处理。
我的意思是,你⽆需硬编码数据。
例如,如果你正在做⼀个查询,需要查找销售最多的销售⼈员的订单,⾮⼦查询的⽅式使⽤IN的语句是:
1 2 3 4 5 6 7 8 9 10SELECT SalesOrderID,
OrderDate,
AccountNumber,
CustomerID,
SalesPersonID,
TotalDue
FROM Sales.SalesOrderHeader
WHERE SalesPersonID IN(279, 286, 289) who results are
但是,现在我们知道了⼦查询,我们可以使⽤下⾯的语句获取同样的数据:
1 2 3 4 5 6 7 8 9 10SELECT SalesOrderID,
OrderDate,
AccountNumber,
CustomerID,
SalesPersonID,
TotalDue
FROM Sales.SalesOrderHeader
WHERE SalesPersonID IN(SELECT BusinessEntityID                            FROM Sales.SalesPerson
WHERE Bonus > 5000)
其优势在于,随着销售⼈员销售的数据变化,返回的SalesPersonID的数据也跟着调整。
和其它的查询⼀样,你可以使⽤IN⼦句来创建⼀个关联⼦查询。这和EXIST⼦句使⽤的是相同的查询。它返回了,从年初⾄今,所有销售⼈员记录的⼤于三百万美元的销售订单,但是现在我们使⽤IN⼦句:翻译于 2个⽉前
0⼈顶翻译的不错哦!
1 2 3 4 5 6 7 8 9SELECT SalesOrderID,
RevisionNumber,
OrderDate
FROM Sales.SalesOrderHeader
WHERE SalesPersonID IN(SELECT SalesPerson.BusinessEntityID                FROM sales.SalesPerson
WHERE SalesYTD > 3000000
AND SalesOrderHeader.SalesPersonID
= Sales.SalesPerson.BusinessEntityID)
如果在⽐较列表中测试值找到了,IN返回TRUE。如果在⽐较列表中测试值没有找到,NOT IN返回TRUE。采⽤和上⾯⼀样的查询,我们可以找到,从年初⾄今,所有销售⼈员记录的⼩于等三百万美元的销售订单,查询语句如下:
1 2 3 4 5 6 7 8 9SELECT SalesOrderID,
RevisionNumber,
OrderDate
FROM Sales.SalesOrderHeader
WHERE SalesPersonID NOT IN(SELECT SalesPerson.BusinessEntityID                FROM sales.SalesPerson
WHERE SalesYTD > 3000000
AND SalesOrderHeader.SalesPersonID
= Sales.SalesPerson.BusinessEntityID)
在IN中碰到NULL是怎么回事?
当⽐较列表值包含NULL值的时候,和此列表⽐较的任何数据均返回fal。例如:
1 2 3 4 5SELECT SalesOrderID,
RevisionNumber,
OrderDate
FROM Sales.SalesOrderHeader WHERE SalesOrderID  IN(SELECT NULL)
返回0⾏。这是因为IN⼦句总是返回fal。和EXISTS⽐起来,即便⼦查询返回NULL,EXISTS还是返回true。⽐较修饰符顺治帝简介
⽐较操作符,如⼤于,⼩于,等于和不等于,可以在WHERE⼦句中修改为更加有趣的⽅式,来完成⽐较。
使⽤ > 仅仅只能⽐较单⼀值 () ,你可以使⽤ > ANY 或者 > ALL ⽐较某列的值和⼦查询返回的列表数据。翻译于 2个⽉前
0⼈顶
翻译的不错哦!
使⽤ > ANY 修饰符
⽐较操作符>ANY意味着⼤于⼀个或多个列表项的值。也就是说会⼤于列表内的最⼩值。因此公式
1Sales > ANY(1000, 2000, 2500)
会在销售量⼤于1000时返回TRUE,等同于语句:
1Sales > MIN(1000, 2000, 2500)
简化为:
1Sales > 1000
注意:你可以看到某些查询使⽤SOME。查询语句在使⽤SOME时返回的结果等同于ANY。即>ANY相同于>SOME。
我们以adventure works数据库为例,查找可能在安全库存等级的产品列表。具体说就是我们要查询的是安全库存等级⼤于平均安全库存等级的产品列表。
使⽤查询语句:
1 2 3 4 5 6 7 8SELECT ProductID,
Name,
SafetyStockLevel,
DaysToManufacture
FROM Production.Product
WHERE SafetyStockLevel > ANY(SELECT AVG(SafetyStockLevel)                              FROM Production.Product
GROUP BY DaysToManufacture)
⼦查询⾸先计算平均安全库存等级。它返回⼀个数值列表。然后对每⼀个产品⾏的安全库存等级对外查询⽐较。如果它⼤于⼀翻译于 2个⽉前
1⼈顶
翻译的不错哦!
⼦查询⾸先计算平均安全库存等级。它返回⼀个数值列表。然后对每⼀个产品⾏的安全库存等级对外查询⽐较。如果它⼤于⼀个或多个列表中的值,就会被包含在结果中返回。
如我⼀样,你可能第⼀反应是>ANY是多余的,鸡肋。它就等同于>MIN(...),不是吗?
这是可以⽤ANY,却不能⽤MIN的⽰例语句:
1 2 3 4 5 6 7 8SELECT ProductID,
Name,
摩羯座与天蝎座SafetyStockLevel,
DaysToManufacture
FROM Production.Product
小狗作文100WHERE SafetyStockLevel > MIN((SELECT AVG(SafetyStockLevel)                              FROM Production.Product
GROUP BY DaysToManufacture)
并不能运⾏,⽽是返回⼀个错误, “Cannot perform an aggregate function on an expression containing an aggregate or a subquery.” [译者注:不能运⾏的原因是GROUP BY语句对聚合函数不能⽤常规关键字操作,⽽是⽤另⼀些代替,例如GROUP BY条件中遇到聚合函数时WHERE⽤HAVING替换。]
武则天一生
使⽤ > ALL 修饰符
> ALL 修饰符是返回所有⽐内查询中结果都⼤的结果。
婚姻治疗⽐较操作>ALL意味着要⼤于列表中最⼤的值。⽰例如下:
1Sales > ALL(1000, 2000, 2500)
等同于:
1Sales > MAX(1000, 2000, 2500)
对条件 Sales > 2500返回为TRUE
这个例⼦我们返回年初⾄今奖⾦⼤于所有销售收⼊⼩于$1000000⼈员的奖⾦的销售⼈员名单:
1 2 3 4 5 6 7 8 9 10 11 12SELECT p.BusinessEntityID,
p.FirstName,
p.LastName,
s.Bonus,
s.SalesYTD
FROM Person.Person AS p
INNER JOIN Sales.SalesPerson AS s
ON p.BusinessEntityID = s.BusinessEntityID
WHERE s.Bonus > ALL(SELECT Bonus
FROM Sales.SalesPerson
WHERE Sales.SalesPerson.SalesYTD
< 1000000)
翻译于 2
个⽉前
0⼈顶
翻译
的不错
哦!
各种⽐较修饰符⼩结
你能使⽤各种⽐较修饰符进⾏其他的操作,⽐如判断相等。如下表格内的⽰例可以更加便于理解。有些组合可能没有意义,我还是全部列了出来。
⽰例中的⼦查询结果集仅包含了三个数值
:  1,2,3.
某些⽐较的组合根本没⽤。⽐如“= ALL” 或 “<> ANY.”。⼯具在于⼈使⽤,如果你觉得MAX或MIN可以⽤就该⽤,ANY和ALL只出现在它该出现的地⽅。我们今天讨论了我在⼦查询中使⽤EXISTS和NOT EXISTS的情况。我⽤了相当多的IN⼦句,但通常是在⼀个静态列表,⽽不是⼦查询中。

本文发布于:2023-07-29 04:19:44,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1122344.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:查询   返回   销售   语句
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图