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