MySQL 创建视图语句
什么是视图?
视图(View)是一种虚拟表,其内容由查询定义。和物理表一样,视图包含行和列,但是视图并不存储实际的数据,而是根据定义的查询实时生成数据。使用视图可以简化复杂的查询,隐藏复杂的业务逻辑,并提高查询的性能。
创建视图的语法
在 MySQL 中,创建视图需要使用 CREATE VIEW
语句。下面是创建视图的基本语法:
CREATE VIEW view_name AS
SELECT column1, column2, ...
FROM table_name
WHERE condition;
其中,view_name
是视图的名称,可以根据自己的需求进行命名。column1, column2, ...
是视图中包含的列,可以是原始表的列或者经过计算、聚合等操作后的列。table_name
是原始数据的表名,可以是一个或多个表的联合查询结果。condition
是查询的条件,用于筛选需要显示的数据行。
创建简单视图
我们先来创建一个简单的视图,假设有一个名为 student
的学生表,包含 id, name, gender, age
等字段。我们想要创建一个视图,只显示女性学生的信息。
CREATE VIEW female_students AS
SELECT id, name, age
FROM student
WHERE gender = 'female';
上面的语句中,视图名称为 female_students
,列包括学生的 id, name, age
,原始表为 student
,只选择 gender
为 ‘female’ 的行。
查询视图
创建完视图后,我们可以像查询普通表一样使用 SELECT 语句来查询视图的内容。例如,下面的语句将列出 female_students
视图中的所有数据:
SELECT * FROM female_students;
查询结果如下:
+----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | Amy | 18 |
| 3 | Lily | 21 |
| 5 | Emma | 19 |
+----+------+-----+
这样,我们就可以方便地查询出符合特定条件的数据,而无需每次都编写相同的过滤条件。
更新视图
视图是基于原始表的数据生成的,因此无法直接对视图进行插入、更新和删除操作。但是,如果原始表被修改了,视图中的数据也会相应地改变。
让我们以之前的例子为基础,创建一个新的视图 female_students_20
,只显示年龄小于 20 岁的女性学生。
CREATE VIEW female_students_20 AS
SELECT id, name, age
FROM student
WHERE gender = 'female' AND age < 20;
这里我们增加了一个额外的筛选条件 age < 20
。现在,如果我们对 student
表进行了更新,例如插入一条年龄为 19 岁的女性学生记录:
INSERT INTO student (name, gender, age) VALUES ('Lucy', 'female', 19);
那么,我们查询 female_students_20
视图的结果将会自动更新,添加了新插入的数据。
更新视图的限制
由于视图是基于查询结果的,所以在更新视图时有一些限制:
- 不能更新包含以下操作的视图:
- DISTINCT 关键字;
- GROUP BY 或 HAVING 子句;
- 聚合函数(如 SUM, COUNT);
- UNION 或 UNION ALL 操作;
- 子查询(除非嵌套在 FROM 子句中)。
- 视图的定义必须符合以下要求:
- SELECT 子句中的列名必须与视图所引用的表中的列名相同;
- 视图可以引用其他视图,但是视图的定义需要保证所有引用的视图存在并且可以访问;
- 视图的定义不能更改,如果需要更改,需要删除视图并重新创建。
示例:创建包含计算字段的视图
除了简单的筛选,视图还可以用于对数据进行计算、聚合等操作,以生成更复杂的结果。让我们通过一个示例来演示。
假设有一个名为 order
的订单表,包含 order_id, customer_id, product_name, quantity, price
等字段。为了方便统计,我们想要创建一个视图,显示每个订单的总金额。首先,我们可以创建一个视图 order_summary
:
CREATE VIEW order_summary AS
SELECT order_id, customer_id, product_name, quantity, price, quantity * price AS total_price
FROM `order`;
在这个视图中,我们计算了每个订单的总金额,并将计算结果命名为 total_price
。
现在,我们可以使用 SELECT 语句查询这个视图,来获取每个订单的总金额:
SELECT * FROM order_summary;
查询结果如下:
+----------+-------------+--------------+----------+-------+-------------+
| order_id | customer_id | product_name | quantity | price | total_price |
+----------+-------------+--------------+----------+-------+-------------+
| 1 | 1 | A | 2 | 10 | 20 |
| 2 | 2 | B | 1 | 15 | 15 |
| 3 | 1 | C | 3 | 5 | 15 |
+----------+-------------+--------------+----------+-------+-------------+
通过创建视图,我们可以方便地计算出每个订单的总金额,而无需每次都编写乘法操作。
总结
视图是 MySQL 中强大的特性之一,它可以简化复杂的查询操作,隐藏复杂的业务逻辑,并提高查询的性能。通过创建视图,我们可以将复杂的查询封装起来,以方便日常的数据操作。
在本文中,我们详细介绍了如何创建视图、查询视图、更新视图以及更新视图的限制。我们还通过一个示例演示了如何创建包含计算字段的视图。