oracle03

来源:互联网 发布:mayo clinic 知乎 编辑:程序博客网 时间:2024/05/18 22:40
 

=======oralce============
1.not in 不等于 any
一。数据类型:
 1.数字: number  number(7) number(11,2)
 2.字符串:char(n) varchar(n) varchar2(n)
  //定长数据比较整齐,效率会高一点点:例如char(10)类似结构体对齐。但是其弱点是浪费空间比较大。  varchar(n)会动态调整空间,效率会低一点点。  varchar2(n)是oracle独有的,自动改成varchar2.
 3.日期:date
 
 --------------以上3个数据类型基本上可以解决90%的sql类型问题-----------------------
 
 4.大字符类型 clob :最大4G空间
 5.大二进制类型 blob:最大4G空间
 
单向加密:一旦加密就不可解。(只是一种概念罢了)
对称加密:可解。

二。标识符:命名罢了:长度1-30 必须以字符开头 _ $ #  A-Z a-z 0-9
 给表,字段 以及其他对象命名
 
 
建表:
 create table 表名(
  字段名 类型,
  字段名 类型,
  ...
 );
 高级建表:as
 create table cwjtab as select id,salary from s_emp where.1=2.....;复制表
  1=2表示:条件不成立,可以只要表结构,不要数据。
 constraint 约束,6年
 
插入数据:不commit就白做。
 insert into 表名 values(字段1值,字段2值,null);commit; 
  高级的插入数据方式:(复制表)
 1。insert into 表名 select id,name from s_emp xx;
 2。insert into 表名(字段) select id from s_emp ; //其他字段要可以为Null
 
删除表:
 drop table 表名: //如果创建表的时候没有commit,则drop表会失败。
 
修改表:
 update cwjtab set salary=salary+10,name='qlr' where id=1; commit;

删除数据:
 delete [from] cwjtab where id =1 ;commit;

 **dml---insert delete update 数据操作语言:只有这种语句才具有事务特性。
 transaction 事务,交易

A -2000;
B +2000;
commit;rollback to;//没提交,就撤销
事务特性:
 1。原子性:事务的操作不可再分。最基本的操作单元,要么一起失败,要么一起成功
 2。持久性:
 3。一致性:同步一致
 4。隔离性:事务和事务之间是相互的隔离的。

  Savepoint A Savepoint B设置回滚点    rollback to A rollback to B rollback ;
 :insert into cwj values(..1);     savepoint a ;
  insert into cwj values(..2);   rollback to a;


约束:
 1。主键约束:非空,唯一 primary key
 2。非空约束:不能null not null
 3。唯一约束:不能重复 unique
 4。检查约束:不能乱来 check
 5。外键约束:不能越界 foreign key references
 
