Oracle基础
来源:互联网 发布:linux vi显示行数 编辑:程序博客网 时间:2024/05/20 05:03
(一)SQL概述
(1)数据定义语言DDL
create:创建表或其他对象的结构
alter:修改表或其他对象的结构
drop::删除表或其他对象的结构
truncate:删除表数据,保留表结构
(2)数据操作语言DML
insert
delete
update
(3)事物控制语言TCL
commit:提交,确认已经进行的数据改变
rollback:回滚,取消已经进行的数据改变
sacepoint:保存点,使当前的事务可以回退到指定的保存点,便于取消部分改变。
(4)数据查询语言DQL
select语句
(5)数据控制语言DCL
grant:授予,用于给用户或角色授予权限
revoke:用于收回用户或角色已有的权限
create user:创建用户
(二)函数
1.2 字符串函数
1.2.1concat 和 ||
concat(char1,char2) 返回两个字符串连接后的结果,两个参数char1,char2是要连接的两个字符串。
等价操作:连接操作符“||”
如果char1和char2任何一个为null,相当于连接了一个空格
select concat('k','z') fromdual ;
1.2.2 length
length(char)用于返回字符串的长度
如果字符类型是varchar2,返回字符的实际长度,如果字符类型是char,长度还要包括后补的空格
select length ('dddd') from dual ;
1.2.3 upper、lower、initcap
upper、lower、initcap 大小 写转换函数,用于转换字符的大小写
upper(char)用于将字符转换为大写格式
lower(char)用于将字符转换为小写格式
initcap(char)用于将字符串中每个单词的首字母大写,其他的字符小写,单词之间用空格和非字母字符分隔
如果输的参数是null值,任然返回null值。
select upper('hello world'),lower('HELLOWORLD'),initcap('HELLO WORLD') from dual;
1.2.4trim、ltrim、rtrim
作用:截去子串
语法形式:
trim(c1 from c2)从c1的前后截去c2
ltrim(c1[,c2)从c1的左边(left)截去c2
rtrim(c1[,c2)从c1的右边(right)截去c2
如果没有c2,就去除空格
trim经常用来去掉字符串前后的空格
1.2.5lpad、rpad
补位函数,用于在字符串char1的左端或右端用char2补足到n位,char2可重复多次
lpad(char1,n,char2)左补位函数
rpad(char1,n,char2)右补位函数
1.2.6substr
substr(c1,m,n)
用于获取字符串的子串,返回char中从m位开始取n个字符
如果m=0,则从首字母开始,如果m取负数,则从尾数开始
如果没有设置n,或者n的长度超过了 c1的长度,则取到字符串末尾为止。
SELECT substr('advc',-4,3) FROM dual; dvc
1.2.7 instr
instr(char1,char2[n[,m]])返回子串char2在原字符串char1中的位置
参数:从n的位置开始搜索,没有指定n,从第一个字符开始搜索
m用于指定子串的第m次出现次数,如果不指定取值1
如果在char1中没有找到子串char2,则返回0
select instr('doctor c22‘,’c22') fromdual;--8
2.1数值类型
number(n)表示整数
number(p,s)表示浮点数,长度p位,小数位s,小数点不占位数
number(p,s)表示浮点数,number的 变种数据类型:内部实现是number,可以将其理解为number的别名,目的是多种数据库及编程语言兼容
number(p,s):完全映射至number(p,s)
decimal(p,s):完全映射至number(p,s)
integer或int:完全映射至number(38)类型
smallint:完全映射至number(38)类型
float(b):映射至number类型
double precision:映射至number类型
real:映射至number类型
2.2数值函数
2.2.1round
round(n[,m]):用于四舍五入
参数中的n可以是任何数字,指要被处理的数字
m必须是整数
m取正数则四舍五入到小数后第m位
m取0则四舍五入到整数位
m取负数,则四舍五入到小数点前m位
SELECT round(45.2621,1) FROM dual;--45.3
SELECT round(45.2621,0) FROM dual;--45
SELECT round(45.2621,-1) FROM dual;--50
2.2.2trunc
trunc(n[,m]):用于截取
n和m的定义和round(n[,m])相同,不同的是功能上按照截取的方式处理数字n
SELECT trunc(45.2621,1) FROM dual;--45.2
SELECT trunc(45.2621,0) FROM dual;--45
SELECT trunc(45.2621,-1) FROM dual;--40
2.2.3mod
mod(m,n)返回m除以n后的余数
n为0则直接返回m
2.2.4ceil和floor
ceil(n)、floor(n)这两个函数顾名思义,一个是天花板,就是取大于或等于n的最小整数,一个就是地板,取小于或等于n的最大整数值
比如数字n=4.5,那么他的ceil是5,他的floor就是4
3.1日期类型
3.1.1 date
oracle中最常用的日期类型,用来保存日期和时间
date表示的日期范围可以是公元前4712年1月1日至公元9999年12月31日
date类型在数据库中的存储固定为7个字节,格式为:
1:世纪+100 2:年 3:月 4:天 5:小时+1 6:分+1 7:秒+1
3.1.2timestamp
oracle中常用的日期类型
与date的区别是不仅保存日期和时间,还能保存小数秒,最高精度可以到ns
数据库内部用7或者11个字节存储,精度为0,用7字节存储,与date功能相同,精度大于0则用11字节存储
格式: 1-7 :和date相同 8-11:纳秒,采用4个字节存储,内部运算类型为整型
3.2日期关键字sysdate
其本质是一个oracle的内部函数,返回当前的系统时间,精确到秒
默认显示格式为dd-mon-rr
3.3日期转换函数
3.3.1to_date
to_date(char[,fmt[,nlparams]]):将字符串按照定制格式转换为日期类型
char:要转换的字符串
fmt:格式
nlsparams:指定的日期语言
SELECT to_date ('2015-02-10:182522','yyyy-mm-dd:hh24miss') FROM dual;
3.3.2to_char
将其他类型的数据转换成字符类型
to_char(date[,fmt[,nlsparams]]):将日期类型数据date按照fmt的格式输出字符串,nlsparams用于指定日期语言
3.4日期常用函数
3.4.1last_day
last_day(date):返回日期date所在月的最后一天
在按照自然月计算某些业务逻辑,或者安排月末周期性活动时很有用处
3.4.2add_months
add_months(date,i):返回日期date加上i个月后的日期值
参数i可以是任何数字,大部分时候去正值整数
如果i是小数,将会被截取整数后再参与运算
如果i是负数,则获得的是减去i个月后的日期值
SELECT add_months(SYSDATE,4) FROM dual;
3.4.3months_between
months_between(date1,date2):计算date1和date2两个日期值质监间隔了多少个月
实际运算是date1-date2,如果date2时间比date1晚,会得到负值
除非两个日期间隔是整数月,否则会得到带小数位的结果,比如计算2009-9-1到2009-10-10之间间隔几个月,会得到1.29个月
3.4.4next_day
next_day(date,char):返回date日期数据的下一个周几,周几是由参数char来决定的
SELECT next_day(SYSDATE,7) FROM dual;
3.4.5least、greatest
比较函数,取最小或最大的一个
SELECT least(SYSDATE,'2017-10-08') FROM dual;
4.3空值函数
4.3.1nvl
nvl(expr1,expr2):将null转变为非null值
如果expr1为null,则取值expr2,expr2是实际值,如果expr1不为null,则实际值为expr1
expr1和expr2可以是任何数据类型,但两个参数的数据类型必须是一致的。
4.3.2nvl2
nvl2(e1,e2,e3):和nvl函数功能类似,都是将null转变为实际值
nvl2用来判断e1是否为null,如果不是null,返回e2,如果是null,返回e3
(三)数据库基础
1.2.7使用any和all条件
all和any不能单独使用,需要配合单行比较操作符>、>=、<、<=一起使用
>any :大于最小
<any:小于最大
>all :大于最大
<all :小于最小
1.2.9 使用disinct过滤重复
数据表中有可能存储相同数据的行,当执行查询操作时,默认情况会显示所有行,不管查询结果是否有重复数据
当重复数据没有实际意义,经常会需要去掉重复值,使用distinct实现
select distinct deptno,job from emp; --此时去掉的是两者组合后的重复值
1.3排序
1.3.1使用order by
对数据按一定规则进行排序操作,使用order by 子句
1.3.2asc和desc
不写asc或desc时,默认是asc,降序排序必须指明
1.3.3多个列排序
当以多列列为排序标准时,首先按照第一列进行操作,如果第一列数据相同,再以第二列排序,以此类推
多列排序时,不管正序还是倒序,每个列需要单独设置排序方式
1.4聚合函数
max、min、avg、sum
1.4.4count
用来计算表中的记录条数
忽略null值
***count不关心给定字段的具体取值,只关心不为null的记录有多少条、count(*)用来统计表中的记录总数
1.4.5聚合函数对空值的处理
聚合函数忽略null值
当emp表中的comm列有null值,比如某新入职员工没有绩效,比较两条语句的结果:
select avg(comm)avg_sal from emp;
select avg(nvl(comm,0)) avg_sal from emp;--将空值替换成0
1.5分组
1.5.1group by 子句
select <*,[alias],...> from table[where condition(s)] [group by group_by_expression] [having group_condition][order by column [asc][desc]];
当希望得到每个部门划分成一个个小组,每个小组中包含一行或多行数据,在每个小组中再使用分组函数进行计算,每组返回一个结果
划分的小组有多少,最终的结果集行数就有多少。
1.5.3having 子句
having子句用来对分组后的结果进一步限制,比如按部门分组后,得到每个部门的最高薪水,可以继续限制输出结果
必须跟在group by 后面,不能单独存在
例:查询每个部门的最高薪水,只有最高薪水大于4000的记录才被输出显示
select deptno,max(sal) max_salfrom emp group by deptno having max(sal)>4000;
此中不能用where,where在group by 之前执行,使用则会出现逻辑错误。
1.6 查询语句执行顺序
查询语句的执行顺序依下列子句次序:
1、from子句:执行顺序为从后往前,从右到左,数据量较少的表尽量放在后面
2、where子句:执行顺序为自上而下,从右到左,将能过滤掉最大数量记录的条件写在where子句的最右
3、group by 执行顺序从左往右分组,最好在group by 前使用where将不需要的记录在group by 再过滤掉
SELECT t.zzjg_dm FROM t_dj_nsrxx t WHERE t.nsrnbm BETWEEN 1000024209 AND 1000044217 GROUP BYt.zzjg_dm HAVING MAX(t.nsrnbm)>1;
2.1.2笛卡尔积
笛卡尔积指做关联操作的每个表的每一行都和其他表的每一行做组合,假设两个表的记录条数分别是X和Y,笛卡尔积将返回X*Y条记录
2.2关联查询
2.2.1内连接
内连接返回所有满足连接条件的记录。
select e.ename,d.dname from emp e ,dept dwhere e.deptno=d.deptno;
SELECT t.zzjg_dm FROM t_dj_nsrxx t WHEREt.nsrnbm BETWEEN 1000024209 AND1000044217 GROUP BY t.zzjg_dm HAVINGMAX(t.nsrnbm)>1;
下面内连接的可读性更好,性能也好
2.2.2外连接
内连接返回满足连接条件的数据记录
有些情况下,需要返回那些不满足连接条件的记录,需要使用外连接
外连接不仅返回满足连接条件的记录,还将返回不满足连接条件的记录
驱动表的概念
select e.name,d.name from emp e ,dept dwhere e.deptno(+)=d.deptno;
其中:(+)在左表示右外连接,(+)在右,表示左外连接。左外连接,将左表中国的记录全部显示出来。
(四)数据库基础2
1.sql高级查询
1.1子查询
1.1.1子查询在where子句中
在select查询中,在where查询条件中的限制条件不是一个确定的值,而是来自与另外一个查询的结果。
为了给查询提供数据而首先执行的查询语句叫做子查询,子查询是嵌入在其他sql语句中的select语句,大部分时候出现在where子句中,子查询嵌入的语句称作主查询或父查询。
主查询可以是select语句,也可以是其他类型的语句比如DML或DDL语句。子查询可以嵌入select、 from 和where子句中
续2:当子查询结果为多行单列时,不能使用=,需要使用in
SELECT t.* FROM t_dm_gy_swjg t WHEREt.swjg_dm =(SELECT a.swjg_dm FROM t_dm_gy_swry a WHEREa.swry_dm='13101070054');
SELECT t.* FROM t_dm_gy_swjg t WHEREt.swjg_dm in(SELECT a.swjg_dm FROM t_dm_gy_swry a WHEREa.swry_dm='13101070054');
续4
在子查询中需要引用到主查询的字段数据,使用exists关键字
exists后边的子查询至少返回一行数据,则整个条件返回true。
select deptno,dname from dept dwhere exists (select * from emp e where d.deptno=e.deptno);
1.1.2子查询在 having子句中
查询列出最低薪水高于部门30的最低薪水的部门信息
select deptno , min(sal) min_sal from empgroup by deptno having min(sal)>(select min(sal) from emp where deptno=30);
1.1.3子查询在from部分
from子句用来指定要查询的表
如果要在一个子查询的结果中继续查询,则子查询出现在from子句中,这个子查询也称作行内视图或者匿名视图
把子查询当做视图对待,当年视图没有名字,只能在当前的sql语句中有效。
1.1.4子查询在select部分
把子查询放在select子句部分,可以认为是外连接的另一种表现形式,使用更灵活
select e.ename,e.sal,(select d.deptno fromdept d where d.deptno=e.deptno) deptno from emp e;
1.2分页查询 Rownum
rownum被称作伪列,用于返回标识行数据顺序的数字
select rownum,wmpno,ename,sal from emp ;
只能从1计数,不能从结果集中直接截取
select rownum,empno,ename,sal from empwhere rownum >=3;
rownum只有在数据取了之后才会被赋值,否则会默认为1,1永远不会大于3
***在编号过程中,不能使用rownum做大于判断,否则查不到结果。
使用分页函数rownum的目的是:当数据量很大时,通过rownum可以只查询有效的数据,减轻了任务。
rownum续1
利用rownum截取结果集中的部分数据,需要用到行内视图
select * from (select rownum rn,e.* fromemp e ) where rn between 8 and 10;
1.2.3分页与order by
分页策略:每次只取一页的数据
按薪水倒序排列,导出结果集中到第8条到第10条的记录
select * from
(
select rownum rn,t.* from (
select empno,ename,sal from emp order by sal desc
) t
) where rn between 8 and 10;
根据要查看的页数,计算起点值((n-1)*pageSize+1)和终点(n*pageSize),替换掉between和and的参数,即得到当前页的记录
1.3decode函数
1.3.1decode函数基本语法
decode(dxpr,serach1,result[,search2,result2...][,default)
decode用于比较参数expr的值,如果匹配到哪一个search条件,就返回对应的result结果。
可以有多组search和result的对应关系,如果任何一个search条件都没有匹配到,则返回最后default 的值
default参数是可选的,如果没有提供default参数值,当没有匹配到时,将返回null
decode基本语法续1
查询职员表,根据职员的职位计算奖励金额,当职位分别是'manager'、'analyst'、'salesman'时,奖励金额分别是薪水的1.2倍,1.1倍,1.05倍,如果不是这三个职位,则奖励金额取薪水值
select ename,job,sal, decode(job,'manager',sal*1.2,'analyst',sal*1.1,'salesman',sal*1.05,sal)bonus fromemp;
decode函数基本语法续2
和decode函数功能相似的由case语句,实现类似于if-else 的操作
select ename,job,sal,case jobwhen 'manager' then sal*1.2 ...
else sal end bonus from emp ;
1.3.2decode函数在分组查询中的应用
按字段内容分组
场景:计算职位的人数,analyst/manager 属于vip ,其余是普通员工operartion,无法用group by 简单实现
select decode(job,'manager','VIP','analyst','VIP','OPREATION')job,cont(1)job_cnt from emp
group by decode(job, manager','VIP','analyst','VIP','OPREATION');
decode函数在分组查询中的应用续1
按字段内容
场景:dept表按“OPERATION”,“ACCOUNTING”,“SALES”排序,无法按照字面数据排序
select deptno,dname,loc fromdept order by decode(dname,‘OPERATION’,‘1’,‘ACCOUTING’,‘2’,‘SALES’,‘3’);
1.4排序函数
1.4.1row_number
row_number() over(partition bycol1 order by col2)
表示根据col1分组,在分组内部根据col2排序
此函数计算的值就表示每组内部排序后的顺序编号,组内连续且唯一
rownum是伪列,row_number功能更强,可以直接从结果集中取出子集
row_number续1
场景:按照部门编码分组显示,每组内按职员编码排序,并赋予组内编码
select deptno,enmae,empno,row_number() over (partition bydeptno order by empno)as emp_id from emp;
注:as可以不加(rank,dense_rank 也一样)
1.4.2排序函数rank
rank()over(partition bycol1 order by col2)
表示根据col1分组,在分组内部根据col2给予等级标识
等级标识即排名,相同的数据返回相同排名
跳跃排序,如果有相同数据,则排名相同,比如并列第二,则两行数据都标记为2,但下一位将是第四名
和row_number的区别是有重复值,而row_number没有
rank续1
场景:按照部门编码分组,同组内按薪水倒序排序,相同薪水则按奖金数正序排序,并给予组内等级,用rank_id表示
select deptno,enmae,salconn,rank()over(partition by deptno order by sal desc,comm)"rank_id"from emp;
1.4.3dense_rank
dense_rank()over(partition bycol1 order by col2)
表示根据col1分组,在分组内部根据col2给予等级标识
即排名,相同的数据返回相同排名
连续排序,如果有并列第二,下一个排序将是三,这一点是和rank的不同,rank是跳跃排序
1.5集合操作
1.5.1union、union all
为了合并多个select语句的结果,可以使用集合操作符,实现集合的并、交、差
集合操作符包括union、union all、intersect、minus
多条作集合的select语句的列的个数和数据类型必须匹配
order by 子句只能放在最后一个查询语句中
集合操作的语法如下:
select statement1 [union|unionall|intersect|minus] select statement2 ;
union、union all续1
用来获取两个或两个以上结果集的并集
union操作符会自动去掉合并后的重复记录
union all 返回两个结果集中的所有行,包括重复的行
union操作符对查询结果排序,union all 不排序
1.5.2intersect
获得两个结果集的交集,只有同时存在于两个结果集中的数据,才被显示输出
使用intersect操作符后的结果集会以第一列的数据作升序排列
显示职位是‘manager’的员工和薪水大于2500的员工的交集
select ename,job,sal from empwhere job=‘manager’ intersect select ename,job,sal from empwhere sal>2500;
1.5.3minus
获取两个结果集的差集
只有在第一个结果集中存在,在第二个结果集中不存在的数据,才能够显示出来,也就是结果集一减去结果集二的结果
列出职位是manager但薪水低于2500的员工记录
select ename,job,sal from empwhere job =‘manager’minus select ename,job,sal from emp where sal>=2500;
1.6高级分组函数
1.6.1rollup
rollup、cube和groupingsets运算符是group by 子句的扩展,可以生成与使用union all来组合单个分组查询时相同的结果集,用来简化和高效的实现统计查询
group by rollup(a,b,c)
group by(a,b)
group by grouping sets((a),(b))
rollup (续1)
假设有表test,有a,b,c,d四个列
select a,b,c ,sum(d) from testgroup by rollup(a,b,c);
等价于:
select a,b,c ,sum(d) from testgroup by a,b,c union all
select a,b,null ,sum(d) from testgroup by a,b union all
select a,null,null ,sum(d) from testgroup by a union all
select null,null,null ,sum(d) from test ;
对rollup的列从右到左以一次少一列的方式进行分组直到所有列都去掉后的分组(也就是全表分组)
对于n个参数的rollup,有n+1次分组
(五)数据库基础3
1.1 视图
1.1.1什么是视图
视图(VIEW)也被称作虚表,即虚拟的表,是一组数据的逻辑表示
视图对应于一条select语句,结果集被赋予一个名字,即视图名字
视图本身并不包含任何数据,它只包含映射到基表的一个查询语句,当基表数据发生变化,视图数据也随之变化
什么是视图(续1)
create [or replace] view view_name[(alias[,alias...])] as subquery;
视图创建后,可以像操作表一样操作视图,主要是查询
subquery是select查询语句,对应的表被称作基表
根据视图所对应的子查询种类分为几种类型
select语句是基于单表建立的,且不包含任何函数运算、表达式或分组函数,叫做简单视图,此时视图是基表的子集
select语句同样是基于单表,但包含了单行函数,表达式、分组函数或group by 子句,叫做复杂视图
select语句是基于多个表的,叫做连接视图
1.1.2视图的作用
如果需要经常执行某项复杂查询,可以基于这个复杂查询建立视图,此后查询此视图即可,简化复杂查询
视图本质上就是一条select语句,所以当访问视图时,只能访问到所对应select语句中涉及到的列,对基表中的其他列起到安全和保密的作用,限制数据访问
视图的作用:重用子查询
1.1.3授权创建视图
创建视图的语句是create view
用户必须有create view 系统权限,才能创建视图
如果没有权限,会提示:权限不足
管理员可以通过DCL语句授予用户创建视图的权限;
Grant create view to rarena;
1.1.4创建简单视图
创建一个简单视图V_EMP_10来显示部门10中的员工的编码、姓名和薪水
create VIEW v_emp_10 as
select empno,ename,sal,deptno from where deptno=10;
查看视图结构:
Desc v_emp_10 ;
创建简单视图(单表)(续1)
创建视图时,给列赋予别名
可以用or replace 短语修改视图对应的SQL查询语句
create or replace VIEW v_emp_10 as
select empno id,ename name,sal salary ,deptnofrom emp where deptno=10;
1.1.5查询视图
查询视图和查询表的操作相同
select * from v_emp_10;
此时视图的列名,和创建视图时的列名一致,不一定是原列名;
select id,name,salay from v_emp_10;
1.1.6对视图进行insert操作
视图本身并不包含数据,只是基表数据的逻辑映射
当对视图执行DML操作时,实际上是对基表的DML操作
对视图执行操作的基本原则:
简单视图能够执行DML操作,下列情况除外:在基表中定义了非空列,但简单视图对应的select语句并没有包含这个非空列,导致这个非空列对视图不可见,这时无法对视图执行insert操作
如果视图定义中包含了函数,表达式,分组语句,distinct关键字或rownum伪列,不允许执行DML操作
DML操作不能违反基表的约束条件
对视图进行insert操作(续1)
对简单视图进行insert操作,成功插入数据到基表中
insert into v_emp_10 values ('1234','doctor',400,10);
简单视图可以通过DML操作影响到基表数据
1.1.7创建具有check option 约束的视图
create [or replace] viewview_name[(alias,[alias...])] as subquery [with check option];
with check option 短语表示,通过视图所做的修改,必须在视图的可见范围内
假设insert,新增的记录在视图仍可查看
假设update,修改后的结果必须能通过视图查看到
假设delete,只能删除现有视图里能查到的记录
创建具有check option 约束的视图(续1)
create or replace view v_emp_10 as
select empno id,ename name,sal salary,deptno from emp where deptno=10wirh check option;
DML操作失败,部门20不在视图可见范围内
insert into v_emp_10 value(1008,'donna',5500,20);
update v_emp_10 set deptno=20 where id=772;
1.1.8创建具有read only 约束的视图
对简单视图进行DML操作是合法的,但是不安全的
如果没有在视图上执行DML操作的必要,在建立视图时声明为只读来避免这种情况,保证视图对应的基表数据不会被非法修改。
create [or replace] view view_name[(alias,[alias,...])] as subquery [with read only];
创建具有read only约束的视图(续1)
create or replace view v_emp_10 as selectempno,ename,sal,deptno from emp where deptno=10
with read only;
对只读视图执行DML操作,失败。
insert into v_emp_10values(1234,'donna',3000,10);
error 位于第1行;
ora-01733:此处不允许虚拟列或:ora-42300:无法对只读视图执行DML操作
1.1.9通过查询user_views获取相关信息
和视图相关的数据字典
user_objects
user_views
user_update_columns
在数据字典user_objects中查询所有视图名称
select object_name from user_objectswhereobject_type='view';
1.1.10创建复杂视图(多表关联)
复杂视图指在子查询中包含了表达式,单行函数或分组函数的视图
必须为子查询中的表达式或函数定义别名
创建一个视图V_emp_salary,把职员表的数据按部门分组,获得每个部门的平均薪水,薪水总和,最高薪水和最低薪水
create view v_emp_salary as
select d.dname,avg(e.sal) avg_sal,sum(e.sal)sum_sal,max(e.sal) max_sal,min(e.sal) min_sal from emp e join dept d one.deptno=d.deptno group b d.name;
创建复杂视图(多表关联)(续1)
查询复杂视图
select * from v_emp_salary;
复杂视图不允许DML操作:因为复杂视图是其他记录的综合结果,如取某个number字段的平均值,若在复杂视图中插入一个平均值,请问哪些字段的平均值,不符合逻辑,而其他的删、改操作与插入雷同,会出现逻辑错误,因此复杂视图不允许DML操作
1.2序列
1.2.1什么是序列
序列(sequence)是一种用来生成唯一数字值的数据库对象
序列的值由oracle程序按递增或递减顺序自动生成,通常用来自动产生表的主键值,是一种高效率获得唯一主键的途径。
序列是独立的数据库对象,和表是独立的对象,序列并不依附于表。
通常情况下,一个序列为一个表提供主键值,但一个序列也可以为多个表提供主键值。
1.2.2创建序列
create sequence[schema.] sequence_name[start with i][increment by j]
[maxvalue m| nomaxvalue ]
[mincaluen|nominvalue]
[cycle|nocycle][cachep|nocache]
sequence_name 是序列号名,将创建在schema方案下
序列的第一个序列值是i,步进j
如果j是正数,表示递增,如果是负数,表示递减
创建序列(续1)
序列可生成的最大值是m,最小值是n
如果没有设置任何可见参数,序列的第一个值是1,步进是1
cycle表示在递增至最大或递减至最小值之后是否继续生成序列号,默认是nocycle
cache用来指定先预取p个数据在缓存中,以提高序列值得生成效率,默认是20
1.2.3使用序列
创建一个序列,起始数据时100,步进是10
当序列被创建后,第一个序列值将是100,将要生成的序列号分别是110,120,130 等
create sequence emp_seq start with 100increment by 10;
使用序列(续1)
序列中有两个伪列
nextval:获取序列的下个值
currval:获取序列的当前值
当序列创建以后,必须先执行一次nextval,之后才能使用currval
获取序列的第一个值,并且使用序列值为emp表插入新的记录
select emp_seq.nextval from dual;
insert into emp (empno,ename) values(emp_seq.nextval,'donna');
使用序列(续2)
查询刚刚生成的记录,主键值将是110
select empno,ename from emp whereename='donna';
此时查询序列的当前值,会得到110数字。
select emp_seq.currval from dual;
在序列中使用过程中,比如执行了一条select emp_seq.nextval from dual 语句,则浪费了一个序列值,会导致表的主键不连续,而currval的使用不会导致序列值得递进。
1.3索引
1.3.1索引的原理
索引是一种允许直接访问数据表中某一数据行的树型结构,为了提高查询效率而引入,是独立于表的对象,可以存放在与表不同的表空间(tablespace)中
索引记录中存有索引关键字和指向表中的数据的指针(地址)
对索引进行的I/O操作比对表进行错啊做要少很多
索引一旦被建立就将被oracle系统自动维护,查询语句中不用指定使用哪个索引
索引是一种提高查询效率的机制
1.3.3创建基于函数的索引
如果需要在empiao的ename列上执行大小写无关搜索,可以在此列上建立一个基于upper函数的索引:
create index emp_ename_upper_idx onemp(upper(ename));
当做下面的查询时,会自动应用刚刚建立的索引:
select * from emp whereupper(ename)='KING';
2约束
2.1约束概述
2.1.1约束的作用
约束(constraint)的全称是约束条件,也称作完整性约束条件
约束是在数据表上强制执行的一些数据校验规则,当执行DML操作时,数据必须符合这些规则如果不符合则无法执行
约束条件可以保证表中数据的完整性,保证数据间的商业逻辑。
2.1.2约束的类型
约束条件包括:
非空约束(not null),简称NN
唯一性约束(unique),简称UK
主键约束(primary key),简称PK
外键约束(foreign key),简称FK
检查约束(check),简称CK
- oracle基础
- Oracle基础
- oracle基础
- Oracle基础
- oracle基础
- Oracle 基础
- oracle 基础
- Oracle基础
- oracle基础
- oracle基础
- oracle基础
- oracle基础
- Oracle 基础
- Oracle基础
- oracle基础
- oracle基础
- Oracle基础
- Oracle基础
- 【PHP高级】Smarty模板二
- jsp 页面 el表达式无法使用
- js 中数据类型和对象的相关
- Android开发之图片处理框架(二)
- 2016CCPC-Fianl宁波流水账
- Oracle基础
- 权限控制
- How to Use Procedure
- 计算机学习的三条主线
- 细数RxBinding的各种优雅响应式绑定
- linux命令行日常系快捷键
- 怎么查看Oracle数据库中的所有用户名
- Java面向对象
- Interlude: Troubleshooting for 'no corresponding BEGIN TRANSACTION'