MySQL 视图

视图是虚拟的表,它们包含的不是数据而是根据需要检索数据的查询。视图提供了一种SELECT语句的封装,用来简化数据处理以及重新格式化基础数据或保护基础数据。

目录

视图

为什么使用视图

视图的规则和限制

使用视图

创建视图

简化复杂的联结

重新格式化检索出的数据

过滤数据

视图计算字段

删除视图

总结


视图

视图是虚拟的表。与包含数据的表不一样,视图只包含使用时动态检索数据的查询。

比如:如果想查询某个歌手下的所有歌曲,所以使用了两表联结,SQL如下:

SELECT
	player_singler.id,
	player_singler.name,
	player_singe.name AS sname,
	player_singe.addtime
FROM
	player_singe,
	player_singler
WHERE
	player_singe.singler_id = player_singler.id
AND player_singler.name = '周杰伦'

任何人想使用上述的SQL语句,查询某个歌手下的歌曲都必须理解相关表结构,并且知道如何创建查询和对表进行联结。为了查询其他歌手,必须修改最后的where子句。

但是通过把整个查询包装成一个名为play_singe_singler的虚拟表,则可以轻松的查询出相同的数据,如下:

SELECT
	id,
	name,
	sname
FROM
	play_singe_singler
WHERE
	NAME = '周杰伦'

这就是视图的作用。play_singe_singler是一个视图,不包含表中应该有的任何列或数据,它包含的是一个SQL查询(与用以正确联结表的相同的查询)。

为什么使用视图

视图的一些常见应用:

1.重用SOL语句。

2.简化复杂的SQL操作。在编写查询后,可以更方便地重用它而不用探究查询细节。

3.使用表的组成部分而不是整个表。

4.保护数据。可以给用户授权表的特定部分的访问权限。

5.更改数据格式和表示。视图可返回与底层表的表示和格式不同的数据。

在视图创建之后,可以用与表基本相同的方式利用它们。可以对视图执行SELECT操作,过滤和排序数据,将视图联结到其他视图或表,甚至能添加和更新数据(添加和更新数据存在某些限制)。因为它们返回的数据是从其他表中检索出来的,在添加或更改这些表中的数据时,视图的数据也将改变。

视图的规则和限制

视图创建和使用的常见规则和限制:

1.与表一样,视图必须唯一命名(不能与视图或表名称重复)。

2.创建的视图数目没有限制。

3.创建视图,必须具有足够的访问权限。

4.视图可以嵌套,即可以利用从其他视图中检索数据的查询来构造一个视图。

5.ORDERBY可以用在视图中,但如果从该视图检索数据SELECT中也含有ORDERBY,那么该视图中的ORDERBY将被覆盖。

6.视图不能索引,也不能有关联的触发器或默认值。

7.视图可以和表一起使用。如:编写一条表和视图联结的SELECT语句。

使用视图

在理解视图和视图的规则、限制后,查看如何创建视图。

创建视图

1.视图用CREATE VIEW语句来创建。

2.使用SHOW CREATE VIEW viewname;来查看创建视图的语句

3.用DROP删除视图,其语法为DROP VIEW viewname;

4.更新视图时,可以先用DROP再用CREATE,也可以直接用CREATEOR REPLACE VIEW。如果要更新的视图不存在,则第2条更新语句会创建一个视图;如果要更新的视图存在,则第2条更新语句会替换原有视图。

简化复杂的联结

视图最常用的应用之一是隐藏复杂的SQL,这通常都会涉及联结。如下:

CREATE VIEW play_singe_singler AS SELECT
	player_singler.id,
	player_singler.name,
	player_singe.name AS sname,
	player_singe.addtime
FROM
	player_singe,
	player_singler
WHERE
	player_singe.singler_id = player_singler.id;

这条语句创建一个名为play_singe_singler的视图,它联结两个表,返回任意单曲的所有歌手列表。如果执行SELECT * FROM play_singe_singler,将列出任意单曲的歌手列表。

比如查询歌手周深的单曲,可如下进行:

SELECT
	id,
	name,
	sname
FROM
	play_singe_singler
WHERE
	name = '周深';

运行结果:

重新格式化检索出的数据

视图的另一个常见应用是重新格式化检索出的数据。下面的SELECT语句在单个组合计算列中返回歌手和单曲格式化数据。

SELECT
	player_singler.id,
	concat(player_singe.name, '(', player_singler.name, ')') as title
FROM
	player_singe,
	player_singler
WHERE
	player_singe.singler_id = player_singler.id;

