Oracle基础

以超级管理员身份解锁scott用户,并为scott设置一个密码
  解锁用户:alter user scott account unlock;
  设置密码:alter user scott by tiger;(密码设置为tiger)

设置显示的列宽(字符型varchar2,日期型date,数值型number),

column ename format a12;
column hiredate format a10;
column empno format 9999;

a代表字符型,10代表位宽,大小写均可,9代表一个数字,代表数字只能有9

设置每页显示20个记录的高度

set pageSize 80;

sql*plus中的清屏

host cls;

使用dual伪表,使用字符串连接符号输出hello world

select 'hello' || 'world' from dual;

伪表是一个系统表,不能删除或者修改其表结构,主要作用是计算表达式的值

 

使用sysdate显示系统当前时间

select sysdate from dual;

单行函数:只有一个参数输入,只有一个结果输出
多行函数或分组函数:可有多个参数输入,只有一个结果输出

lower/upper/initcap函数

转小写:

select lower('AAA') from dual;

转大写:

select upper('bbb') from dual;

首字母转大写:

select initcap('aaa') from dual;

concat/substr函数

连接字符串:

select concat('hello','world') from dual;

(最多连接两个)

连接多个字符串可以选择concat函数嵌套或者"||"来连接字符串

截取字符串:

select substr('helloworld',5,3) from dual;

(5表示从第几个字符开始,3代表联系几个,第一个字符为1)

 

length/lengthb函数

select length('hello你好') from dual;

(中英文统一处理)

select length('hello你好') from dual;

(中英文分开处理)
(一个中文占3/2个字节,一个英文一个字节)

 

instr/lpad/rpad函数

找出某个字符串的位置:

select instr('helloworld','e')from dual;

(找不到返回0)


使用指定的字符串在左边填充:

select LPAD('hello',10,'#')from dual;

(10代表填充10位)
使用指定的字符串在右边填充:

select RPAD('hello',10,'#')from dual;

 

trim/replace函数

裁剪掉前面或后面的字符串:

select trim(' ' from ' he ll o ') from dual;


执行字符串搜索和替换:

select replace('hello','1','L') from dual;

 

round/trunc/mod函数

按precision精度四舍五入:

select round(3.1415,3) from dual;

 

(3代表小数点后留3位)
按照precision截取值:

select trunc(3.1415,3) from dual;

 

(不会四舍五入)
求模:

select mod(10,3) from dual;

 

(求余数)

 

add_month函数:下个月的今天

select add_month(sysdate,1) from dual;

 

next_day函数:下个星期六

select next_day(sysdate,'星期六') from dual;

 

last_day函数:所在月的最后一天

select last_day(sysdate) from dual;

需要特别注意的是:日期-日期=天数;日期+-天数=日期

 

to_char函数:日期转成字符串

select to_char(sysdate,'yyyy mm dd day') from dual;

to_date函数:字符串装换成日期

select to_date('2017-06-25','yyyy-MM-dd') from dual;

NVL(a,b)函数:如果a为null取b值
NVL2(a,b,c):如果a不为null取b,否则取c
NULLIF(a,b):在类型一致的情况下,如果a,与b相同,则返回null,否则返回a

条件取值decode
decode(条件,值 1,翻译值 1,值 2,翻译值 2,...值 n,翻译值 n,缺省值):根据条件返回相应值

分析函数
RANK:相同的值排名相同,排名跳跃

select rank() over(order by number desc),number from test;

DENSE_RANK:相同的值排名相同,排名连续

select dense_rank() over(order by number desc),number from test;

ROW_NUMBER:返回连续的排名,无论值是否相等

select row_number() over(order by number desc),number from test;

并集运算:UNION ALL不去除重复记录

select * from test where id <= 7 union all select * from test where id >=5;

UNION去掉重复记录

select * from test where id <= 7 union select * from test where id >=5;

交集运算:INTERSECT:得到共有的

select * from test where id <= 7 intersect select * from test where id >=5;

差集运算:MINUS;得到第一个集合但不属于第二个集合的

select * from test where id <= 7 minus select * from test where id >=5;

分页查询
在Oracle中分页需要用到伪列rownum和嵌套查询
首先分页显示前10条记录

select rownum,t.* from test t where rownum <= 10;

但是在显示10到20条记录的时候

select rownum,t.* from test t where rownum >= 10 and rownum <= 20;

这时候没有记录,因为rownum是在查询语句扫描每条记录时产生的,所以不能使用"大于",只用"等于"也不行,这时候就需要使用子查询
下面用子查询查询10到20的记录

select * from (select rownum r,t.* from test t where rownum >= 20) where row <= 10;


