oracle学习记录-DML
简介
DML(Data Manipulation Language-数据操纵语言)可以在下列条件下执行:
- 向表中
插入
数据 修改
现存数据删除
现存数据
事务是由完成若干项工作的DML语句组成的
insert语法
插入数据
向表中插入空值
插入指定的值
SYSDATE 记录当前系统的日期和时间
创建脚本
- 在SQL 语句中使用
&
变量指定列值。 &
变量放在values
子句中。
从其它表中拷贝数据
update
删除数据
数据库事务
- 事务:一组逻辑操作单元,使数据从一种状态变换到另一种状态。
- 数据库事务由以下的部分组成:
一个或多个DML
语句
一个DDL
(Data Definition Language – 数据定义语言) 语句
一个 DCL(Data Control Language – 数据控制语言) 语句 - 以第一个 DML 语句的执行作为开始
- 以下面的其中之一作为结束:
COMMIT
或ROLLBACK
语句
DDL 语句(自动提交)
用户会话正常结束
系统异常终止
COMMIT和ROLLBACK语句的优点
使用COMMIT 和 ROLLBACK语句,我们可以:
确保数据完整性。
数据改变被提交之前预览。
将逻辑上相关的操作分组。
控制事务
回滚到保留点
事务进程
- 自动提交在以下情况中执行:
- DDL 语句。
- DCL 语句。
不使用 COMMIT 或 ROLLBACK 语句提交或回滚,正常结束会话。
- 会话异常结束或系统异常会导致自动回滚。
提交或回滚前的数据状态
改变前的数据状态是可以恢复的
执行 DML 操作的用户可以通过 SELECT 语句查询之前的修正
其他用户不能看到当前用户所做的改变,直到当前用户结束事务。
DML语句所涉及到的行被锁定, 其他用户不能操作
提交后的数据状态
数据的改变已经被保存到数据库中。
改变前的数据已经丢失。
所有用户可以看到结果。
锁被释放,其他用户可以操作涉及到的数据。
所有保存点被释放。
提交数据
数据回滚后的状态
总结
constraint(约束)
约束是表级的强制规定
有以下五种约束:
NOT NULL
UNIQUE
PRIMARY KEY
FOREIGN KEY
CHECK
表级约束和列级约束
语法
NOT NULL 约束
非空约束:值不能为空
UNIQUE 约束
唯一约束:允许出现多个空值:Null,不允许出现列的值重复
PRIMARY KEY 约束
主键约束:不允许空值
可以定义在表级或列级:
FOREIGN KEY 约束
外键约束
可以定义在表级或列级:
FOREIGN KEY 约束的关键字
CHECK 约束
检查约束:定义每一行是否满足条件
添加约束
删除约束
从表 EMPLOYEES 中删除约束
无效化约束
在ALTER TABLE 语句中使用 DISABLE 子句将约束无效化。
激活约束
ENABLE 子句可将当前无效的约束激活
当定义或激活UNIQUE 或 PRIMARY KEY 约束时系统会自动创建UNIQUE 或 PRIMARY KEY索引
查询约束
查询定义约束的列
视 图
常见的数据库对象
视图是一种虚表。
视图建立在已有表
的基础上, 视图赖以建立的这些表称为基表
。
向视图提供数据内容的语句为 SELECT 语句, 可以将视图理解为存储起来的 SELECT 语句.
视图向用户提供基表数据的另一种表现形式
视图的好处
- 控制数据访问
- 简化查询
- 避免重复访问相同的数据
简单视图和复杂视图
创建视图
create view empview as
select * from employees; # 创建视图empview从employees表
查询视图
select * from empview ;# select * from empview (视图名)
修改视图
创建复杂视图
视图中使用DML的规定
当视图定义中包含以下元素之一时不能使用update:
组函数
GROUP BY
子句
DISTINCT
关键字
ROWNUM
伪列
列的定义为表达式
当视图定义中包含以下元素之一时不能使insert
:
组函数
GROUP BY
子句
DISTINCT
关键字
ROWNUM
伪列
列的定义为表达式
表中非空的列在视图定义中未包括
屏蔽 DML 操作
删除视图
Top-N 分析
Top-N 分析查询一个列中最大或最小的 n 个值:
销售量最高的十种产品是什么?
销售量最差的十种产品是什么?
最大和最小的值的集合
是 Top-N 分析所关心的
select *
from(
select rownum rn,employee_id,salary
from(
select employee_id,salary,last_name
from employees
order by salary desc
)
)where rn <=50 and rn >40
序列
序列: 可供多个用户用来产生唯一数值的数据库对象
自动提供唯一的数值
共享对象
主要用于提供主键值
将序列值装入内存可以提高访问效率
语法
查询序列
NEXTVAL 和 CURRVAL 伪列
NEXTVAL 返回序列中下一个有效的值,任何用户都可以引用
CURRVAL 中存放序列的当前值
NEXTVAL 应在 CURRVAL 之前指定
,否则会报CURRVAL 尚未在此会话中定义的错误。
举例
使用序列
将序列值装入内存可提高访问效率
序列在下列情况下出现裂缝
:
回滚
系统异常
多个表同时使用同一序列
如果不将序列的值装入内存(NOCACHE), 可使用表 USER_SEQUENCES 查看序列当前的有效值
修改序列
注意事项
删除序列
索 引
创建索引
自动创建: 在定义 PRIMARY KEY
或 UNIQUE
约束后系统自动在相应的列上创建唯一性索引
手动创建: 用户可以在其它列上创建非唯一的索引,以加速查询
什么时候创建索引
以下情况可以创建索引:
列中数据值分布范围很广
列经常在 WHERE 子句或连接条件中出现
表经常被访问而且数据量很大 ,访问的数据大概占数据总量的2%到4%
什么时候不要创建索引
下列情况不要创建索引:
表很小
列不经常作为连接条件或出现在WHERE子句中
查询的数据大于2%到4%
表经常更新
Desc emp;
Create index name_index on emp(name);
索引不需要用,只是说我们在用name进行查询的时候,速度会更快。当然查的速度快了,插入的速度就会慢。因为插入数据的同时,还需要维护一个索引。
查询索引
删除索引
同义词-synonym
创建和删除同义词
控制用户权限
权 限
数据库安全性:
系统安全性
数据安全性
系统权限: 对于数据库的权限
对象权限: 操作数据库对象的权限
系统权限
超过一百多种有效的权限
数据库管理员具有高级权限以完成管理任务,例如:
创建新用户
删除用户
删除表
备份表
创建用户
用户的系统权限
赋予系统权限
创建用户表空间
用户拥有create table权限之外,还需要分配相应的表空间才可开辟存储空间用于创建的表
角 色
建角色并赋予权限
修改密码
对象权限
分配对象权限
WITH GRANT OPTION和PUBLIC关键字
查询权限分配情况
收回对象权限
总结
SET 运算符
set操作符
union 操作实例
UNION 操作符返回两个查询的结果集的并集
UNION ALL
UNION ALL 操作符返回两个查询的结果集的并集。对于两个结果集的重复部分,不去重。
INTERSECT 操作符
INTERSECT 操作符返回两个结果集的交集
MINUS
MINUS操作符:返回两个结果集的差集
SET 操作符注意事项
在SELECT 列表中的列名和表达式在数量和数据类型
上要相对应
括号可以改变执行的顺序
ORDER BY 子句:
只能在语句的最后出现
可以使用第一个查询中的列名, 别名或相对位置
除 UNION ALL之外,系统会自动将重复的记录删除
系统将第一个查询的列名显示在输出中
除 UNION ALL之外,系统自动按照第一个查询中的第一个列的升序排列
高级子查询
子查询
子查询是嵌套在 SQL 语句中的另一个SELECT 语句
- 子查询 (内查询) 在主查询执行之前执行
- 主查询(外查询)使用子查询的结果
多列子查询
多列子查询中的比较分为两种:
成对比较
不成对比较
成对比较举例
不成对比较举例
在 FROM 子句中使用子查询
单列子查询表达式
相关子查询
EXISTS 操作符
EXISTS 操作符检查在子查询中是否存在满足条件的行
如果在子查询中存在满足条件的行:
不在子查询中继续查找
条件返回 TRUE
如果在子查询中不存在满足条件的行:
条件返回 FALSE
继续在子查询中查找
EXISTS 操作符应用举例
NOT EXISTS 操作符应用举例
相关更新
相关删除
WITH 子句
使用 WITH 子句, 可以避免在 SELECT 语句中重复书写相同的语句块
WITH 子句将该子句中的语句块执行一次并存储到用户的临时表空间中
使用 WITH 子句可以提高查询效率