一 。sql语言操作分类:
1 数据定义语言DDL (DATA DEFINE LANAGUAGE) (定义,操作数据的结构) 【-->java的变量定义】
CREATE : 在数据库中创建新的数据对象
ALTER : 修改数据库中对象的数据结构
DROP : 删除数据库中的对象
DISABLE/ENABLE TRIGGER : 修改触发器的状态
UPDATE STATISTIC : 更新表/视图统计信息
TRUNCATE TABLE : 清空表中数据
COMMENT : 给数据对象添加注释
RENAME : 更改数据对象名称
2数据操作语言DML
DML(Data Manipulation Language)(CRUD),用于添加/修改/查询数据库中数据。
DML包含以下语句:
INSERT :将数据插入到表或视图
DELETE :从表或视图删除数据
select :从表或视图中获取数据
UPDATE :更新表或视图中的数据
MERGE : 对数据进行合并操作(插入/更新/删除)
3数据控制语言DCL
DCL(Data Control Language)用来向用户赋予/取消对数据对象的控制权限。
DCL包含以下语句:
GRANT : 赋予用户某种控制权限
REVOKE :取消用户某种控制权限
4. 事务控制语言(TCL)
TCL(Transaction Control Language)用来对事务进行管理。
TCL包含以下语句:
COMMIT : 保存已完成事务动作结果
SAVEPOINT : 保存事务相关数据和状态用以可能的回滚操作
ROLLBACK : 恢复事务相关数据至上一次COMMIT操作之后
SET TRANSACTION : 设置事务选项
二。 crud (create read update,delete)
所有的数据库 都是使用这四个单词来描述增删改查 isud (insert select update delete)
1 insert语句
语法:
INSERT INTO 表名[(列名1,列名2,…)] VALUES(值1, 值2,…); --列名的个数和值的个数 必须相同 【表列较多 建议使用】
insert into 表名 values(值1,值2 .。。) --如果没有指定列名 值得个数必须和表中所有的列的个数相同 列的类型必须匹配 【表列较少 建议使用】
INSERT INTO 表名[(列名2,列名1,…)] VALUES(值2,值1, …); 值得顺序和列的顺序保持一致
insert into student select '11','test1',25,'女' from dual --根据常量来模拟
insert into student1 select * from student --可以根据 insert into select语句来进行复制表的数据 (备份表) seelct查询的列数必须和insert插入的表列数一致 并且列类型匹配
日期类型的插入
insert into student1 values(7,'a',20,'男',sysdate)
insert into student1 values(7,'a',20,'男',to_date('1987-06-18','yyyy-MM-dd'))
2 update语句(注意在修改之前一定先将条件写好)
语法:
UPDATE 表名 SET 列名=值[,列名2=值2,…] [WHERE 修改条件]; --
3 delete语句(注意在修改之前一定先将条件写好)
delete scott.emp where empno='8110'
三。 事务
事务表示 一段sql的执行 要么同时成功 要么同时失败
任意的dml语句【数据的修改】 必须要提交数据(因为用户的误操作 导致数据的损坏 有可能导致无法挽回的灾难 可以使用 事务的机制来解决这类问题)
commit(提交) 一旦提交了事务 数据就被修改到物理的数据文件中 (ctrl+s) 保存到文件
rollback(回滚) 如果除了误操作 需要回滚当前事务 (记事本ctrl+z)(撤回)
事务的acid属性
原子性(Atomic):
指整个数据库事务是不可分割的工作单元。原子性确保在事务中的所有操作要么都发生,要么都不发生。
举例:
--被一起的执行的dml语句位于同一事务当中
insert into scott.emp values(8111,'test','MANAGER',7934,sysdate,3000,100,10);
insert into scott.emp values(8112,'test','MANAGER',7934,sysdate,3000,100,10);
insert into scott.emp values(8113,'test','MANAGER',7934,sysdate,3000,100,10);
rollback;
一致性(Consistency):
一旦一个事务结束了(不管成功与否),系统所处的状态和它的业务规则是一致的。即数据应当不会被破坏。
举例:
insert into scott.emp values(8113,'test','MANAGER',7934,'2012-12-15',3000,100,10);
一旦数据被约束成某种 类型或者某些值 那么就必须对应满足这些类型或者某些值
隔离性(Isolation):
指多个事务同时操作同一数据时,每个事务都有各自的完整数据空间。
未提交的数据 在其他的客户端中是无法看到因为 因为隔离性
持久性(Durability):
一旦事务完成,事务的结果应该持久化
存到物理磁盘中(就是断电了 下次还能 看的到 )
事务的提交方式【了解即可】
默认数据库使用 手动(非自动)提交方式 需要操作者 使用commit关键字来提交
SQL> show autocommit;
autocommit OFF
设置自动提交
SQL> set autocommit on;
SQL> insert into scott.emp values(8113,'test','MANAGER',7934,sysdate,3000,100,10);
已创建 1 行。
提交完成。
隐式的事务提交(不需要使用commit和rollback也会自动提交)
1 自动隐式提交事务:
执行一个DDL语句、执行一个DCL语句、从SQL*Plus正常退出(exit,quit)
2自动隐式回滚事务:
强行退出SQL*Plus、客户端到服务器的连接异常中断、系统崩溃
回滚点
savepoint a;
insert into scott.emp values(8113,'test','MANAGER',7934,sysdate,3000,100,10);
savepoint b;
insert into scott.emp values(8114,'test','MANAGER',7934,sysdate,3000,100,10);
rollback to a; --没有记录被插入
rollback to b -- 8113被插入 8114被回滚
commit;
事务引发的问题和隔离级别【重点】
事务 对同一行数据进行操作时 必须等先操作的客户端 提交或者回滚事务后 另外一个客户端才能操作数据(锁)
事务操作同一行数据出现的问题 (并发的引发的问题)
脏读 【是一种错误】
读取到了用户未提交的数据 oracle数据库永远不会出现脏读
不可重复读 【只是一种设计问题】
在读取的事务中 两次重复读取同一行数据 发现数据 被更改了
幻读【只是一种设计问题】
在读取的事务中 两次读取某一个条件的多条数据时 发现多出了几条数据
隔离级别 (就是为了解决事务操作同一份数据导致的问题)
READ UNCOMMITTED: 读未提交数据。脏读、不可重复读、幻读都可能发生。它的事务隔离性最低。
READ COMMITTED:读已提交数据。解决了脏读。【数据库的默认的隔离级别】
REPEATABLE READ:可重复读。解决不可重复读,脏读。
SERIALIZABLE:串行化。解决任何并发事务问题。最严格的事务
Oracle只支持READ COMMITTED和SERIALIZABLE。
默认为READ COMMITTED
设置隔离级别
alter session set isolation_level=serializable;--如果需要演示 必须每个客户端都要执行