MySQL 视图与虚拟表

MySQLBeginner
立即练习

介绍

在本实验中,你将学习如何使用 MySQL 视图。视图是一个基于 SQL 语句结果集的虚拟表。视图有助于简化复杂查询、隐藏数据复杂性以及为数据访问提供抽象层。你将学习如何创建、更新、查询和删除 MySQL 视图。

你将首先连接到 MySQL 服务器,创建一个名为 company 的数据库,并用一个 employees 表填充它。然后,你将创建一个名为 sales_employees 的视图,该视图会过滤 employees 表,只显示来自“Sales”部门的员工。你将学习如何验证视图的结构并像查询普通表一样查询它。

这是一个实验(Guided Lab),提供逐步指导来帮助你学习和实践。请仔细按照说明完成每个步骤,获得实际操作经验。根据历史数据,这是一个 初级 级别的实验,完成率为 94%。获得了学习者 100% 的好评率。

连接 MySQL 并创建数据库/表

在此步骤中,你将连接到 MySQL 服务器并为实验设置必要的数据库和表。这包括创建一个名为 company 的数据库,并在其中创建一个 employees 表,并填充一些示例数据。

首先,在 LabEx VM 中打开一个终端。你应该已经在 ~/project 目录中。

以 root 用户连接到 MySQL 服务器。由于你拥有 sudo 权限,并且 MySQL 中的 root 用户配置为使用 auth_socket 插件,因此你可以使用 sudo 无密码连接。

sudo mysql -u root

你现在已进入 MySQL shell。提示符将变为 mysql>

在 MySQL shell 中,创建一个名为 company 的数据库:

CREATE DATABASE company;

切换到 company 数据库,以便后续命令在此数据库中执行:

USE company;

现在,创建一个名为 employees 的表来存储员工信息:

CREATE TABLE employees (
    id INT PRIMARY KEY,
    first_name VARCHAR(50),
    last_name VARCHAR(50),
    salary DECIMAL(10, 2),
    department VARCHAR(50)
);

employees 表插入一些示例数据:

INSERT INTO employees (id, first_name, last_name, salary, department) VALUES
(1, 'John', 'Doe', 60000.00, 'Sales'),
(2, 'Jane', 'Smith', 75000.00, 'Marketing'),
(3, 'Robert', 'Jones', 50000.00, 'Sales'),
(4, 'Emily', 'Brown', 80000.00, 'Engineering'),
(5, 'Michael', 'Davis', 65000.00, 'Marketing');

你可以通过选择所有行来验证 employees 表中的数据:

SELECT * FROM employees;

输出应显示已插入的员工数据:

+----+------------+-----------+----------+-------------+
| id | first_name | last_name | last_name | department  |
+----+------------+-----------+----------+-------------+
|  1 | John       | Doe       | 60000.00 | Sales       |
|  2 | Jane       | Smith     | 75000.00 | Marketing   |
|  3 | Robert     | Jones     | 50000.00 | Sales       |
|  4 | Emily      | Brown     | 80000.00 | Engineering |
|  5 | Michael    | Davis     | 65000.00 | Marketing   |
+----+------------+-----------+----------+-------------+
5 rows in set (0.00 sec)

你已成功连接到 MySQL,创建了一个数据库,并用数据填充了一个表。

创建视图

在此步骤中,你将基于 employees 表创建一个视图。视图是一个存储的 SQL 查询,它像一个虚拟表一样工作。它本身不存储数据,而是呈现一个或多个底层表中的数据。

你应该仍然在 MySQL shell 中,并连接到 company 数据库。如果不是,请使用 sudo mysql -u root 重新连接,然后执行 USE company;

我们将创建一个名为 sales_employees 的视图,该视图将只显示在“Sales”部门工作的员工。此视图将从 employees 表中选择特定列。

CREATE VIEW sales_employees AS
SELECT id, first_name, last_name, salary
FROM employees
WHERE department = 'Sales';

此语句定义了一个名为 sales_employees 的视图。视图的定义是 AS 关键字后面的 SELECT 查询。此查询从 employees 表中选择 idfirst_namelast_namesalary 列,但仅限于 department 列等于 'Sales' 的行。

要确认视图已创建,你可以列出当前数据库中的表和视图:

SHOW TABLES;

你应该会看到 employeessales_employees 都被列出。

+-------------------+
| Tables_in_company |
+-------------------+
| employees         |
| sales_employees   |
+-------------------+
2 rows in set (0.00 sec)

你也可以像描述表一样描述视图的结构:

DESCRIBE sales_employees;

这将显示视图中包含的列:

+------------+---------------+------+-----+---------+-------+
| Field      | Type          | Null | Key | Default | Extra |
+------------+---------------+------+-----+---------+-------+
| id         | int           | NO   |     | NULL    |       |
| first_name | varchar(50)   | YES  |     | NULL    |       |
| last_name  | varchar(50)   | YES  |     | NULL    |       |
| salary     | decimal(10,2) | YES  |     | NULL    |       |
+------------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

你已成功创建了一个名为 sales_employees 的视图。

使用视图查询数据

