隨著基礎(chǔ)知識(shí)的不斷深入,我們會(huì)漸漸發(fā)現(xiàn)一些有趣的概念,覺得:欸,不錯(cuò)欸,好想繼續(xù)聽下去.保持這種想法,繼續(xù)前行,你會(huì)發(fā)現(xiàn)知識(shí)不僅僅是紙上談兵
一.視圖-基本概念
1.視圖基本概念
- 視圖僅僅是表的結(jié)構(gòu), 沒有表的數(shù)據(jù)
- 視圖的結(jié)構(gòu)和數(shù)據(jù)是建立在表的基礎(chǔ)上的
- 視圖中保存了一張表或者多張表的部分或者所有數(shù)據(jù)
2.視圖的作用:
- 視圖可以用來簡化SQL語句
+ 例如 表中有id,name,age,gender,score, 我們需要查詢id,name,gender
+ select id,name,gender from stu;
+ 如果在表的基礎(chǔ)上創(chuàng)建了一個(gè)包含id,name,gender的視圖
+ select * from stu_view;
- 視圖可以用來隱藏表的結(jié)構(gòu)
+ 表中有id,name,age,gender,score, 視圖中有id,name,gender
+ 那么外界在使用視圖的時(shí)候就不知道表中還有age和score
By 極客江南
二.視圖-常規(guī)操作
3.創(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;
注意點(diǎn):
視圖僅僅是表的結(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';
示例二:
#在多表查詢的時(shí)候, 如果需要顯示重復(fù)字段, 必須在字段名稱前面加上表名
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;
By 極客江南
三.視圖-視圖算法
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: 臨時(shí)表算法, 將視圖生成一個(gè)臨時(shí)表, 再執(zhí)行外層的語句
- undefined: 未定義, 由MySQL自己決定使用如上的哪一種算法, 默認(rèn)就是undefined
+ 由于合并算法的效率比臨時(shí)表算法效率高, 所以MySQL一般會(huì)選擇合并算法
- 如上案例中導(dǎo)致數(shù)據(jù)混亂的原因就是因?yàn)槟J(rèn)使用了合并算法
#將子查詢封裝到視圖中去
# algorithm=temptable指定視圖的算法
create algorithm=temptable view order_view as select * from stu order by score desc;
#用視圖替代子查詢
select * from order_view group by city;
By 極客江南