唐抉的个人博客

PgSQL数据库学习笔记(一)

字数统计: 4.2k阅读时长: 17 min
2022/10/14

写在前头

本笔记前两篇主要列出PgSQL的常用命令和数据类型。具体的实操命令从第三篇开始讲解。

Windows上安装PostgreSQL

使用EnterpriseDB来下载安装,根据安装指引安装即可。下载地址:Download PostgreSQL (enterprisedb.com)

PostgreSQL语法

默认情况下PostgreSQL安装完成后,自带了个命令行工具SQL Shell(psql)。

进入命令行工具,可以使用\help 命令来查看各个命令的语法。

若要查看具体命令的用法,可到PostgreSQL的API文档中查看。PostgreSQL 14.3 中文 (runebook.dev)

PostgreSQL语句

常用语句

在表和文件之间拷贝数据:copy

具体语句用法如下:

1
2
-- 使用竖线(|)作为域定界符把一个表复制到客户端
copy country to stdout (delimiter '|');

定义访问权限:grant

具体语句用法如下:

1
2
-- 把表films上的插入特权授予给所有用户
grant insert on films to public;

从一个查询的结果中定义一个新表:select into

具体语句用法如下:

1
2
-- 创建一个只由来自films的最近项构成的 新表films_recent
select * into films_recent from films where date_prod >= '2002-01-01';

清空一个或一组表:truncate

具体语句用法如下:

1
2
-- 清除 COMPANY 表
w3cschooldb=# truncate table company;

修改运行时参数:set

具体语句用法如下:

1
2
3
4
5
exec sql set descriptor indesc count = 1;
exec sql set descriptor indesc value 1 data = 2;
exec sql set descriptor indesc value 1 data = :val1;
exec sql set descriptor indesc value 2 indicator = :val1, data = 'some string';
exec sql set descriptor indesc value 2 indicator = :val2null, data = :val2;

把一个运行时参数值恢复为默认值:reset

具体语句用法如下:

1
2
-- 把timezone配置变量设置为默认值
reset timezone;

显示运行时的参数值:show

具体语句用法如下:

1
2
3
-- 显示参数DateStyle的当前设置
show datestyle;
datestyle

更新一个表中的行:update

具体语句用法如下:

1
2
-- 把表films的列kind 中的单词Drama改成Dramatic
update films set kind = 'dramatic' where kind = 'drama';

创建一个准备好的查询:prepare

具体语句用法如下:

1
2
-- 提交由事务标识符foobar标识的事务
commit prepared 'foobar';

执行一个准备好的查询:execute

具体语句用法如下:

1
execute query(100, 200);

显示一个语句的执行规则:explain

具体语句用法如下:

1
2
3
4
-- 有一个具有单个integer列和 10000 行的表,要显示在其上的一个简单查询的计划
explain select * from foo;

query plan

在表中创建新行:insert

具体语句用法如下:

1
2
3
-- 向films中插入一行
insert into films values
('ua502', 'bananas', 105, '1971-07-13', 'comedy', '82 minutes');

重建索引:reindex

具体语句用法如下:

1
2
3
4
-- 重建单个索引
reindex index my_index;
-- 重建表my_table上的所有索引
reindex table my_table;

收集与数据库有关的统计:analyze

具体语句用法如下:

1
analyze;

生成一个通知:notify

具体语句用法如下:

1
2
3
4
5
6
7
8
9
10
-- 从psql配置和执行一个监听/通知序列
listen virtual;
notify virtual;
asynchronous notification "virtual" received from server process with pid 8448.
notify virtual, 'this is the payload';
asynchronous notification "virtual" with payload "this is the payload" received from server process with pid 8448.

listen foo;
select pg_notify('fo' || 'o', 'pay' || 'load');
asynchronous notification "foo" with payload "payload" received from server process with pid 14728.

监听一个通知:listen

具体语句用法如下:

1
2
3
4
-- 从psql中配置并执行一个监听/通知序列
listen virtual;
notify virtual;
asynchronous notification "virtual" received from server process with pid 8448.

停止监听通知信息:unlisten

具体语句用法如下:

1
2
3
4
5
6
7
8
-- 做一次注册
listen virtual;
notify virtual;
asynchronous notification "virtual" received from server process with pid 8448.
-- 一旦执行了UNLISTEN,进一步的NOTIFY 消息将被忽略
unlisten virtual;
notify virtual;
-- no notify event is received

