Oracle数据库之四

删除记录的SQL语句

delete from 表名[where 条件];(DML)

注意:

  如果没有where子句,代表全部删除(慎用)。

  delete也必须commit后才能生效

 

truncate也可以删除全部数据,但直接生效(DDL;

 

delete from student where id =4;

 

如果删除父表中的记录,子表怎么办?

 

delete from dept  where d_id =3;

 

通常情况下,删除父表数据时,必须保证子表中没有相关数据。

在创建外键约束时,可以指定删除数据的关系:

 on delete cascade -- 删除父表的同时级联子表相关数据

 on delete set null--删除父表的同时把子表相关数据的关联字段设置为NULL

drop table emp ;

create table emp (

  id  number(11) constraint emp_pk primary key,

  name varchar(20) not null,

  salary number(10,4),

  joindate date,

  position varchar(15),

  dept_id number(10),

  constraint emp_fk 

  foreign key(dept_id) 

  references dept(d_id) 

  on delete set null

);

 

唯一约束 -- unique

 保证字段值不会重复,字段级约束:

  字段名  字段类型 [constraint 约束名] unique

 

create table user(

  id number(11) primary key,

  name varchar2(20) not null,

  email varchar2(40) unique

);

 

insert into user values(1,'zhangfei','11111');

insert into user values(2,'guanyu',NULL);

insert into user values(3,'zhaoyun','11111');错  违反唯一约束

insert into user values(4,'liubei',NULL);email NULL可以重复

 

check约束 -- 额外添加约束

 check(表达式)

比如:要求用户名至少6个字符

drop table user;

create table user(

  id number(11) primary key,

  name varchar2(20) not null,

  email varchar2(40) unique,

  check(length(name)>5)

);

insert into user values(1,'zhangfei','11111');

insert into user values(2,'liru','2222');//用户名长度不够

 

建表时,也可以使用子查询,使用子查询建表在建立表格的同时也会把数据复制过来。

这种方式一般用于建立临时表。格式:

  create table 表名 [(字段)] as 子查询;

  子查询建表  只能把非空约束带到新表中

 

create table myemp as (select id,first_name,salary from s_emp);

 

DML和事务处理语句:

最常用的DML语句:

insert:插入记录

update:修改记录

delete:删除记录

 

insert 可以使用子查询插入多条数据

insert into 表名 [(字段名)] 子查询;

 

update 语法:

update 表名 set 字段1 =1,字段2 = 2,... [where 条件];

 

注:where 条件如果不写,就相当于修改全部数据

 

myemp_gzgd1306_marsh所有人的工资都加500

 

update myemp set salary = salary+500;

commit;

id=5的员工工资加上1000(用myemp表)

update myemp set salary = salary+1000 where id =5;

commit;

 

事物处理是针对DML(insert/update/delete) 的,其他的SQL不需要事务处理。

事物处理语句:commitrollback

commit是提交DML,相当有确认

rollback是回滚DML,相当于撤销

 

select * from myemp;

delete from myemp where id = 25;

commit;

delete from myemp where id = 24;

rollback;

 

 事物处理之前数据的状态(只执行了DML,而没有执行commit/rollback)

数据库中的数据没有真正改变

当前窗口看到的是记录改变之后的数据

其他窗口看到的是改变之前的数据

所有发生改变的记录被锁定,不能再次修改,但运行查询

 当前窗口修改记录,未commit/rollback,则记录将被锁定,其他窗口不能修改

 

事物处理之后的状态(事物处理方式commit):

数据库中的数据发生改变(无法再回滚)

修改之前的数据将消失

所有用户都会看到修改之后的数据

释放/解除相关记录的锁定

如果有断点,也会被释放

 

事务处理之后的状态(事物处理方式rollback)

数据库数据回到修改前的状态(无法再提交)

修改之后的状态和数据消失

所有用户都看到修改之前的数据

释放/解除相关记录的锁定

 

注意:DML操作之后记得立即提交

 

自动回滚和自动提交

非正常的推出sqlplus 自动回滚数据。

正常退出sqlplus 自动提交数据(exit)

执行ddl语句之前 自动提交数据

执行dcl语句之前 自动提交数据

注:DDL语句:create drop truncate...

 

可以使用savepoint语句设置断点,回滚时可以部分回滚(回滚到前面的断点)

select * from myemp;

delete from myemp where id = 24;

savepoint a;

delete from myemp where id = 23;

savepoint b;

delete from myemp where id = 22;

 

rollback to b;

 

select * from myemp;

 

rollback to a;

 

select * from myemp_select * from myemp;

注:关于表结构的修改SQL语句可以课下看

 

oracle数据库中,有很多的对象,包括:表、视图、序列、索引。Oracle对象不能重名。

 

oracle数据库 用序列提供表的主键,序列和表一样是Oracle对象,

序列就是一个自增的整数

 

建序列:

create sequence  序列名

删除序列:

drop sequence 序列名

[INCREMENT BY n]//增量,默认为1

[START WITH n]//从几开始

[{MAXVALUE n| NOMAVALUE}}]