运行结果:

假如经常需要这个格式的结果。就可以创建一个视图,每次需要时使用它即可。

此语句转换为视图,可按如下进行:

CREATE VIEW play_singe_singler2 AS SELECT
	player_singler.id,
	concat(player_singe.name, '(', player_singler.name, ')') as title
FROM
	player_singe,
	player_singler
WHERE
	player_singe.singler_id = player_singler.id;

还是使用CREATE VIEW方式查询创建视图。

创建后检索数据,即可按照如下方式进行:

SELECT * FROM play_singe_singler2;

 

过滤数据

还可以定义一个singlermanysinge视图,它过滤掉单曲少于2个的歌手。

为达到此目的,可使用以下语句:

CREATE VIEW singlermanysinge AS SELECT
	id,
	NAME,
	singe_num
FROM
	player_singler
WHERE
	singe_num > 1;

这样在使用SELECT语句:SELECT * FROM singlermanysinge查询时,

即可过滤掉单曲少于2首的歌手,返回的都是大于1首的歌手列表,如下图:

提示:如果从视图检索数据时又使用了一条where子句,则两组子句将自动组合。

视图计算字段

视图对于简化计算字段的使用也特别有用。下面介绍一条SELECT语句,它检索某个特定订单中的物品,计算每个物品的总价格:

SELECT
	orderNum,
	price,
	num,
	price * num AS product_price
FROM
	`product_order_spare`;

运行结果:

将其转换为一个视图,按如下进行:

CREATE VIEW orderproductprice AS SELECT
	orderNum,
	price,
	num,
	price * num AS product_price
FROM
	`product_order_spare`;

创建视图后,如想检索订单编号为20210224140918225910订单的产品信息时,

可按如下进行:

SELECT * FROM orderproductprice WHERE orderNum = '20210224140918225910';

运行结果:

 

删除视图

删除视图与删除表语句相似,都是使用DROP,不过后面跟的是VIEW。如下:

DROP VIEW play_singe_singler;

 

总结

视图是虚拟的表,它们包含的不是数据而是根据需要检索数据的查询。

视图提供了一种SELECT语句的封装,用来简化数据处理以及重新格式化基础数据或保护基础数据。

### 创建、查询管理 MySQL 视图的方法 #### 一、创建视图MySQL 中,可以通过 `CREATE VIEW` 语句来创建视图。以下是具体的语法: ```sql CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW view_name [(column_list)] AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION]; ``` - **`view_name`**: 示要创建的视图名称。 - **`select_statement`**: 是一条标准的 SQL 查询语句,用于定义视图的内容[^4]。 ##### 示例 假设有一个名为 `employees` 的,包含字段 `id`, `name`, `salary`。如果想创建一个只显示员工姓名薪水的视图,则可以这样写: ```sql CREATE VIEW employee_salary_view AS SELECT name, salary FROM employees; ``` 此命令将创建一个名为 `employee_salary_view` 的视图[^1]。 #### 二、查询视图 一旦视图被创建,就可以像对待普通一样对其进行查询操作。例如,继续上面的例子,我们可以这样查询该视图: ```sql SELECT * FROM employee_salary_view WHERE salary > 5000; ``` 这将返回所有工资超过 5000 的员工的名字及其对应的薪资情况[^2]。 #### 三、管理视图 除了创建查询之外,还需要掌握如何更新或者删除已有的视图。 ##### 修改视图 可以直接使用带有 OR REPLACE 子句的新 CREATE VIEW 命令重新定义现有视图而不必先将其删除再重建新版本: ```sql CREATE OR REPLACE VIEW employee_salary_view AS SELECT id, name, salary FROM employees WHERE department='Sales'; ``` 这里我们不仅增加了部门筛选条件还加入了 ID 字段作为额外信息展示的一部分[^3]。 ##### 删除视图 当不再需要某个特定视图时,应该考虑移除它以保持数据库整洁有序。执行如下指令即可完成这一过程: ```sql DROP VIEW IF EXISTS employee_salary_view; ``` 这条语句会安全地尝试销毁指定名字下的任何现存实例——即如果没有找到同名对象则不会报错而是静默忽略掉请求[^3]。 --- ### 注意事项 需要注意的是,在构建新的虚拟格之前应当清楚了解哪些类型的 SELECT 结构支持转换成持久化形式供后续调用者反复利用。比如不能含有某些特殊关键字如 DISTINCT , GROUP BY 等等因为它们可能破坏了原本打算呈现出来的直观映射关系[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JSON_L

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值