【MySQL】-- 视图

文章目录

  • 1. 什么是视图
  • 2. 创建视图
  • 3. 使用视图
  • 4. 修改数据
    • 4.1 注意事项
  • 5. 删除视图
  • 6. 视图的优点

1. 什么是视图

视图是一个虚拟的表,它是基于一个或多个基本表或其他视图的查询结果集。视图本身不存储数据,而是通过执行查询来动态生成数据。用户可以像操作普通表一样使用视图进行查询、更新和管理。视图本身并不占用物理存储空间,它仅仅是一个查询的逻辑表示,物理上它依赖于基础表中的数据。

2. 创建视图

-- 语法
create view vew_name [(column_list)] as select_statement;
  • create view:创建视图的关键字
  • view_name:视图名
  • [(column_list)]:视图中包含的列
  • select_statement:视图所依赖的查询语句

3. 使用视图

  • 查询用户的所有信息和考试成绩
mysql> create view v_student_score as (
    -> select
    -> s.id,
    -> s.`name`,
    -> s.sno,
    -> s.age,
    -> s.enroll_date,
    -> cls.`name`,
    -> c.`name`,
    -> sco.score
    -> from
    -> student s,
    -> class cls,
    -> score sco,
    -> course c
    -> where
    -> s.class_id = cls.id
    -> AND
    -> sco.student_id = s.id
    -> AND
    -> sco.course_id = c.id
    -> order by s.id asc
    -> );
ERROR 1060 (42S21): Duplicate column name 'name'

s.name、cls.name、c.name这三个列的名字重复了,需要为重名的列起别名。

mysql> create view v_student_score as (
    -> select
    -> s.id,
    -> s.`name`,
    -> s.sno,
    -> s.age,
    -> s.enroll_date,
    -> cls.`name` as class_name,
    -> c.`name` as course_name,
    -> sco.score
    -> from
    -> student s,
    -> class cls,
    -> score sco,
    -> course c
    -> where
    -> s.class_id = cls.id
    -> AND
    -> sco.student_id = s.id
    -> AND
    -> sco.course_id = c.id
    -> order by s.id asc
    -> );
Query OK, 0 rows affected (0.02 sec)

由于在创建视图时没有指定视图包含的列,默认会以查询结果中返回的列作为视图的列。

-- 创建的视图可以直接在表中找到
mysql> show tables;
+-------------------+
| Tables_in_java114 |
+-------------------+
| class             |
| course            |
| emp               |
| exam              |
| score             |
| student           |
| student1          |
| t_recored         |
| t_recored_new     |
| t_recored_new2    |
| t_truncate        |
| users             |
| v_student_score   |
+-------------------+
13 rows in set (0.00 sec)

