子查询介绍
更多介绍
上一节说到联接查询,Class通过关系表找到Student,用联接就已经满足了我们的需求,那为什么会出现子查询,而且大部分情况联接能做到的,子查询也可以做到
现在我们的问题就是联接已经这么强大了,子查询它的优点是什么?什么情况下需要用到子查询?
先介绍一下什么叫子查询,查询里面嵌套查询,就叫子查询,子查询可以嵌套到列、条件,联接中
列嵌套
select
stu.Id,
stu.Age,
stu.Gender,
(
select class.[Name] from Class as class
left join Class_Student_Merge as csm on class.Id = csm.ClassId
where csm.StudentId = stu.Id
) as ClassName
from Student as stu
-- 等同于
select
stu.Id,
stu.Age,
stu.Gender,
class.[Name] as ClassName
from Student as stu
left join Class_Student_Merge as csm on csm.StudentId = stu.Id
left join Class as class on csm.ClassId = class.Id
条件嵌套
select * from Student as stu
where stu.Id in (
select csm.StudentId from Class_Student_Merge as csm
left join Class as class on csm.ClassId= class.Id
where class.[Name] = N'九年级'
)
-- 等同于
select * from Student as stu
where exists (
select * from Class_Student_Merge as csm
left join Class as class on csm.ClassId= class.Id
where csm.StudentId = stu.Id and class.[Name] = N'九年级'
)
-- 等同于
select stu.* from Student as stu
left join Class_Student_Merge as csm on stu.Id = csm.StudentId
left join Class as class on csm.ClassId= class.Id
where class.[Name] = N'九年级'
联接嵌套
select stu.* from Student as stu
left join (
select csm.StudentId, class.[Name] as ClassName from Class_Student_Merge as csm
left join Class as class on csm.ClassId = class.Id
) as csm on stu.Id = csm.StudentId
where csm.ClassName = N'九年级'
-- 等同于
select stu.* from Student as stu
left join Class_Student_Merge as csm on stu.Id = csm.StudentId
left join Class as class on csm.ClassId= class.Id
where class.[Name] = N'九年级'
P.S:看了上面三个例子,你会发现嵌入到列中,可以得到其它表的内容
这里需要注意,子查询一般只能返回一个列的值,但是当你用作联接嵌套就可以无视前面所说
条件嵌套一般只是为了拿到自身符合条件的数据
联接嵌套是比较常用的一种,比如做报表的时候,我们希望从各种各样的表拼接在一起当成一个新的数据源来进行联接操作在条件嵌套里你会看到一个exists的关键字,它的意思和in大致一样,都是判断这行数据是否存在于子查询的结果中
光看是否觉得很笼统,上图
有是否存在,相对应就会有不在结果中出现的关键字,not exists和not in
使用exists子查询里面的列得用*号表示
如果懒得管这么多,直接in无脑用也可以
现在回到我们开头的到问题
子查询它的优点是什么?
1、允许我们自定义数据源,进行联接嵌套,这样就可以有无限的可能性,因为我们可以拿到我们的对应的结果,所以子查询玩起来还是很多花样的特别爽,但是效率问题是我们需要担心的
2、可以减少结果拼接,联接会附带上联接表里的列,这样会让我们的结果变的庞大起来,需要处理
3、可以在任意列里,对数据进行单独处理,返回处理后的新的值
什么情况下使用子查询?优点里面也提到了
1、当我们的要展现数据比较杂乱,不打一处来的时候,需要组装各种各样的数据时
2、针对每列的结果需要单独处理时
3、当你随心所欲的时候