sql子查询及其运行原理,附树形结构求和实战案例

T-sql子查询及其运行原理

多表连接查询往往也可以用子查询进行替代(子查询的效率往往低于连接查询)

**子查询本质是嵌套进其他 select update insert Delete 语句的一个被限制的select语句,**在子查询中,只有下面几个子句可以使用:

1 select 子句(必须)
2 From 子句(必须)
3 where 子句(可选)
4 group by(可选)
5 having(可选)
6 order by(只有在top关键字使用时才可用)
子查询的返回:
1 返回一张表
2 返回一列值
3 返回单个值

一 ,子查询作为数据源使用(子查询的最简单的使用)
当子查询在外部查询的from子句之后使用时,子查询被当作一个数据源使用,即使这个子查询只返回一个值,一列值,一张表,这里都看做是数据源,
作为数据源使用的子查询很像一个 View(视图),只是这个子查询只是临时存在,并不包含在数据库中

select a.username from a inner join (select * from b ) as c on a.id = c.id

当子查询作为数据源使用时候,也分为相关子查询和无关子查询

二 ,子查询作为选择条件使用(比较复杂的应用)

作为选择条件的子查询是那些只返回一列(column)的子查询,如果作为选择条件使用,即使返回单个值,也可以看做是只有一行的一列

SELECT * FROM a WHERE ID IN(SELECT ID FROM b WHERE age >68)

上面是 在in或者 not in 关键字后面的子查询返回一列值作为外部查询的选择条件使用,不过不太建议用这兄弟俩,比较耗性能,当然如果 in后的返回是固定的值,可以随便用

如果需要实现in的作用,可以用 exists ,not exists ,join 关键字进行代替,,除了in之外,用于选择条件的关键字还有 any和all,和 < ,>,= 连接使用
例如:

SELECT c.Nickname,c.Id FROM Customer AS c
WHERE c.Id = any(SELECT a.CustomerId FROM ForumTopicCustomerXREF AS a )


SELECT c.Nickname,c.Id FROM Customer AS c
WHERE c.Id 
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值