MySQL数据库之视图


目录

  • 视图
  • 1、视图定义
  • 1、为什么需要视图
  • 3、视图的作用优点
  • 作用:
  • 优点:
  • 4、创建视图
  • 5、视图使用规则
  • 1)视图的嵌套:
  • 2)视图排序的覆盖
  • 6、修改视图
  • 多表连接视图:复杂视图
  • 7、 删除视图
  • 8:MySQL数据库中的视图保存:


视图

1、视图定义

视图通过以定制的方式显示来自一个或多个表的数据
视图是一种数据库对象,用户可以像查询普通表一样查询视图
视图内其实没有存储任何数据,它只是对表的一个查询
视图的定义保存在数据字典内,创建视图所基于对表称为“基表”

1、为什么需要视图

例如经常要对emp和dept表进行连接查询,每次都要做表的连接,写同样的一串语句,同时由于工资列队数据比较敏感,对外要求不可见;使用子查询,每次做表的连接写的语句过长,把查询语句做成视图,下次查询视图就好了;
对这样的问题就可以通过视图来解决。

3、视图的作用优点

作用:

控制安全
保存查询数据

优点:

提供了灵活一致级别安全性。
隐藏了数据的复杂性
简化了用户的SQL指令
通过重命名列,从另一个角度提供数据

4、创建视图

CREATE [OR REPLACE] VIEW 视图名
	[(alias[, alias]...)]--为视图字段指定别名
	AS subquery
	[WITH READ ONLY];

举例说明:创建视图, emp_V1, 包括10号部门的所有雇员信息.

mysql> create view emp_v1 as	//创建视图emp_v1
    -> select * from emp
    -> where deptno=10;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from emp_v1;
+-------+-----------+-----------+------+------------+-------+------+--------+
| empno | ename     | job       | mgr  | hiredate   | sai   | comm | deptno |
+-------+-----------+-----------+------+------------+-------+------+--------+
|  1007 | 张飞      | 经理      | 1009 | 2001-09-01 | 24500 | NULL |     10 |
|  1009 | 曾阿牛    | 董事长    | NULL | 2001-11-17 | 50000 | NULL |     10 |
|  1014 | 黄盖      | 文员      | 1007 | 2002-01-23 | 13000 | NULL |     10 |
+-------+-----------+-----------+------+------------+-------+------+--------+
3 rows in set (0.00 sec)

5、视图使用规则

  1. 视图必须有唯一命名
  2. 在mysql中视图的数量没有限制
  3. 创建视图必须从管理员那里获得必要的权限
  4. 视图支持嵌套,也就是说可以利用其他视图检索出来的数据创建新的视图
  5. 在视图中可以使用OREDR BY,但是如果视图内已经使用该排序子句,则视图的ORDER BY将覆盖前面的 ORDER BY。
  6. 视图不能索引,也不能关联触发器或默认值。
  7. 视图可以和表同时使用

1)视图的嵌套:

4 . 视图支持嵌套,也就是说可以利用其他视图检索出来的数据创建新的视图
可以在创建视图emp_v2中进行嵌套emp_v1;

mysql> create view emp_v1 as
    -> select * from emp
    -> where deptno=10;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from emp_v1;
+-------+-----------+-----------+------+------------+-------+------+--------+
| empno | ename     | job       | mgr  | hiredate   | sai   | comm | deptno |
+-------+-----------+-----------+------+------------+-------+------+--------+
|  1007 | 张飞      | 经理      | 1009 | 2001-09-01 | 24500 | NULL |     10 |
|  1009 | 曾阿牛    | 董事长    | NULL | 2001-11-17 | 50000 | NULL |     10 |
|  1014 | 黄盖      | 文员      | 1007 | 2002-01-23 | 13000 | NULL |     10 |
+-------+-----------+-----------+------+------------+-------+------+--------+
3 rows in set (0.00 sec)

mysql> create view emp_v2 as	//创建视图emp_v2嵌套emp_v1
    -> select * from emp_v1
    -> where job='文员';
Query OK, 0 rows affected (0.00 sec)

mysql> select * from emp_v2
    -> ;
+-------+--------+--------+------+------------+-------+------+--------+
| empno | ename  | job    | mgr  | hiredate   | sai   | comm | deptno |
+-------+--------+--------+------+------------+-------+------+--------+
|  1014 | 黄盖   | 文员   | 1007 | 2002-01-23 | 13000 | NULL |     10 |
+-------+--------+--------+------+------------+-------+------+--------+
1 row in set (0.00 sec)

2)视图排序的覆盖

5 . 在视图中可以使用OREDR BY,但是如果视图内已经使用该排序子句,则视图的ORDER BY将覆盖前面的 ORDER BY。
下面举例说明,新的视图排序会覆盖原来的视图排序

mysql> create view emp_v3 as
    -> select * from emp_v1
    -> order by sai desc;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from emp_v3;	//此处是降序的排序
