加入收藏 | 设为首页 | 会员中心 | 我要投稿 温州站长网 (https://www.0577zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

T-SQL查询进阶:深入理解子查询

发布时间:2016-10-02 16:27:37 所属栏目:MsSql教程 来源:站长网
导读:副标题#e# 引言 SQL有着非常强大且灵活的查询方式,而多表连接操作往往也可以用子查询进行替代,本篇文章将会讲述子查询的方方面面。 简介 子查询本质上是嵌套进其他SELECT,UPDATE,INSERT,DELETE语句的一个被限制的SELECT语句,在子查询中,只有下面几个子句

如何区别相关子查询和无关子查询呢?最简单的办法就是直接看子查询本身能否执行,比如上面的例子中的子查询:

(SELECT *
  FROM [AdventureWorks].[HumanResources].[Employee] e
  WHERE c.ContactID=e.ContactID AND e.SickLeaveHours>68)

这一句本身执行本身会报错.因为这句引用到了外部查询的表

对于无关子查询来说,整个查询的过程为子查询只执行一次,然后交给外部查询,比如:

SELECT *
FROM AdventureWorks.HumanResources.Employee
WHERE SickLeaveHours>ANY

SQLRESULT

上面的无关子查询,整个查询过程可以看作是子查询首先返回SQLResult(SQL结果集),然后交给外部查询使用,整个过程子查询只执行一次

而相反,作为相关子查询,子查询的执行的次数依赖于外部查询,外部查询每执行一行,子查询执行一次,比如:

还是上面的例子:我想取得总共请病假天数大于68天的员工

SELECT [FirstName]
      ,[MiddleName]
      ,[LastName]
  FROM [AdventureWorks].[Person].[Contact] c
  WHEREEXISTS

  (SELECT *
  FROM [AdventureWorks].[HumanResources].[Employee] e
  WHERE c.ContactID=e.ContactID AND e.SickLeaveHours>68)

----
step 1:
SELECT [FirstName]
      ,[MiddleName]
      ,[LastName]
  FROM [AdventureWorks].[Person].[Contact] c
  WHEREEXISTS

  (SELECT *
  FROM [AdventureWorks].[HumanResources].[Employee] e
  WHERE 1=e.ContactID AND e.SickLeaveHours>68)
----
step 2:
SELECT [FirstName]
      ,[MiddleName]
      ,[LastName]
  FROM [AdventureWorks].[Person].[Contact] c
  WHEREEXISTS

  (SELECT *
  FROM [AdventureWorks].[HumanResources].[Employee] e
  WHERE 2=e.ContactID AND e.SickLeaveHours>68)
----
step n:
SELECT [FirstName]
      ,[MiddleName]
      ,[LastName]
  FROM [AdventureWorks].[Person].[Contact] c
  WHEREEXISTS

  (SELECT *
  FROM [AdventureWorks].[HumanResources].[Employee] e
  WHERE n=e.ContactID AND e.SickLeaveHours>68)

 如上面代码所示。上面的相关子查询实际上会执行N次(N取决与外部查询的行数),外部查询每执行一行,都会将对应行所用的参数传到子查询中,如果子查询有对应值,则返回TRUE(既当前行被选中并在结果中显示),如果没有,则返回FALSE。然后重复执行下一行。

(编辑:温州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读