MySQL 视图

      视图是一种虚拟的表
操作简单化
增加数据的安全性
提高表的逻辑独立性
语法:
CREATE  [ OR REPLACE] [ ALGORITHM  = { UNDEFINED  MERGE  TEMPTABLE}]
      VIEW  view_name [(column_list)]
      AS  select_statement
    [ WITH  [ CASCADED  LOCAL CHECK OPTION]

查看创建视图的权限
SELECT  Select_priv,Create_view_priv  FROM  mysql.user  WHERE USER='root';
+-------------+------------------+
| Select_priv | Create_view_priv |
+-------------+------------------+
| Y               | Y                                 |
| Y               | Y                                 |
| Y               | Y                                 |
| Y               | Y                                 |
| Y                   | Y                                 |
| Y                   | Y                                 |
+-------------+------------------+
6 rows in set (0.00 sec)

练习表(自己创建)
mysql> desc department;
+----------+-------------+------+-----+---------+-------+
| Field             | Type                 | Null     | Key   | Default   | Extra |
+----------+-------------+------+-----+---------+-------+
| d_id             | int(4)               | NO       | PRI   | NULL     |       |
| d_name   | varchar(20) | NO     | UNI   | NULL     |       |
| function   | varchar(50) | YES     |             | NULL     |       |
| address   | varchar(50) | YES     |             | NULL     |       |
+----------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

mysql> desc worker;
+-------------+-------------+------+-----+---------+-------+
| Field                 | Type           | Null   | Key   | Default   | Extra   |
+-------------+-------------+------+-----+---------+-------+
| num                 | int(10)         | NO     | PRI   | NULL     |       |
| d_id               | int(4)               | YES   | MUL | NULL     |       |
| NAME           | varchar(20)   | NO   |             | NULL     |       |
| sex               | varchar(4)     | NO   |             | NULL     |       |
| birthday       | datetime       | YES   |             | NULL     |       |
| homeaddress | varchar(50)   | YES   |             | NULL     |       |
+-------------+-------------+------+-----+---------+-------+
6 rows in set (0.01 sec)

单表创建
CREATE VIEW  department_view1
AS SELECT  FROM  department;

mysql> desc department_view1;
+----------+-------------+------+-----+---------+-------+
| Field     | Type         | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| d_id     | int(4)       | NO   |     | NULL     |       |
| d_name   | varchar(20) | NO   |     | NULL     |       |
| function | varchar(50) | YES   |     | NULL     |       |
| address   | varchar(50) | YES   |     | NULL     |       |
+----------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

CREATE VIEW  department_view2(NAME,funciton,location)
AS SELECT  d_name,FUNCTION,address  FROM  department;
desc department_view2;
+----------+-------------+------+-----+---------+-------+
| Field     | Type         | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| name     | varchar(20) | NO   |     | NULL     |       |
| funciton | varchar(50) | YES   |     | NULL     |       |
| location | varchar(50) | YES   |     | NULL     |       |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

多表创建视图
mysql>  CREATE ALGORITHM= MERGE  VIEW
    -> worker_view1(NAME,department,sex,age,address)
    ->  AS SELECT  NAME,department.d_name,sex,2009-birthday,address
    ->  FROM  worker,department WHERE worker.d_id=department.d_id
    -> WITH LOCAL CHECK OPTION;
Query OK, 0 rows affected (0.01 sec)

mysql> desc worker_view1;
+------------+--------------+------+-----+---------+-------+
| Field       | Type         | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| NAME       | varchar(20)   | NO   |     | NULL     |       |
| department | varchar(20)   | NO   |     | NULL     |       |
| sex         | varchar(4)   | NO   |     | NULL     |       |
| age         | double(23,6) | YES   |     | NULL     |       |
| address     | varchar(50)   | YES   |     | NULL     |       |
+------------+--------------+------+-----+---------+-------+
5 rows in set (0.01 sec)

查看视图
mysql>   SHOW TABLE STATUS LIKE  'worker_view1' \G
*************************** 1. row ***************************
            Name: worker_view1
          Engine: NULL
        Version: NULL
      Row_format: NULL
            Rows: NULL
  Avg_row_length: NULL
    Data_length: NULL
Max_data_length: NULL
    Index_length: NULL
      Data_free: NULL
  Auto_increment: NULL
    Create_time: NULL
    Update_time: NULL
      Check_time: NULL
      Collation: NULL
        Checksum: NULL
  Create_options: NULL
        Comment: VIEW
1 row in set (0.00 sec)

mysql>  SHOW CREATE VIEW  worker_view1 \G
*************************** 1. row ***************************
                View: worker_view1
          Create View: CREATE ALGORITHM=MERGE DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `worker_view1` AS select `worker`.`NAME` AS `NAME`,`department`.`d_name` AS `department`,`worker`.`sex` AS `sex`,(2009 - `worker`.`birthday`) AS `age`,`department`.`address` AS `address` from (`worker` join `department`) where (`worker`.`d_id` = `department`.`d_id`) WITH LOCAL CHECK OPTION
character_set_client: utf8
collation_connection: utf8_general_ci
1 row in set (0.00 sec)

在views表中查看视图详细信息
视图存在放information_schema数据库下的views表中
mysql>  SELECT  FROM  information_schema.VIEWS \G
*************************** 1. row ***************************
        TABLE_CATALOG: def
        TABLE_SCHEMA: grzl
          TABLE_NAME: payment_view
      VIEW_DEFINITION: select `grzl`.`payment`.`payment_id` AS `payment_id`,`grzl`.`payment`.`amount` AS `amount` from `grzl`.`payment` where (`grzl`.`payment`.`amount` < 10)
        CHECK_OPTION: CASCADED
        IS_UPDATABLE: YES
              DEFINER: root@localhost
        SECURITY_TYPE: DEFINER
CHARACTER_SET_CLIENT: utf8
COLLATION_CONNECTION: utf8_general_ci
*************************** 2. row ***************************
                        TABLE_CATALOG: def
                        TABLE_SCHEMA: grzl
                                  TABLE_NAME: payment_view1
                      VIEW_DEFINITION: select `payment_view`.`payment_id` AS `payment_id`,`payment_view`.`amount` AS `amount` from `grzl`.`payment_view` where (`payment_view`.`amount` > 5)
                      CHECK_OPTION: LOCAL
                                IS_UPDATABLE: YES
                                              DEFINER: root@localhost
                                SECURITY_TYPE: DEFINER
        CHARACTER_SET_CLIENT: utf8
COLLATION_CONNECTION: utf8_general_ci
.............................................

CREATE OR REPLACE VIEW 语句修改视图
存在修改,不存在创建
mysql>  CREATE OR REPLACE ALGORITHM= TEMPTABLE
    ->  VIEW  department_view1(department,funciton,location)
    ->  AS SELECT  d_name,FUNCTION,address  FROM  department;
Query OK, 0 rows affected (0.01 sec)

ALTER语句修改视图
mysql>  ALTER VIEW  department_view2(department,NAME,sex,location)
    ->  AS SELECT  d_name,worker.name,worker.sex,address
    ->  FROM  department,worker  WHERE  department.d_id=worker.d_id
    ->  WITH CHECK OPTION;
Query OK, 0 rows affected (0.01 sec)

更新视图

mysql>  SELECT  FROM  department;
+------+-----------+--------------+-------------+
| d_id        | d_name     | function     | address     |
+------+-----------+--------------+-------------+
| 1001        | 人事部     | 人事变动     | 2号楼3层     |
| 1002         | 生产部     | 生产管理     | 5号楼1层     |
+------+-----------+--------------+-------------+
2 rows in set (0.00 sec)

CREATE VIEW  department_view3(NAME,FUNCTION,address)
AS SELECT  d_name,FUNCTION,address  FROM  department 
WHERE  d_id=1001;

mysql>  SELECT  FROM  department_view3;
+-----------+--------------+-------------+
| NAME       | FUNCTION     | address     |
+-----------+--------------+-------------+
| 人事部     | 人事变动     | 2号楼3层     |
+-----------+--------------+-------------+
1 row in set (0.00 sec)


mysql>  UPDATE  department_view3  SET  NAME='科研部',FUNCTION='新产品研发',address='3号楼五层';
Query OK, 1 row affected (0.04 sec)
Rows matched: 1   Changed: 1   Warnings: 0

mysql>    SELECT  FROM department_view3;
+-----------+-----------------+---------------+
| NAME       | FUNCTION         | address       |
+-----------+-----------------+---------------+
| 科研部     | 新产品研发       | 3号楼五层     |
+-----------+-----------------+---------------+
1 row in set (0.00 sec)

不能更新视图:
视图中含SUM(),MAX(),MIN()等函数
CREATE VIEW  worker_view4(NAME,sex,total)  AS SELECT  NAME,sex, COUNT(NAME)  FROM  worker;
Query OK, 0 rows affected (0.06 sec)
mysql>  UPDATE  worker_view4  SET  NAME='abc';
ERROR  1288 (HY000): The target table worker_view4 of the UPDATE is not updatable

视图中含UNION、UNION ALL、DISTINCT、GROUP BY、HAVING等关键字
CREATE VIEW  worker_view5(NAME,sex,address)  AS SELECT  NAME,sex,homeaddress  FROM  worker  GROUP BY  d_id;
Query OK, 0 rows affected (0.00 sec)
UPDATE  worker_view5  SET  NAME='abc';
ERROR  1288 (HY000): The target table worker_view5 of the UPDATE is not updatable

常量视图
CREATE VIEW  worker_view6  AS SELECT  'Aric'  AS  NAME;
Query OK, 0 rows affected (0.00 sec)
UPDATE  worker_view6  SET  NAME='abc';
ERROR  1288 (HY000): The target table worker_view6 of the UPDATE is not updatable

视图中的SELECT中包含子查询
CREATE VIEW  worker_view7(NAME)  AS SELECT  ( SELECT  NAME  FROM  worker);
Query OK, 0 rows affected (0.00 sec)
UPDATE  worker_view7  SET  NAME='abc';
ERROR  1288 (HY000): The target table worker_view7 of the UPDATE is not updatable

由不可更新的视图导出的视图
CREATE VIEW  worker_view8  AS  SELECT  FROM  worker_view7;
Query OK, 0 rows affected (0.00 sec)
UPDATE  worker_view8  SET  NAME='abc';
ERROR  1288 (HY000): The target table worker_view8 of the UPDATE is not updatable

创建视图是,ALGORITHM为TEMPTABLE类型
CREATE ALGORITHM= TEMPTABLE VIEW  worker_view9  AS SELECT  FROM  worker;
Query OK, 0 rows affected (0.01 sec)
UPDATE  worker_view9  SET  NAME='abc';
ERROR 1288 (HY000): The target table worker_view9 of the UPDATE is not updatable

视图的表上存在没有默认值得列,而且该列没有包含在视图里。
例如:表中包含name字段没有默认值,但是视图中不包括该字段。那么这个视图是不能更新的。
因为在更新时,这个没有默认值得记录将没有值插入,也没有NULL值插入。

删除视图
只能删视图的定义,不能删除数据,必须有drop权限
DROP VIEW [IF EXISTS] view_name [RESTRICT|CASCADE]

查看权限
mysql>  SELECT  Drop_priv  FROM  mysql.user  WHERE  USER='root';
+-----------+
| Drop_priv |
+-----------+
| Y         |
| Y         |
| Y         |
| Y         |
| Y         |
| Y         |
+-----------+
6 rows in set (0.00 sec)
删除视图
DROP VIEW IF EXISTS  worker_view1;
Query OK, 0 rows affected (0.00 sec)
删多个
DROP VIEW IF EXISTS  department_view1,department_view2;
Query OK, 0 rows affected (0.00 sec)

实例
创建work_info表
插入数据
创建视图info_view
查看视图info_view的基本机构和详细结构
查看视图info_view的所有记录
修改视图info_view
更新视图
删除视图

work_info表内容
字段名 字段描述 数据类型 主键 外键 非空 唯一 自增
id 编号 INT(10)
name 姓名 VARCHAR(20)
sex 性别 VARCHAR(4)
age 年龄 INT(5)
address 家庭住址 VARCHAR(50)
tel 电话号码 VARCHAR(20)
work_info表中的信息
id name sex age address tel
1 张三 M 18 海淀 1234567
2 李四 M 22 昌平 2345678
3 王五 F 17 平谷 3456789
4 赵六 F 25 顺义 4567890
mysql>  CREATE TABLE  work_info(id  INT(10)  NOT NULL UNIQUE PRIMARY KEY,
    -> NAME  VARCHAR(20)  NOT NULL,
    -> sex  VARCHAR(4)  NOT NULL,
    -> age  INT(5),
    -> address  VARCHAR(50),
    -> tel  VARCHAR(20)
    -> );
Query OK, 0 rows affected (0.02 sec)

INSERT INTO  work_info  VALUES(1,'张三','M',18,'海淀','1234567');
INSERT INTO  work_info  VALUES(2,'李四','M',22,'昌平','2345678');
INSERT INTO  work_info  VALUES(3,'王五','F',17,'平谷','3456789');
INSERT INTO  work_info  VALUES(4,'赵六','F',25,'顺义','4567890');

创建视图info_view,从work_info表中选出age>20的记录来创建视图。视图的字段包含id、name、sex和address.ALGORITHM设置为MERGE类型加上WITH LOCAL CHECK OPTION条件
mysql>  CREATE ALGORITHM=MERGE VIEW  info_view(
    -> id,NAME,sex,address)  AS SELECT  id,NAME,sex,address  FROM  work_info  WHERE  age>20
    ->  WITH LOCAL CHECK OPTION;
Query OK, 0 rows affected (0.00 sec)
mysql>  SHOW CREATE VIEW  info_view \G
*************************** 1. row ***************************
                View: info_view
          Create View: CREATE ALGORITHM=MERGE DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `info_view` AS select `work_info`.`id` AS `id`,`work_info`.`NAME` AS `NAME`,`work_info`.`sex` AS `sex`,`work_info`.`address` AS `address` from `work_info` where (`work_info`.`age` > 20) WITH LOCAL CHECK OPTION
character_set_client: utf8
collation_connection: utf8_general_ci
1 row in set (0.00 sec)

mysql> SELECT * FROM info_view;
+----+--------+-----+---------+
| id         | NAME   | sex   | address |
+----+--------+-----+---------+
|         | 李四     | M     | 昌平         |
|   4         | 赵六     | F       | 顺义     |
+----+--------+-----+---------+
2 rows in set (0.00 sec)

修改视图,使其显示age<20的信息,其他条件不变。
ALTER ALGORITHM=MERGE VIEW
info_view(id,NAME,sex,address)
AS SELECT  id,NAME,sex,address  FROM  work_info WHERE age<20
WITH LOCAL CHECK OPTION;
Query OK, 0 rows affected (0.01 sec)
mysql>  SELECT  FROM  info_view;
+----+--------+-----+---------+
| id | NAME   | sex | address |
+----+--------+-----+---------+
|   1 | 张三       | M   | 海淀       |
|   3 | 王五       | F     | 平谷     |
+----+--------+-----+---------+
2 rows in set (0.00 sec)

mysql>  UPDATE  info_view  SET  sex='M'  WHERE  id=3;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1   Changed: 1   Warnings: 0

mysql>  SELECT  FROM  info_view;
+----+--------+-----+---------+
| id | NAME   | sex | address |
+----+--------+-----+---------+
|   1 | 张三     | M     | 海淀     |
|   3 | 王五     M    | 平谷     |
+----+--------+-----+---------+
2 rows in set (0.01 sec)

mysql>  SELECT  FROM  work_info;
+----+--------+-----+------+---------+---------+
| id | NAME   | sex | age   | address | tel     |
+----+--------+-----+------+---------+---------+
|   1 | 张三   | M   |   18 | 海淀     | 1234567 |
|   2 | 李四   | M   |   22 | 昌平     | 2345678 |
|   3 | 王五   M    |   17 | 平谷     | 3456789 |
|   4 | 赵六   | F   |   25 | 顺义     | 4567890 |
+----+--------+-----+------+---------+---------+
4 rows in set (0.00 sec)

DROP VIEW IF EXISTS  info_view;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql>  SELECT  FROM  info_view;
ERROR 1146 (42S02): Table 'tianfan.info_view'  doesn't exist

实践
创建college表
在student表上创建视图college_view。视图的字段包括student_num、student_name、student_age和department。ALGORITHM设置为UNDEFINED类型。加入WITH LOCAL CHECK OPTION条件
查看视图college_view的详细结构
更新视图。向视图中插入三条记录。
修改视图,使其显示专业为‘计算机’的信息,其他条件不变
删除视图college_view
college表内容
字段名 字段描述 数据类型 主键 外键 非空  唯一 自增
number 学好 INT(10)
name 姓名 VARCHAR(10)
mejor 专业 VARCHAR(10)
age 年龄 INT(5)
collegeview表信息
number name major age
0901 张三 外语 20
0902 李四 计算机 22
0903 王五 计算机 19

CREATE TABLE college(number INT(10) NOT NULL UNIQUE PRIMARY KEY,
NAME VARCHAR(20) NOT NULL,
major VARCHAR(20)  NOT NULL ,
age  INT(5)
);

CREATE ALGORITHM=UNDEFINED VIEW 
college_view (student_num,student_name,student_age,department)
AS SELECT number,NAME,age,major FROM college
WITH LOCAL CHECK OPTION;


mysql> SHOW CREATE VIEW college_view \G
*************************** 1. row ***************************
                    View: college_view
         Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `college_view` AS select `college`.`number` AS `student_num`,`college`.`NAME` AS `student_name`,`college`.`age` AS `student_age`,`college`.`major` AS `department` from `college` WITH LOCAL CHECK OPTION
character_set_client: utf8
collation_connection: utf8_general_ci
1 row in set (0.00 sec)

INSERT INTO college_view VALUES(0901,'张三',20,'外语');
INSERT INTO  college_view VALUES(0902,'李四',22,'计算机');
INSERT INTO  college_view VALUES(0903,'王五',19,'计算机');

CREATE OR REPLACE ALGORITHM=UNDEFINED VIEW 
college_view (student_num,student_name,student_age,department)
AS SELECT number,NAME,age,major FROM college WHERE major='计算机'
WITH LOCAL CHECK OPTION;

DROP VIEW IF EXISTS college_view;
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值