視圖基本概念
- 什么是視圖?
- 視圖僅僅是表的結(jié)構(gòu), 沒有表的數(shù)據(jù)
- 視圖的結(jié)構(gòu)和數(shù)據(jù)是建立在表的基礎(chǔ)上的
- 視圖中保存了一張表或者多張表的部分或者所有數(shù)據(jù)
- 視圖的作用
+ 例如 表中有id,name,age,gender,score, 我們需要查詢id,name,gender
+ select id,name,gender from stu;
+ 如果在表的基礎(chǔ)上創(chuàng)建了一個包含id,name,gender的視圖
+ select * from stu_view;
- 視圖可以用來隱藏表的結(jié)構(gòu)
+ 表中有id,name,age,gender,score, 視圖中有id,name,gender
+ 那么外界在使用視圖的時候就不知道表中還有age和score
創(chuàng)建視圖語法
create view 視圖名稱 as select 語句;
示例一:
select name,city from stu;
create view stu_view as select name,city from stu;
select * from stu_view;
注意點:
視圖僅僅是表的結(jié)構(gòu), 沒有表的數(shù)據(jù)
視圖是建立在表的基礎(chǔ)上的, 如果修改視圖中的數(shù)據(jù)本質(zhì)上是修改了表中的數(shù)據(jù)
#由于視圖不保存數(shù)據(jù), 本質(zhì)上數(shù)據(jù)是插入到了表中
insert into stu_view values('yyyy', '武漢');
#由于視圖不保存數(shù)據(jù), 本質(zhì)上修改的是表中的數(shù)據(jù)
update stu_view set city='杭州' where name='ww';
#由于視圖不保存數(shù)據(jù), 本質(zhì)上刪除的是表中的數(shù)據(jù)
delete from stu_view where name='ww';
示例二:
在多表查詢的時候, 如果需要顯示重復字段, 必須在字段名稱前面加上表名
select * from stuinfo inner join stugrade on stuinfo.stuid=stugrade.stuid;
select stuinfo.stuid, name, score from stuinfo inner join stugrade on stuinfo.stuid=stugrade.stuid;
create view studes_view as select stuinfo.stuid, name, score from stuinfo inner join stugrade on stuinfo.stuid=stugrade.stuid;
更改視圖
alter view 視圖名稱 as select 語句;
create view stu_view as select name,city from stu;
# 修改視圖返回的結(jié)果
alter view stu_view as select name,age,city from stu;
刪除視圖
drop view [if exists] 視圖名;
drop view if exists stu_view;
視圖算法(了解)
select * from (select * from stu order by score desc) as t group by city;
#將子查詢封裝到視圖中去
create view order_view as select * from stu order by score desc;
#用視圖替代子查詢
select * from order_view group by city; #結(jié)果出現(xiàn)了誤差
視圖算法
- merge: 合并算法, 將視圖的語句和外層的語句合并之后再執(zhí)行
- temptable: 臨時表算法, 將視圖生成一個臨時表, 再執(zhí)行外層的語句
- undefined: 未定義, 由MySQL自己決定使用如上的哪一種算法, 默認就是undefined
+ 由于合并算法的效率比臨時表算法效率高, 所以MySQL一般會選擇合并算法
- 如上案例中導致數(shù)據(jù)混亂的原因就是因為默認使用了合并算法
#將子查詢封裝到視圖中去
# algorithm=temptable指定視圖的算法
create algorithm=temptable view order_view as select * from stu order by score desc;
#用視圖替代子查詢
select * from order_view group by city;