SqlServer系列笔记——子查询
子查询意思:
将一个查询语句做为一个结果集供其他SQL语句使用,就像使用普通的表一样,
被当作结果集的查询语句被称为子查询
所有可以使用表的地方几乎都可以使用子查询来代替。
关键子 IN
exists Not Exists 子查询返回true 或 false
SELECT * FROM(SELECT * FROM T2 where FAge<30)
子查询和连接查询的比较
有些问题使用子查询解决会更简单,有些问题使用连接查询可以变得简单,
因此要根据实际情况进行选择。
当需要频繁地计算统计函数的值并将其作为外部查询的条件时,
应该使用子查询。
单值做为子查询:SELECT 1 AS f1,2,(SELECT MIN(FYearPublished) FROM T_Book),(SELECT MAX(FYearPublished) FROM T_Book) AS f4
只有返回且仅返回一行、一列数据的子查询才能当成单值子查询。
下面的是错误的:
SELECT * FROM T_ReaderFavorite WHERE FCategoryId=(SELECT FId FROM T_Category WHERE FName='Story')
如果子查询是多行单列的子查询,这样的子查询的结果集其实是一个集合。
SELECT * FROM T_Reader
WHERE FYearOfJoin IN
(
select FYearPublished FROM T_Book
)
用 in实现select * from Person p where p.PersonID in(select PersonID from Person where LastName like 'A%')
用exists 实现
select * from Person p where exists (select PersonID from Person where LastName like 'A%' and Person.PersonID=p.PersonID )
EXISTS与IN的使用效率的问题,通常情况下采用exists要比in效率高,因为IN不走索引,但要看实际情况具体使用:
IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341