在此步骤中,你将学习如何使用你创建的 sales_employees 视图来查询数据。视图可以像普通表一样进行查询,从而提供一种简化的方式来访问数据的特定子集。

你应该仍然在 MySQL shell 中,并连接到 company 数据库。如果不是,请使用 sudo mysql -u root 重新连接,然后执行 USE company;

要从 sales_employees 视图中检索所有数据,请使用标准的 SELECT 语句:

SELECT * FROM sales_employees;

此查询执行视图中定义的底层 SELECT 语句并返回结果。你应该只看到来自“Sales”部门的员工:

+------+------------+-----------+----------+
| id   | first_name | last_name | salary   |
+------+------------+-----------+----------+
|    1 | John       | Doe       | 60000.00 |
|    3 | Robert     | Jones     | 50000.00 |
+------+------------+-----------+----------+
2 rows in set (0.00 sec)

你还可以对从视图检索的数据应用额外的过滤或排序。例如,要查找薪资大于 55000 的销售员工:

SELECT * FROM sales_employees WHERE salary > 55000;

这将仅返回视图中薪资大于 55000 的行:

+------+------------+-----------+----------+
| id   | first_name | last_name | salary   |
+------+------------+-----------+----------+
|    1 | John       | Doe       | 60000.00 |
+------+------------+-----------+----------+
1 row in set (0.00 sec)

你也可以从视图中选择特定列:

SELECT first_name, last_name FROM sales_employees;

这将仅显示销售员工的名字和姓氏:

+------------+-----------+
| first_name | last_name |
+------------+-----------+
| John       | Doe       |
| Robert     | Jones     |
+------------+-----------+
2 rows in set (0.00 sec)

查询视图本质上与查询表相同,但视图提供了来自底层数据源的预定义过滤器和列选择。

使用 ALTER VIEW 更新视图定义

在此步骤中,你将学习如何使用 ALTER VIEW 语句修改现有视图的定义。当你需要更改视图中包含的列或过滤条件时,这将非常有用。

你应该仍然在 MySQL shell 中,并连接到 company 数据库。如果不是,请使用 sudo mysql -u root 重新连接,然后执行 USE company;

当前,sales_employees 视图包含 idfirst_namelast_namesalary。让我们修改视图以也包含 department 列。

ALTER VIEW sales_employees AS
SELECT id, first_name, last_name, salary, department
FROM employees
WHERE department = 'Sales';

此语句使用 ALTER VIEW,后跟视图名称和定义视图的新 SELECT 查询。新查询现在包含 department 列。

要验证视图是否已更新,请再次描述它:

DESCRIBE sales_employees;

你应该现在在输出中看到 department 列:

+------------+---------------+------+-----+---------+-------+
| Field      | Type          | Null | Key | Default | Extra |
+------------+---------------+------+-----+---------+-------+
| id         | int           | NO   |     | NULL    |       |
| first_name | varchar(50)   | YES  |     | NULL    |       |
| last_name  | varchar(50)   | YES  |     | NULL    |       |
| salary     | decimal(10,2) | YES  |     | NULL    |       |
| department | varchar(50)   | YES  |     | NULL    |       |
+------------+---------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

查询更新后的视图以查看新列:

SELECT * FROM sales_employees;

输出现在将包括 department 列:

+------+------------+-----------+----------+------------+
| id   | first_name | last_name | salary   | department |
+------+------------+-----------+----------+------------+
|    1 | John       | Doe       | 60000.00 | Sales      |
|    3 | Robert     | Jones     | 50000.00 | Sales      |
+------+------------+-----------+----------+------------+
2 rows in set (0.00 sec)

你已成功更新了 sales_employees 视图的定义。

删除视图并清理

在最后一步中,你将学习如何删除(移除)视图,并清理在此实验中创建的数据库和表。

你应该仍然在 MySQL shell 中,并连接到 company 数据库。如果不是,请使用 sudo mysql -u root 重新连接,然后执行 USE company;

要移除 sales_employees 视图,请使用 DROP VIEW 语句:

DROP VIEW sales_employees;

此命令将永久地从 company 数据库中移除 sales_employees 视图。

要确认视图已被删除,你可以尝试描述它:

DESCRIBE sales_employees;

这应该会产生一个错误消息,表明视图不存在:

ERROR 1146 (42S02): Table 'company.sales_employees' doesn't exist

现在,让我们清理 employees 表和 company 数据库。

删除 employees 表:

DROP TABLE employees;

删除 company 数据库:

DROP DATABASE company;

你可以通过输入以下命令退出 MySQL shell:

exit

你已成功删除了视图、表和数据库,清理了在此实验中使用的资源。

总结

在此实验中,你学习了如何使用 MySQL 视图。你首先连接到 MySQL 服务器并设置了数据库和表。然后,你创建了一个名为 sales_employees 的视图,以提供 employees 表的过滤视图。

你通过 SELECT 语句练习了查询视图,展示了视图如何简化数据访问。你还学习了如何使用 ALTER VIEW 语句修改现有视图的定义以包含其他列。最后,你学习了如何使用 DROP VIEW 语句移除视图,并清理了数据库和表。

你现在已掌握了使用 MySQL 视图的基本概念和操作,视图是管理和访问数据库中数据的宝贵工具。