首页>>数据库>>SQLServer语句中的三种子查询(in,比较符,exisits)
SQLServer语句中的三种子查询(in,比较符,exisits)
来源: 易习特达网 www.easytd.com 时间: 2015-01-13 10:18:22

子查询是一个嵌套在select、update、insert、delete语句或其他子查询中的select查询,它返回单个值。子查询也称为内部查询或内部选择,它可以用在任何允许使用表达式的地方。    

例如检索语句

    这儿就利用了子查询select sum(UnitPrice*UnitsInStock) From Products求出整个Products中所有商品的总价值,然后进一步计算出各个商品在其中所占的比例。

很多时候,包含子查询的T-SQL语句也可以改用联接实现。一般说来,这两种方法没有什么区别,在T-SQL中,包括子查询的语句和不包括子查询但语义上等效的语句在性能方面通常相同。例如下面两个检索语句的效果基本相同:

Select ProductName

From Northwind.dbo.Products

Where UnitPrice=(Select UnitPrice

               From Northwind.dbo.Products

Where ProductNam=’Sir Rodney”s Scones’

Select Prd1.ProductName

From Northwind.dbo.Products AS Prd1

JOIN Northwind.dbo.Products AS Prd2

ON(Prd1.UnitPrice=Prd2.UnitPrice)

Where Prd2.ProductName=’Sir Rodney”s Scones’

注意:并不是在任何惜况下子查询和联接都是等效的,在一些必须检查存在性的情况中,使用联接会产生更好的性能。反之也不是所有的子查询都可以用联接代替的,某些功能只能由于查询完成。

子查询的基本类型有以下三种:

●用于由in关键字引入的列表。

●通过比较运算符引入,此时必须返回单个值。

●用于EXISTS关键字引入的存在测试。

通过in引入的于查询只能返回表中某一列,对列中值的数目没有限制,甚至可以没有任何值,子查询返回结果之后,外部查询将利用这些结果进行检索。例如检索语句:

Select ProductName,UnitPrice

From Products

Where ProductId in (Select ProductID 

From [Order Details]

Where OrderID=10273)

将返回10273号订单中购买的商品名称。

该检索语句的执行过程中,首先通过内部查询得到10273号订单购买的商品编号(ProductID),然后根据这些值,外部杏询该商品信息表Products中查到它们对应的商品名称。

由比较运算符(=、<>、>、<、>=、<=、!>或!<)引入的子查询必须返回单个值而不能是多个值的列表,因为这种类型的子查询在外部查询中是作为一个操作数出现的,一个操作

数显然只能有一个值,而不能是一个值的集合。如果这样的子查询返回多个值,SQLServer将显示错误信息。

 

返回订单10273的客户信息。

    由于事先知道一个订单只能属于一个客户,所以这儿可以使用这种子查询。否则如果

子查询可能返回多个值时,就应该使用in代替比较运算符。

    注意:要使用这种由比较运算符引入的子查询,用户必须对数据和问题的本质非常熟悉,以了解放子查询实际是否只返回一个值。

使用EXISTS关键字引入的子查询实际上不产生任何数据;它只返回TRUE或FALSE值,来表示子查询返回的行是否存在。例如检索语旬

 

与前面使用的IN的子查询相同,将返回10273号订单中购买的商品名称。

由于这三种子查询只是检查是否存在符合条件的行,而并不实际返回任何数据,所以列出的列名没有意义。所以由EXISTS引入的子查询的选择列表通常几乎都是由星号(*)组成。

上面分别介绍了三种子查询的详细用法和实例,下面列出使用于查询时需要注意的一些事项

●通过比较运算符引入的子查询的选择列表只能包括一个表达式或列名称。

●如果外部查询的Where子句包括某个列名,则该子句必须与于查询选择列表中的该列在联接上兼容。

●由于必须返回单个值,所以由比较运算符引入的于查询不能包括GROUP BY和HAVING子句。

●包括GROUP BY的于查询不能使用DISTINCT关键字。

●不能在于查询中指定COMPUTE和INTO子句。

●按约定,通过EXISTS引入的子查询的选择列表由星号(*)组成,

●子查询可以嵌套在外部Select,Insert,Update或Delete语句酌WHERE或HAVING字旬内,或者其他子查询中。根据可用内存和查询中其他表达式的复杂程度不同,嵌套限制也有所不同,一般说来可以嵌套到32层。

本页地址:http://www.easytd.com/shujuku/d_15011310218.html

上一篇:SQLServer中连接查询,子查询,exisits子句的用法 下一篇:SQL like语句正则表达式精细化模糊查询