锁定一个表:lock

具体语句用法如下:

1
2
-- 将数据库中的 COMPANY 表锁定为 ACCESS EXCLUSIVE 模式
lock table company1 in access exclusive mode;

根据一个索引聚簇一个表:cluster

具体语句用法如下:

1
2
-- 基于索引employees_ind聚簇表 employees
cluster employees using employees_ind;

定义或者改变一个对象的注释:comment

具体语句用法如下:

1
2
-- 为表mytable附加一段注释
comment on table mytable is 'this is my table.';

垃圾收集以及可选地分析一个数据库:vacuum

具体语句用法如下:

1
2
-- 清理单一表onek,为优化器分析它并且打印出详细的清理活动报告
vacuum (verbose, analyze) onek;

为当前会话设置会话用户标识符和当前用户标识符:set session authorization

具体语句用法如下:

1
set session authorization 'paul';

删除访问权限:revoke

具体语句用法如下:

1
2
-- 从 public 收回表films上的插入特权
revoke insert on films from public;

事务相关命令

开始一个事务:begin

具体语句用法如下:

1
begin;

提交当前事务:commit

具体语句用法如下:

1
2
-- 要提交当前事务并且让所有更改持久化
commit;

提交当前事务:end

具体语句用法如下:

1
2
-- 提交当前事务并且让所有更改持久化
end;

强制一个事务日志检查点:checkpoint

具体语句用法如下:

1
checkpoint;

中止当前事务:rollback

回滚当前事务并且导致该事务所作的所有更新都被抛弃。具体语句用法如下:

1
2
-- 中止所有更改
rollback;

中止当前事务:abort

回滚当前事务并且导致由该事务所作的所有更新被丢弃。具体语句用法如下:

1
abort;

开始一个事务块:set transaction

具体语句用法如下:

1
2
3
4
-- 要用一个已经存在的事务的同一快照开始一个新事务,首先要从该现有 事务导出快照。这将会返回快照标识符
begin transaction isolation level repeatable read;
select pg_export_snapshot();
pg_export_snapshot

开始一个事务块:start transaction

具体语句用法如下:

1
2
-- 中止所有更改
rollback;

在当前事务里定义一个新的保存点:savepoint

具体语句用法如下:

1
2
3
4
5
6
7
8
-- 建立一个保存点并且后来撤销在它建立之后执行的所有命令的效果
begin;
insert into table1 values (1);
savepoint my_savepoint;
insert into table1 values (2);
rollback to savepoint my_savepoint;
insert into table1 values (3);
commit;

回滚到一个保存点:rollback to savepoint

具体语句用法如下:

1
2
-- 撤销在my_savepoint建立后执行的命令的效果
rollback to savepoint my_savepoint;

删除一个前面定义的保存点:release savepoint

具体语句用法如下:

1
2
3
4
5
6
7
-- 建立并且销毁一个保存点
begin;
insert into table1 values (3);
savepoint my_savepoint;
insert into table1 values (4);
release savepoint my_savepoint;
commit;

游标相关命令

定义一个游标:declare

具体语句用法如下:

1
2
-- 声明一个游标
declare liahona cursor for select * from films;

定位一个游标:move

具体语句用法如下:

1
2
3
4
5
6
BEGIN WORK;
DECLARE liahona CURSOR FOR SELECT * FROM films;

-- 跳过前 5 行:
MOVE FORWARD 5 IN liahona;
MOVE 5

用游标从查询中抓取行:fetch

具体语句用法如下:

1
2
-- 在游标 liahona 中取出前 5 行:
FETCH FORWARD 5 FROM liahona;

关闭游标:close

具体语句用法如下:

1
2
-- 关闭游标liahona
close liahona;

alter修改命令

修改一个聚集函数的定义:alter aggregate

具体语句用法如下:

1
alter aggregate myavg(integer) rename to my_average;

修改一个排序规则定义:alter collation

具体语句用法如下:

1
2
-- 把排序规则de_DE重命名为german
alter collation "de_de" rename to german;

修改一个编码转换的定义:alter conversion

具体语句用法如下:

1
2
-- 把转换iso_8859_1_to_utf8的拥有者改成joe
alter conversion iso_8859_1_to_utf8 owner to joe;