-- 可以直接使用视图查询
mysql> select * from v_student_score;
+----+--------+--------+------+-------------+------------+-------------+-------+
| id | name   | sno    | age  | enroll_date | class_name | course_name | score |
+----+--------+--------+------+-------------+------------+-------------+-------+
|  1 | 唐三藏 | 100001 |   18 | 1986-09-01  | Java001班  | Java        |  70.5 |
|  1 | 唐三藏 | 100001 |   18 | 1986-09-01  | Java001班  | MySQL       |  98.5 |
|  1 | 唐三藏 | 100001 |   18 | 1986-09-01  | Java001班  | 计算机网络  |    33 |
|  1 | 唐三藏 | 100001 |   18 | 1986-09-01  | Java001班  | 数据结构    |    98 |
|  1 | 唐三藏 | 100001 |   18 | 1986-09-01  | Java001班  | Java        |  70.5 |
|  1 | 唐三藏 | 100001 |   18 | 1986-09-01  | Java001班  | MySQL       |  98.5 |
|  2 | 孙悟空 | 100002 |   18 | 1986-09-01  | Java001班  | Java        |    60 |
|  2 | 孙悟空 | 100002 |   18 | 1986-09-01  | Java001班  | 计算机网络  |  59.5 |
|  2 | 孙悟空 | 100002 |   18 | 1986-09-01  | Java001班  | Java        |    60 |
|  3 | 猪悟能 | 100003 |   18 | 1986-09-01  | Java001班  | Java        |    33 |
|  3 | 猪悟能 | 100003 |   18 | 1986-09-01  | Java001班  | MySQL       |    68 |
|  3 | 猪悟能 | 100003 |   18 | 1986-09-01  | Java001班  | 计算机网络  |    99 |
|  4 | 沙悟净 | 100004 |   18 | 1986-09-01  | Java001班  | Java        |    67 |
|  4 | 沙悟净 | 100004 |   18 | 1986-09-01  | Java001班  | MySQL       |    23 |
|  4 | 沙悟净 | 100004 |   18 | 1986-09-01  | Java001班  | 计算机网络  |    56 |
|  4 | 沙悟净 | 100004 |   18 | 1986-09-01  | Java001班  | 数据结构    |    72 |
|  5 | 宋江   | 200001 |   18 | 2000-09-01  | C++001| Java        |    81 |
|  5 | 宋江   | 200001 |   18 | 2000-09-01  | C++001| 计算机网络  |    37 |
|  6 | 武松   | 200002 |   18 | 2000-09-01  | C++001| C++         |    56 |
|  6 | 武松   | 200002 |   18 | 2000-09-01  | C++001| 操作系统    |    43 |
|  6 | 武松   | 200002 |   18 | 2000-09-01  | C++001| 数据结构    |    79 |
|  7 | 李逹   | 200003 |   18 | 2000-09-01  | C++001| C++         |    80 |
|  7 | 李逹   | 200003 |   18 | 2000-09-01  | C++001| 数据结构    |    92 |
+----+--------+--------+------+-------------+------------+-------------+-------+
23 rows in set (0.00 sec)

-- 查看视图结构
mysql> desc v_student_score;
+-------------+-------------+------+-----+---------+-------+
| Field       | Type        | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+-------+
| id          | bigint      | NO   |     | 0       |       |
| name        | varchar(20) | NO   |     | NULL    |       |
| sno         | varchar(10) | NO   |     | NULL    |       |
| age         | int         | YES  |     | NULL    |       |
| enroll_date | date        | YES  |     | NULL    |       |
| class_name  | varchar(20) | NO   |     | NULL    |       |
| course_name | varchar(20) | NO   |     | NULL    |       |
| score       | float       | NO   |     | NULL    |       |
+-------------+-------------+------+-----+---------+-------+
8 rows in set (0.00 sec)

