MySql视图原理讲解与使用大全_MySQL
摘要:本文主要讲了MySql中视图的定义、原理和如何使用、创建、删除等一. 视图概述视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。 既然视图的定义是基于基本表的,哪为什么还要定义视图呢?这是因为合理地使用视图能够带来许多好处: CREATE VIEW Student(Sno,Sname,Ssex,Sage,Sdept)AS SELECT SX.Sno,SX.Sname,SY.Ssex,SX.Sage,SY.Sdept FROM SX,SY WHERE SX.Sno=SY.Sno;这样尽管数据库的逻辑结构改变了(变为SX和SY两个表了),但应用程序不必修改,因为新建立的视图定义为用户原来的关系,使用户的外模式保持不变,用户的应用程序通过视图仍然能够查找数据。 当然,视图只能在一定程度上提供数据的逻辑独立,比如由于视图的更新是有条件的,因此应用程序中修改数据的语句可能仍会因为基本表构造的改变而改变。 4、视图能够对机密数据提供安全保护 有了视图机制,就可以在设计数据库应用系统时,对不同的用户定义不同的视图,使机密数据不出现在不应该看到这些数据的用户视图上。这样视图机制就自动提供了对机密数据的安全保护功能。例如,Student表涉及全校15个院系学生数据,可以在其上定义15个视图,每个视图只包含一个院系的学生数据,并只允许每个院系的主任查询和修改本原系学生视图。 5、适当的利用视图可以更清晰地表达查询 例如经常需要执行这样的查询“对每个学生找出他获得最高成绩的课程号”。可以先定义一个视图,求出每个同学获得的最高成绩: CREATE VIEW VMGRADEASSELECT Sno,MAX(Grade) MgradeFROM SCGROUP BY Sno然后用如下的查询语句完成查询: SELECT SC.Sno,Cno FROM SC,VMGRADE WHERE SC.Sno = VMGRADE.Sno AND SC.Grade = VMGRADE.Mgrade;
二、数据准备1、员工表
CREATE TABLE t_employee( ID INT PRIMARY KEY AUTO_INCREMENT, NAME CHAR(30) NOT NULL, SEX CHAR(2) NOT NULL, AGE INT NOT NULL, DEPARTMENT CHAR(10) NOT NULL, SALARY INT NOT NULL, HOME CHAR(30), MARRY CHAR(2) NOT NULL DEFAULT '否', HOBBY CHAR(30) ); 插入数据:
INSERT INTO learning.t_employee(ID, NAME, SEX, AGE,DEPARTMENT, SALARY, HOME, MARRY, HOBBY) VALUES(NULL,'小红','女',20,'人事部','4000','广东','否','网球');INSERT INTO learning.t_employee(ID, NAME, SEX, AGE,DEPARTMENT, SALARY, HOME, MARRY, HOBBY) VALUES(NULL,'明日','女',21,'人事部','9000','北京','否','网球');INSERT INTO learning.t_employee(ID, NAME, SEX, AGE,DEPARTMENT, SALARY, HOME, MARRY, HOBBY) VALUES(NULL,'天天','男',22,'研发部','8000','上海','否','音乐');INSERT INTO learning.t_employee(ID, NAME, SEX, AGE,DEPARTMENT, SALARY, HOME, MARRY, HOBBY) VALUES(NULL,'大大','女',23,'研发部','9000','重庆','否','无');INSERT INTO learning.t_employee(ID, NAME, SEX, AGE,DEPARTMENT, SALARY, HOME, MARRY, HOBBY) VALUES(NULL,'王下','女',24,'研发部','9000','四川','是','足球');INSERT INTO learning.t_employee(ID, NAME, SEX, AGE,DEPARTMENT, SALARY, HOME, MARRY, HOBBY) VALUES(NULL,'无名','男',25,'销售部','6000','福建','否','游戏');INSERT INTO learning.t_employee(ID, NAME, SEX, AGE,DEPARTMENT, SALARY, HOME, MARRY, HOBBY) VALUES(NULL,'不知道','女',26,'销售部','5000','山西','否','篮球');插入的结果:
然后再定义一张员工信息表:
create TABLE t_employee_detail(ID INT PRIMARY KEY,POS CHAR(10) NOT NULL,EXPERENCE CHAR(10) NOT NULL,CONSTRAINT `FK_ID` FOREIGN KEY(ID) REFERENCES t_employee(ID)) 插入如下:
INSERT INTO t_employee_detail(ID,POS,EXPERENCE) VALUES(1,'人事管理','工作二年');INSERT INTO t_employee_detail(ID,POS,EXPERENCE) VALUES(2,'人事招聘','工作二年');INSERT INTO t_employee_detail(ID,POS,EXPERENCE) VALUES(3,'初级工程师','工作一年');INSERT INTO t_employee_detail(ID,POS,EXPERENCE) VALUES(4,'中级工程师','工作二年');INSERT INTO t_employee_detail(ID,POS,EXPERENCE) VALUES(5,'高级工程师','工作三年');INSERT INTO t_employee_detail(ID,POS,EXPERENCE) VALUES(6,'销售代表','工作二年');INSERT INTO t_employee_detail(ID,POS,EXPERENCE) VALUES(7,'销售员','工作一年');内容:
三、使用案例1. 语法 通过该语句可以创建视图,若给定了[OR REPLACE],则表示当已具有同名的视图时,将覆盖原视图。select_statement是一个查询语句,这个查询语句可从表或其它的视图中查 询。视图属于数据库,因此需要指定数据库的名称,若未指定时,表示在当前的数据库创建新视图。 在创建视图前应先看看是否有权限:
SELECT SELECT_priv,create_view_priv from mysql.user WHERE user='root' Y表示有创建的权限
2、单表上创建视图 在员工表是创建视图
CREATE VIEW V_VIEW1(ID, NAME, SEX, AGE,DEPARTMENT) AS SELECT ID, NAME, SEX, AGE,DEPARTMENT FROM learning.t_employee; 然后是显示内容:
SELECT * FROM V_VIEW1
3、多表上创建视图
CREATE VIEW V_VIEW2(ID, NAME, SEX, AGE,DEPARTMENT,POS,EXPERENCE) AS SELECT a.ID, a.NAME, a.SEX, a.AGE,a.DEPARTMENT,b.POS,b.EXPERENCE FROM learning.t_employee a,learning.t_employee_detail b WHERE a.ID=b.ID; 显示结果 SELECT * FROM V_VIEW2
![]() 4、查看视图 (1)DESCRIBE 命令
DESCRIBE V_VIEW2
![]() (2)SHOW TABLE STATUS
show TABLE status LIKE 'V_VIEW2'
![]() (3)SHOW CREATE view命令
show CREATE view V_VIEW2
![]()
(1)CREATE OR REPLACE命令
CREATE OR REPLACE VIEW V_VIEW1(ID, NAME, SEX) AS SELECT ID, NAME, SEX FROM learning.t_employee;
![]()
ALTER VIEW V_VIEW1(ID, NAME) AS SELECT ID, NAME FROM learning.t_employee;SELECT * FROM learning.v_view1
![]()
在MySQL中,更新视图是指通过视图来插入(INSERT)、更新(UPDATE)和删除(DELETE)表中的数据。因为视图是一个虚拟表,其中没有数据,所以通过视图更新时,都是转换到基本表来更新。 更新前: 更新后:
UPDATE V_VIEW2 SET POS='高级工程师' WHERE NAME='天天'
![]()
SELECT * FROM learning.t_employee_detail WHERE t_employee_detail.ID=3
![]()
不可更新的视图: · 聚合函数(SUM(), MIN(), MAX(), COUNT()等)。 注意 CASCADED和LOCAL能不能决定视图是否能更新? With check option的用法: CREATE VIEW V_VIEW3(ID, NAME,SEX,AGE,DEPARTMENT,SALARY, HOME, MARRY, HOBBY) AS SELECT ID, NAME, SEX,AGE,DEPARTMENT,SALARY,HOME,MARRY,HOBBY FROM learning.t_employee WHERE DEPARTMENT='人事部' WITH LOCAL CHECK OPTION;表示只限定插入部门为人事部的人。
![]()
INSERT INTO learning.V_VIEW3(ID, NAME, SEX, AGE,DEPARTMENT, SALARY, HOME, MARRY, HOBBY) VALUES(NULL,'会会会会','女',20,'人事部','4500','广东','否','网球');看下结果: SELECT * FROM learning.V_VIEW3
![]() 同时看真实表中的数据: 再来插入一条:
INSERT INTO learning.V_VIEW3(ID, NAME, SEX, AGE,DEPARTMENT, SALARY, HOME, MARRY, HOBBY) VALUES(NULL,'qqqqvasvas','女',20,'研发部','4500','上海','否','网球');
![]() 结果显示插入失败 7、删除视图 DROP VIEW IF EXISTS 视图名 |