Mysql视图

一、什么是视图

视图是存放数据的一个接口,也可以说是虚拟表,这些数据可以是从一个或几个基表(视图)的数据,也可是用户自己定义的数据,其实视图里面不存放数据,数据据还是存在基表里面,基表数据发生变化,视图里的数据也随之变量,视图里数据变化,基表也会变化。


二、视图的作用

1. 视图可以让查询变得很清楚(复杂的SQL语句变得很简单)

2. 保护数据库的重要数据, 给不同的人看不同的数据


3.数据独立,增加基本字段对视图可以没有影响,如果有影响可以修改视图解决


三、创建视图

create [or replace] [algorithm={merge|temptable|undefined}]

view view_name [(column_list)]

as select_statement

[with [cascaded|local] check option]


视图有三种类型

Merge: 会将引用视图的语句的文本与视图定义结合起来,使用得视图定义的某一部分取代语句的对应部分


Temptable(临时表)视图的结果将被置于临时表中,然后使用它执行语句


undefined :MySQL将选择所要使用的算法。如果可能,它倾向于MERGE而不是TEMPTABLE,这是因为MERGE通常更有效,而且如果使用了临时表,视图是不可更新的。



使用 algorithm=merge 指定视图类型


with local check option [local]只要满足本视图的条件就可以更新

with cascaded check option [cascaded]则是必须满足所有针对视图的条件,才可以更新


四、视图的操作

视图定义服从下述限制:

· SELECT语句不能包含FROM子句中的子查询。

· SELECT语句不能引用系统或用户变量。

· SELECT语句不能引用预处理语句参数。

· 在存储子程序内,定义不能引用子程序参数或局部变量。

· 在定义中引用的表或视图必须存在。但是,创建了视图后,能够舍弃定义引用的表或视图。要想检查视图定义是否存在这类问题,可使用CHECK TABLE语句。

· 在定义中不能引用TEMPORARY表,不能创建TEMPORARY视图。

· 在视图定义中命名的表必须已存在。

· 不能将触发程序与视图关联在一起。

在视图定义中允许使用ORDER BY,但是,如果从特定视图进行了选择,而该视图使用了具有自己ORDER BY的语句,它将被忽略。

对于定义中的其他选项或子句,它们将被增加到引用视图的语句的选项或子句中,但效果未定义。例如,如果在视图定义中包含LIMIT子句,而且从特定视图进行了选择,而该视图使用了具有自己LIMIT子句的语句,那么对使用哪个LIMIT未作定义。相同的原理也适用于其他选项,如跟在SELECT关键字后的ALL、DISTINCT或SQL_SMALL_RESULT,并适用于其他子句,如INTO、FOR UPDATE、LOCK IN SHARE MODE、以及PROCEDURE


五、更改视图


alter [or replace] [algorithm={merge|temptable|undefined}]

view view_name [(column_list)]

as select_statement

[with [cascaded|local] check option]


六、删除视图


drop view view_name;

drop view view_name1,view_name2,view_name3;


七、查看视图


show tables;

show table status link 'view_name';

show create view 'view_name';

select * from information_schema.views; 从系统库里面查询视图


八、视图在WEB开发中的应用(PHP中使用视图)


$mysqli=new mysqli("localhost", "root", "123456", "xsphpdb2");


$sql="select * from stuc order by phpc";


$result=$mysqli->query($sql);


echo '';

echo '

';

while($row=$result->fetch_assoc()){

echo '

';

foreach($row as $col){

echo '

';

}

echo '';

}

echo '

mysql view demo

'.$col.'
';


$mysqli->close();