约束的2个级别:即约束添加的2种方式;`
 1。列级别:在创建表的时候的列上直接设置约束
 2。表级别:在所有列定义完成之后,在表上给列再设置约束

没提交的表,是不可以删除滴,因为它的事情还没有做完。+

  oralce的引号可以是:‘’ 也可以是 "",表示原样存储,不转换成大写。

作业:起2个终端,:1,2
 1.insert into emp values(1,100) 不提交
 2.同样insert .
 3.观察操作结果有什么音响。


========下午==========
表级共享锁:
行级排他锁:dml操作影响的行,会加行级排他锁。即同时插入有约束的数据时会阻塞,直到那边commit;

二:表级约束方式:
 create table cwj( id number,salary number, constraint "cwj_pk" primary key(id));
  表级约束的优势:
   1。联合主键。列级约束不能建联合约束。(id,salary)
   id number constraint emp_pk primary key,//这是给这个主键取名叫 emp_pk
   id number primary key //无名约束
 2.多个约束的写法:加上逗号即可呗
 3。非空约束:只有列级约束,没有表级。没有联合非空这一说!
注意:中间有空行,oracle会翻译不了。
………………………………………………………………………………………………………………………………………………
 外键约束:(完整性约束)
  主键:定义唯一的一个字段
   
  子表:一个字段可以引用主表中的唯一性字段。primary key  or unique;
    如果子表中的字段和主表发生外键关系,子表中的字段只能取主表字段中的值。或者null值。
  fid number [foreign key] references cwj(id)
   外键可以为Null.
commit;  
如果在表象上先删除父表中的数据,可以使用级联方式:级联删除。

 drop table cwjtab cascade constraints;
 先把所有的约束干掉,然后再删表。
……………………………………………………………………………………………………………………………………………………………………
级联删除:删除父表数据时,会先删除子表中相关联的数据。再删除子表中的数据。
 xxxx on delete cascade 级联删除
级联置空:
 xxxx on delete set null 删除父表时,子表中的外键变成空
级联更新:oracle 中没有,sqlserver中有 on update cascade
 但是oracle使用触发器来完成这个级联更新操作。
 
 
 
执行脚本@
 sqlplus openlab/open123  登录
 @test.sql :执行脚本。用@号。
……………………………………………………………………………………………………………………………………………………………………
其他数据库对象:
 1。序列 identity
  是一个自增的数字对象,共享对象,可以替代用户的代码,可以用缓存加快主键的生成-为主键而生
  create sequence 序列名(cwjtab_seq_pk);
  select test_seq_pk.nextval from dual表名;调用nextval即可
 例如:create table testseq( id number primary key , name varchar2(30) );
  insert into testseq values(test_seq_pk.nextval,'cwj');
   查看当前sequence的值:第一次查看之前必须调用一次nextval
   select test_seq_pk.currval from dual;//当前值,前提必须调用国nextval
   //调一次nextval,他会自动+1;
   1.increment by n(1 5 8)步长可以设定,默认为1
   2.start with n 起始值
   3.maxvalue n | nomaxvalue 默认值,系统最大
   4.cycle |nocycle 是否循环
   5.cache n |nocache 默认是20个,人多的时候就慢。开发的时候要考虑一下。
  
  数据字典:user_tables  user_sequences放了所有用户sequences信息。
  select cache_size from user_sequences where sequence_name='test_seq
  _pk';//注意:要大写,否则找不着!! ='TEST_SEQ_PK';
  
 建立序列:语法
 create sequence s_sss
 minvalue 1
 maxvalue 100
 increment by 10
 start with 5
 cache 3
 cycle ;//中间没有任何分隔哦
 
 drop sequence s_sss删除序列
 
 日期类型:sysdate 代表系统时间  select sysdate from dual ;
  默认字符串可以代表日期'dd-MON-yy'  'dd-MON-yyyy'
  1999-2000千年虫,2位年不行,搞成4位年。大连青岛对日外包子
  存储数据和显示数据 to_char(par1,'fm')
  fm 日期相关的格式:
   yyyy mm dd hh24 hh12 mi ss  MON 英文三位月缩写 MONTH day 星期几
  select to_char(start_date,'yyyy-mm-dd hh24:mi:ss day') from s_emp;
  select to_char(start_date,'dd') from s_emp; //start_date是字段
  
  
  存入日期:
  年月日根据默认日期格式用字符串存入即可。2008-08-08 20:08:08
  日期处理函数:可以把字符串按照格式变成日期;
  

create table test_date(
 tdate date
);
insert into test_date values('08-AUG-2008');时分秒会丢弃掉,所以我么应该用日期函数。
select to_char(tdate,'yyyy-mm-dd hh24:mi:ss day') from test_date;

to_date('字符串','日期格式');
insert into test_date values(to_date('2008-08-08 20:08:08','yyyy-mm-dd hh24:mi:ss'));

 日期的运算:
  相减-------得到两个日期相差的天数:天数 :-减号运算符
 例子:select sysdate-to_date('2008-08-08','yyyy-mm-dd') from dual ;
  select sysdate-10 from dual;//10天前
 1.select sysdate+1/(24*6) from dual; //10分钟后
  现在到2008-08-08过了多少个月。
 2.months_between(par1,par2);
  select months_between(sysdate,to_date('2008-08-08','yyyy-mm-dd')) from dual;
 3.add_months(sysdate,1);
  select add_months(sysdate,1) from dual;
 4.next_day('01-SEP-95','friday');//下一个星期5
  select next_day(sysdate,'monday') from dual;可以得到下一个星期一(几)
 5.last_day('01-SEP-95') 当前对应的月的最后一天。
  select last_day(sysdate) from dual ;
 
 作业:自学trunc round函数;计算给你任何一个时间得出这个时间下一个月的开始时间。
 
 2。索引
  
 3。视图