sql join 子查询_SQL复杂查询(视图,子查询,标量子查询,关联子查询)

de838981f740bad248fe7140797a2c4b.png

37b72baed9dccc875c06db1eade6369b.png

一、创建视图

1。

03b0e85c9af5c8952b235c55b5ac3b6e.png
视图相当于一张临时表,链接了数据库,原表数据跟新时也会随之更新,当数据库没了,这个视图也不存在了。

548536ba2b8e9f269da564d1d32deeee.png

CREATE VIEW后面的要和SELECT一一对应

2、视图的作用:

1)当你要频繁使用某些查询语句,那么就可以保存成视图。特别是在进行汇总或复杂当查询条件时,导致这个sql语句非常庞大的时候,可以保存为视图提高效率。

2)视图会随着原表更新:因为它存放的不是数据而是sql语言。

3)不需要保存数据,所以节省了保存数据的空间。

3、注意事项
1)避免在视图的基础上再创建视图,因为多重视图会降低sql运行的效率

2)不能往视图里插入数据,不然会报错。

二、子查询(在一个select嵌套里另一个select查询)

1、

当sql语句中有子查询时总是先运行子查询。sql子查询可以放在FROM子句里,也可以放在WHERE子句里和in,any,all一起使用。

1)用于WHEREIN子句中

5964a5c779029ad820b38daae34bc53c.png

8fe38f4aac6d1007b3b3c635d9c60551.png

2)用于WHEREany子句中【any(子查询)和some(子查询)相同】

dc1eee555fda215eb19abe8cd28bc374.png

3)WHERE子句里的 ALL子查询

b111e44977dc4d7993cb9b2727431b44.png

注:any的意思是只要比其中的一个高就行了。ALL的意思是要比所有的每一个都高。

2、注意事项:

bc2d09919544e6c14622116f8a2865f8.png

1)all(子查询)里得到的是一个集合,所有3*all(子查询)没有意义,只能是前面那个数a/3>all(子查询);

2)避免使用多重嵌套,不然降低会降低效率,也很难读懂。

3)一般来说,as后面的子查询名称可以省略。但是我们一开始可以不省略,以便后面查询时能够读懂自己写的语句。

三、标量子查询

1、标量子查询定义:必须而且只能返回一行一列的结果,也就是只返回一个唯一的值(不能返回多行的值)。任何使用单一值的地方都可以使用标量子查询。

如图所示,汇总函数avg不能用在WHERE子句中。

3b38c8e87ce03e29afe616bb5670f913.png

那么如何能写出大于平均成绩的学号和成绩呢?答案如下图:

AVG(成绩)返回的是一个唯一的单行单列的值,所以可以直接用于比较运算符。

4d51b0e1b05518bf0d1e049ca2032ddf.png

例如:找出介于差等生平均成绩和优等生平均成绩之间的学号和成绩。可以用between and,因AVG得到的是一个唯一值,把标量子查询AVG放在between and之间,就相当于把两个数放在了between and 之间。如图所示。

f299a23c06e38211ea9e7514f70bd694.png

标量子查询还可以用在SELECT中。

6180d33fddef2fc360d4d8949f7a7bb6.png

2、标量子查询有什么用:

标量子查询表示只返回单一的值,不能返回多行结果。因此可以使用比较运算符,可以和in, any,all,between一起使用。

9fc0c6600cdd0a7dda1f1889bf5090b0.png

3、注意事项:

如下图所示,用了group by之后的avg(成绩)返回的是多个值,就不是标量子查询。注意看报错信息。

4fd3d93d5f68f0df37a640d358c58a94.png

四、关联子查询:在每个组里进行比较。

例如:查找出每个课程中大于对应课程平均成绩的学生。

569cdcd392fc8dbafb6deab14f0a93e0.png
s1是父查询的score表的别名;s2是子查询的score表的别名。其实际两个表是同一个表。

1、关联子查询的执行逻辑完全不同于正常的SELECT语句。

2、关联子查询执行逻辑如下:

(1)先从主查询的score表中“课程号”列取出第一个值,进入子查询中,得到子查询结果,然后返回父查询,判断父查询的where子句条件,则返回整个语句的第1条结果。

(2)重复上述操作,直到所有主查询中的score表中课程号列取完为止。得出整个语句的结果集,就是最后的答案。

(详细解释可参考https://zhuanlan.zhihu.com/p/41844742)

五、如果运行报错,也看不出哪里出错了,可以先运行子查询,再运行父查询来排除错误。

六、各种函数

740c12c4b055dea049b7e962c8c4a22b.png

a6b338f176c3240d5af3f84e682bf93c.png

fe2fce4cc05d8aec3d99ab2f8bd6ade1.png

c5d40161013731d77a52cf563ccffffa.png

七、总结

37b72baed9dccc875c06db1eade6369b.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值