一、视图
视图中存放的是sql查询语句,而非数据。使用视图时,会运行视图里的sql查询语句创建出一张临时表
创建视图语句:
create view 视图名称(<视图列名1>,<视图列名2>,...)
as
<select 查询语句>;
例题:
注意:sql查询语句中列的顺序和视图中列的顺序是一一对应的,它们列的名称可以不一样,但是对应关系是一一对应的。
使用视图的注意事项:
- 避免在视图的基础上再创建视图,多重视图会降低sql的性能和运行效率
- 不能往sql里插入数据,否则会报错
二、子查询
子查询可以被看成是一个临时表,在sql语句运行结束后临时表就消失了。
sql运行顺序:先运行子查询
子查询除了放到如上图所示的from子句中,也可以放到where子句中,与运算符in, any, all一起使用,从而构建出复杂的查询条件。使用方法是在in, any, all括号里面放入子查询。
与in关键字一起使用:找出每个课程里成绩最低的学号
与any关键词一起使用:哪些学生的成绩比课程0002的全部成绩里的任意一个高呢?
...any(子查询)与some(子查询)相同:
select 列名1
from 表名1
where 列名1>any(子查询)
与all关键词一起使用:哪些学生的成绩比课程0002的全部成绩里的都高呢?
三、标量子查询
标量子查询返回的是一个一行一列的数值。当需要单一值的时候,就可以使用标量子查询来获取到。
例题:大于平均成绩学生的学号和成绩
例题:查找成绩介于差生(成绩<=60)平均分和优等生(成绩>=60)平均分之间的学生的学号和成绩
通常任何使用单一值的情况都可以使用标量子查询:
四、关联子查询
使用关联子查询的场景:当每个组里进行比较的时候使用关联子查询。关联子查询是在子查询里面有了一个关联条件。
例题:查找出每个课程中大于对应课程平均成绩的学生
关联子查询中起到关键作用的是关联条件。在上面这道例题中子查询部分有一个where子句的条件就是关联条件,这个条件的意思是按课程号对成绩表(score)分组,同一组里的数据和这一组里的平均成绩去比较,由于作为比较对象的是同一张表score,为了进行区别分别使用了s1和s2两个别名。在使用关联子查询的时候,需要取表的别名去使用表里的列名。
注:1. 子查询里的关联条件保证了子查询返回的是当前组的数据
2. 关联条件一定要写在子查询里面
五、如何用SQL解决业务问题
- 翻译成大白话
- 写出分析思路
- 写出对应的sql子句
以题目:“哪些学生的成绩比课程0002的全部成绩里的任意一个高呢?”为例
- 翻译成大白话
2. 写出分析思路
3. 写出对应的sql子句
六、各种函数
函数的功能:
函数可分为:汇总函数,算术函数,字符串函数,日期函数等
本节课程总结:
七、sqlzoo子查询题目