• 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的别名实现其他运算符。

  • 相关阅读:
    Oracle DBA手记3:数据库性能优化与内部原理解析
    产品部和业务部门的利益之争
    利用dir函数查询各个数据类型的方法
    Python自动单元测试框架
    十一长假归来
    我心爱的TT被我擦到了,伤心!
    150首现代最流行的歌曲连放
    Increase bugzilla attachment size
    Python中的搜索路径
    抛出异常
  • 原文地址:https://www.cnblogs.com/marshhu/p/3266775.html
Copyright © 2020-2023  润新知