天天看点

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

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

1。

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

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

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

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

2、视图的作用:

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

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

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

3、注意事项

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

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

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

1、

当sql语句中有子查询时总是先运行子查询。sql子查询可以放在

FROM

子句里,也可以放在

WHERE

子句里和

in,any,all

一起使用。

1)用于

WHERE

IN

子句中

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

2)用于

WHERE

any

子句中【any(子查询)和some(子查询)相同】

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

3)WHERE子句里的 ALL子查询

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

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

2、注意事项:

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

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

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

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

三、标量子查询

1、标量子查询定义:

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

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

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

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

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

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

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

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

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

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

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

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

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

3、注意事项:

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

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

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

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

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

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

1、关联子查询的执行逻辑完全不同于正常的SELECT语句。 2、关联子查询执行逻辑如下: (1)先从主查询的score表中“课程号”列取出第一个值,进入子查询中,得到子查询结果,然后返回父查询,判断父查询的where子句条件,则返回整个语句的第1条结果。 (2)重复上述操作,直到所有主查询中的score表中课程号列取完为止。得出整个语句的结果集,就是最后的答案。 (详细解释可参考

https://zhuanlan.zhihu.com/p/41844742)

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

六、各种函数

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

七、总结

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

继续阅读