![181509a23ae38bd9cfd38d6b505bd63f.png](https://i-blog.csdnimg.cn/blog_migrate/a602e84d2354abc0171eec73b97cbcd8.png)
本章将介绍以下知识点:
- 视图
- 子查询
- 标量子查询
- 关联子查询
- 各种函数
- 本章注意事项
1. 视图
视图定义:
从SQL的角度来看,视图和表是相同的,两者的区别在于表中保存的是实际的数据,而视图保存的是SELECT语句(视图本身不存储数据)。
视图的优点:
- 视图本身不存储数据,节省存放数据的空间。运行视图时会运行视图里的SQL查询语句,创建出一张临时表;
- 频繁使用的SELECT查询语句可存储在视图中供下次使用,可提高工作效率。
创建视图的 CREATE VIEW 语句:
CREATE VIEW 视图名称(<视图列名1>,<视图列名2>, ......)
AS
<SELECT语句>;
注意事项:
- 视图中AS不能省略;
- SELECT语句中列的顺序和视图中列的顺序是一一对应的,列的名称可以不一样,但是关系是一一对应的;
- 避免在视图的基础上创建视图,因为多重视图会降低SQL的性能;
- 定义视图时不能使用ORDER BY子句;
- 视图和表需要同时进行更新,因此,通过汇总得到的视图无法进行更新。
练习:
1)创建视图:按性别汇总学生人数
第一步:
![79138ccdd74305b11af6abaf4f4395b2.png](https://i-blog.csdnimg.cn/blog_migrate/992b87cf2f28b1a9082192f0a46d3a77.png)
第二步:运行后右键点击视图-刷新
![2c7e7a82dde52a90b0a06cfa0031a7bc.png](https://i-blog.csdnimg.cn/blog_migrate/c7e1daba141d2d5362e5a1c50857ee64.png)
双击视图即可看见按性别汇总视图设置成功
![7f905b9fd31755abbbd47d64cabfac28.png](https://i-blog.csdnimg.cn/blog_migrate/73bdcf750fa82069ff7978f3cde3847f.png)
下次如果要调用视图的sql语句,直接在查询窗口输入下图所示sql语句即可
![191f83fd39228357d53e870f708201b2.png](https://i-blog.csdnimg.cn/blog_migrate/f8da3c003cc272b9ea463c620f75d5b6.png)
如果想要删除该视图:
![926c27aa422fe483896434ab512db8b3.png](https://i-blog.csdnimg.cn/blog_migrate/bb0567dfd278be03f8bcb4f2dfabba00.png)
2. 子查询
子查询定义:
将用来定义视图的SELECT查询语句直接用于FROM子句中。
子查询的特点:
子查询的特点就是一次性视图(SELECT 语句)。与视图不同,子查询在SELECT语句执行完毕后就会消失。
子查询vs.视图:
若偶尔使用该查询语句,则可以使用子查询;若频繁使用该查询语句,可创建视图方便下次使用。
我们可以将上个例子的视图转换成子查询的形式:
![8ae254197ec97fec210bcad03ffe875b.png](https://i-blog.csdnimg.cn/blog_migrate/e1cc784ba25ee303cbee07d2cda56ff1.png)
FROM括号内的子查询作为内层查询会首先执行得到一个临时表,然后再运行外层的查询。
另外,我们还可以在一些逻辑运算符后使用子查询语句来达到我们的查询目的:
- ...in(子查询)
- ...any(子查询)
- ...all(子查询)
注意事项:
- 尽量避免使用多层嵌套的子查询,因为多重嵌套不仅难读懂,还会降低SQL的性能;
- ALL()得到的是一个集合,不能使用a>一个数字如3*ALL(),可以写成a/3>all(b);
练习:
1)哪些学生的成绩与课程0003的全部成绩里的任意一个相同呢?
方法一:
![01dece6240948009a5b9c345a9abba03.png](https://i-blog.csdnimg.cn/blog_migrate/d23803bbc6a79010328784c215837d87.png)
方法二:
![2448b66208a2341e491fa9db8bc744cc.png](https://i-blog.csdnimg.cn/blog_migrate/2a911aafbf756bb79d298bb8db1916f2.png)
2)哪些学生的成绩比课程0002的全部成绩里的任意一个高呢?
![47e29afa0665f554aa3da0305381522d.png](https://i-blog.csdnimg.cn/blog_migrate/c23ea859a1851c2132dfeb0ff5a15e7a.png)
3)哪些学生的成绩比课程0002的全部成绩里的都高呢?
![a7afea1cf63bc3787b22eaf74a83f80d.png](https://i-blog.csdnimg.cn/blog_migrate/d2e90f4afc5cfcbc5ee4891a5f1e1d57.png)
3. 标量子查询
标量子查询的定义:
标量子查询就是返回单一值的子查询。
如果我们想要查询大于平均成绩学生的学号和成绩,如果在WHERE子句中使用AVG()聚合函数,这时就会出现如下报错
![0e320771122245352419f011974fb5d3.png](https://i-blog.csdnimg.cn/blog_migrate/7d5c00273e968201a0bd8b49b19000af.png)
报错:聚合函数是无效的。
这是因为WHERE子句中不能使用聚合函数,这时标量子查询就可以派上用场了。
![5f5294832f153484c10d370dca318d7c.png](https://i-blog.csdnimg.cn/blog_migrate/08cc76aa4d41357f29fa1876268ca9b7.png)
本例中括号中的就是标量子查询--只能返回一行一列的子查询
![b9773b6aa7d3745f3a12a6d20ac4485a.png](https://i-blog.csdnimg.cn/blog_migrate/4db896e0071dd09774effe5e103a1d85.png)
练习:
1)查询成绩介于差生(成绩<=60)的平均成绩和优等生(成绩>=80)的平均成绩的学生有哪些
![2decaa1c5d63f6b412f0e6c8095c210f.png](https://i-blog.csdnimg.cn/blog_migrate/a8c9f6262c93d4c183f559df272765b9.png)
另外,标量子查询的书写位置不仅仅局限于WHERE子句中,通常任何可以使用单一值的位置都可以使用:
![fd34255da184ad444a08d736052b847e.png](https://i-blog.csdnimg.cn/blog_migrate/47fb37965629fda4ce9d89eae45a02ac.png)
注意事项:
- 标量子查询不能返回多行结果,返回的是单一值,可以与比较运算符一起使用;
- WHERE子句中不能使用聚合函数。
4. 关联子查询
关联子查询的定义:
关联子查询就是会在细分的组内进行比较时使用的子查询。
例:查找出每个课程中大于对应课程平均成绩的学生
![e0a2d21c08719d81de91e932adb82ca4.png](https://i-blog.csdnimg.cn/blog_migrate/db76bcda8155a16b13c69e75e22a68c0.jpeg)
注意事项:
- 起到关键作用的就是在子查询中添加的WHERE子句的条件 :WHERE S1.课程号 = S2.课程号,该条件只能在子查询的内部使用,因为内部可以看到外部的S1表,而外部看不到内部S2表;
- 使用关联子查询时,通常会使用“限定”或者“限制”这类语言,在细分的组内进行比较。
![cbc51606993ca9f23548e281f0893304.png](https://i-blog.csdnimg.cn/blog_migrate/236ea8f7c4f7e0339a8d4296840322bd.png)
5. 各种函数
下面总结一下SQL中常用的函数:汇总函数、算术函数、字符串函数、日期函数
5.1 汇总函数
![9cbbb449de27d505fa232bca647c4596.png](https://i-blog.csdnimg.cn/blog_migrate/ac8b799928cdaf70e06bab91b8a98e2a.png)
5.2 算术函数
![ef462f4f391a209c4cc25faf2f760e01.png](https://i-blog.csdnimg.cn/blog_migrate/9c057121a41131c4be817647915a5207.png)
5.3 字符串函数
![6aa0b82c7a4b38e45376ea18ede445ae.png](https://i-blog.csdnimg.cn/blog_migrate/c9b1686efd33333b9a66d874d0b73ecb.png)
5.4 日期函数
1) 当前日期和时间:
![4f085233b3d26ad7a0f2e1e12b64cb00.png](https://i-blog.csdnimg.cn/blog_migrate/d016c48d5eb56a5971cf594ed0dd0333.png)
2) 当前日期:
![c164120b8b01a487de4a25db0fae3b4a.png](https://i-blog.csdnimg.cn/blog_migrate/6bac8243eb80c7fa87b3fe2f656fb21b.png)
3) 当前时间:
![7597e73f5a49b6333028fac669f38af3.png](https://i-blog.csdnimg.cn/blog_migrate/e09bf346e6540287c1fbf252dcaf0c66.png)
4) 获取当前日期的年份:
![b824d4cd636fdaef5f883bd019db85b3.png](https://i-blog.csdnimg.cn/blog_migrate/adceb7c1c0cde299541c7ed773500f64.png)
5) 获取当前日期的月份:
![19faf84767786bffd1cae70d65aeec01.png](https://i-blog.csdnimg.cn/blog_migrate/4e032bcc9083009bee2b103ff52dabc9.png)
6) 获取当前日期是哪一天:
![31508d4ad0d35d752b1e72e0fc2e3440.png](https://i-blog.csdnimg.cn/blog_migrate/8460a4c29afd55c66f1c5308c9c1dbe6.png)
7) 获取当前日期对应星期几:
![f93fef9ed0aaae3d097f6c00e308f707.png](https://i-blog.csdnimg.cn/blog_migrate/ffa9771856950794b9c60afa54d492e8.png)
函数不用死记硬背,需要用时可通过搜索引擎查找。
6. 本章注意事项
- 视图中AS不能省略;
- SELECT语句中列的顺序和视图中列的顺序是一一对应的,列的名称可以不一样,但是关系是一一对应的;
- 避免在视图的基础上创建视图,因为多重视图会降低SQL的性能;
- 定义视图时不能使用ORDER BY子句;
- 视图和表需要同时进行更新,因此,通过汇总得到的视图无法进行更新;
- 尽量避免使用多层嵌套的子查询,因为多重嵌套不仅难读懂,还会降低SQL的性能;
- ALL()得到的是一个集合,不能使用a>一个数字如3*ALL(),可以写成a/3>all(b);
- 标量子查询不能返回多行结果,返回的是单一值,可以与比较运算符一起使用;
- WHERE子句中不能使用聚合函数;
- 起到关键作用的就是在子查询中添加的WHERE子句的条件 :WHERE S1.课程号 = S2.课程号,该条件只能在子查询的内部使用,因为内部可以看到外部的S1表,而外部看不到内部S2表;
- 使用关联子查询时,通常会使用“限定”或者“限制”这类语言,在细分的组内进行比较;
- 函数不用死记硬背,需要用时可通过搜索引擎查找。