[{MINVALUE n| NOMINVALUE]

[{CYCLE|NOCYCLE]

[{CACHE n|NOCACHE}]

 

create sequence seq_user;

drop sequence seq_user;

 

序列和表没有任何的直接联系,只是为表提供主键

 

creat sequence seq_user;

序列名.nextval   取序列的下一个值  

序列名.currval   取序列的当前值

 

第一次使用必须先取.nextval

select seq_user.nextval from dual;

...

select seq_user.currval from dual;

 

主键提供方案:

 先建一个序列,然后用序列.nextval提供主键

 insert into user

 values(seq_user.nextval,'zhangliang','bbbb');

 

注:序列只会自增,不会回滚---主键不保证连续,保证唯一

 

Oracle有一些系统表,记录这一些操作和信息叫数据字典。比如:USER_SEQUENCE.

 

索引:

  索引用于提升Oracle数据库的查询速度,分为自动索引和普通索引

  当使用唯一约束或者主键时,对应的字段自动加上索引。

  Oracle有很多中索引,但最多的是二叉树索引

经验:

  经常用来做查询条件的字段可以考虑加上索引

  索引可以提升查询速度,但降低增删的速度,因此不是经常用来做查询条件的字段不需要使用索引

 

普通索引的建立预防:

create index 索引名 on 表名(字段名);

字段名可以有多个,但一般都是1个。

create index index_user on user(name);

drop indext index_user;

 

视图:

  视图自身不存储数据,视图的数据也来自于表。

  视图就是表中数据额外的展现形式,可以把一个select语句的结果集做成视图。

  视图的数据来源比较灵活,可以跨表、跨字段。

  视图不会提升查询效率,但可以把复杂的SQL查询语句做成视图,然后简单化再次查询。

  同时也提供了数据的多种展现形式。

视图(view)的创建语法:

CREATE [OR REPLACE] VIEW 视图名

[(alias[,alias...])]

as subquery

[WITH CHECK OPTION [CONSTRAINT constraint]]

[WITH READ ONLY]

 

create or replace view view_emp

as(select e.id,first_name,salary,name from s_emp e,s_dept d 

 where e.dept_id = d.id) WITH READ ONLY;

drop view view_emp;

可以想查询表一样查询视图,简化SQL语句。

select id,first_name,salary,name from view_emp;

 

Oraclerownum

 用于数据的分页问题。

 当数据库的数据非常大时,先取10页的数据,等过了10页以后再取下一个10页的数据。

如何从数据库中取出部分数据,Oracle使用rownum实现。

 

select id,first_name,salary from s_emp where rownum<11;

 

select id,first_name,salary from s_emp where rownum>11;(错)

 

select id,first_name,salary from s_emp where rownum between 11 and 20;(错)

 

rownum 是一个伪列,只能使用 运算。

 

first_name 排序取前10

select id,first_name,salary from s_emp 

where rownum < 11 order by first_name; //错,先where后排序

 

select id,first_name,salary from(

 select id,first_name,salary from s_emp  order by first_name

) where rownum<11;

 

first_name 排序取11-20

select id,first_name,salary from

(select rownum row,id,first_name,salary from(

 select id,first_name,salary from s_emp  order by first_name

)) where row between 11 and 20;

可以用rownum的别名实现其他运算符。

posted @ 2013-08-18 22:40  我没有领悟  阅读(281)  评论(0编辑  收藏  举报