一. Sql语言中的DML
DML:数据操纵语言
1. insert:添加数据
语法:insert into 表名(列名,列名,...) values (值,值,...)
注意:没有指定列名添加数据时,添加的值要与表中的列一 一对应
例如:insert into student values(sno,sname,sage,...)
如果添加的是时间对象,则需要使用to_date('时间字符串','格式字符串')
insert 将一个表的数据复制到另一个表
语法:insert into 表名 select 列名,列名,... from 表名
注意:select出来的字段数量和数据类型必须要与添加的字段数量和数据类型对应,字段的名称不要求一样
例如:insert into 表名(sno,sname,sage) select t_sno,t_sname,t_sage from 表名
2. update:更新修改数据
语法:update 表名 set 列名=新值,列名=新值,...[where 过滤条件]
注意:如果不添加where条件则默认将表中所有行的数据都修改
一般不修改主键
3. delete:删除数据
语法:delete from 表名 [where 过滤条件]
注意:如果不添加where条件则默认将表中所有数据删除
truncate:清空表中所有的数据,不删除指定的删除
语法:truncate
区别:
(1)truncate 只能清除表中所有的数据,但是delete可以删除指定数据
(2)truncate 删除的数据不能撤回,但是delete删除的数据可以撤回
(3)truncate 删除数据的时候数据不会放到撤销表空间,所以效率比delete高
二. Oracle数据库中的事务处理:
1. 事务:从业务角度来说,事务就是一个完整的业务逻辑
从sql语句角度来说,事务就是多条sql语句的集合
从数据库层面来说,事务是数据库中处理数据的最小单位
2. 事务特性:
1. 原子性:是处理数据的最小单位,事务中的操作是一个整体,要么全部执行成功,如果有一个失败,则全部撤回
2. 一致性:数据在事务处理之前和处理之后必须要保持一致
3. 持久性:一旦事务执行结束,事务对数据库所做的修改就会永久保存下来
4. 隔离性:用来代事务在操作的时候多个事务之间相互独立,互不影响
5. 隔离级别:
(1)串行读:serializable
隔离级别最高,可以解决下面所有的问题,但是效率相对较低
(2)可重复读:repeatable
(3)提交读:read_committed
(4)未提交读:read_uncommitted
事务操作常见的问题:
脏读:事务A去修改某一条数据,但是还没提交,事务B来读取数据,后来事务A撤销修改操作
导致事务B读到的数据根本不存在
不可重复读:事务A中有两个地方要读取数据,当他读取了第一次的之后,事务B对数据进行修改,
导致第二次读到的数据和第一次读到的不一致
幻读:和不可重复读类似,只不过操作的是一个结果集也就是查询结果
设置隔离级别:isolation level
设置当前事务的隔离级别
Set transaction isolation level read committed
设置当前会话中的事务的隔离级别
Alter session set isolation level serializable
3. 事务的操作:
事务的开启:
在Oracle中事务都是系统自动开启,一般情况只有对数据库操作修改的一些操作才会开启事务
事务的结束:
在Oracle中只有在以下情况系统会自动提交或者回滚事务
(1)执行了DDL语句或者DCL语句自动提交事务
(2)正常退出数据库连接的时候会自动提交事务
在Oracle中如果执行的是DML语句则需要手动提交事务
事务操作的语句:
commit:提交
让对数据库所做的修改永久生效,一旦一个事务被提交了之后就代表不能撤回
优化:在保证数据完整性的情况下多使用commit
rollback:撤回
撤销对数据库所做的所有修改操作,撤销的前提操作就是事务不能被提交
savepoint:保存点
可以在事务中设置一个点,使得撤销的时候不会全部撤回,只会撤销到保存点,此时事务并不会结束
使用步骤:
(1)设置保存点:savepoint 保存名
(2)撤销到保存点:rollback to savepoint 保存名
三. 数据表的简单查询
DQL:数据查询语言:select
语法:select [distinct 去重\all] 列名,列名,... [into 变量]
from 表名\视图
[where 过滤条件]
[group by 分组字段,分组字段,...]
[having 分组过滤语句]
[order by 排序列 [desc|asc] ,列,...]
单表查询:
(1)简单查询
select 列名,列名,... from 表名
*:是一个通配符,代表所有列
sql优化:在查询所有列时不要写*,直接写列名,使用*的时候在查询之前会先去数据字典中查询该表中字段的名称,然后再执行查询操作
在列上使用算数运算符:+ - * /
字符串拼接使用:||
(2)筛选查询
where 查询条件
算数运算符:> < <= >= <> != =
any:只满足其中一个就可以 列名 = any(集合)
all:满足全部 列名 = all(集合)