视图

在 SQL 中,视图(View)是基于 SQL 语句的结果集的虚拟表。 它包含与真实的表一样的行和列。 每次查询视图时,都会运行该视图的查询。

在以下情况下,我们可以使用视图:

  • 简化复杂查询,避免每次查询都重复编写和发送复杂语句。
  • 对特定用户开放读取权限,限制一些列和行的读取,保证数据安全和隔离。

可以使用 CREATE VIEW 语句创建视图。

视图示例

  1. CREATE VIEW cpu_monitor AS
  2. SELECT cpu, host, ts FROM monitor;

这个视图的名称是 cpu_monitor,在 AS 之后的查询语句是用于呈现数据的 SQL 语句。查询视图:

  1. SELECT * FROM cpu_monitor;

结果示例:

  1. +------+-----------+---------------------+
  2. | cpu | host | ts |
  3. +------+-----------+---------------------+
  4. | 0.5 | 127.0.0.1 | 2023-12-13 02:05:41 |
  5. | 0.3 | 127.0.0.1 | 2023-12-13 02:05:46 |
  6. | 0.4 | 127.0.0.1 | 2023-12-13 02:05:51 |
  7. | 0.3 | 127.0.0.2 | 2023-12-13 02:05:41 |
  8. | 0.2 | 127.0.0.2 | 2023-12-13 02:05:46 |
  9. | 0.2 | 127.0.0.2 | 2023-12-13 02:05:51 |
  10. +------+-----------+---------------------+

通过 WHERE 查询视图:

  1. SELECT * FROM cpu_monitor WHERE host = '127.0.0.2';

结果示例:

  1. +------+-----------+---------------------+
  2. | cpu | host | ts |
  3. +------+-----------+---------------------+
  4. | 0.3 | 127.0.0.2 | 2023-12-13 02:05:41 |
  5. | 0.2 | 127.0.0.2 | 2023-12-13 02:05:46 |
  6. | 0.2 | 127.0.0.2 | 2023-12-13 02:05:51 |
  7. +------+-----------+---------------------+

创建一个从两个表联合查询数据的视图:

  1. CREATE VIEW app_cpu_monitor AS
  2. SELECT cpu, latency, host, ts FROM monitor LEFT JOIN app_monitor
  3. ON monitor.host = app_monitor.host AND monitor.ts = app_monitor.ts

然后可以像查询一个单表数据一样查询这个视图:

  1. SELECT * FROM app_cpu_monitor WHERE host = 'host1'

更新视图

使用 CREATE OR REPLACE VIEW 来更新视图,如果视图不存在,则会创建:

  1. CREATE OR REPLACE VIEW memory_monitor AS
  2. SELECT memory, host, ts FROM monitor;

显示视图定义

通过 SHOW CREATE VIEW view_name 语句来显示创建视图的 CREATE VIEW 语句:

  1. SHOW CREATE VIEW cpu_monitor;
  1. +-------------+--------------------------------------------------------------+
  2. | View | Create View |
  3. +-------------+--------------------------------------------------------------+
  4. | cpu_monitor | CREATE VIEW cpu_monitor AS SELECT cpu, host, ts FROM monitor |
  5. +-------------+--------------------------------------------------------------+

列出视图

使用 SHOW VIEWS 语句查找所有视图:

  1. > SHOW VIEWS;
  2. +----------------+
  3. | Views |
  4. +----------------+
  5. | cpu_monitor |
  6. | memory_monitor |
  7. +----------------+

当然,像 SHOW TABLES 一样,它也支持 LIKEWHERE

  1. > SHOW VIEWS like 'cpu%';
  2. +-------------+
  3. | Views |
  4. +-------------+
  5. | cpu_monitor |
  6. +-------------+
  7. 1 row in set (0.02 sec)
  8. > SHOW VIEWS WHERE Views = 'memory_monitor';
  9. +----------------+
  10. | Views |
  11. +----------------+
  12. | memory_monitor |
  13. +----------------+

删除视图

使用 DROP VIEW 语句删除视图:

  1. DROP VIEW cpu_monitor;

如果希望在视图不存在时不报错,可以使用:

  1. DROP VIEW IF EXISTS test;