一、概述
1. DML(data manipulation language 数据操作语言):insert update delete
2. DDL(data definition language 数据定义语言): create table,alter table,drop table,truncate
Oracle 中 修改字段名称 alter table student rename column sname to myname;MySQL 中 修改字段名称 alter table student change name myname vachar(30);
Oracle中 添加一个列(字段)
ALTER TABLE 表名 add ( COLUMN 列名 数据类型(长度)); -- 注意 add() 这个括号不要忘了
Oracle 中 删除一个列
ALTER TABLE 表名 DROP COLUMN 列名;
Oracle 中 修改列名
alter table student rename column 旧列名 to 新列名;
Oracle中 修改表名
ALTER TABLE 旧表名 RENAME TO 新表名;
说明:注意加上COLUMN,为了强调修改的是表中的字段信息
注意:MySQL 中的DDL 和 Oracle 中的DDL语句有差异,注意加以区分
3.DCL(data control language 数据库控制语言) grant 授权 revoke 撤销授权
4.DQL(data query language 数据库查询语言) select
二、细节问题
(1)insert
需求1:我要给字段插入值,但是没想好,这个字段实际的值我可以先用占位符表示 ,等会我再给占位符赋值上实际的值。
知识点1:地址符 & (可以理解为一个占位符)
insert into emp(empno,ename,sal) values(&empno,&ename,&sal);
截图:
补充:结合"/"(执行上一个sql语句)可以再插入语句,对于插入多条数据比较方便。
需求2:查询语句中的字段你也可以使用占位符来占
select ename,sal,&c from emp;
需求3:表名使用占位符来占
select * from &tablename;
需求4:一次插入多条数据
-- 我先创建一张表
create table myemp(ename varchar(32), sal int);
-- 一次性将emp中所有10号部门的员工的名字和工资,插入到myemp表中,也就是说我从一张表查出数据,然后插入另一张表中.
insert into myemp select ename,sal from emp where deptno=10; --注意两张表的字段要对应上
注意:select ename,sal from emp where deptno=10;得出的是一条数据信息,等于是将查询的数据追加到原表中
截图显示
需求5:更新表 update 和MySQL中的一样
语法:update 表名 set 字段名=值,字段名=值 where 条件
update emp set ename='zhangsan' where ename='SMITH';
面试题1:delete和truncate的区别?
(1)delete逐条删除;truncate先摧毁表,再重建(2)最重要的区别是 delete是DML(DML语句,可以回滚,没有提交事务) truncate是DDL(不可以回滚)
(3)delete 不会释放空间; truncate会
(4)delete会 产生碎片 t;runcate不会
(5)delete 可以闪回(即便你删了,可以通过闪回来恢复); truncate 不可以(不走Oracle的回收站)
注意:如果删除不加任何条件,就删除了整张表中的数据
碎片:指的是 delete 删除某些数据后,造成每一条和每一条数据之间不连贯,那么就会造成查询时效率比较低。
解决方法:所以我们可以用一条命令来整理某张表中的碎片
alter table emp move;
思考:闪回的原因?
解答:delete删除的数据,会在Oracle数据库的回收站暂存,所以可以闪回。
注意:在Oracle 中 “truncate emp”比 “select emp”慢 ,在MySQL中是相反的(效率的深层次问题)
--------------------------------------------
需求6:在每次插入的时候,屏幕上会有一些插入成功的提示语句,嫌烦人不想要
解决思路:提示可以关掉和打开
set feedback off --关掉提示语句
set feedback on --打开提示语句
注意:客户端中不能用这种方法。
--------------------------------------------
需求7:执行文本文件中写好的sql语句
如:执行D盘下的mysql文件中的sql语句(文件的后缀名必须是.sql)
@d:\mysql.sql;-- @表示执行
---------------------------------------------
三、事务
3.1、事务特性:原子性、一致性、隔离性、持久性
回顾:MySQL种开启事务是 start transaction 通过这个命令开启事务
思考1:在Oracle中事务的开启是这样的?
解决:事务的开启标志,事务中第一条DML语句(准备操作数据,准备持久化)
比如:你第一条语句是一个DML语句,那么事务就自动开启了,语句中有这几个关键字 insert、update、delete就是DML语句
思考2:在Oracle中事务是如何提交(结束)的
(1)显式提交;用 commit 来提交事务(2)隐式提交事务; a.:正常退出exit;b:执行 DDL语句 、DCL语句,就会默认提交事务
(3)显式回滚;rollback
(4)隐式回滚;非正常退出,停电了、死机
注意:DDL语句会提交事务的原因(从需求上,DDL是定义语句,一旦出现标志着创建新的东西,原来的数据就会通过缓存持久化)
补充:自动提交事务
若把AUTOCOMMIT设置为ON,则在插入、修改、删除语句执行后,系统将自动进行提交,这就是自动提交。
SET AUTOCOMMIT ON;
3.2、回滚点
需求7:设置事务的回滚点,我可以回滚到上一个回滚点(理解--预先设定的中断位置)
练习
(1)先创建一张表(create 是一个DDL语句);
(2)插入数据(insert into 是一个DML语句);
(3)再插入一条数据;
(4)保存一个回滚点(savepoint a);
(5)继续再插入一条数据;
(6)回滚到上一个回滚点,观察最后这条数据是否插入进去?
create table testsavepoint (tid number,tname varchar(20)); --先创建一张表 create 是一个DDL语句 说明上一个事务已经提交了
insert into testsavepoint values(1,'Tom'); --插入数据,是一个DML语句,说明这次的事务默认开启了
insert into testsavepoint values(2,'Mary'); --再插入一条数据
savepoint a; --保存一个回滚点
-- 到这里事务还没提交---
-- 我继续再插入一条数据
insert into testsavepoint values(2,'hehe'); -- 比如我觉得hehe这个名字写错了,我不想要这条数据了,我就可以回滚到回滚点
rollback to savepoint a; --回滚到上一个回滚点 那么 hehe这条数据就没插入进去了 我们用了rollback此时事务也提交了
语法说明:
ROLLBACK [WORK] TO [SAVEPOINT]:回退到某一点
ROLLBACK:回滚命令使数据库状态回到 上次最后提交事务的状态3.3 、Oracle 数据库的三个事务隔离级别
read committed 读已提交 可以避免脏读的发生(Oracle的 默认隔离级别)serializable 串行化 可以避免所有的问题
read only 只读(Oracle数据库特有的,其他数据库没有,思考其作用)
思考:如何设置数据库的隔离级别
设置数据库的隔离级别 set transaction read only; -- 设置数据库的隔离级别
注意:一般不要修改事务的隔离级别
相关链接:
未完待续。。。