修改一个数据库:alter database

具体语句用法如下:

1
2
-- 在数据库test中默认禁用索引扫描
alter database test set enable_indexscan to off;

定义默认的访问权限:alter default privileges

具体语句用法如下:

1
2
3
-- 在模式myschema中创建的所有表(和视图)授予 SELECT 特权,并且也允许角色webuser向它们之中 INSERT 数据
alter default privileges in schema myschema grant select on tables to public;
alter default privileges in schema myschema grant insert on tables to webuser;

修改一个域的定义:alter domain

具体语句用法如下:

1
2
-- 把一个NOT NULL约束加到一个域
alter domain zipcode set not null;

修改一个函数的定义:alter function

具体语句用法如下:

1
2
-- 把用于类型integer的函数sqrt 重命名为square_root
alter function sqrt(integer) rename to square_root;

修改角色名称或成员关系:alter group

具体语句用法如下:

1
2
3
4
-- 向一个组增加用户
alter group staff add user karl, john;
-- 从一个组移除一个用户
alter group workers drop user beth;

修改一个索引的定义:alter index

具体语句用法如下:

1
2
-- 把一个索引移动到一个不同的表空间
alter index distributors set tablespace fasttablespace;

修改一个操作符的定义:alter operator

具体语句用法如下:

1
2
-- 更改类型text的一个自定义操作符a @@ b 的拥有者
alter operator @@ (text, text) owner to joe;

修改一个模式的定义:alter schema

具体语句用法如下:

1
2
-- 把一个索引移动到一个不同的表空间
alter index distributors set tablespace fasttablespace;

修改一个数据库角色:alter role

具体语句用法如下:

1
2
-- 更改一个角色
alter role davide with password 'hu8jmn3';

修改一个序列生成器的定义:alter sequence

具体语句用法如下:

1
2
-- 在 105 重启一个被称为serial的序列
alter sequence serial restart with 105;

修改表的定义:alter table

具体语句用法如下:

1
2
-- 向一个表增加一个类型为varchar的列
alter table distributors add column address varchar(30);

修改一个表空间:alter tablespace

具体语句用法如下:

1
2
-- 将表空间index_space重命名为fast_raid
alter tablespace index_space rename to fast_raid;

修改一个事件触发器的定义:alter event trigger

具体语句用法如下:

1
2
-- 重命名一个现有的触发器
alter event trigger name rename to new_name

修改一个类型的定义:alter type

具体语句用法如下:

1
2
-- 重命名一个数据类型
alter type electronic_mail rename to email;

create定义命令

定义一个新的约束触发器:constraint trigger

具体语句用法如下:

1
2
3
4
5
-- 只要表accounts的一行即将要被更新时会执行函数check_account_update
create trigger check_update
before update on accounts
for each row
execute function check_account_update();

定义一个新的编码转换:create conversion

具体语句用法如下:

1
2
-- 使用myfunc创建一个从编码UTF8到 LATIN1的转换
create conversion myconv for 'utf8' to 'latin1' from myfunc;

创建一个新数据库:create database

具体语句用法如下:

1
2
-- 创建一个新数据库
create database lusiadas;

定义一个新域:create domain

具体语句用法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-- 创建us_postal_code数据类型并且把它用在 一个表定义中。一个正则表达式测试被用来验证值是否看起来像一个 合法的 US 邮政编码
create domain us_postal_code as text
check(
value ~ '^\d{5}$'
or value ~ '^\d{5}-\d{4}$'
);

create table us_snail_addy (
address_id serial primary key,
street1 text not null,
street2 text,
street3 text,
city text not null,
postal us_postal_code not null
);

定义一个新函数:create function

具体语句用法如下:

1
2
3
4
5
create function add(integer, integer) returns integer
as 'select $1 + $2;'
language sql
immutable
returns null on null input;

定义一个新索引:create index

具体语句用法如下:

1
2
-- 在表films中的列title上创建一个 B-树索引
create unique index title_idx on films (title);

定义一种新的过程语言:create language

具体语句用法如下:

1
2
3
4
5
6
-- 创建新的过程语言的最小顺序
create function plsample_call_handler() returns language_handler
as '$libdir/plsample'
language c;
create language plsample
handler plsample_call_handler;

