第四关 复杂查询
1、视图
2、子查询
3、标量子查询
4、关联子查询
5、如何用SQL解决业务问题
6、各种函数
是什么?--如何用?---有什么用?--注意事项
- 视图:存放SQL查询语句--临时表(不存放数据)
创建视图:create view 视图名称 as <select 查询语句>;
性别,人数)as select 性别,count(*) from student group by 性别;对应
使用视图: 在from 子句中使用视图名称代替表名称
select 性别,人数 from 按性别汇总;
数据更新后,视图也会更新
有什么用:频繁使用的SQL保存为视图,或者繁琐的SQL方便使用
注意事项:不能往视图里面插入数据,不要在视图里面创建视图
自己创建了个视图:
使用视图:
- 子查询(嵌套查询)
什么是:在from 字句中直接写定义视图中的SQL查询语句
Select 性别,人数 from (select 性别,count(*) as 人数 from student group by 性别 )as 按性别汇总;(先运行)
先运行子查询
使用子查询:in、any、all(子查询)
In(子查询): 找出每个课程里成绩最低的学号
第一步:查找出每门课程的最低成绩有哪些值
Select 课程号,min(成绩) from score group by 课程号;
第二步:在成绩表里查找这些值对应的学号
Select 学号,成绩 from score where 成绩 in ( 刚刚找的最低值)
...any(子查询) 任意一个
...all(子查询)=some(子查询) 所有数据
必须与比较运算符一起使用---等于、不等于、小于、大于、小于等于、大于等于
Select 列名1 from 表名1 where 列名1 >any (子查询);
哪些学生的成绩比课程0002的全部成绩里的任意一个高呢?
第一步:找出课程0002的全部成绩,
第二步:某个学生的成绩 大于 任意一个第1步里的成绩,就符合条件
Select 成绩 from score where 课程号=‘0002’;
Select 学号,成绩 from score where 成绩 > any (Select 成绩 from score where 课程号=‘0002’);
哪些学生的成绩比课程0002的全部成绩里的 都高呢?
Select 学号,成绩 from score where 成绩 > all (Select 成绩 from score where 课程号=‘0002’);
偶尔使用:子查询
频繁使用:视图
子查询注意事项:
1、a>3*all(b)❌------a/3>all(b);√ all(b)得到的是集合,是多行数据
2、避免使用多层嵌套子查询
3、As 子查询名称 可省略
- 标量子查询--只能返回一行、一列的值,单一值,可以和比较运算符使用
什么是标量子查询:
大于平均成绩学生的学号和成绩
Select 学号,成绩 from score where 成绩 >(select avg(成绩) from score);
差生:成绩<=60
优等生 :成绩>80
介于这两个之间
标量子查询不一定在where字句后,使用单一值就可以
注意事项:标量子查询不能返回多个行
- 关联子查询--在每个组里进行比较
查找出每个课程中 大于对应课程平均成绩的学生
Select 学号,课程号,成绩 from score as s1 where 成绩 >(select avg(成绩)from score as s2 where s1.课程号=s2.课程号 group by 课程号);
S2仅在子查询里有效
- 如何用SQL解决业务问题
如何排错:先运行子查询,看是哪里问题
- 函数(了解)