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适合于外表小而内表大的情况。