定义一个新的操作符:create operator

具体语句用法如下:

1
2
3
4
5
6
7
8
9
10
11
-- 为数据类型box定义一种新的操作符--面积相等
create operator === (
leftarg = box,
rightarg = box,
function = area_equal_function,
commutator = ===,
negator = !==,
restrict = area_restriction_function,
join = area_join_function,
hashes, merges
);

定义一个新的操作符表:create operator class

具体语句用法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-- 为数据类型_int4(int4数组) 定义了一个 GiST 索引操作符
create operator class gist__int_ops
default for type _int4 using gist as
operator 3 &&,
operator 6 = (anyarray, anyarray),
operator 7 @>,
operator 8 <@,
operator 20 @@ (_int4, query_int),
function 1 g_int_consistent (internal, _int4, smallint, oid, internal),
function 2 g_int_union (internal, internal),
function 3 g_int_compress (internal),
function 4 g_int_decompress (internal),
function 5 g_int_penalty (internal, internal, internal),
function 6 g_int_picksplit (internal, internal),
function 7 g_int_same (_int4, _int4, internal);

定义一个新的数据库角色:create role

具体语句用法如下:

1
2
-- 创建一个有口令的角色
create user davide with password 'jw8s0f4';

定义一个新重写规则:create rule

具体语句用法如下:

1
create rule notify_me as on update to mytable do also notify mytable;

定义一个新模式:create schema

具体语句用法如下:

1
2
3
4
-- 创建一个模式
create schema myschema;
-- 为用户joe创建一个模式,该模式也将被命名为 joe
create schema authorization joe;

定义一个新的外部服务器:create server

具体语句用法如下:

1
2
3
-- 创建使用外部数据包装器postgres_fdw 的服务器myserver
create server myserver foreign data wrapper postgres_fdw options (host 'foo', dbname 'foodb', port '5432');

定义一个新序列发生器:create sequence

具体语句用法如下:

1
2
-- 创建一个称作serial的上升序列,从 101 开始
create sequence serial start 101;

定义一个新表:create table

具体语句用法如下:

1
2
3
4
5
6
7
8
9
-- 创建表distributors
create table distributors (
did integer primary key generated by default as identity,
name varchar(40) not null check (name '')
);
-- 创建有一个二维数组的表
create table array_int (
vector int[][]
);

从一条查询的结果中创建一个新表:create table as

具体语句用法如下:

1
2
3
-- 创建一个新表films_recent,它只由表 films中最近的项组成
create table films_recent as
select * from films where date_prod >= '2002-01-01';

定义一个新的表空间:create tablespace

具体语句用法如下:

1
2
3
4
5
6
7
8
9
-- 要在文件系统位置/data/dbs创建表空间dbspace,请首先使用操作系统工具创建目录并设置正确的所有权
mkdir /data/dbs
chown postgres:postgres /data/dbs

-- 然后在内部发出表空间创建命令 PostgreSQL
--create tablespace dbspace location '/data/dbs';

-- 要创建由不同数据库用户拥有的表空间
create tablespace indexspace owner genevieve location '/data/indexes';

定义一个新的触发器:create trigger

具体语句用法如下:

1
2
3
4
5
6
7
8
9
10
11
12
-- 禁止执行任何DDL命令
create or replace function abort_any_command()
returns event_trigger
language plpgsql
as $$
begin
raise exception 'command % is disabled', tg_tag;
end;
$$;

create event trigger abort_ddl on ddl_command_start
execute function abort_any_command();

定义一个新的数据类型:create type

具体语句用法如下:

1
2
3
4
5
6
7
8
-- 创建一个枚举类型并且将其用在一个表定义中
create type bug_status as enum ('new', 'open', 'closed');

create table bug (
id serial,
description text,
status bug_status
);

定义一个视图:create view

具体语句用法如下:

1
2
3
4
5
-- 创建一个由所有喜剧电影组成的视图
create view comedies as
select *
from films
where kind = 'comedy';

drop删除命令

删除一个表中的行:delete

具体语句用法如下:

1
2
-- 删除所有电影,但音乐剧除外
delete from films where kind 'musical';

删除一个用户定义的聚类函数:drop aggregate

具体语句用法如下:

1
2
-- 为类型integer移除聚集函数myavg
drop aggregate myavg(integer);