视图:
  视图是一种虚表,视图依赖建立的这些表称为基表,视图没有存储真正的数据,真正的数据还是存储在基表中.
  如果你不想让用户看到所有数据,(字段,记录),只想让用户看到某些数据时,可以使用视图,视图可以限制数据访问,简化复杂的查询


但是scott的权限不够,你要首先给scott用户赋予create view权限

grant create view to scott;

 


当然,还可以撤销scott的权限

revoke create view from scott;

创建或修改视图的语法

CREATE [OR REPLACE] [FORCE] VIEW view_name
AS subquery
[WITH CHECK OPTION ]
[WITH READ ONLY]

OR REPLACE:若所创建的视图已经存在,oracle自动重建该视图
FORCE:不管基表是否存在Oracle都会自动创建该视图
subquery:一条完整的select语句
WITH CHECK OPTION:插入或修改的数据行必须满足视图定义的约束
WHIT READ ONLY:该视图上不能进行DML操作

删除视图:

drop view view_name

需要特别注意的是:键保留表的概念:键保留表示理解连接视图修改限制的一个基本概念,该表的主键列全部显示在视图中,并且它们的值在视图中都是唯一
且非空的,也就是说,表的键值在一个连接视图中也是键值,那么就称这个表为键保留表

 

物化视图
视图是一个虚拟表,基于它创建时指定的查询语句返回的结果集,每次访问它都会导致这个查询语句执行一次,为了避免每次访问都执行这个查询,可以将
这个查询结果集存储到一个物化视图(也叫实体化视图)

物化视图的语法

    CREATE METERIALIZED VIEW view_name
    [BUILD IMMEDIATE | BUILD DEFERRED ]
    REFRESH [FAST|COMPLETE|FORCE]
    [
    ON [COMMIT |DEMAND ] | START WITH (start_time) NEXT
    (next_time)
    ]
    AS
    subquery

BUILD IMMEDIATE 是在创建物化视图的时候就生成数据
BUILD DEFERRED 则在创建时不生成数据,以后根据需要再生成数据
REFRESH 当基表放生了DML操作后,物化视图何时采用哪种方式和基表同步,后面跟着指定的刷新方法有三种:FAST,COMPLETE,FORCE,FAST刷新采用增量刷新,只
刷新自上次刷新以后进行的修改.COMPLETE刷新对整个物化视图进行完全的刷新,如果选择FORCE方式,则Oracle在刷新时会去判断是否可以进行快速刷新,如果可以
则采用FAST方式,否则采用COMPLETE的方式.FORCE是默认的方式.刷新的模式分为两种:ON DEMAND和ON COMMIT.ON DEMAND指需要手动刷新物化视图,ON COMMIT指在
基表发生COMMIT操作时自动刷新.

手动刷新视图的代码

begin
DBMS_MVIEW.refresh('物化视图的名字','C');
end;


序列
序列是Oracle提供的用于产生一系列唯一数字的数据库对象
创建序列语法:create sequence 序列名称
NEXTVAL 返回序列的下一个值
CURRVAL 返回序列的当前值

提取下一个值:select 序列名称.nextval from dual;
提取当前值:select 序列名称.currval from dual;

 

同义词
同义词实质上是指定方案对象的一个别名,你可以创建公共同义词和私有同义词,其中,公共同义词public特殊用户组,数据库的所有用户都能访问;而私有同义词包含在特
定用户的方案中,中允许特定用户或者有基对象访问权限的用户进行访问;

 

创建同义词的语法:

create[public] SYNONYM synooym for object;

 


其中synonym表示要创建的同义词的名称,object表示表,视图,序列等我们要创建同义词的对象的名称

索引
  索引是用于加速数据存取的数据对象,合理的使用索引可以大大降低i/o次数,从而提高数据访问性能
  索引是需要占据存储空间的,也可以理解为是一种特殊的数据,形式类似于一颗树,而树的节点存储的就是每条记录的物理地址,也就是伪列(rowid)

 

普通索引语法:
  create index 索引名称 on 表名(列名)

唯一索引
  如果我们需要在某个表某个列创建索引,而这列的值是不会重复的,这时我们可以创建唯一索引.

唯一索引创建语法:

create unique index 索引名称 on 表名(列名)

复合索引
  就是基于两个以上的列建立一个索引

语法:

create index 索引名称 on 表名(列名,列名...)

反向键索引
  当某个字段的值为连续增长的值,用标准的索引会增加查询的层数,性能会下降,建立反向键索引,可以使索引的值变得不规则.

语法:

create index 索引名称 on 表名(列名) reverse;

位图索引
  位图索引适合创建在低基数列上,位图索引不直接存储ROWID,而是存储字节位到ROWID的映射

语法:

create bitmap index 索引名称 on 表名(列名)

 

posted @ 2017-06-26 20:44  司机刹一脚  阅读(158)  评论(0编辑  收藏  举报