📜  SQL |观看次数

📅  最后修改于: 2021-05-20 08:28:17             🧑  作者: Mango

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

在本文中,我们将学习有关创建,删除和更新视图的信息。
样本表

学生详细资料

截图(57)

学生分数

截图(58)

创建视图

我们可以使用CREATE VIEW语句创建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允许我们删除现有的View。我们可以使用DROP语句删除或删除View。

语法

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和年龄字段添加到该视图从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语句在视图中插入一行。语法
    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 
    

    范例
    在本示例中,我们将从上面的插入行示例中添加的ViewDetailView视图中删除最后一行。

    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。
例如,尽管该视图是可更新的,但是下面对该视图的查询也是无效的:

INSERT INTO SampleView(S_ID)
VALUES(6);

注意:NAME列的默认值为null

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

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