一、DDL(data definition language)数据定义语言
数据定义语言用于执行数据库的任务,对数据库以及数据库中的各种对象进行创建、删除、修改等操作。基本的DDL命令及功能如下:
命令 | 功能说明 |
Alter procedure | 重新编译存储过程 |
Alter table | 修改表(增加列、重新定义列、更改表存储区分配) |
Alter table and constraint | 在已有的表增加约束 |
Create table | 创建表 |
Create index | 创建索引 |
Drop table | 删除表 |
Drop index | 删除索引 |
Truncate table | 截断表中的数据,表示先删除,再提交 |
Truncate 与 Delete 区别:(摘录:truncate和delete的区别_易腾一涵的博客-优快云博客_truncate和delete的区别)
- 当表被truncate后,表和索引的所占空间会恢复到初始大小,Delete操作不会减少表和索引的所占空间。
- Truncate只能对Table,Delete可以是Table和View(视图)。
- Truncate和Delete只删除数据,Drop则删除整个表(结构和数据)。
- Delete语句为DML(Data Manipulation Language 数据操纵语句),这个操作会被放到 rollback segment(用来临时的保存当数据库数据发生改变时的先前值)中,事务提交后才生效。如果有相应的trigger(触发器),执行的时候将被触发。Truncate是DDL(Data Definition Language),操作立即生效,原数据不会放到rollback segment中,不能回滚。
- Truncate速度快,效率高。
- Truncate和Delete均不会使表结构及其列、约束、索引等发生改变。
二、DML(Data Manipulation Language 数据操纵语句)
数据操纵语句用于操纵数据库中各种对象、检索和修改数据。使用 DML 语句对某一种数据进行操作时,需要必须拥有该对象的对应操作权限或拥有相应的系统权限。DML命令包括的主要语句及功能如下表:
命令 | 功能说明 |
Selcet | 查询数据库 |
Insert | 在数据库中插入一行数据 |
Update | 更新数据库中的数据 |
Delete | 从表中删除数据 |
三、DCL (数据控制语句)
数据控制语句用于安全管理、确定哪些用户可以查看或修改数据库中的数据。DCL命令包括的主要语句及功能如下表:
命令 | 功能说明 |
grant | 将权限和角色授予用户或角色 |
revoke | 从用户或角色收回权限 |
--该⾓⾊的系统权限
select* from dba_sys_privs where grantee = 'dba'
--该⾓⾊的对象权限
select * from dba_tab_privs where grantee = 'dba'
--查询某个⽤户具有多少⾓⾊
select* from dba_role_privs where grantee = '⽤户名';
四、PL/SQL中使用DML、DDL语言
【select into 可以直接使用(赋值),但是如果是删除,创建,清空表需要用execute immediate执行】
4.1 DML语言的使用
DML语句在PL/SQL中的使用方式和单独执行并没有什么区别,示例:
begin
INSERT INTO product(name,price,num) values('GTX 2080Ti',2333.33,33);
COMMIT;
end;
begin
UPDATE product SET price = 6666.66 where num = 33;
COMMIT;
end;
begin
DELETE FROM product where num = 33;
COMMIT;
end;
4.2 DDL语言的使用
PL/SQL中DDL语言的使用需要用到 EXECUTE IMMEDIATE 命令,同时,这个命令不仅可以执行DDL语句,也可以执行DML语句.
--DDL
declare
v_ddl_sql varchar2(200);
begin
v_ddl_sql := 'CREATE TABLE ddl_test(
tid number(10) primary key,
tname varchar2(10)
)';
EXECUTE IMMEDIATE v_ddl_sql;
end;
--DML
declare
v_dml_sql varchar2(200);
begin
v_dml_sql := 'INSERT INTO ddl_test VALUES(1,';
v_dml_sql := v_dml_sql || '''AAA'')';
EXECUTE IMMEDIATE v_dml_sql;
COMMIT;
end;
由于使用 EXECUTE IMMEDIATE 命令主要是拼接字符串,拼接起来很麻烦,所以如果不是特别需要,执行DML语句不要使用动态SQL的方式.