一、什么是視圖
- 視圖(View)是一種虛擬存在的表
- 視圖中的數(shù)據(jù)并不在數(shù)據(jù)庫中真實存在
- 行和列數(shù)據(jù)來自定義視圖的查詢中使用的表,并且是在使用視圖時動態(tài)生成的
二、視圖語法
--- 創(chuàng)建視圖
CREATE
OR REPLACE VIEW student_view AS SELECT
id,
`name`,
money
FROM
student;
--- 查看視圖的創(chuàng)建語句
show create view student_view;
--- 查看視圖中的數(shù)據(jù)
select * from student_view;
select * from student_view where id <= 10;
--- 修改視圖
create or replace view student_view as select id, `name` from student;
alter view student_view as select id, `name`, money from student;
--- 刪除視圖
drop view if exists student_view;
三、檢查選項
當使用 WITH CHECK OPTION
子句創(chuàng)建視圖時,MySQL 會通過視圖檢查正在更改的每個行,例如 插入,更新,刪除,以使其符合視圖的定義。
MySQL 允許基于一個視圖創(chuàng)建另一個視圖,它還會檢查依賴視
圖中的規(guī)則以保持一致性。
為了確定檢查的范圍,MySQL 提供了兩個選項: CASCADED 和 LOCAL,默認值為 CASCADED
?? 沒有添加
with check option
的時候是直接插入,不做校驗
# ① 基于 student 表創(chuàng)建了一個視圖
# ② 該視圖沒有添加【檢查選項】
# ③ 當使用視圖插入的數(shù)據(jù)不符合視圖創(chuàng)建的條件(id <= 20)的時候,數(shù)據(jù)依然可以插入到 student 表中
create or replace view stu_v1 as select id, `name`, money from student where id <= 20;
select * from stu_v1;
# 沒有檢查 id 是否符合視圖創(chuàng)建的條件(id <= 20)
insert into stu_v1 values (8, 'Happy', 66666);
# 沒有檢查 id 是否符合視圖創(chuàng)建的條件(id <= 20)
# id 不符合視圖創(chuàng)建的條件(id <= 20),但依然可以插入到 student 表中
# 但在 stu_v1 中是不存在該條記錄的
insert into stu_v1 values (99, 'Nice', 88888);
(1) cascaded(級聯(lián))
當視圖使用 WITH CASCADED CHECK OPTION
或 WITH CHECK OPTION
時,會循環(huán)檢查視圖的規(guī)則以及底層視圖的規(guī)則
create or replace view stu_v1 as select id, `name`, money from student where id <= 20;
# 可插入到基表中, 可插入到 stu_v1 視圖中
insert into stu_v1 values (8, 'eight', 88888);
# 可插入到基表中, 【不】可插入到 stu_v1 視圖中
insert into stu_v1 values (22, '22', 22222);
# 可插入到基表中, 可插入到 stu_v1 視圖中
insert into stu_v1 values (20, '20', 20000);
# 基于 stu_v1 視圖創(chuàng)建有檢查選項的視圖
create view stu_v2 as select id, `name`, money from stu_v1 where id >= 10 with cascaded check option;
insert into stu_v2 values (6, '6', 66666); # failed
insert into stu_v2 values (21, '21', 21111); # failed(不符合 stu_v1 視圖的條件)
insert into stu_v2 values (15, '15', 15555); # OK
# 基于 stu_v2 視圖創(chuàng)建【沒有】檢查選項的視圖
create view stu_v3 as select id, `name`, money from stu_v2 where id <= 15;
insert into stu_v3 values (11, '11', 11111); # OK
insert into stu_v3 values(17, '17', 17000); # OK
insert into stu_v3 values(28, '28888', 28888); # failed
(2) local
?? 當視圖使用 WITH LOCAL CHECK OPTION
時,會遞歸查找當前視圖所依賴的視圖是否有檢查選項?
?? 如果有,則檢查;如果沒有,就不檢查
create or replace view stu_v1 as select id, `name`, money from student where id <= 20;
# 基于 stu_v1 視圖創(chuàng)建有檢查選項的視圖
create or replace view stu_v2 as select id, `name`, money from stu_v1 where id >= 10 with local check option;
insert into stu_v2 values (6, '6', 66666); # failed
insert into stu_v2 values (21, '21', 21111); # OK
insert into stu_v2 values (15, '15', 15555); # OK
# 基于 stu_v2 視圖創(chuàng)建【沒有】檢查選項的視圖
create or replace view stu_v3 as select id, `name`, money from stu_v2 where id <= 15;
insert into stu_v3 values (9, '9', 99999); # failed
insert into stu_v3 values(17, '17', 17000); # OK
insert into stu_v3 values(28, '28888', 28888); # OK
四、視圖的作用
?? 要使視圖可更新,視圖中的行與基表中的行必須存在一對一的關系
?? 視圖不僅可以簡化用戶對數(shù)據(jù)的理解,也可以簡化它們的操作。那些被經常使用的查詢可以被定義為視圖,從而使得用戶不必為以后的操作每次指定全部的條件。
?? 數(shù)據(jù)庫可以授權,但不能授權到數(shù)據(jù)庫特定行和特定的列上。通過視圖用戶只能查詢和修改他們所能見到的數(shù)據(jù),有一定的權限控制作用。
?? 視圖可幫助用戶屏蔽真實表結構變化帶來的影響【數(shù)據(jù)獨立】
五、視圖案例
?? 為了保證數(shù)據(jù)庫表的安全性,開發(fā)人員在操作 tb_user
表時,只能看到的用戶的基本字段(屏蔽手機號和郵箱兩個字段)
CREATE
OR REPLACE VIEW user_basic_info_view AS SELECT
id,
`name`,
profession,
age,
gender,
`status`,
createtime
FROM
tb_user;
?? 查詢每個學生所選修的課程(三張表聯(lián)查),這個功能在很多的業(yè)務中都有使用到,為了簡化操作,定義一個視圖。文章來源:http://www.zghlxwxcb.cn/news/detail-478066.html
CREATE
OR REPLACE VIEW student_course_view AS (
SELECT
s.id '學生編號',
s.`name`,
s.`no`,
c.id '課程編號',
c.`name` '課程名'
FROM
student s
LEFT JOIN student_course sc ON sc.studentid = s.id
LEFT JOIN course c ON c.id = sc.courseid
);
create table student(
id int auto_increment primary key comment '主鍵ID',
name varchar(10) comment '姓名',
no varchar(10) comment '學號'
) comment '學生表';
insert into student values (null, '黛綺絲', '2000100101'),(null, '謝遜',
'2000100102'),(null, '殷天正', '2000100103'),(null, '韋一笑', '2000100104');
create table course(
id int auto_increment primary key comment '主鍵ID',
name varchar(10) comment '課程名稱'
) comment '課程表';
insert into course values (null, 'Java'), (null, 'PHP'), (null , 'MySQL') ,
(null, 'Hadoop');
CREATE TABLE student_course (
id INT auto_increment COMMENT '主鍵' PRIMARY KEY,
studentid INT NOT NULL COMMENT '學生ID',
courseid INT NOT NULL COMMENT '課程ID',
CONSTRAINT fk_courseid FOREIGN KEY ( courseid ) REFERENCES course ( id ),
CONSTRAINT fk_studentid FOREIGN KEY ( studentid ) REFERENCES student ( id )
) COMMENT '學生課程中間表';
insert into student_course values (null,1,1),(null,1,2),(null,1,3),(null,2,2),
(null,2,3),(null,3,4);
學習筆記基于黑馬程序員的課程,阿里嘎多文章來源地址http://www.zghlxwxcb.cn/news/detail-478066.html
到了這里,關于【MySQL 數(shù)據(jù)庫】8、視圖的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!