MySQL 视图:视图是什么,视图和基表之间的关系

目录

[1. 视图规则和限制](#1. 视图规则和限制)

[2. 基本使用](#2. 基本使用)

[2.1 创建视图](#2.1 创建视图)

[2.2 修改视图](#2.2 修改视图)

[2.3 修改基表](#2.3 修改基表)

[2.4 删除视图](#2.4 删除视图)


视图是一个虚拟表,内容由查询定义。和真实的表一样,视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表,基表的数据变化也会影响到视图。

1. 视图规则和限制

  • 与表一样,必须唯一命名(不能出现同名视图或表名)
  • 创建视图数目无限制,但要考虑复杂查询创建为视图之后的性能影响
  • 视图不能添加索引,也不能有关联的触发器或者默认值
  • 视图可以提高安全性,必须具有足够的访问权限
  • order by 可以用在视图中,但是如果从该视图检索数据 select 中也含有 order by,那么该视图中的 order by 将被覆盖
  • 视图可以和表一起使用

2. 基本使用

2.1 创建视图

create view 视图名 as select语句;

例子:

sql 复制代码
mysql> create view v_ename_dname as select ename,dname 
    -> from emp,dept where emp.deptno=dept.deptno;
Query OK, 0 rows affected (0.01 sec)

mysql> show tables;
+-----------------+
| Tables_in_scott |
+-----------------+
| dept            |
| emp             |
| salgrade        |
| v_ename_dname   | <--视图
+-----------------+
4 rows in set (0.00 sec)


mysql> select *from v_ename_dname order by dname;
+--------+------------+
| ename  | dname      |
+--------+------------+
| CLARK  | ACCOUNTING |
| KING   | ACCOUNTING |
| MILLER | ACCOUNTING |
| SMITH  | RESEARCH   |
| JONES  | RESEARCH   |
| SCOTT  | RESEARCH   |
| ADAMS  | RESEARCH   |
| FORD   | RESEARCH   |
| ALLEN  | SALES      |
| WARD   | SALES      |
| MARTIN | SALES      |
| BLAKE  | SALES      |
| TURNER | SALES      |
| JAMES  | SALES      |
+--------+------------+
14 rows in set (0.01 sec)

2.2 修改视图

修改了视图,对基表数据有影响

sql 复制代码
mysql> select *from v_ename_dname order by dname;
+--------+------------+
| ename  | dname      |
+--------+------------+
| CLARK  | ACCOUNTING | <--准备修改这个
| KING   | ACCOUNTING |
| MILLER | ACCOUNTING |
| SMITH  | RESEARCH   |
| JONES  | RESEARCH   |
| SCOTT  | RESEARCH   |
| ADAMS  | RESEARCH   |
| FORD   | RESEARCH   |
| ALLEN  | SALES      |
| WARD   | SALES      |
| MARTIN | SALES      |
| BLAKE  | SALES      |
| TURNER | SALES      |
| JAMES  | SALES      |
+--------+------------+
14 rows in set (0.01 sec)

mysql> update v_ename_dname set ename='TEST' where ename='CLARK';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select *from v_ename_dname;
+--------+------------+
| ename  | dname      |
+--------+------------+
| SMITH  | RESEARCH   |
| ALLEN  | SALES      |
| WARD   | SALES      |
| JONES  | RESEARCH   |
| MARTIN | SALES      |
| BLAKE  | SALES      |
| TEST   | ACCOUNTING | <--修改成功
| SCOTT  | RESEARCH   |
| KING   | ACCOUNTING |
| TURNER | SALES      |
| ADAMS  | RESEARCH   |
| JAMES  | SALES      |
| FORD   | RESEARCH   |
| MILLER | ACCOUNTING |
+--------+------------+
14 rows in set (0.00 sec)

mysql> select *from emp where ename='CLARK'; <--基表中找不到了
Empty set (0.00 sec)

mysql> select *from emp where ename='TEST'; <--被修改成 TEST 了
+--------+-------+---------+------+---------------------+---------+------+--------+
| empno  | ename | job     | mgr  | hiredate            | sal     | comm | deptno |
+--------+-------+---------+------+---------------------+---------+------+--------+
| 007782 | TEST  | MANAGER | 7839 | 1981-06-09 00:00:00 | 2450.00 | NULL |     10 |
+--------+-------+---------+------+---------------------+---------+------+--------+
1 row in set (0.00 sec)

2.3 修改基表

修改了基表,对视图有影响

sql 复制代码
mysql> select *from dept;
+--------+------------+----------+
| deptno | dname      | loc      |
+--------+------------+----------+
|     10 | ACCOUNTING | NEW YORK | <--部门号所对应的部门名
|     20 | RESEARCH   | DALLAS   |
|     30 | SALES      | CHICAGO  |
|     40 | OPERATIONS | BOSTON   |
+--------+------------+----------+
4 rows in set (0.00 sec)

mysql> select *from emp where ename='JAMES';
+--------+-------+-------+------+---------------------+--------+------+--------+
| empno  | ename | job   | mgr  | hiredate            | sal    | comm | deptno |
+--------+-------+-------+------+---------------------+--------+------+--------+
| 007900 | JAMES | CLERK | 7698 | 1981-12-03 00:00:00 | 950.00 | NULL |     30 |
+--------+-------+-------+------+---------------------+--------+------+--------+
1 row in set (0.00 sec)

mysql> select *from v_ename_dname where ename='JAMES';
+-------+-------+
| ename | dname |
+-------+-------+
| JAMES | SALES |
+-------+-------+
1 row in set (0.00 sec)

mysql> update emp set deptno=10 where ename='JAMES';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select *from v_ename_dname where ename='JAMES';
+-------+------------+
| ename | dname      |
+-------+------------+
| JAMES | ACCOUNTING | <--基表的修改,对视图产生影响
+-------+------------+
1 row in set (0.00 sec)

2.4 删除视图

drop view 视图名;

sql 复制代码
mysql> show tables;
+-----------------+
| Tables_in_scott |
+-----------------+
| dept            |
| emp             |
| salgrade        |
| v_ename_dname   |
+-----------------+
4 rows in set (0.00 sec)

mysql> drop view v_ename_dname;
Query OK, 0 rows affected (0.01 sec)

mysql> show tables;
+-----------------+
| Tables_in_scott |
+-----------------+
| dept            |
| emp             |
| salgrade        |
+-----------------+
3 rows in set (0.00 sec)
相关推荐
程序员-Benothing14 分钟前
什么是 MySQL 的主从同步机制?它是如何实现的?
android·数据库·mysql
Wang's Blog18 分钟前
Vibe Coding一人即团队系列31:基于Claude Code实现登录注册与数据库联动
数据库·人工智能
2601_9620566021 分钟前
Spring Boot——日志介绍和配置
java·数据库·spring boot
Cloud云卷云舒24 分钟前
【运营商数据库】实战淬炼,规模落地 | 中国移动HaishanDB年中总结会圆满召开
数据库·postgresql·ai-native·haishandb·移动云海山数据库
烂蜻蜓24 分钟前
Flask入门教程(十三):数据库操作——SQLAlchemy与CRUD完整实践
数据库·oracle·flask
程序员夏洛29 分钟前
Redis 的 Red Lock 是什么?你了解吗?
数据库·redis·缓存
程序员夏洛34 分钟前
Redis 实现分布式锁时可能遇到的问题有哪些?
数据库·redis·分布式
Sagittarius_A*38 分钟前
【好靶场】报错注入-sql注入-数字型
数据库·sql·web安全·sql注入
Wang's Blog41 分钟前
Vibe Coding一人即团队系列30: AI辅助数据库脚本设计与字符集问题修复
数据库·人工智能