一.视图
1.视图是什么
视图中存放的是SQL语句。视图运行时从表中查找数据,保存到一张临时表中,当客户端与数据库的连接断开以后,临时表会自动消失。
2.如何创建视图
1.创建视图操作步骤:查询→新建→编辑SQL语句→运行→视图→刷新。展开视图菜单栏即可看到新建的视图。
2.视图语句结构:
create view 视图名称(<视图列名1>,<视图列名2>,...)as <select查询语句>,此处select语句的排列顺序与视图中的排列顺序一一对应,列的名称可以不同。
3.视图的优点和限制
1.视图的优点
- 视图无需保存数据,节省了存储设备的空间。
- 视图会随着原表的变化而更新,可将频繁使用的select语句保存成视图,能很好的提高使用效率,减少工作量的同时还能提高系统性能。
2.视图的限制
- 多重视图会降低SQL的性能,应避免在视图的基础上创建视图。
- 不能往视图中插入数据,否则会报错。
- 定义视图时不能使用order by子句。
- 通过多表或group by对原表聚合得到的视图是不能进行自动更新。
二.子查询
常用的子查询有三种,分别是普通子查询,标量子查询和关联子查询。三种子查询相关内容如下。
1.普通子查询
- 子查询是什么
子查询是一次性的SQL语句。子查询在 select语句执行完毕后就会消失。子查询返回的结果可以是多行或者单一的值。
- 子查询的使用
1.放在from子句中,示例如下
2.放在where子句里,与in、all、any等构成复杂查询,示例如下
- 子查询运行顺序
子查询作为内层查询会先执行,然后再执行外层的select语句。
- 子查询注意事项
1.根据使用目的选择,如果频繁使用某个SQL语句,则保存为视图,如果偶尔使用,则选择子查询
2.如果2个数字进行比较,如a>3*all(b),在SQL中不能这样书写,因为3*all(b)得到的不是一个数字,而是一个集合。正确的书写方式应为a÷3>all(b)。
3.避免使用多层嵌套子查询。如果使用多层嵌套子查询,这样不易于明白SQL语句,同时会降低SQL性能,对后期维护也会带来不必要的麻烦。
4.子查询中'as'关键字与查询名称都可省略。如:select (<列名1>,<列名2>,...) from(子查询)as 查询名称 中的as和查询名称可以省略。
2.标量子查询
- 什么是标量子查询
标量子查询是子查询的一种,但标量子查询只能返回1行1列的结果,即返回的是一个值。它可以与比较运算符一起使用,与in、or、between一起实现复杂查询。
- 标量子查询如何使用
通常能够使用常数或者列名的地方,无论是select子句、group by子句、having子句,还是order by子句,几乎所有的地方都可以使用标量子查询。
- 标量子查询注意事项
标量子查询不能返回多行结果,如果返回多行结果即不是标量子查询
3.关联子查询
- 什么是关联子查询
关联子查询也是子查询的一种,它与group by子句一样,也可以对表中的集合数据进行切分,它在细分的组内进行比较时使用。
- 关联子查询的使用方法,示例如下
上图中,s1与s2为关联子查询的关联条件。
- 关联子查询注意事项
1.关联子查询的关联条件一定要写在子查询中,否则将发生错误无法正确执行。
2.关联子查询内部设定的关联名称,只能在该子查询内部使用,因为内部可以看到外部的信息,而外部是看不到内部的关联名称的。
三.SQLZOO练习