+-------+-----------+-----------+------+------------+-------+------+--------+
| empno | ename     | job       | mgr  | hiredate   | sai   | comm | deptno |
+-------+-----------+-----------+------+------------+-------+------+--------+
|  1009 | 曾阿牛    | 董事长    | NULL | 2001-11-17 | 50000 | NULL |     10 |
|  1007 | 张飞      | 经理      | 1009 | 2001-09-01 | 24500 | NULL |     10 |
|  1014 | 黄盖      | 文员      | 1007 | 2002-01-23 | 13000 | NULL |     10 |
+-------+-----------+-----------+------+------------+-------+------+--------+
3 rows in set (0.00 sec)

mysql> select * from emp_v3
    -> order by sai;			//这里覆盖之前升序排序
+-------+-----------+-----------+------+------------+-------+------+--------+
| empno | ename     | job       | mgr  | hiredate   | sai   | comm | deptno |
+-------+-----------+-----------+------+------------+-------+------+--------+
|  1014 | 黄盖      | 文员      | 1007 | 2002-01-23 | 13000 | NULL |     10 |
|  1007 | 张飞      | 经理      | 1009 | 2001-09-01 | 24500 | NULL |     10 |
|  1009 | 曾阿牛    | 董事长    | NULL | 2001-11-17 | 50000 | NULL |     10 |
+-------+-----------+-----------+------+------------+-------+------+--------+
3 rows in set (0.00 sec)

6、修改视图

修改视图可以有两种方法进行修改

使用CREATE OR REPLACE VIEW 语句修改EMP_V_10 视图. 为每个列指定列名.

–CREATE OR REPLACE VIEW emp_v_10
	–(id, name, sal, dept_id)
	–AS SELECT id,name, 
	–salary, dept_id
	–FROM employees
	–WHERE dept_id = 10;

在CREATE VIEW 语句中字段与子查询中的字段必须一一对应,否则就别指定别名,或在子查询中指定别名

使用ALTER VIEW 语句修改EMP_V_10 视图. 为每个列指定列名.

–ALTER VIEW emp_v_10
	–(id, name, sal, dept_id)
	–AS SELECT id,name, 
	–salary, dept_id
	–FROM employees
	–WHERE dept_id = 10;

在CREATE VIEW 语句中字段与子查询中的字段必须一一对应,否则就别指定别名,或在子查询中指定别名

2)创建复杂视图
创建一个从两个表中查询数据,并进行分组计算的复杂视图.
在数据库中插入另一个表

mysql> select * from dept;
+--------+-----------+--------+
| deptno | dname     | lo     |
+--------+-----------+--------+
|     10 | 教研部    | 北京   |
|     20 | 学工部    | 上海   |
|     30 | 销售部    | 广州   |
|     40 | 财务部    | 武汉   |
+--------+-----------+--------+
4 rows in set (0.00 sec)

多表连接视图:复杂视图

多个表更体现出视图的优势
创建复杂视图将两个表连接起来

mysql> create view emp_v4 as
    -> select e.*,d.dname
    -> from dept d,
    -> (select deptno,count(1) from emp
    -> group by deptno
    -> having count(1)>=1) e
    -> where d.deptno=e.deptno;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from emp_v4;
+--------+----------+-----------+
| deptno | count(1) | dname     |
+--------+----------+-----------+
|     10 |        3 | 教研部    |
|     20 |        4 | 学工部    |
|     30 |        6 | 销售部    |
+--------+----------+-----------+
3 rows in set (0.00 sec)

7、 删除视图

删掉视图不会导致数据的丢失,因为视图是基于数据库的表之上的一个查询定义.  
   DROP VIEW view_name;
mysql> drop view emp_v1;
Query OK, 0 rows affected (0.00 sec)

mysql> drop view emp_v2;
Query OK, 0 rows affected (0.00 sec)

8:MySQL数据库中的视图保存:

MySQL视图保存在information_schema表里面

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db                 |
| db1                |
| gtid               |
| it                 |
| mysql              |
| performance_schema |
| sys                |
| test               |
| test2              |
+--------------------+
10 rows in set (0.00 sec)

mysql> use information_schema

需要进入information_schema数据库进行查看视图

mysql> select * from VIEWS 
	->	where TABLE_NAME='emp_v1'\G;
*************************** 1. row ***************************
       TABLE_CATALOG: def
        TABLE_SCHEMA: db1
          TABLE_NAME: emp_v1
     VIEW_DEFINITION: select `db1`.`emp`.`empno` AS `empno`,`db1`.`emp`.`ename` AS `ename`,`db1`.`emp`.`job` AS `job`,`db1`.`emp`.`mgr` AS `mgr`,`db1`.`emp`.`hiredate` AS `hiredate`,`db1`.`emp`.`sai` AS `sai`,`db1`.`emp`.`comm` AS `comm`,`db1`.`emp`.`deptno` AS `deptno` from `db1`.`emp` where (`db1`.`emp`.`deptno` = 10)
        CHECK_OPTION: NONE
        IS_UPDATABLE: YES
             DEFINER: root@localhost
       SECURITY_TYPE: DEFINER
CHARACTER_SET_CLIENT: utf8
COLLATION_CONNECTION: utf8_general_ci
1 row in set (0.00 sec)

ERROR: 
No query specified

mysql>