一、 视图
1. 是什么?
表中存放的是数据,而视图存放的是SQL语句。每次使用视图的时候,都会运行一次里面的SQL语句,并形成一个临时表。同时,视图内的数据随着原表数据的更新而更新。
2. 怎么用?
例子:创建一个按照性别分组汇总的视图。
格式:
create view 视图名称(<视图列名1>,<视图列名2>……)
as
select 查询语句
视图的列名和select中的列名可以不一致,但其代表的内容要一一对应。性别对应性别,人数对应COUNT(*).
当我们把视图创建完毕后,以后使用该视图的内容时,直接在from子句中使用视图名称代替表名称即可:
3. 有什么用?
对使用频率较高的SQL语句,可以保存成视图,方便日后直接调用,就不用每次用这个指令的时候都要再“造一遍轮子”。
4. 注意事项
a) 不要在视图的基础上再创建视图,否则会降低SQL的运行效率。
b) 不能往视图里插入数据。
二、 子查询
1. 是什么?
在select中再嵌套一个select。在运行顺序中,会先运行子查询。
2. 怎么用?
a) from
b) in(子查询)
例子:找出每个课程里成绩最低的学号
首先,找出每门课程的最低成绩:
其次,在成绩表中查找这些值对应的学号:
但是,这结果并不太准确。他不能反应哪个学生哪一门课考了最低分。因此,结合后面所学的关联条件查询,修改如下:
c) any(子查询)
要与比较运算符结合使用,any和some含义一样。
例子:哪些学生的成绩比课程0002的全部成绩里的任意一个高?
d) all(子查询)
例子:哪些学生的成绩比课程号0002的全部成绩里的都高?
3. 有什么用?
偶尔使用某个SQL查询语句
4. 注意事项
a) 错误:A>3*all(b)
正确:A/3>all(b)
b) 子查询中避免层层嵌套,层数越多,SQL运行效率越低。而且难看懂,不方便维护。
c) 虽然as 子查询名称是可以省略,但为了方便后期维护,建议还是不要省略,养成良好的书写习惯。
三、 标量子查询
1. 是什么?
必须且只能返回一行一列的查询结果,返回的是单一的值。
2. 怎么用?
例子1:大于平均成绩学生的学号和成绩
例子2:查找成绩位于差生平均成绩和优等生平均成绩之间的学生。
例子3:标量子查询不仅用在where语句中,还能用在查询语句中
3. 有什么用?
子查询的一种,返回的是单一的值,所以可以和比较运算符和逻辑运算符一起使用以实现复杂的查询条件。
4. 注意事项
不能返回多行的结果。
四、 关联子查询
1. 是什么?
比较对应组的内容
2. 怎么用?
例子:查找每个课程中大于对应课程平均成绩的学生。
首先,先求出各门课的平均成绩
然后,通过关联条件,把各门课中每个学生的成绩与其对应的平均成绩相比较,得出大于平均成绩的学生的学号
3. 有什么用?
每个组里进行比较
五、 用SQL解决业务问题
主要分三步:
1. 把问题或需求翻译成大白话
2. 写出分析思路
3. 写出对应的SQL语句
六、 如何处理报错信息:逐一排查
先运行子查询,看能否得出对应的结果。如果有,则子查询有问题。如没有,则再排查子查询以外的SQL语句。
七、 各种函数
1. 汇总函数
2. 算术函数
3. 字符串函数
4. 日期函数
八、 SQLZOO练习:SELECT IN SELECT