--查看视图的创建语句
mysql> show create view v_student_score;
+-----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| View            | Create View                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | character_set_client | collation_connection |
+-----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| v_student_score | CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v_student_score` AS select `s`.`id` AS `id`,`s`.`name` AS `name`,`s`.`sno` AS `sno`,`s`.`age` AS `age`,`s`.`enroll_date` AS `enroll_date`,`cls`.`name` AS `class_name`,`c`.`name` AS `course_name`,`sco`.`score` AS `score` from (((`student` `s` join `class` `cls`) join `score` `sco`) join `course` `c`) where ((`s`.`class_id` = `cls`.`id`) and (`sco`.`student_id` = `s`.`id`) and (`sco`.`course_id` = `c`.`id`)) order by `s`.`id` | gbk                  | gbk_chinese_ci       |
+-----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
1 row in set (0.00 sec)
  • 查询用户的姓名和总分(隐藏学号和各科成绩)

定义视图的好处:

  1. 隐藏敏感字段。
  2. 对外提供统一访问规范
  1. 隐藏敏感字段
mysql> select * from student;
+----+----------+--------+------+--------+-------------+----------+
| id | name     | sno    | age  | gender | enroll_date | class_id |
+----+----------+--------+------+--------+-------------+----------+
|  1 | 唐三藏   | 100001 |   18 |      1 | 1986-09-01  |        1 |
|  2 | 孙悟空   | 100002 |   18 |      1 | 1986-09-01  |        1 |
|  3 | 猪悟能   | 100003 |   18 |      1 | 1986-09-01  |        1 |
|  4 | 沙悟净   | 100004 |   18 |      1 | 1986-09-01  |        1 |
|  5 | 宋江     | 200001 |   18 |      1 | 2000-09-01  |        2 |
|  6 | 武松     | 200002 |   18 |      1 | 2000-09-01  |        2 |
|  7 | 李逹     | 200003 |   18 |      1 | 2000-09-01  |        2 |
|  8 | 不想毕业 | 200004 |   18 |      1 | 2000-09-01  |        2 |
+----+----------+--------+------+--------+-------------+----------+
8 rows in set (0.00 sec)

这是学生表的信息,但是有些时候我们不希望一些隐私信息显示出来,就可以创建视图。

mysql> create view v_student as(
    -> select
    -> s.id,
    -> s.`name`,
    -> s.gender
    -> from student s
    -> );
Query OK, 0 rows affected (0.02 sec)

mysql> select * from v_student;
+----+----------+--------+
| id | name     | gender |
+----+----------+--------+
|  1 | 唐三藏   |      1 |
|  2 | 孙悟空   |      1 |
|  3 | 猪悟能   |      1 |
|  4 | 沙悟净   |      1 |
|  5 | 宋江     |      1 |
|  6 | 武松     |      1 |
|  7 | 李逹     |      1 |
|  8 | 不想毕业 |      1 |
+----+----------+--------+
8 rows in set (0.01 sec)
  1. 对外提供统一访问规范
mysql> desc student;
+-------------+-------------+------+-----+---------+----------------+
| Field       | Type        | Null | Key | Default | Extra          |
+-------------+-------------+------+-----+---------+----------------+
| id          | bigint      | NO   | PRI | NULL    | auto_increment |
| name        | varchar(20) | NO   |     | NULL    |                |
| sno         | varchar(10) | NO   |     | NULL    |                |
| age         | int         | YES  |     | NULL    |                |
| gender      | tinyint(1)  | YES  |     | NULL    |                |
| enroll_date | date        | YES  |     | NULL    |                |
| class_id    | bigint      | NO   |     | NULL    |                |
+-------------+-------------+------+-----+---------+----------------+
7 rows in set (0.01 sec)

这是student表的表结构,如果我们希望把表中的字段sno改成number,修改之前我们的查询语句可能是这样的select id, name, ,sno from student;,修改之后的查询语句可能是这样的select id, name, number from student。那么,如果我们的业务代码中存在相关的查询,则需要大面积的修改。

如果使用视图:
在这里插入图片描述

  • 视图和真实表进行表连接查询
mysql> create view v_student2 as(
    -> select
    -> id,
    -> name,
    -> gender,
    -> class_id
    -> from
    -> student);
Query OK, 0 rows affected (0.01 sec)

mysql> select * from v_student2;
+----+----------+--------+----------+
| id | name     | gender | class_id |
+----+----------+--------+----------+
|  1 | 唐三藏   |      1 |        1 |
|  2 | 孙悟空   |      1 |        1 |
|  3 | 猪悟能   |      1 |        1 |
|  4 | 沙悟净   |      1 |        1 |
|  5 | 宋江     |      1 |        2 |
|  6 | 武松     |      1 |        2 |
|  7 | 李逹     |      1 |        2 |
|  8 | 不想毕业 |      1 |        2 |
+----+----------+--------+----------+
8 rows in set (0.01 sec)

mysql> select * from v_student2 s, class c where c.id = s.class_id;
+----+----------+--------+----------+----+-----------+
| id | name     | gender | class_id | id | name      |
+----+----------+--------+----------+----+-----------+
|  1 | 唐三藏   |      1 |        1 |  1 | Java001班 |
|  2 | 孙悟空   |      1 |        1 |  1 | Java001班 |
|  3 | 猪悟能   |      1 |        1 |  1 | Java001班 |
|  4 | 沙悟净   |      1 |        1 |  1 | Java001班 |
|  5 | 宋江     |      1 |        2 |  2 | C++001|
|  6 | 武松     |      1 |        2 |  2 | C++001|
|  7 | 李逹     |      1 |        2 |  2 | C++001|
|  8 | 不想毕业 |      1 |        2 |  2 | C++001|
+----+----------+--------+----------+----+-----------+
8 rows in set (0.02 sec)

使用视图进行查询操作,和使用真实表进行查询一样。

4. 修改数据

  • 通过真实表修改数据,会影响数据(因为视图依赖真实表中的数据)
mysql> select * from v_student_score;
+----+--------+--------+------+-------------+------------+-------------+-------+
| id | name   | sno    | age  | enroll_date | class_name | course_name | score |
+----+--------+--------+------+-------------+------------+-------------+-------+
|  1 | 唐三藏 | 100001 |   18 | 1986-09-01  | Java001班  | Java        |  70.5 |
|  1 | 唐三藏 | 100001 |   18 | 1986-09-01  | Java001班  | MySQL       |  98.5 |
|  1 | 唐三藏 | 100001 |   18 | 1986-09-01  | Java001班  | 计算机网络  |    33 |
|  1 | 唐三藏 | 100001 |   18 | 1986-09-01  | Java001班  | 数据结构    |    98 |
|  1 | 唐三藏 | 100001 |   18 | 1986-09-01  | Java001班  | Java        |  70.5 |
|  1 | 唐三藏 | 100001 |   18 | 1986-09-01  | Java001班  | MySQL       |  98.5 |
|  2 | 孙悟空 | 100002 |   18 | 1986-09-01  | Java001班  | Java        |    60 |
|  2 | 孙悟空 | 100002 |   18 | 1986-09-01  | Java001班  | 计算机网络  |  59.5 |
|  2 | 孙悟空 | 100002 |   18 | 1986-09-01  | Java001班  | Java        |    60 |
|  3 | 猪悟能 | 100003 |   18 | 1986-09-01  | Java001班  | Java        |    33 |
|  3 | 猪悟能 | 100003 |   18 | 1986-09-01  | Java001班  | MySQL       |    68 |
|  3 | 猪悟能 | 100003 |   18 | 1986-09-01  | Java001班  | 计算机网络  |    99 |
|  4 | 沙悟净 | 100004 |   18 | 1986-09-01  | Java001班  | Java        |    67 |
|  4 | 沙悟净 | 100004 |   18 | 1986-09-01  | Java001班  | MySQL       |    23 |
|  4 | 沙悟净 | 100004 |   18 | 1986-09-01  | Java001班  | 计算机网络  |    56 |
|  4 | 沙悟净 | 100004 |   18 | 1986-09-01  | Java001班  | 数据结构    |    72 |
|  5 | 宋江   | 200001 |   18 | 2000-09-01  | C++001| Java        |    81 |
|  5 | 宋江   | 200001 |   18 | 2000-09-01  | C++001| 计算机网络  |    37 |
|  6 | 武松   | 200002 |   18 | 2000-09-01  | C++001| C++         |    56 |
|  6 | 武松   | 200002 |   18 | 2000-09-01  | C++001| 操作系统    |    43 |
|  6 | 武松   | 200002 |   18 | 2000-09-01  | C++001| 数据结构    |    79 |
|  7 | 李逹   | 200003 |   18 | 2000-09-01  | C++001| C++         |    80 |
|  7 | 李逹   | 200003 |   18 | 2000-09-01  | C++001| 数据结构    |    92 |
+----+--------+--------+------+-------------+------------+-------------+-------+
23 rows in set (0.02 sec)

-- 修改真实表中的数据
mysql> update score set score = 80 where student_id = 1 and course_id = 1;
Query OK, 2 rows affected (0.01 sec)
Rows matched: 2  Changed: 2  Warnings: 0

-- 查看视图中的数据,数据已更新
mysql> select * from v_student_score;
+----+--------+--------+------+-------------+------------+-------------+-------+
| id | name   | sno    | age  | enroll_date | class_name | course_name | score |
+----+--------+--------+------+-------------+------------+-------------+-------+
|  1 | 唐三藏 | 100001 |   18 | 1986-09-01  | Java001班  | Java        |    80 |
|  1 | 唐三藏 | 100001 |   18 | 1986-09-01  | Java001班  | MySQL       |  98.5 |
|  1 | 唐三藏 | 100001 |   18 | 1986-09-01  | Java001班  | 计算机网络  |    33 |
|  1 | 唐三藏 | 100001 |   18 | 1986-09-01  | Java001班  | 数据结构    |    98 |
|  1 | 唐三藏 | 100001 |   18 | 1986-09-01  | Java001班  | Java        |    80 |
|  1 | 唐三藏 | 100001 |   18 | 1986-09-01  | Java001班  | MySQL       |  98.5 |
|  2 | 孙悟空 | 100002 |   18 | 1986-09-01  | Java001班  | Java        |    60 |
|  2 | 孙悟空 | 100002 |   18 | 1986-09-01  | Java001班  | 计算机网络  |  59.5 |
|  2 | 孙悟空 | 100002 |   18 | 1986-09-01  | Java001班  | Java        |    60 |
|  3 | 猪悟能 | 100003 |   18 | 1986-09-01  | Java001班  | Java        |    33 |
|  3 | 猪悟能 | 100003 |   18 | 1986-09-01  | Java001班  | MySQL       |    68 |
|  3 | 猪悟能 | 100003 |   18 | 1986-09-01  | Java001班  | 计算机网络  |    99 |
|  4 | 沙悟净 | 100004 |   18 | 1986-09-01  | Java001班  | Java        |    67 |
|  4 | 沙悟净 | 100004 |   18 | 1986-09-01  | Java001班  | MySQL       |    23 |
|  4 | 沙悟净 | 100004 |   18 | 1986-09-01  | Java001班  | 计算机网络  |    56 |
|  4 | 沙悟净 | 100004 |   18 | 1986-09-01  | Java001班  | 数据结构    |    72 |
|  5 | 宋江   | 200001 |   18 | 2000-09-01  | C++001| Java        |    81 |
|  5 | 宋江   | 200001 |   18 | 2000-09-01  | C++001| 计算机网络  |    37 |
|  6 | 武松   | 200002 |   18 | 2000-09-01  | C++001| C++         |    56 |
|  6 | 武松   | 200002 |   18 | 2000-09-01  | C++001| 操作系统    |    43 |
|  6 | 武松   | 200002 |   18 | 2000-09-01  | C++001| 数据结构    |    79 |
|  7 | 李逹   | 200003 |   18 | 2000-09-01  | C++001| C++         |    80 |
|  7 | 李逹   | 200003 |   18 | 2000-09-01  | C++001| 数据结构    |    92 |
+----+--------+--------+------+-------------+------------+-------------+-------+
23 rows in set (0.00 sec)
  • 通过视图修改数据会影响基表
    重新创建一个视图,不加排序子句
-- 创建不加排序子句的视图
mysql> create view v_student_score1 as (
    -> select
    -> s.id,
    -> s.`name`,
    -> s.sno,
    -> s.age,
    -> s.enroll_date,
    -> cls.`name` as class_name,
    -> c.`name` as course_name,
    -> sco.score
    -> from
    -> student s,
    -> class cls,
    -> score sco,
    -> course c
    -> where
    -> s.class_id = cls.id
    -> AND
    -> sco.student_id = s.id
    -> AND
    -> sco.course_id = c.id
    -> );
Query OK, 0 rows affected (0.01 sec)

-- 查看新建的视图
mysql> select * from v_student_score1;
+----+--------+--------+------+-------------+------------+-------------+-------+
| id | name   | sno    | age  | enroll_date | class_name | course_name | score |
+----+--------+--------+------+-------------+------------+-------------+-------+
|  1 | 唐三藏 | 100001 |   18 | 1986-09-01  | Java001班  | Java        |    80 |
|  1 | 唐三藏 | 100001 |   18 | 1986-09-01  | Java001班  | MySQL       |  98.5 |
|  1 | 唐三藏 | 100001 |   18 | 1986-09-01  | Java001班  | 计算机网络  |    33 |
|  1 | 唐三藏 | 100001 |   18 | 1986-09-01  | Java001班  | 数据结构    |    98 |
|  2 | 孙悟空 | 100002 |   18 | 1986-09-01  | Java001班  | Java        |    60 |
|  2 | 孙悟空 | 100002 |   18 | 1986-09-01  | Java001班  | 计算机网络  |  59.5 |
|  3 | 猪悟能 | 100003 |   18 | 1986-09-01  | Java001班  | Java        |    33 |
|  3 | 猪悟能 | 100003 |   18 | 1986-09-01  | Java001班  | MySQL       |    68 |
|  3 | 猪悟能 | 100003 |   18 | 1986-09-01  | Java001班  | 计算机网络  |    99 |
|  4 | 沙悟净 | 100004 |   18 | 1986-09-01  | Java001班  | Java        |    67 |
|  4 | 沙悟净 | 100004 |   18 | 1986-09-01  | Java001班  | MySQL       |    23 |
|  4 | 沙悟净 | 100004 |   18 | 1986-09-01  | Java001班  | 计算机网络  |    56 |
|  4 | 沙悟净 | 100004 |   18 | 1986-09-01  | Java001班  | 数据结构    |    72 |
|  5 | 宋江   | 200001 |   18 | 2000-09-01  | C++001| Java        |    81 |
|  5 | 宋江   | 200001 |   18 | 2000-09-01  | C++001| 计算机网络  |    37 |
|  6 | 武松   | 200002 |   18 | 2000-09-01  | C++001| C++         |    56 |
|  6 | 武松   | 200002 |   18 | 2000-09-01  | C++001| 操作系统    |    43 |
|  6 | 武松   | 200002 |   18 | 2000-09-01  | C++001| 数据结构    |    79 |
|  7 | 李逹   | 200003 |   18 | 2000-09-01  | C++001| C++         |    80 |
|  7 | 李逹   | 200003 |   18 | 2000-09-01  | C++001| 数据结构    |    92 |
|  1 | 唐三藏 | 100001 |   18 | 1986-09-01  | Java001班  | Java        |    80 |
|  1 | 唐三藏 | 100001 |   18 | 1986-09-01  | Java001班  | MySQL       |  98.5 |
|  2 | 孙悟空 | 100002 |   18 | 1986-09-01  | Java001班  | Java        |    60 |
+----+--------+--------+------+-------------+------------+-------------+-------+
23 rows in set (0.00 sec)

-- 通过视图来修改数据
mysql> update v_student_score1 set score = 95 where id = 1;
Query OK, 6 rows affected (0.01 sec)
Rows matched: 6  Changed: 6  Warnings: 0

-- 查询视图,此时视图中的数据已改变
mysql> select * from v_student_score1;
+----+--------+--------+------+-------------+------------+-------------+-------+
| id | name   | sno    | age  | enroll_date | class_name | course_name | score |
+----+--------+--------+------+-------------+------------+-------------+-------+
|  1 | 唐三藏 | 100001 |   18 | 1986-09-01  | Java001班  | Java        |    95 |
|  1 | 唐三藏 | 100001 |   18 | 1986-09-01  | Java001班  | MySQL       |    95 |
|  1 | 唐三藏 | 100001 |   18 | 1986-09-01  | Java001班  | 计算机网络  |    95 |
|  1 | 唐三藏 | 100001 |   18 | 1986-09-01  | Java001班  | 数据结构    |    95 |
|  2 | 孙悟空 | 100002 |   18 | 1986-09-01  | Java001班  | Java        |    60 |
|  2 | 孙悟空 | 100002 |   18 | 1986-09-01  | Java001班  | 计算机网络  |  59.5 |
|  3 | 猪悟能 | 100003 |   18 | 1986-09-01  | Java001班  | Java        |    33 |
|  3 | 猪悟能 | 100003 |   18 | 1986-09-01  | Java001班  | MySQL       |    68 |
|  3 | 猪悟能 | 100003 |   18 | 1986-09-01  | Java001班  | 计算机网络  |    99 |
|  4 | 沙悟净 | 100004 |   18 | 1986-09-01  | Java001班  | Java        |    67 |
|  4 | 沙悟净 | 100004 |   18 | 1986-09-01  | Java001班  | MySQL       |    23 |
|  4 | 沙悟净 | 100004 |   18 | 1986-09-01  | Java001班  | 计算机网络  |    56 |
|  4 | 沙悟净 | 100004 |   18 | 1986-09-01  | Java001班  | 数据结构    |    72 |
|  5 | 宋江   | 200001 |   18 | 2000-09-01  | C++001| Java        |    81 |
|  5 | 宋江   | 200001 |   18 | 2000-09-01  | C++001| 计算机网络  |    37 |
|  6 | 武松   | 200002 |   18 | 2000-09-01  | C++001| C++         |    56 |
|  6 | 武松   | 200002 |   18 | 2000-09-01  | C++001| 操作系统    |    43 |
|  6 | 武松   | 200002 |   18 | 2000-09-01  | C++001| 数据结构    |    79 |
|  7 | 李逹   | 200003 |   18 | 2000-09-01  | C++001| C++         |    80 |
|  7 | 李逹   | 200003 |   18 | 2000-09-01  | C++001| 数据结构    |    92 |
|  1 | 唐三藏 | 100001 |   18 | 1986-09-01  | Java001班  | Java        |    95 |
|  1 | 唐三藏 | 100001 |   18 | 1986-09-01  | Java001班  | MySQL       |    95 |
|  2 | 孙悟空 | 100002 |   18 | 1986-09-01  | Java001班  | Java        |    60 |
+----+--------+--------+------+-------------+------------+-------------+-------+
23 rows in set (0.00 sec)

-- 查询真实表,真实表中的数据也已改变
mysql> select * from score;
+----+------------+-----------+-------+
| id | student_id | course_id | score |
+----+------------+-----------+-------+
|  1 |          1 |         1 |    95 |
|  2 |          1 |         3 |    95 |
|  3 |          1 |         5 |    95 |
|  4 |          1 |         6 |    95 |
|  5 |          2 |         1 |    60 |
|  6 |          2 |         5 |  59.5 |
|  7 |          3 |         1 |    33 |
|  8 |          3 |         3 |    68 |
|  9 |          3 |         5 |    99 |
| 10 |          4 |         1 |    67 |
| 11 |          4 |         3 |    23 |
| 12 |          4 |         5 |    56 |
| 13 |          4 |         6 |    72 |
| 14 |          5 |         1 |    81 |
| 15 |          5 |         5 |    37 |
| 16 |          6 |         2 |    56 |
| 17 |          6 |         4 |    43 |
| 18 |          6 |         6 |    79 |
| 19 |          7 |         2 |    80 |
| 20 |          7 |         6 |    92 |
| 21 |          1 |         1 |    95 |
| 22 |          1 |         3 |    95 |
| 23 |          2 |         1 |    60 |
+----+------------+-----------+-------+
23 rows in set (0.00 sec)

4.1 注意事项

  1. 修改真实表会影响视图,修改视图同样会影响真实表

  2. 以下视图不可更新

  1. 创建视图时使用聚合函数的视图
  2. 创建视图时使用DISTINCT
  3. 创建视图时使用GROUP BY 以及HAVING子句
  4. 创建视图时使用UNIONUNION ALL
  5. 查询列表中使用子查询。
  6. 在FROM子句中不可更新视图
  7. 创建视图时使用ORDER BY

5. 删除视图

-- 语法
drop view view_name;

可以一个一个的删除;也可以一次性删除多个,用逗号将视图名隔开。

6. 视图的优点

  1. 简单性:视图可以将复杂的查询封装成一个简单的查询。例如,针对一个复杂的多表连接查询,可以创建一个视图,用户只需查询视图而无需了解底层的复杂逻辑。
  2. 安全性:通过视图,可以隐藏表中的敏感数据。例如,一个系统的用户表中,可以创建一个不包含密码列视图,普通用户只能访问这个视图,而不能访问原始表。
  3. 逻辑数据独立性:视图提供了一种逻辑数据独立性,即使底层表结构发生变化,只需修改视图定义,而无需修改依赖视图的应用程序。使用到应用程序与数据库的解耦
  4. 重命名列:视图允许用户重命名列名,以增强数据可读性。

你可能感兴趣的:(数据库MySQL,mysql,adb,数据库)