山山未迟

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

子查询

一条查询语句出现在另外一条查询语句的内部,这条语句就被称之为子查询语句。

子查询分类

子查询可以根据子查询返回的结果以及子查询出现的位置两种方式进行分类

按结果分类:

标量子查询:子查询返回的结果是一行一列,一个字段的某一个值

列子查询:子查询返回的结果是一列,多行,一个字段有多个值

行子查询:子查询返回的结果是一行多列,多行多列

表子查询:子查询返回的结果多行多列

按照位置分类:

where子查询:子查询出现在where条件之后

from子查询:子查询出现在from之后

exists子查询:出现在exists之后,exists出现在where之后

标量子查询

子查询返回的结果是一个标量

clip_image002

列子查询

子查询返回的结果是一列。

需求:获取所有班级的所有学生,学生必须在班级中存在。

select * from student where c_id is not null; -- 无法解决

解决方案

1. 获取所有的现有班级的id:select id from class;

2. 从学生表中查出所有数据,判断学生的班级id是否在刚查出来的班级id中存在

clip_image004

集合判断条件(理解性知识)

集合(1,2,3,4,5)

any:任意一个,1 = any(集合),只要结果在集合中出现过,就返回true

all:全部,必须满足全部条件才返回真

some:等于其中的一部分,与any完全一致

clip_image006

行子查询

子查询返回的结果是一行多列

需求:找出所有班级中年龄最大,同时身高最高的学生;

行子查询必须构建行元素:有多个字段的元素

select * from 表名 where (字段1,字段2…) =/in (select 字段1,字段2… from 表名);

clip_image008

表子查询

表子查询从返回结果的层面上讲与行子查询完全一样。因为其出现的位置不是在where之后,而是在where之前,from之后。from后接数据源。

需求:求出每个班中身高最高的1个学生。

clip_image010

表子查询出现的原因:因为某些时候,希望order by在group by之前先执行。

先排序,再分组

视图

视图:视图是一张虚拟表,存在表结构,但是没有数据。

视图关键字:view

创建视图

语法:

create view 视图名字 as select语句;

clip_image012

视图创建之后发生了什么?

1. 创建视图结构(虚拟表)

clip_image014

2. 在数据库对应的文件夹下创建结构文件

clip_image016

视图是虚拟表,只有结构,没有数据。

视图查看

1. 视图可以像表一样的查看

show tables/show create table/desc 视图名

clip_image018

2. 可以通过视图查看创建语句的方法

show create view 视图名;

clip_image020

3. 查看视图数据:与查看表完全一致

clip_image022

视图不保存数据:数据的来源指的是当视图被调用的时候,系统会自动调用视图的创建语句中的select语句去执行。

clip_image024

修改视图

视图修改的本质是修改视图的数据来源。

语法

alter view 视图名字 as select语句;

clip_image026

删除视图

语法

drop view 视图名字;

clip_image028

视图作用

1. 节省查询语句的长度

2. 对外提供访问接口clip_image030

保证数据表(基表)的数据安全性。

视图能够选择性的从基表获取数据,并提供给外部。

3. 对外友好性

视图能够对外提供不同的数据信息。(不同的接口定义不同的视图)

视图数据增删改

视图可以为基表进行数据的增删改操作,必须满足以下条件

视图新增数据

1. 视图的数据来源(基表)只能有一个

clip_image032

多表视图不能插入数据

clip_image034

2. 视图中的所有字段,必须包含了基表中不为空或者没有默认值的全部字段。

clip_image036

更新数据:基本没有限制

单表视图更新

clip_image038

多表视图更新

clip_image040

删除数据:与插入数据条件一致,只有单表视图可以删除,多表不能删除

单表视图删除

clip_image042

多表视图删除

clip_image044

视图算法

视图在执行的过程中(视图被查询),到底是如何去执行视图对应的查询语句。

视图算法分为三种:

合并:merged,先将视图的SQL查询与与外部的查询语句进行语法合并

临时表:temptable,先执行视图里面的查询语句,结果变成一个临时表

未定义:undefined,系统自己判断到底使用合并还是临时表,默认的

clip_image046

算法指定语法

create view algorithm = 算法 视图名字 as select语句

clip_image048

posted on 2016-04-20 22:29  山山未迟  阅读(285)  评论(0编辑  收藏  举报