从这一篇开始要总结子查询了,什么是子查询呢?子查询就是将内部查询的结果供外部查询使用,内部查询可以取代基于常量或变量的表达式,并在运行时进行计算。通过使用子查询,可以避免在查询解决方案中把操作分成多个步骤,并在变量中保存中间查询结果的需要。

子查询可以分为独立子查询和相关子查询,那么这一篇我们总结的就是独立子查询,我想分为以下几个方面进行总结。

1,独立标量子查询

2,独立多值子查询

独立标量子查询

独立标量子查询就是返回单个值的子查询,标量子查询可以出现在外部查询中期望使用单个值的任何地方,包括WHERE,SELECT,等等。

下面是一个例子,假设现在要查询Orders表,返回表中订单ID最大的订单信息。

SQL查询代码:

USE TSQLFundamentals2008;
GO

-- 独立标题子查询
SELECT orderid,orderdate,empid,custid 
FROM Sales.Orders
WHERE orderid= (SELECT MAX(orderid) FROM Sales.Orders);

查询结果:

image

这里,有一个需要注意的地方,就是对于有效的标量子查询,它的返回值不能超过一个(也可以没有)。如果标量子查询返回了多个值,在运行时就会失败。如下面的例子,尝试用这条查询语句来查找姓氏以字母D开头的职员的订单。

SQL查询代码:

SELECT orderid 
FROM Sales.Orders
WHERE empid=(SELECT employees.empid FROM HR.Employees AS employees WHERE employees.lastname LIKE N'D%');

查询结果:

image

独立多值子查询

多值子查询就是在一个列中返回多个值的子查询。多值子查询通常与谓词IN一起使用,例如,就像上面的那个例子,使用多值子查询来写如下查询代码。

SQL查询代码:

-- 独立多值子查询
SELECT orderid,empid 
FROM Sales.Orders
WHERE empid IN (SELECT employees.empid FROM HR.Employees AS employees WHERE employees.lastname LIKE N'D%');

查询结果:

image

注意,使用子查询完成的任务,很多时候也可以使用联接来解决。比如,上面的例子使用联接来实现的话。

SQL查询代码:

-- 使用联接查询实现
SELECT orders.orderid,employees.empid 
FROM HR.Employees AS employees
LEFT JOIN Sales.Orders AS orders ON employees.empid = orders.empid
WHERE employees.lastname LIKE N'D%';

查询结果同使用子查询。

所以,到底是使用子查询还是联接查询,这个要看具体需求。

posted on 2014-08-03 15:22  永远的麦子  阅读(1269)  评论(0编辑  收藏  举报