网站在布局/今日头条新闻最新疫情
一.视图
1.什么是视图
是用来存放sql查询语句的,在使用时会运行存放的sql查询语句生成一张临时表。
2.如何使用视图
创建视图
create view 视图名称(<视图名称1>,<视图名称2>,...)
as
<select 查询语句>;使用视图
select <视图名称1>,<视图名称2>,...
from 视图名称;
3.为什么使用视图
- 对于频繁使用或者查询的表格,可以保存成视图,这样不用每次重新写sql,提高效率
- 视图中的数据会随原表的变化而自动更新
- 因为不需要保存数据,可以节省存放数据的空间
4.注意事项
- 避免在视图基础上再创建视图,多重视图会降低sql的性能和效率
- 不能在视图中插入数据,会报错
练习:
创建视图、使用视图


二.子查询
1.什么是子查询
是一次性的视图,就是在select查询语句中嵌套另一个select查询语句,可以看作一个临时表
sql的的运行顺序是:先运行子查询,然后运行select查询
select 性别,人数
from (select 性别,count(*) as 人数 from student
group by 性别) as 按性别汇总;
2.如何使用子查询
除了位于from子句后面的子查询,还有三种类型的子查询分别是:
- ...in (子查询)
找出每门课程里 成绩最低的学号
select 学号,成绩 from score
where 成绩 in (select min(成绩) from score group by 课程号);
- ...any(子查询)
哪些学生的成绩比课程0002的全部成绩里的任意一个高呢?
select 学号,成绩 from score
where 成绩 > any(select 成绩 from score where 课程号='0002');
- ...all(子查询)
哪些学生的成绩比课程0002的全部成绩里的都高呢?
select 学号,成绩 from score
where 成绩 > all(select 成绩 from score where 课程号='0002');
3.子查询的作用
- 偶尔使用某个查询语句,推荐使用子查询
- 频繁使用某个查询语句,推荐使用视图
4.注意事项
- 因为all(b)指的时一个集合,书写子查询时应写成 a/3 > all(b)而不是 a > 3*all(b)
- 避免使用多层嵌套子查询, select ... from (子查询(子查询))
- 子查询重命名as语句可以省略,但是不建议省略,select ... from ...子查询 as 子查询名称
三.标量子查询
1.什么是标量子查询
必须返回一行一列的查询结果,是一个单一的值。
2.如何使用标量子查询
- 查询介于差生平均成绩和优生平均成绩之间的学生成绩(在where子句中)
select 学号,成绩 from score
where 成绩 between (select avg(成绩) from score where 成绩 <=60)
and (select avg(成绩) from score where 成绩 >80);
- 查询所有学生的成绩和平均成绩(在select子句中)
select 学号,成绩,(select avg(成绩) from score) as 平均成绩 from score;
3.标量子查询的作用
标量子查询返回的是单一的值,可以与比较运算符一起使用,包括in、any、all、between。
4.注意事项
标量子查询不能够返回多行结果,不能使用多行数据
练习:
1.大于平均成绩学生的学号和成绩

2.查询介于差生平均成绩和优生平均成绩之间的学生成绩

四.关联子查询
1.什么是关联子查询
子查询结果与跟它关联的外部查询进行比较得出结果
2.如何使用关联子查询
查找出每门课程中大于对应课程平均成绩的学生
select 学号,成绩 from score as s1
where 成绩 > (select avg(成绩) from score as s2 where s1.课程号=s2.课程号 group by 课程号);
3.关联子查询的作用
当需要在每个组里比较时需要使用
4.练习

五.如何用sql解决业务问题
回顾一下解决问题思路:
step1:翻译成大白话
step2:写出分析思路
step3:写出对应的sql子句
案例:哪些学生的成绩比课程0002的全部成绩里的任意一个高呢?
1.把问题翻译成大白话
第一步:查找出课程0002的全部成绩
第二步:某个学生的成绩大于课程0002的任一成绩
2.写出分析思路
- select 查询结果,成绩
- from 从哪张表取出数据,course表
- where 指定条件, 课程号=0002
- group by 分组,无
- having 按分组结果指定条件,无
- order by 对查询结果排序,无
- limit 从查询结果中取出指定行,无
3.写出对应的sql子句
step1:
select 成绩 from course
where 课程号='0002';
step2:
select 学号 from course
where 成绩 > any(select 成绩 from course where 课程号='0002');
注意:sql报错信息看不懂用什么方法找出错误
排除法,当sql语句中包含子查询时,我们先选中子查询单独运行看是否报错,
如果没有我们便运行整个sql语句继续检查,逐一排查。
六.各种函数
汇总函数

算数函数

字符串函数

日期函数

七.总结
- 学习了什么是视图
- 学习了子查询、标量子查询和关联子查询
- 进一步实际操作用sql解决业务问题,三个步骤(1.翻译问题 2.分析思路 3.写出sql)
