数据库原理及应用(六)——视图和子查询
一、什么是视图
视图是关系数据库系统提供给用户以多种角度观察数据库中数据的重要机制。
视图是一个虚拟的表,不同于直接操作数据表,视图是依据SELECT语句来创建的(会在下面具体介绍),所以操作视图时会根据创建视图的SELECT语句生成一张虚拟表,然后在这张虚拟表上做SQL操作。
二、视图与表有什么区别、
-
视图是从一个或几个基本表(或视图)导出的表,它与基本表不同,是一个虚表,你可以理解成Windows的快捷方式。而表是物理存在的,你可以理解成计算机中的文件。
-
表是内模式,视图是外模式。
-
视图可以像基本表一样被查询、删除,也可以在一个视图上再定义视图,但是对视图的增删改有一定的限制。
三、视图的定义和删除
1. 定义视图
SQL语言用CREATE VIEW建立视图:
CREATE VIEW<视图名>(<列名1>,<列名2>,...)
AS <SELECT语句>
[WITH CHECK OPTION];
例: 建立计算机系的学生的视图
CREATE VIEW CS_VIEW
AS
SELECT *
FROM S
WHERE sdept='CS';
2.删除视图
SQL语言用DROP VIEW删除视图:
DROP VIEW <视图名>;
视图删除后,基于该视图建立的视图仍在数据字典中,不过无法使用,需要一一删除它们。
例2:删除CS_VIEW视图。
DROP VIEW CS_VIEW
执行结果:
DROP VIEW CS_VIEW
> OK
> 时间: 0.016s
四、更新视图
更新视图是指通过INSERT、DELETE、UPDATE来更新.
!!!
由于视图实际上是不储存数据的虚表,因此对视图的更新其实就是对基本表的更新。
例3:将计算机系的学生的视图CS_VIEW中性别为男的同学年龄加1
UPDATE CS_VIEW
SET sage = sage + 1
WHERE ssex = '男';
修改前:
修改后:
五、子查询
1.什么是子查询
子查询就是将用来定义视图的 SELECT 语句直接用于 FROM 子句当中。
2.嵌套子查询
例4 查询年龄大于19岁的学生信息:
SELECT
*
FROM
( SELECT * FROM s WHERE sage > 19 ) AS S5
虽然嵌套子查询可以查询出结果,但是随着子查询嵌套的层数的叠加,SQL语句不仅会难以理解而且执行效率也会很差,所以要尽量避免这样的使用。
3.标量子查询
标量就是单一的意思,那么标量子查询也就是单一的子查询,那什么叫做单一的子查询呢?
所谓单一就是要求我们执行的SQL语句只能返回一个值,也就是要返回表中具体的某一行的某一列。
例:查询学生的学号、姓名、年龄、和平均年龄:
SELECT
sno,
sname,
sage,
( SELECT AVG ( sage ) FROM s ) AS AVG_AGE
FROM
S