SQL DROP VIEW 语句
- SQL DROP VIEW 语句
- SQL 中删除单个视图
- SQL 中删除多个视图
- 使用 IF EXISTS 子句删除视图
- 从视图中删除记录(不删除视图本身)
- 视图依赖关系和权限
SQL DROP VIEW 语句
SQL 中的 DROP VIEW 语句用于从数据库中永久删除一个视图。一旦删除,视图及其所有关联权限将被移除,除非重新创建,否则无法再查询或引用该视图。
此命令仅从数据库中删除视图定义,不会影响其基于的原始表。这是一个不可逆操作,因此应谨慎使用。大多数 SQL 数据库支持一次删除多个视图,并且为了避免视图不存在时的错误,我们可以使用 IF EXISTS 子句。
SQL 中删除单个视图
要从数据库中移除特定视图,可以使用 DROP VIEW 语句后跟视图名称。这在视图不再需要或需要从头重新定义时非常有用。
语法
以下是在 SQL 中删除单个视图的基本语法:
DROP VIEW view_name;
示例
假设我们使用以下查询通过 CREATE TABLE 语句创建了一个名为 CUSTOMERS 的表:
CREATE TABLE CUSTOMERS ( ID INT NOT NULL, NAME VARCHAR (20) NOT NULL, AGE INT NOT NULL, ADDRESS CHAR (25), SALARY DECIMAL (18, 2), PRIMARY KEY (ID) );
现在,让我们使用 INSERT 语句向该表插入一些记录,如下所示:
INSERT INTO CUSTOMERS VALUES (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, 'Hyderabad', 4500.00 ), (7, 'Muffy', 24, 'Indore', 10000.00 );
然后,我们使用 CREATE VIEW 语句基于此表创建三个视图:
CREATE VIEW CUSTOMERS_VIEW1 AS SELECT * FROM CUSTOMERS; CREATE VIEW CUSTOMERS_VIEW2 AS SELECT * FROM CUSTOMERS; CREATE VIEW CUSTOMERS_VIEW3 AS SELECT * FROM CUSTOMERS;
创建每个视图后的输出将是:
Query OK, 0 rows affected (0.01 sec)
现在,让我们使用 DROP VIEW 语句删除其中一个视图:
DROP VIEW CUSTOMERS_VIEW2;
得到以下输出:
Query OK, 0 rows affected (0.01 sec)
验证
我们可以使用以下 SELECT 查询验证视图是否已被删除:
SELECT * FROM CUSTOMERS_VIEW2;
您将收到以下错误消息:
ERROR 1146 (42S02): Table 'testdb.customers_view2' doesn't exist
SQL 中删除多个视图
SQL 允许您使用单个 DROP VIEW 语句一次删除多个视图。这在需要同时清理数据库中的多个视图时非常有用。
语法
以下是在 SQL 中一次删除多个视图的语法:
DROP VIEW view_name1, view_name2, ...;
示例
在本示例中,我们使用 DROP VIEW 语句一次删除先前创建的多个视图。
DROP VIEW CUSTOMERS_VIEW1, CUSTOMERS_VIEW3;
我们得到如下所示的输出:
Query OK, 0 rows affected (0.02 sec)
验证
要确认视图已被删除,您可以使用以下 SELECT 语句查询它们:
SELECT * FROM CUSTOMERS_VIEW1; SELECT * FROM CUSTOMERS_VIEW3;
分别产生以下错误消息:
ERROR 1146 (42S02): Table 'testdb.customers_view1' doesn't exist ERROR 1146 (42S02): Table 'testdb.customers_view3' doesn't exist
使用 IF EXISTS 子句删除视图
在删除现有视图时,可以使用 IF EXISTS 子句与 DROP VIEW 语句一起使用。该子句会在尝试删除视图之前检查当前数据库中是否存在指定的视图。如果视图存在,则会删除它;如果不存在,则查询将被安全忽略,不会抛出错误。
语法
以下是使用带有 IF EXISTS 子句的 DROP VIEW 语句的语法:
DROP VIEW IF EXISTS view_name;
示例
以下示例仅在视图 CUSTOMERS_VIEW1 存在时安全删除它:
DROP VIEW IF EXISTS CUSTOMERS_VIEW3;
这会生成一个警告,因为我们尝试删除的视图已被移除,不再存在于数据库中:
Query OK, 0 rows affected, 1 warning (0.00 sec)
从视图中删除记录(不删除视图本身)
与其删除整个视图,您可以使用 DELETE 语句从视图中删除特定行。当视图是可更新的时,此操作还会从存储数据的实际表中删除相应的记录。
语法
以下是基于条件从视图中删除行的语法:
DELETE FROM view_name WHERE condition;
示例
在下面的示例中,我们从上面创建的 CUSTOMERS_VIEW3 视图中删除年龄为 22 的客户,该视图基于 CUSTOMERS 表的数据:
DELETE FROM CUSTOMERS_VIEW3 WHERE AGE = 22;
我们得到以下输出:
Query OK, 1 row affected (0.01 sec)
验证
为了验证记录已从视图中删除,请运行以下查询:
SELECT * FROM CUSTOMERS_VIEW3;
得到以下表格:
| 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 |
| 7 | Muffy | 24 | Indore | 10000.00 |
现在,为了验证记录也已从基础表中删除,请运行以下查询:
SELECT * FROM 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 |
| 7 | Muffy | 24 | Indore | 10000.00 |
仅允许在 可更新视图 上删除记录。使用 JOIN、GROUP BY 或 DISTINCT 等子句的视图通常不可更新,如果尝试从中删除记录,将导致错误。
视图依赖关系和权限
在 SQL 中使用视图时,了解它们如何依赖于底层表以及管理它们所需的权限非常重要:
- 如果删除了基础表,依赖于它的任何视图不会自动删除,您必须显式删除这些视图。
- 要删除或修改视图,您需要对 schema 具有 ALTER 或 CONTROL 权限,具体取决于您的数据库系统。