一、视图
创建视图步骤:
create view 视图名称(<视图列名1>,<视图列名2>)
as <select 查询语句>
注意视图中列的顺序与select语句中显示列的数据是一一对应的,视图里放的不是数据,是sql查询语句
(一)创建视图
使用场景:在频繁使用某一sql语句时
如何使用视图:直接在from子句中使用视图名称代替表名称
优点:提高效率;视图数据会随着原表的变化更新;不需要保存数据,节省空间
使用注意事项:
1、避免在使用视图的基础上再使用视图
2、不能往视图里插入数据
练习题1:
创建视图:
直接使用视图
二、子查询
(一)什么是子查询:子查询可以作为一个临时表,在语句运行结束后临时表消失;一次性的视图,在from子句中直接写定义视图的sql查询语句,当sql里有子查询时会先运行子查询
例如:
select性别,人数
from(
select 性别,count(*) as 人数
from student
group by 性别
) as 按性别汇总;
from子句中为sql查询语句,“as 按性别汇总”就是子查询的名称
随堂练习:
(二)如何使用子查询
子查询也可以用在where子句里面,与in /any/all一起使用,在in /any/all后面放入子查询
随堂练习:
在练习中注意如果直接筛选课程和成绩,显示的学号为随机生成,因为在实际运行过程中,第二步算最低成绩时,只有课程号与成绩两列数据保留。
any、all的使用:
1、必须与比较运算符(大小)一起使用
2、any 与some使用方法相同
示例:
select 列名1
from 表名1
where列名1>any(子查询);
表示:查询结果只需大于子查询中的任意一个数字即可。
随堂练习:
any子查询:
all子查询:
(三)使用子查询的场景:偶尔使用某个查询语句用子查询,频繁查询使用视图
(四)使用子查询注意的事项:
(1)all后面跟的是集合范围不是单独的数字,因此不能表示成a>3*all(b),而是a/3>all(b)
(2)避免使用多层嵌套子查询
(3)select from 子查询 as 子查询名称,其中“as 子查询名称”可以省略
(五)sql运行顺序:子查询——from、where、group by、having——select 子句——order by、limit
三、标量子查询
注意:在where子句中不能使用汇总函数
标量子查询:只能返回一行一列的查询结果,因为标量子查询结果是一个单一的值,因此可以与比较运算符一起使用。
随堂练习:
任何使用单一值都可以用标量子查询。
因为标量子查询返回的是单一的值,所以可以和比较运算符、in、any、all、between使用,一定要注意标量子查询不会返回多行结果
四、关联子查询
随堂练习:
select 学号,课程号,成绩
from score as S1
where 成绩> ( select avg(成绩) from score as S2
where S1.课程号= S2.课程号
group by 课程号);
(一)注意:关联条件一定要写在子查询里面,S2仅在子查询里有效。所以S2能在子查询里看到S1,S1在子查询外看不到S2。
(二)使用子查询的场景:在每个组里进行比较,关联子查询起作用是因为有一个关联条件。
五、如何使用sql解决业务问题
随堂练习:
如何查找错误:可以注意检查问题,例如先检验子查询的问题再查询是否为子查询外面的问题。
六、各种函数
函数的3个功能:具备功能、有输入端(参数)、有输出端(返回值)
常用的函数:
汇总——count/sum/avg/max/min(求和与平均值只能对数值类型计算)
算术函数
字符串函数
日期函数
七、课后练习
此题求出结果与网站结果不一,练习结果按照四舍五入后数据显示,网站显示比例不按四舍五入取值。
本题经检查,应注意 x中的名称不等于y中的名称。
修改为:
select name,continent from world as x where population/3 >=
all(select population from world as y
where x.continent=y.continent and x.name <> y.name
group by continent);
本节学习心得:复杂查询相比较与简单查询困难很多,想快速掌握感觉是不太可能的,还是要多做题多理解,读懂题目意思,用老师的方法一步步分解题目逐步解决。