删除一个用户定义的类型转换:drop cast

具体语句用法如下:

1
2
-- 移除从类型text到类型int的类型
drop cast (text as int);

删除一个用户定义的编码转换:drop conversion

具体语句用法如下:

1
2
-- 删除名为myname的转换
drop conversion myname;

删除一个数据库:drop database

具体语句用法如下:

1
2
-- 删除名为myname的数据库
drop database myname;

删除一个用户定义的域:drop domain

具体语句用法如下:

1
2
-- 移除域box
drop domain box;

删除一个函数:drop function

具体语句用法如下:

1
2
-- 移除域box
drop domain box;

删除一个索引:drop index

具体语句用法如下:

1
2
-- 移除索引title_idx
drop index title_idx;

删除一个过程语言:drop language

具体语句用法如下:

1
2
-- 移除过程语言plsample
drop language plsample;

删除一个操作符:drop operator

具体语句用法如下:

1
2
-- 为类型integer移除幂操作符 a^b
drop operator ^ (integer, integer);

删除一个操作符表:drop operator class

具体语句用法如下:

1
2
-- 移除 B-树操作符类widget_ops
drop operator class widget_ops using btree;

删除一个数据库角色:drop role

具体语句用法如下:

1
2
-- 删除一个角色
drop role jonathan;

删除一个重写规则:drop rule

具体语句用法如下:

1
2
-- 删除重写规则newrule
drop rule newrule on mytable;

删除一个模式:drop schema

具体语句用法如下:

1
2
-- 移除序列serial
drop sequence serial;

删除一个表:drop table

具体语句用法如下:

1
2
-- 销毁两个表films和 distributors
drop table films, distributors;

删除一个表空间:drop tablespace

具体语句用法如下:

1
2
-- 从系统移除表空间mystuff
drop tablespace mystuff;

删除一个触发器定义:drop trigger

具体语句用法如下:

1
2
-- 销毁表films上的触发器 if_dist_exists
drop trigger if_dist_exists on films;

删除一个用户定义数据类型:drop type

具体语句用法如下:

1
2
-- 移除数据类型box
drop type box;

删除一个视图:drop view

具体语句用法如下:

1
2
-- 将移除名为kinds的视图
drop view kinds;
CATALOG
  1. 1. 写在前头
  2. 2. PostgreSQL语句
    1. 2.1. 常用语句
      1. 2.1.1. 在表和文件之间拷贝数据:copy
      2. 2.1.2. 定义访问权限:grant
      3. 2.1.3. 从一个查询的结果中定义一个新表:select into
      4. 2.1.4. 清空一个或一组表:truncate
      5. 2.1.5. 修改运行时参数:set
      6. 2.1.6. 把一个运行时参数值恢复为默认值:reset
      7. 2.1.7. 显示运行时的参数值:show
      8. 2.1.8. 更新一个表中的行:update
      9. 2.1.9. 创建一个准备好的查询:prepare
      10. 2.1.10. 执行一个准备好的查询:execute
      11. 2.1.11. 显示一个语句的执行规则:explain
      12. 2.1.12. 在表中创建新行:insert
      13. 2.1.13. 重建索引:reindex
      14. 2.1.14. 收集与数据库有关的统计:analyze
      15. 2.1.15. 生成一个通知:notify
      16. 2.1.16. 监听一个通知:listen
      17. 2.1.17. 停止监听通知信息:unlisten
      18. 2.1.18. 锁定一个表:lock
      19. 2.1.19. 根据一个索引聚簇一个表:cluster
      20. 2.1.20. 定义或者改变一个对象的注释:comment
      21. 2.1.21. 垃圾收集以及可选地分析一个数据库:vacuum
      22. 2.1.22. 为当前会话设置会话用户标识符和当前用户标识符:set session authorization
      23. 2.1.23. 删除访问权限:revoke
    2. 2.2. 事务相关命令
      1. 2.2.1. 开始一个事务:begin
      2. 2.2.2. 提交当前事务:commit
      3. 2.2.3. 提交当前事务:end
      4. 2.2.4. 强制一个事务日志检查点:checkpoint
      5. 2.2.5. 中止当前事务:rollback
      6. 2.2.6. 中止当前事务:abort
      7. 2.2.7. 开始一个事务块:set transaction
      8. 2.2.8. 开始一个事务块:start transaction
      9. 2.2.9. 在当前事务里定义一个新的保存点:savepoint
      10. 2.2.10. 回滚到一个保存点:rollback to savepoint
      11. 2.2.11. 删除一个前面定义的保存点:release savepoint
    3. 2.3. 游标相关命令
      1. 2.3.1. 定义一个游标:declare
      2. 2.3.2. 定位一个游标:move
      3. 2.3.3. 用游标从查询中抓取行:fetch
      4. 2.3.4. 关闭游标:close
    4. 2.4. alter修改命令
      1. 2.4.1. 修改一个聚集函数的定义:alter aggregate
      2. 2.4.2. 修改一个排序规则定义:alter collation
      3. 2.4.3. 修改一个编码转换的定义:alter conversion
      4. 2.4.4. 修改一个数据库:alter database
      5. 2.4.5. 定义默认的访问权限:alter default privileges
      6. 2.4.6. 修改一个域的定义:alter domain
      7. 2.4.7. 修改一个函数的定义:alter function
      8. 2.4.8. 修改角色名称或成员关系:alter group
      9. 2.4.9. 修改一个索引的定义:alter index
      10. 2.4.10. 修改一个操作符的定义:alter operator
      11. 2.4.11. 修改一个模式的定义:alter schema
      12. 2.4.12. 修改一个数据库角色:alter role
      13. 2.4.13. 修改一个序列生成器的定义:alter sequence
      14. 2.4.14. 修改表的定义:alter table
      15. 2.4.15. 修改一个表空间:alter tablespace
      16. 2.4.16. 修改一个事件触发器的定义:alter event trigger
      17. 2.4.17. 修改一个类型的定义:alter type
    5. 2.5. create定义命令
      1. 2.5.1. 定义一个新的约束触发器:constraint trigger
      2. 2.5.2. 定义一个新的编码转换:create conversion
      3. 2.5.3. 创建一个新数据库:create database
      4. 2.5.4. 定义一个新域:create domain
      5. 2.5.5. 定义一个新函数:create function
      6. 2.5.6. 定义一个新索引:create index
      7. 2.5.7. 定义一种新的过程语言:create language
      8. 2.5.8. 定义一个新的操作符:create operator
      9. 2.5.9. 定义一个新的操作符表:create operator class
      10. 2.5.10. 定义一个新的数据库角色:create role
      11. 2.5.11. 定义一个新重写规则:create rule
      12. 2.5.12. 定义一个新模式:create schema
      13. 2.5.13. 定义一个新的外部服务器:create server
      14. 2.5.14. 定义一个新序列发生器:create sequence
      15. 2.5.15. 定义一个新表:create table
      16. 2.5.16. 从一条查询的结果中创建一个新表:create table as
      17. 2.5.17. 定义一个新的表空间:create tablespace
      18. 2.5.18. 定义一个新的触发器:create trigger
      19. 2.5.19. 定义一个新的数据类型:create type
      20. 2.5.20. 定义一个视图:create view
    6. 2.6. drop删除命令
      1. 2.6.1. 删除一个表中的行:delete
      2. 2.6.2. 删除一个用户定义的聚类函数:drop aggregate
      3. 2.6.3. 删除一个用户定义的类型转换:drop cast
      4. 2.6.4. 删除一个用户定义的编码转换:drop conversion
      5. 2.6.5. 删除一个数据库:drop database
      6. 2.6.6. 删除一个用户定义的域:drop domain
      7. 2.6.7. 删除一个函数:drop function
      8. 2.6.8. 删除一个索引:drop index
      9. 2.6.9. 删除一个过程语言:drop language
      10. 2.6.10. 删除一个操作符:drop operator
      11. 2.6.11. 删除一个操作符表:drop operator class
      12. 2.6.12. 删除一个数据库角色:drop role
      13. 2.6.13. 删除一个重写规则:drop rule
      14. 2.6.14. 删除一个模式:drop schema
      15. 2.6.15. 删除一个表:drop table
      16. 2.6.16. 删除一个表空间:drop tablespace
      17. 2.6.17. 删除一个触发器定义:drop trigger
      18. 2.6.18. 删除一个用户定义数据类型:drop type
      19. 2.6.19. 删除一个视图:drop view