视图:
1.视图的概念引入:
SQL数据库里面存放的是SQL语句,视图中查看到的SQL查询语句,当我们运用客户端连接到视图时候,视图会运行里面的查询语句,从库中查找出数据,保存在临时表里面。当客户端和数据库断开时,表会被自动删除。不是保存在SQL数据库里面。
2.如何创建视图;
Code: create view 视图名称(<视图列名1>,<视图列名2>...) as <select查询语句>
3.为什么要使用视图:
- 不需要重复工作:某些大量重复使用的SQL语句,可以保存为视图,不需要每次运用时都去写SQL语句。类似Excel中给每个表写好函数,基础数据变动,设计好的函数结果就会变化。
- 自动更新: 如上述说的,基础数据变化,视图中函数结果就会发生变化
- 节省存储空间:减少存放数据设备的空间。视图不需要保存数据。
注意事项:
1.不要重复新建视图,会降低SQL性能效率
2.不能忘视图里面插入数据,会报错。
eg.在工作中需要常常用性别来汇总计算,就写好视图。数据库中数据表动,视图中函数得出结果也会相对应变动。
create view 按性别汇总(性别,人数)as select 性别,count(*) from student group by 性别;
多条件子查询
以下代码根据此四个基础原表:
【原数据表】
1)IN(子查询)--在...之一
相当于or
【题目】:找出每个课程里 成绩最低的学号
第一时间可能想到的是如下语句,但这个是错误的:
【理解思路1】:理解这个代码错误的原因要从SQL运行顺序上去想。首先从Score表里面提取数据并根据课程号进行数据分组,然后执行应用函数min(成绩)。此时得出的结果只有课程号和成绩。然后再进行组合和随机学号的加入。
【理解思路2 】:因此应该要用子函数进行嵌套,首先子函数先运行,找出每门课程对应最低成绩是多少。然后运行主句。在选出的每门课的最低成绩中,找出对应的学生学号。
2)Any(子查询)/some(子查询)在...(子查询)之一
一般用于比较,接于比较运算符之后。
select<列名1> from <表名> where<列名> > any(子查询)
eg.
【解析】:
3)all(子查询) 全部...
一般用于比较,接于比较运算符之后。
eg.
标量子查询
标量子查询和一般子查询相比,其特征是标量子查询得出来只有一个值,一般子查询可能会有一个值会有多个值,所以他们之间是包含关系。
标量子查询多用于比较运算符后。例如小于大于等于之后。但也可用于主句中,当显示结果为唯一值时。
【解析】:select avg(成绩)from score的出来只有一个数值。
eg2.
关联子查询:
在进行在每个组里比较的时候会用到关联子查询,先看下面栗子:
栗子中,希望找出大于没个课程平均成绩的学生,但是select子从句的出来的结果是三个值(因为有三个课程)而非一个值,这个导致不能直接使用标量子查询。
【解决方法】:
子从句中加入 where 条件。
在子查询加入where之后,得出来的结果虽然仍然是‘0001,'0002','0003'三个课程的平均成绩,但是这三个课程的平均成绩因为有where 进行限定,所以是一 一对应的关系。主句中出现0001课程的成绩,就会对子查询中0001值出现的平均成绩进行比对,不再是一对三,而是实现一对一的效果。
子查询注意事项:
- 不建议层层嵌套子查询,这会造成数据库运行速度减慢。 select... from (子查询(子查询))
- 子查询用as 来标记方便阅读。 select ...from...子查询 as 子查询名称
【sqlzoo练习】-->select in select: