📜  SQL |观看次数

📅  最后修改于: 2021-09-10 01:54:18             🧑  作者: Mango

SQL 中的视图是一种虚拟表。视图也有行和列,因为它们在数据库中的真实表中。我们可以通过从数据库中存在的一个或多个表中选择字段来创建视图。视图可以包含表的所有行或基于特定条件的特定行。

在本文中,我们将学习创建、删除和更新视图。
示例表

学生详情

截图 (57)

学生成绩

截图 (58)

创建视图

我们可以使用CREATE VIEW语句创建视图。可以从单个表或多个表创建视图。

语法

CREATE VIEW view_name AS
SELECT column1, column2.....
FROM table_name
WHERE condition;

view_name: Name for the View
table_name: Name of the table
condition: Condition to select rows

例子

  • 从单个表创建视图:
    • 在这个例子中,我们将从表 StudentDetails 创建一个名为 DetailsView 的视图。
      询问:
      CREATE VIEW DetailsView AS
      SELECT NAME, ADDRESS
      FROM StudentDetails
      WHERE S_ID < 5;
      

      要查看视图中的数据,我们可以像查询表一样查询视图。

      SELECT * FROM DetailsView;
      

      输出:
      截图 (57)

    • 在这个例子中,我们将从StudentDetails 表中创建一个名为StudentNames 的视图。
      询问:

      CREATE VIEW StudentNames AS
      SELECT S_ID, NAME
      FROM StudentDetails
      ORDER BY NAME;
      

      如果我们现在将视图查询为

      SELECT * FROM StudentNames;
      

      输出:
      截图 (64)

  • 从多个表创建视图:在本例中,我们将从两个表 StudentDetails 和 StudentMarks 创建一个名为 MarksView 的视图。要从多个表创建视图,我们可以简单地在 SELECT 语句中包含多个表。询问:
    CREATE VIEW MarksView AS
    SELECT StudentDetails.NAME, StudentDetails.ADDRESS, StudentMarks.MARKS
    FROM StudentDetails, StudentMarks
    WHERE StudentDetails.NAME = StudentMarks.NAME;
    

    显示 View MarksView 的数据:

    SELECT * FROM MarksView;
    

    输出:
    截图 (59)

删除视图

我们已经学习了创建视图,但是如果不再需要创建的视图怎么办?显然我们会想要删除它。 SQL 允许我们删除现有的视图。我们可以使用 DROP 语句删除或删除视图。

语法

DROP VIEW view_name;

view_name: Name of the View which we want to delete.

例如,如果我们想删除 View MarksView ,我们可以这样做:

DROP VIEW MarksView;

更新视图

更新视图需要满足某些条件。如果不满足这些条件中的任何一个,那么我们将不会被允许更新视图。

  1. 用于创建视图的 SELECT 语句不应包含 GROUP BY 子句或 ORDER BY 子句。
  2. SELECT 语句不应包含 DISTINCT 关键字。
  3. 视图应具有所有 NOT NULL 值。
  4. 不应使用嵌套查询或复杂查询创建视图。
  5. 视图应该从单个表创建。如果视图是使用多个表创建的,那么我们将不被允许更新视图。
  • 我们可以使用CREATE OR REPLACE VIEW语句在视图中添加或删除字段。
    语法
    CREATE OR REPLACE VIEW view_name AS
    SELECT column1,coulmn2,..
    FROM table_name
    WHERE condition;
    

    例如,如果我们想更新视图MarksView并将字段 AGE 添加到来自StudentMarks表的视图中,我们可以这样做:

    CREATE OR REPLACE VIEW MarksView AS
    SELECT StudentDetails.NAME, StudentDetails.ADDRESS, StudentMarks.MARKS, StudentMarks.AGE
    FROM StudentDetails, StudentMarks
    WHERE StudentDetails.NAME = StudentMarks.NAME;
    

    如果我们现在从 MarksView 获取所有数据:

    SELECT * FROM MarksView;
    

    输出:
    截图 (60)

  • 在视图中插入一行
    我们可以像在表中那样在视图中插入一行。我们可以使用 SQL 的 INSERT INTO 语句在 View 中插入一行。语法
    INSERT INTO view_name(column1, column2 , column3,..) 
    VALUES(value1, value2, value3..);
    
    view_name: Name of the View
    

    示例
    在下面的示例中,我们将在上面“从单个表创建视图”示例中创建的 View DetailsView 中插入一个新行。

    INSERT INTO DetailsView(NAME, ADDRESS)
    VALUES("Suresh","Gurgaon");
    

    如果我们现在从 DetailsView 获取所有数据,

    SELECT * FROM DetailsView;
    

    输出:
    截图 (62)

  • 从视图中删除一行
    从视图中删除行也与从表中删除行一样简单。我们可以使用 SQL 的 DELETE 语句从视图中删除行。同样从视图中删除一行首先从实际表中删除该行,然后更改反映在视图中。语法
    DELETE FROM view_name
    WHERE condition;
    
    view_name:Name of view from where we want to delete rows
    condition: Condition to select rows 
    

    示例
    在这个例子中,我们将从我们刚刚在上面插入行的例子中添加的视图 DetailsView 中删除最后一行。

    DELETE FROM DetailsView
    WHERE NAME="Suresh";
    

    如果我们现在从 DetailsView 获取所有数据,

    SELECT * FROM DetailsView;
    

    输出:
    截图 (57)

带检查选项

SQL 中的 WITH CHECK OPTION 子句是非常有用的视图子句。它适用于可更新的视图。如果视图不可更新,则在 CREATE VIEW 语句中包含此子句没有任何意义。

  • WITH CHECK OPTION 子句用于防止在视图中插入不满足 CREATE VIEW 语句中 WHERE 子句中的条件的行。
  • 如果我们在 CREATE VIEW 语句中使用了 WITH CHECK OPTION 子句,并且如果 UPDATE 或 INSERT 子句不满足条件,那么它们将返回错误。

示例
在下面的示例中,我们使用 WITH CHECK OPTION 子句从 StudentDetails 表创建一个 View SampleView。

CREATE VIEW SampleView AS
SELECT S_ID, NAME
FROM  StudentDetails
WHERE NAME IS NOT NULL
WITH CHECK OPTION;

在这个视图中,如果我们现在尝试在 NAME 列中插入一个具有空值的新行,那么它将给出一个错误,因为该视图是在 NAME 列的条件为 NOT NULL 的情况下创建的。
例如,虽然 View 是可更新的,但此 View 的以下查询也无效:

INSERT INTO SampleView(S_ID)
VALUES(6);

注意:NAME 列的默认值为null

视图的用途:
由于给定的原因,一个好的数据库应该包含视图:

  1. 限制数据访问——
    视图通过限制对表的预定行和列集的访问来提供额外的表安全级别。
  2. 隐藏数据复杂性——
    视图可以隐藏多表连接中存在的复杂性。
  3. 为用户简化命令——
    视图允许用户从多个表中选择信息,而无需用户实际知道如何执行连接。
  4. 存储复杂的查询 –
    视图可用于存储复杂的查询。
  5. 重命名列 –
    视图还可用于重命名列而不影响基表,前提是视图中的列数必须与 select 语句中指定的列数匹配。因此,重命名有助于隐藏基表的列名。
  6. 多视图设施 –
    可以在同一个表上为不同的用户创建不同的视图。