orcle的使用

orcle介绍

Oracle的关系数据库是世界第一个支持SQL语言的数据库。Oracle属于甲骨文公司,是全球最大的企业级软件公司,总部位于美国加利福尼亚州的红木滩。1989年正式进入中国市场。
2013年,甲骨文已超越 IBM ,成为继 Microsoft 后全球第二大软件公司。Oracle是一个大型的数据库的,里面的提供了用户很多便捷的操作,但是由于过于庞大以及收费,所以小
型公司都会选择小型的数据库。

Oracle与MySQL的区别

1.Oracle是大型数据库而Mysql是中小型数据库,同时Mysql是开源的而Oracle价格非常高。
2.主键上面Mysql一般使用自动增长类型,在创建表时只要指定表的主键为auto increment,插入记录时,不需要再指定该记录的主键值,Mysql将自动增长;Oracle没有自动增长类型,
主键一般使用的序列,插入记录时将序列号的下一个值付给该字段即可;只是ORM框架是只要是native主键生成策略即可。
3.单引号的处理 MYSQL里可以用双引号包起字符串,ORACLE里只可以用单引号包起字符串。在插入和修改字符串前必须做单引号的替换:把所有出现的一个单引号替换成两个单引号。ORACLE不能使用引号(包括单双引 号)将数字括起来。双引号被用来将包含特定字符或者空格的列别名括起来。
4.翻页的SQL语句的处理 MYSQL处理翻页的SQL语句比较简单,用LIMIT 开始位置, 记录个数;ORACLE处理翻页的SQL语句就比较繁琐了。每个结果集只有一个ROWNUM字段标明它的位置, 并且只能用ROWNUM<100, 不用 ROWNUM>80
5.数据类型不一样,ORACLE有独特的数据类型,例如CLOB类型。
6.空字符的处理 MYSQL的非空字段也有空的内容,ORACLE里定义了非空字段就不容许有空的内容。按MYSQL的NOT NULL来定义ORACLE表结构, 导数据的时候会产生错误。因此导数据时要对空字符进行判断,如果为NULL 或空字符,需要把它改成一个空格的字符串。
7.在函数的使用里,ORACLE有更多的函数方法使用。

ORACLE的数据类型

char,varchar2,nchar,xvarchar2,number,date,timestamp,blob,clob,bfile

其中nchar,xvarchar2是使用的unicode字符集,blob是二进制对象,clob是字符串对象,bfile是二进制存储在操作系统文件中。
number是可以整数也可以浮点数,number(p,s) 前一个是数据(从非零开始),后一个是小数点后面多少位。

伪列ROWID和ROWNUM,ROWID存储着表行的存储地址,使用它可以快速的定位到表中某一行。ROWID格式,数据对象编号+文件编号+块编号+行编号。
ROWNUM是查询结果集的一个序号。使用伪列可以像使用普通列一样,但是没有在表中存储。

sql语言

ddl:create,alter,drop,truncate
dml:insert,update,delete,select
tcl:commit,savepoint,rollback
dcl:grant,revoke

sql语法

在使用条件查询的时候,一般不推荐使用 > 符号,因为在使用这个条件时,数据会出现错误,查询的时候,如果不满足条件会进行抛弃,然后在下一行比较,但是ROWNUM不会改变。例如:10行数据,如果使用ROWNUM>5来查询后,发现没有查询数据,因为在第一行比较时发现ROWNUM=1<5,不满足条件,抛弃,那么下一行将还是ROWNUM=1,所以是空的。也就是先有结果,再有ROWNUM。

orcle进行分页就很麻烦:

1
2
3
4
5
select * from (
select e.*,rownum rn from (
select * from emp order by sal desc
) e
) where rn>5 and rn<10>

排序是在rownum赋值之后。

利用现有表创建新表

1
2
3
4
5
6
7
create table new_t as select * from old_t;

//筛选列
create table new_t as select name,no,age from old_t;

//可以不要数据,只要表结构
create table new_t as select * from old_t where 1=2;

可以使用检查点来回滚到那个检查点

1
2
3
4
//一整套流程,必须这么做
savepoint a;
rollback to savepoint a;
commit;

操作符与函数

算术操作符,逻辑操作符,比较操作符和MySQL一样,例如+,-,*,/,&,|,>,<

但是集合操作符有新的,union是并集,minus是差集,intersect,例如:

1
2
3
4
5
//没有出现重复的数据行
select * from t1 union select * from t2

//如果需要出现重复的数据行
select * from t1 union all select * from t2

连接字符串和数字使用 || 方法,mysql中使用concat()。

函数:单行函数,分组函数,分析函数。
sqrt()算出平方根,lower()转换成小写字符串,to_char()转换成字符串,to_date()转换成带格式的时间,to_number()转换成数字,nvl()对空值进行操作,decode()对值进行转换

1
2
3
4
5
6
7
8
select to_char(sysdate,'YYYY"年"MM"月"dd"日"') from dual;

select to_date('2015-09-10','yyyy-mm-dd') from dual;

select to_number('100') from dual;

select ename,sal+nvl(comm,0) sal,decode(to_char(hiredate,'MM'),
'01','一月','02','二月',...) mon from emp;

表空间

表空间:永久性,临时性,撤销。
使用表空间给不同的子系统创建不同的表空间,这样会增加效率和性能。

1
create TABLESPACE name datafile 'filename' [size][autoextend(off|on)];

调整表空间

1
2
3
alter TABLESPACE name add datafile 'filename' size 80M;

alter datebase datafile 'filename' resize 80M;

删除表空间

1
drop TABLESPACE name [including contents];

角色权限

角色是带有以些权限的名称,有connect,resource,dba,select,update…

授予权限

1
2
3
grant privileges or role to user;

grant select on scott.emp to marrin;

撤销权限

1
revoke privileges or role from user;

序列

在mysql中使用主键,里面有自动增长的选择,但是在orcle里面没有这个操作,需要使用序列来进行同样的功能。
语法:

1
2
3
4
5
6
create sequence name start_with val //开始序列值
increment by val //增长步长
maxvalue val //最大序列值
minvalue val
nocycle //到达最大值后停止产生下一个序列
cache val; //预先分配多少个序列

通过序列的伪列来访问值:nextval 下一个值,currval 当前值。