从这一篇开始要总结子查询了,什么是子查询呢?子查询就是将内部查询的结果供外部查询使用,内部查询可以取代基于常量或变量的表达式,并在运行时进行计算。通过使用子查询,可以避免在查询解决方案中把操作分成多个步骤,并在变量中保存中间查询结果的需要。
子查询可以分为独立子查询和相关子查询,那么这一篇我们总结的就是独立子查询,我想分为以下几个方面进行总结。
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);
查询结果:
这里,有一个需要注意的地方,就是对于有效的标量子查询,它的返回值不能超过一个(也可以没有)。如果标量子查询返回了多个值,在运行时就会失败。如下面的例子,尝试用这条查询语句来查找姓氏以字母D开头的职员的订单。
SQL查询代码:
SELECT orderid FROM Sales.Orders WHERE empid=(SELECT employees.empid FROM HR.Employees AS employees WHERE employees.lastname LIKE N‘D%‘);
查询结果:
多值子查询就是在一个列中返回多个值的子查询。多值子查询通常与谓词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%‘);
查询结果:
注意,使用子查询完成的任务,很多时候也可以使用联接来解决。比如,上面的例子使用联接来实现的话。
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%‘;
查询结果同使用子查询。
所以,到底是使用子查询还是联接查询,这个要看具体需求。
原文:http://www.cnblogs.com/mcgrady/p/3888422.html