一、视图
表中存放的是实际数据,但是视图中存放的是sql查询语句。
使用视图时,系统会运行视图里的sql查询语句然后创建出一张临时表。
创建视图
1.1 视图的优点
1.在进行汇总复杂查询条件导致这个sql查询语句非常冗杂时,同时所使用的sql语句需要频繁查询时,就可以保存成视图重复使用,可以帮助我们提高效率
2.视图数据会随原表的状态自动更新,因为视图中存放的并不是实际数据,而是视图中存放的是sql查询语句。
3.视图不需要保存数据,可以节省空间。
如何使用视图
1.2 视图注意事项
1.避免在视图的基础上再创建视图,因为会降低sql查询的效率。
2.一般不能往视图里插入数据,因为会报错,但是某些时候也能对视图进行更新。
3.视图中列的顺序和sql查询语句中列的顺序是一一对应的。
1.3 更新视图时需要的注意事项
如果定义视图的select子句能够满足以下条件,那么这个视图就可以被更新
1.select子句中未使用distinct
2.from子句中只有一张表
3.未使用group by 子句,通过汇总得到的视图无法更新
4.未使用having子句
通过汇总得到的视图并没有原表中的其他列,视图和表需要同时更新(因为视图就是对原表的子查询),因此视图无法进行更新。
二、子查询
什么是子查询:在一个select子句中嵌套了多个select查询语句,相当于创建了一个临时表,在sql查询语句运行结束后,这个临时表就消失了。
系统会先运行子查询,再运行外层select查询语句
in
在sql中,in主要是用来判断数据是否在某个数据集中,因此可以和where以及子查询一起配合使用,增强代码的可读性和执行效率。
其实where和in以及子查询不仅能对单个数据列进行判断,同时也能对多个数据列进行判断是否位于某个集合之中,例如:
where (成绩,课程号) in (
select 成绩,课程号 from score
group by 课程号
any
any关键字是用来进行判断,某个数据>any(数据集),就是比数据集中的全部数据中任意一个高就为真。其实最主要是看数据集中的最小值,比最小值大就可以了。
all
all关键字是用来进行判断,某个数据>all(数据集)就是比数据集中的全部数据都要高就为真。其实最主要是看数据集中的最大值,比最大值大就可以了。
找出列名中成绩比子查询中所有都高 where 成绩>all(子查询)
列名中成绩比子查询中所有成绩高(也就是要比最高的成绩要高)where 成绩>all(子查询),那为什么不用max函数呢?where 成绩 >max(成绩2),因为where中不能使用聚合函数,所以只能使用all。
使用子查询注意事项:
避免使用多层嵌套子查询
要注意sql运行顺序
from->where->group by->having->select->distinct->union->order by->limit
标量子查询
在子查询基础上限制了只能返回一行一列的值,标量子查询不能返回多行结果。
关联子查询
当在每个组内进行比较时,使用关联子查询
三、如何用sql解决业务问题
1.翻译成大白话
2.写出分析思路
3.写出对应的sql子句