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 表名(列名)