SQL - 使用视图

  • 简述

    视图只不过是存储在具有关联名称的数据库中的 SQL 语句。视图实际上是预定义 SQL 查询形式的表的组合。
    视图可以包含表的所有行或从表中选择行。可以从一个或多个表创建视图,这取决于编写的 SQL 查询来创建视图。
    视图是一种虚拟表,允许用户执行以下操作 -
    • 以用户或用户类别认为自然或直观的方式构造数据。
    • 以用户可以看到和(有时)准确修改他们需要的内容的方式限制对数据的访问。
    • 汇总各种表格中的数据,这些表格可用于生成报告。
  • 创建视图

    数据库视图是使用CREATE VIEW陈述。可以从单个表、多个表或另一个视图创建视图。
    要创建视图,用户必须根据具体实现具有适当的系统权限。
    基础的CREATE VIEW语法如下 -
    
    CREATE VIEW view_name AS
    SELECT column1, column2.....
    FROM table_name
    WHERE [condition];
    
    您可以在 SELECT 语句中包含多个表,其方式与在普通 SQL SELECT 查询中使用它们的方式相似。

    例子

    考虑具有以下记录的 CUSTOMERS 表 -
    
    +----+----------+-----+-----------+----------+
    | ID | NAME     | AGE | ADDRESS   | SALARY   |
    +----+----------+-----+-----------+----------+
    |  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
    |  2 | Khilan   |  25 | Delhi     |  1500.00 |
    |  3 | kaushik  |  23 | Kota      |  2000.00 |
    |  4 | Chaitali |  25 | Mumbai    |  6500.00 |
    |  5 | Hardik   |  27 | Bhopal    |  8500.00 |
    |  6 | Komal    |  22 | MP        |  4500.00 |
    |  7 | Muffy    |  24 | Indore    | 10000.00 |
    +----+----------+-----+-----------+----------+
    
    以下是从 CUSTOMERS 表创建视图的示例。此视图将用于获取 CUSTOMERS 表中的客户姓名和年龄。
    
    SQL > CREATE VIEW CUSTOMERS_VIEW AS
    SELECT name, age
    FROM  CUSTOMERS;
    
    现在,您可以以与查询实际表类似的方式查询 CUSTOMERS_VIEW。以下是相同的示例。
    
    SQL > SELECT * FROM CUSTOMERS_VIEW;
    
    这将产生以下结果。
    
    +----------+-----+
    | name     | age |
    +----------+-----+
    | Ramesh   |  32 |
    | Khilan   |  25 |
    | kaushik  |  23 |
    | Chaitali |  25 |
    | Hardik   |  27 |
    | Komal    |  22 |
    | Muffy    |  24 |
    +----------+-----+
    
  • WITH CHECK 选项

    WITH CHECK OPTION 是 CREATE VIEW 语句选项。WITH CHECK OPTION 的目的是确保所有 UPDATE 和 INSERT 都满足视图定义中的条件。
    如果它们不满足条件,则 UPDATE 或 INSERT 返回错误。
    以下代码块具有使用 WITH CHECK OPTION 创建相同视图 CUSTOMERS_VIEW 的示例。
    
    CREATE VIEW CUSTOMERS_VIEW AS
    SELECT name, age
    FROM  CUSTOMERS
    WHERE age IS NOT NULL
    WITH CHECK OPTION;
    
    这种情况下的 WITH CHECK OPTION 应该拒绝在视图的 AGE 列中输入任何 NULL 值,因为视图是由 AGE 列中没有 NULL 值的数据定义的。

    更新视图

    可以在以下给出的某些条件下更新视图 -
    • SELECT 子句可能不包含关键字 DISTINCT。
    • SELECT 子句可能不包含汇总函数。
    • SELECT 子句可能不包含集合函数。
    • SELECT 子句可能不包含集合运算符。
    • SELECT 子句可能不包含 ORDER BY 子句。
    • FROM 子句不能包含多个表。
    • WHERE 子句不能包含子查询。
    • 查询可能不包含 GROUP BY 或 HAVING。
    • 计算的列可能不会更新。
    • 基表中的所有 NOT NULL 列都必须包含在视图中,INSERT 查询才能正常工作。
    因此,如果视图满足上述所有规则,那么您可以更新该视图。以下代码块有一个更新 Ramesh 年龄的示例。
    
    SQL > UPDATE CUSTOMERS_VIEW
       SET AGE = 35
       WHERE name = 'Ramesh';
    
    这最终会更新基表 CUSTOMERS,同样会反映在视图本身中。现在,尝试查询基表,SELECT 语句将产生以下结果。
    
    +----+----------+-----+-----------+----------+
    | ID | NAME     | AGE | ADDRESS   | SALARY   |
    +----+----------+-----+-----------+----------+
    |  1 | Ramesh   |  35 | Ahmedabad |  2000.00 |
    |  2 | Khilan   |  25 | Delhi     |  1500.00 |
    |  3 | kaushik  |  23 | Kota      |  2000.00 |
    |  4 | Chaitali |  25 | Mumbai    |  6500.00 |
    |  5 | Hardik   |  27 | Bhopal    |  8500.00 |
    |  6 | Komal    |  22 | MP        |  4500.00 |
    |  7 | Muffy    |  24 | Indore    | 10000.00 |
    +----+----------+-----+-----------+----------+
    

    在视图中插入行

    数据行可以插入到视图中。适用于 UPDATE 命令的相同规则也适用于 INSERT 命令。
    在这里,我们不能在 CUSTOMERS_VIEW 中插入行,因为我们没有在此视图中包含所有 NOT NULL 列,否则您可以在视图中插入行,就像在表中插入它们一样。

    将行删除到视图中

    可以从视图中删除数据行。适用于 UPDATE 和 INSERT 命令的相同规则适用于 DELETE 命令。
    以下是删除 AGE = 22 的记录的示例。
    
    SQL > DELETE FROM CUSTOMERS_VIEW
       WHERE age = 22;
    
    这最终会从基表 CUSTOMERS 中删除一行,同样会反映在视图本身中。现在,尝试查询基表,SELECT 语句将产生以下结果。
    
    +----+----------+-----+-----------+----------+
    | ID | NAME     | AGE | ADDRESS   | SALARY   |
    +----+----------+-----+-----------+----------+
    |  1 | Ramesh   |  35 | Ahmedabad |  2000.00 |
    |  2 | Khilan   |  25 | Delhi     |  1500.00 |
    |  3 | kaushik  |  23 | Kota      |  2000.00 |
    |  4 | Chaitali |  25 | Mumbai    |  6500.00 |
    |  5 | Hardik   |  27 | Bhopal    |  8500.00 |
    |  7 | Muffy    |  24 | Indore    | 10000.00 |
    +----+----------+-----+-----------+----------+
    

    删除视图

    显然,在您有视图的地方,如果不再需要视图,您需要一种方法来删除它。语法非常简单,如下所示 -
    
    DROP VIEW view_name;
    
    以下是从 CUSTOMERS 表中删除 CUSTOMERS_VIEW 的示例。
    
    DROP VIEW CUSTOMERS_VIEW;