MySQL 视图

      视图是一种虚拟的表
操作简单化
增加数据的安全性
提高表的逻辑独立性
语法:
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED MERGE TEMPTABLE}]
    VIEW view_name [(column_list)]
    AS select_statement
    [WITH [CASCADED LOCALCHECK 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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值