T-SQL查询进阶:深入理解子查询
子查询作为选择条件使用作为选择条件的子查询也是子查询相对最复杂的应用. 作为选择条件的子查询是那些只返回一列(Column)的子查询,如果作为选择条件使用,即使只返回单个值,也可以看作是只有一行的一列.比如: 在AdventureWorks中: 我想取得总共请病假天数大于68小时的员工: SELECT [FirstName] ,[MiddleName] ,[LastName] FROM [AdventureWorks].[Person].[Contact] WHERE ContactID IN (SELECT EmployeeID FROM [AdventureWorks].[HumanResources].[Employee] WHERE SickLeaveHours>68) 结果如下: 上面的查询中,在IN关键字后面的子查询返回一列值作为外部查询的选择条件使用. 同样的,与IN关键字的逻辑取反的NOT IN关键字,这里就不再阐述了 但是要强调的是,不要用IN和NOT IN关键字,这会引起很多潜在的问题,这篇文章对这个问题有着很好的阐述:http://wiki.lessthandot.com/index.php/Subquery_typo_with_using_in。这篇文章的观点是永远不要再用IN和NOT IN关键字,我的观点是存在即合理,我认为只有在IN里面是固定值的时候才可以用IN和NOT IN,比如: SELECT [FirstName] ,[MiddleName] ,[LastName] FROM [AdventureWorks].[Person].[Contact] WHERE ContactID IN (25,33) 只有在上面这种情况下,使用IN和NOT IN关键字才是安全的,其他情况下,最好使用EXISTS,NOT EXISTS,JOIN关键字来进行替代. 除了IN之外,用于选择条件的关键字还有ANY和ALL,这两个关键字和其字面意思一样. 和"<",">",”="连接使用,比如上面用IN的那个子查询: 我想取得总共请病假天数大于68小时的员工 用ANY关键字进行等效的查询为: SELECT [FirstName] ,[MiddleName] ,[LastName] FROM [AdventureWorks].[Person].[Contact] WHERE ContactID =ANY (SELECT EmployeeID FROM [AdventureWorks].[HumanResources].[Employee] WHERE SickLeaveHours>68) 在作为ANY和ALL关键字在子查询中使用时,所实现的效果如下 =ALL关键字很少使用,这个的效果在子查询中为如果只有一个返回值,则和“=”相等,而如果有多个返回值,结果为空 这里要注意,SQL是一种很灵活的语言,就像子查询所实现的效果可以使用JOIN来实现一样(效果一样,实现思路不同),ANY和ALL所实现的效果也完全可以使用其他方式来替代,按照上面表格所示,>ANY和>MIN完全等价,比如下面两个查询语句完全等价: SELECT * FROM AdventureWorks.HumanResources.Employee WHERE SickLeaveHours>ANY (SELECT SickLeaveHours FROM AdventureWorks.HumanResources.Employee WHERE SickLeaveHours>68) SELECT * FROM AdventureWorks.HumanResources.Employee WHERE SickLeaveHours> (SELECTMIN(SickLeaveHours) FROM AdventureWorks.HumanResources.Employee WHERE SickLeaveHours>68) (编辑:PHP编程网 - 黄冈站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |