Oracle
Posted 懒蛋。
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle相关的知识,希望对你有一定的参考价值。
Oracle
更改时间:
- 2017-10-25 - 21:33:49
- 2017-10-26 - 11:43:19
- 2017-10-27 - 19:06:57
- 2017-10-28 - 15:21:47
- 2017-10-30 - 21:43:21
- 2017-11-01 - 20:51:07
今天开始接触oracle,2017-10-25 - 08:48:06,以下内容是记录自己的学习过程,也是oracle的自学笔记吧,感觉可以的给个赞哦,如果不对的地方请及时指出来 ,谢谢~~
这是我自己创建的表
1 -------------------------------------------------------- 2 -- 文件已创建 - 星期五-十月-27-2017 3 -------------------------------------------------------- 4 -------------------------------------------------------- 5 -- DDL for Table FRR 6 -------------------------------------------------------- 7 8 CREATE TABLE "SYSTEM"."FRR" 9 ( "ID" NUMBER(10,0), 10 "NAME" VARCHAR2(20 BYTE), 11 "MONEY" NUMBER(20,0), 12 "TIME" DATE 13 ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 14 NOCOMPRESS LOGGING 15 STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 16 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 17 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) 18 TABLESPACE "SYSTEM" ; 19 REM INSERTING into SYSTEM.FRR 20 SET DEFINE OFF; 21 Insert into SYSTEM.FRR (ID,NAME,MONEY,TIME) values (1,\'纯菜鸟\',100,to_date(\'25-10月-17\',\'DD-MON-RR\')); 22 Insert into SYSTEM.FRR (ID,NAME,MONEY,TIME) values (2,\'懒蛋 23 \',null,to_date(\'25-10月-17\',\'DD-MON-RR\')); 24 Insert into SYSTEM.FRR (ID,NAME,MONEY,TIME) values (3,\'纯菜鸟\',100,to_date(\'25-10月-17\',\'DD-MON-RR\')); 25 Insert into SYSTEM.FRR (ID,NAME,MONEY,TIME) values (6,null,null,null); 26 Insert into SYSTEM.FRR (ID,NAME,MONEY,TIME) values (5,\'期_待\',666,to_date(\'21-10月-14\',\'DD-MON-RR\')); 27 Insert into SYSTEM.FRR (ID,NAME,MONEY,TIME) values (555,\'null\',555,null);
- 使用的数据库是12c 版本的,
- select sysdate from dual; 查询现在的年份及时间
- 导入sql 文件, @d:/file.sql ; 就可以导入指定目录路径下的sql文件
-
- sql 语句分为
- DML:数据操纵语言:包括sql 的增删改查
- DDL:数据定义语言:用于定义数据库的结构,比如:创建表,更改表结构,删除表,建立索引。删除索引等。
- DCL:数据控制语言:是用来控制数据库的访问:包括授予与撤销访问权限,提交事务以及回滚事务,设置保存点等
- desc tableName;查看表的列的信息
- select * from user_tables; 查看自己用户下的所有的表的视图;
select :查询关键字
- select * from tableName;从指定的tableName 表中查询全部的信息出来,* 表示全部。 frr表是自己创建的
- select id from tableName;从制定的tableName表中查询指定的列,相较于上一个命令,这个的查询结果只显示了需要的列,指定的列名必须存在于表中,desc tableName可查看表列信息
- sql 语言的大小写不敏感,sql语句可以分行来写,
- 关键字不能被缩写,也不能分行写,大小写不敏感
- 计算符号 + - * / 可用于类型为number 的列值 和 类型为date 的列值
- 表的信息
- 可以进行计算数字的运算结果,dual是一个伪表
- 时间的计算使用:
- y年
- M月
- d日
- H 时在一天中的
- m分
- s秒
- 下列中的时间的格式中的 MI和MM的区别
- MI是在现在的实时时间上加上指定的时间
- MM是表示月份与java中的时间有些差别
- date函数的乘法和除法运算是无效的
-
定义空值 null,凡是与空值参与的运算结果都为空,null不是0或者空格
-
查询frr表,id为2 的懒蛋用户的money字段为空
进行第二个命令 :select name,money,money*2 from frr; 可见懒蛋用户的计算结果也为null,
-
为列名起别名。别名就是在家老爸老妈叫你的小名儿,为了方便我们可以为任何想改变的字段的名起一个小名儿。
- 查询frr表,select id,name,money,time from frr;,所查询出来的表的字段默认为大写形式,
- 再次查询此表,用别名的方式查询,在查询的时候可以使用as关键字来指定列的别名,也可以忽略使用as不影响,查询出来的列名默认为大写,如果想使用小写来显示,那么把别名用双引号引起来即可,如果两个单词想表示一个列的列名,那么使用双引号引起来一样有效,如下图
- 连接符: ||, select name ||\'的出生日期是 :\' ||time from frr;
- 去除重复的内容:distinct,distinct必须放在最开头
- 查询frr表,表中有两id,名字一样的名为 纯菜鸟的 行信息
- 根据名字去重
- 有时候也会根据多个字段一起来判断重复的行进行去重
where条件查询: 在查找信息内容的时候可以用where进行条件的筛选
现在表中的信息的情况如下
我们将money等于100的查询出来:select * from frr where money = 100;where 关键字后面是跟的查询的条件
具体的查询的条件的符号以及意思如下
再查询money等于空值的信息:select * from frr where money = null ;这么进行查询的是不会的到结果的,因为这样查询的意思不是在判断是否为空值,如果此字段为空的话用 is 关 键字,下图第一个查询是没有结果的,执行的是第二个查询出来的“懒蛋”
where条件为字符或者日期格式的 ,需要用单引号引起来,单引号中严格区分大小写
查询money字段大于100 小于10000的人的信息:select * from frr where money>100 and money <10000; 在这 新关键字 and 代表并列的一起,代表所查询的值的区间是大于100 与 小于10000的
其他的比较运算符的关键字
between--and--:查询money在100 与 10000之间的人的信息:select * from frr where money between 100 and 10000;,对照上一个查询就可以看出来,between-and 包含临界值
in:查询money等于100 与等于1000的人的信息:
方法一:select * from frr where money =100 or money =1000; 这里我们使用了 or 关键字,区别与上述的 and 关键字,or 关键字是或者的意思,意思就是,满足等于100 或者 满足 等于1000都会被 查询到
方法二: 这里我们是用的in关键字,作用跟or关键字查询结果一样,但是in关键字不可以取一个范围的值,
like:用于模糊查询的关键字,
查询名字中带有“纯”字的人的信息出来:在图中的两种方式的出现的% 与 _ 做一下说明,%就是代表任意数量的字符,而_ 只代表一位字符,
select * from frr where name like \'%纯%\';
select * from frr where name like \'纯__\';
如果我们想查询名字中带有 _ 得人的名字,
select * from frr where name like \'%_%\'; 这样会把所有人的名字全部查询出来,这时候_也是会被当做成任意一位的字符处理,显示结果如下
正确姿势: select * from frr where name like \'%/_%\' escape \'/\'; escape 关键字规定的后面单引号中的内容为转移符,在这里 / 被定义为转移符,\'%/_%\' 中 转移符/ 后的_ 就会被当作为一个普通的 字符进行处理
order by: 用来排序的,可以按照不同的列名进行升序与降序的排序,asc 从小到大,desc 从大到小,默认为asc
select * from frr order by money asc;
select * from frr order by money desc;
。。
我们看到按照money排序后,出现两个money为100的,我们需要再次根据id从大到小排序的话,我们只需要在后面进行添加需要排序的字段以及对应的排序规则即可
select * from frr order by money desc,id desc;
函数
大小写控制函数 : lower , upper , initcap,从下面就可以看出三个函数的功能
lower:将大写字母全部转换为小写字母
upper:将小写字母全部转换成大写字母
initcap:将每个单词的首字母进行转换大写处理
如果我们不知道查询的用户的名字或者其他信息的大小写状态的话,我们可以将名字全部转换成大小写,然后去判断即可
字符控制函数:
concat(\'str1\',\'str2\'):就是把两个字符串str1 和 str2 拼接在一起
substr(\'str1\',1,5):从字符串str1 的第一位开始,输出五位字符
select concat(\'Qidai\',\' in Oracle\'),substr(\'Qidai in Oracle\',1,7) from dual;
length(\'str1\'):返回str1 的长度
instr(\'str1\',\'w\'):返回字母w 在str1 中首次出现的位置
select length(\'Qidai in Oracle\'),instr(\'Qidai in Oracle\',\'i\') from dual;
lpad(\'str1\',10,\'-\'):以十个字符位置显示str1,不够的用 "-" 左补齐,str1 超出的话,只显示str1 前十位
rpad(\'str1\',10,\'-\'):以十个字符位置显示str1,不够的用 "-" 右补齐,str1 超出的话,只显示str1 前十位
select lpad(\'Qidai\',10,\'-\'),rpad(\'Qidai\',10,\'-\') from dual;
trim(\'d\' from \'str1 \'): 将d 从str1 中去除掉,只去除首尾的指定字母,如下图中首尾已经将指定的字母去掉,而中间的字母没有去掉,
replace(\'str1\',\'s\',\'r\'):将str1 中的 指定字母s 全部替换成 指定字母 r,
select trim(\'d\' from \'dddQdidaiddd\'),replace(\'dddQdidaiddd\',\'d\',\'r\') from dual;
数字函数
round(num1,num2): 将num1 按照num2 的保留位数四舍五入
select round(53.444,2),round(53.444),round(53.444,-1) from dual;
round(53.444,2) 安四舍五入 保留两位小数
round(53.444) 不写保留位数的话,默认为0,所以它会先按一位小数进行四舍五入 : 例 round(53.544) = 54 即 53.5 四舍五入为54.0
round(53.444,-1) 参数为负数的话,就是在小数点右边进行按参数位的四舍五入操作:例 round(55.444,-1) = 60 即 55 四舍五入
trunc(num1,num2):按照参数num2 的指定位数进行对num1 的截断,不进行四舍五入操作
select trunc(53.444,2), trunc(53.544),trunc(55.544,-1) from dual;所有操作区别与上一个函数round,此函数直接截断,
mod 求余函数,下表中,10/2=5是没有余数的,所以为0 , 10/3=3 余1,所以 结果为1
日期函数
months_between:计算两个日期的相差的月份 :id 为5 的创建时间为 14年-10 月-21号
select trunc(months_between(sysdate,time)) from frr where id = 5 ; 先进行函数的运算,然后用trunc去截断,取出整数
add_months(date,number):在指定日期上加上number 个月份,上面在运算符的时候,有提到不用函数进行日期的运算
select sysdate ,add_months(sysdate,2) from dual; 查询结果为:当前日期,,已经处理过的当前日期
next_day(date,\'星期几\') :结果为指定date日期上的 下一个指定星期几,
select next_day(sysdate,\'星期六\') from dual;指定当前日期的下一个周六是几号
last_day(sysdate) :本月的最后一天
select LAST_DAY(SYSDATE) from dual;
对于时间的 trunc 和 round:结果为 当前时间,按月进行四舍五入,按小时进行四舍五入,按月进行截断,按小时进行截断。
select to_char(sysdate,\'yyyy-mm-dd HH:MI:SS\'),round(sysdate,\'mm\'), round(sysdate,\'hh\'),trunc(sysdate,\'mm\'),trunc(sysdate,\'hh\') from dual;
转换函数.重点
涉及到数据类型的转换,
从上图可以看出来Oracle会自动完成上述的类型的相互转换 date <> varcahar2 or char <> number 这一类关系
select 12 + \'2\' ,sysdate + \'2\' ,sysdate from dual; 从结果也可以看出来,Oracle会帮我们自动的做转换,这里区别与java中的 + ,如果想做连接操作可以使用 || 或者使用concat 函数来进行连接操作
但是往往有时候有些运算用隐式转换不能够处理好问题 , 例 : 12,312,323.22 + 2 这个运算,Oracle会以 “,” 为分割看成三列,只有最后一列与2 做运算
select 12,312,323.22 + 2 from dual;
这时候我们就要进行将这一串数字进行显示的转换后进行运算了,
从上图中我们可以看出,将char类型或者varchar类型的哪来举例子,char 可以 通过 to_number 转换成 number类型。number 类型也可以通过to_char来转换回来,char类型通过to_date转换成日期类 型,日期类型也可以通过to_char再次转换回去
数字到字符的转换:select to_char(1232123.3126,\'999,999,999.999\') from dual; 从图中可以看出来,把数字按照指定格式进行了输入,会自动进行四舍五入操作,
数字到字符的转换:select to_char(1213.1,\'$999,999,999.999\'),to_char(1213.1,\'L000,000,000.000\') from dual;如下图,可以进行加入美元符。也可以用L来表示当地的货币符号,这里使用0来进行 格式化数字,不满的数字位数都进行补零操作。
字符到数字的转换:select to_number(\'¥000,001,213.100\',\'L000,000,000.000\'), to_number(\'$000,001,213.100\',\'$999,999,999.999\') from dual;需要注意的是互相转换的符号必须一致,在这里就可以 解决上述隐式转换出现的问题了,
实例问题:需求我们输出 2017年10月27日,这时候直接使用 select to_char(sysdate,\'yyyy年\') from dual;就会出错
我们操作这个问题的时候,需要用双引号来引起“年”,就可以解决问题
通用函数
NVL(s1,s2):如果s1不为空就使用s1,如果为空就用s2代替,将空值转换成一个已知的值,可以使用的数据类型有:日期,字符,数字,
我们看到下列中的id为2 的money为空。select * from frr;
所以与空值运算的结果为空 select id,name,money,money*2 from frr;,所以下图中的 money*2 就为空,
但是有时候我们希望没有值的会给一个默认值代替这个null值,所以我们就可以用到了NVL 函数
select id,name,money,nvl(money,0) from frr; 图中money为空,我们就用0代替了null 了
但是我们想用字符去代替就会出错了 : select id,name,money,nvl(money,\'穷鬼\')from frr;,因为money是number类型的,两个参数间替换的话会出现不兼容的情况,所以会出现错误
我们可以把他转换成char类型的再去替换就好了,select id,name,money,nvl(to_char(money),\'穷鬼\')from frr; 在这也可以看出函数是可以嵌套使用的
NVL2(s1 , s2 , s3):当s1参数不为 null 的话返回 s2参数的值,为null 的话返回s3 参数的值,下面查询 如果frr表中的 money为空的话返回没钱,不为空的话返回有钱和具体的钱的金额数量,相当于Java中 的: s1 ? s2 : s3
select id ,name ,money,nvl2(to_char(money),concat(\'有钱:\',money),\'没钱\') from frr;
NULLIF(s1 , s2) : 相等返回 null,不相等返回 s1,
我们查出表中的id 为 555的用户如下
从图中看出id 与 money相等,id与名字不相等,我们使用函数查询:select nullif(id,money),nullif(to_char(id),name) from frr where id =555; 图中就能看出此函数的效果
COALESCE(s1 , s2 , s3...):相较于nvl优点是可以处理多个表达式的值,如果s1 为空 返回s2,s2 为空返回s3,以此类推
我们查看表中id 为6 的用户,只有id 有值,其余字段全部为空 :查询的时候注意参数要全部类型一致。
select COALESCE(to_char(name),to_char(money),to_char(time),to_char(id)),COALESCE(name,to_char(money),to_char(sysdate),to_char(id)) from frr where id =6;
从图中第二个查询表达式来看,他并没有返回id,而是返回的现在时间,就能显示出函数的作用了
条件表达式
case表达式语法格式:
frr表中有四个不同的money的值 分别为:100,555,666 和null ,我们来用case表达式来进行演示。当money=100的时候输出一百块,等于666的时候输出六六六,等于555的时候输出呜呜呜,其他的值 直接输出西北风!!这个case函数有点类似于java中的switch
select id,name,money,case money when 100 then \'一百块\'
when 666 then \'六六六\'
when 555 then \'呜呜呜\'
else \'西北风\'
end
from frr ;
图中标注的end为结束符,case 后面可以跟一个变量或者常量数字
decode表达式语法格式
decode表达式与case 比较类似,只是去掉了一些关键字,查询跟case中相同:当money=100的时候输出一百块,等于666的时候输出六六六,等于555的时候输出呜呜呜,其他的值直接输出西北 风!!
select id,name,money,decode(money,100,\'一百块\',
666,\'六六六\',
555,\'呜呜呜\',
\'西北风\')
from frr;
decode表达式相较于case表达式,decode使用小括号来开始和结束表达式,而且必须带有逗号加以分割,而case 则是用关键字来分割条件的。
多表查询
建表语句
1 --建表 2 --student表+注释 3 create table student( 4 sno varchar2(3) not null, 5 sname varchar2(9) not null, 6 ssex varchar2(3) not null, 7 sbirthday date, 8 sclass varchar2(5), 9 constraint pk_student primary key(sno) 10 ); 11 comment on column student.sno is \'学号(主键)\'; 12 comment on column student.sname is \'学生姓名\'; 13 comment on column student.ssex is \'学生性别\'; 14 comment on column student.sbirthday is \'学生出生年月日\'; 15 comment on column student.sclass is \'学生所在班级\'; 16 --course表+注释 17 create table course( 18 cno varchar2(5) not null, 19 cname varchar2(15) not null, 20 tno varchar2(3) not null, 21 constraint pk_course primary key(cno) 22 ); 23 comment on column course.cno is \'课程编号(主键)\'; 24 comment on column course.cname is \'课程名称\'; 25 comment on column course.tno is \'教工编号(外键)\'; 26 --score表+注释 27 create table score( 28 sno varchar2(3) not null, 29 cno varchar2(5) not null, 30 degree number(4,1), 31 constraint pk_score primary key(sno,cno) 32 ); 33 comment on column score.sno is \'学号(主键)\'; 34 comment on column score.cno is \'课程编号(主键)\'; 35 comment on column score.degree is \'成绩\'; 36 --teacher表+注释 37 create table teacher( 38 tno varchar2(3) not null, 39 tname varchar2(9) not null, 40 tsex varchar2(3) not null, 41 tbirthday date, 42 prof varchar2(9), 43 depart varchar2(15) not null, 44 constraint pk_teacher primary key(tno) 45 ); 46 comment on column teacher.tno is \'教工编号(主键)\'; 47 comment on column teacher.tname is \'教工姓名\'; 48 comment on column teacher.tsex is \'教工性别\'; 49 comment on column teacher.tbirthday is \'教工出生年月\'; 50 comment on column teacher.prof is \'职称\'; 51 comment on column teacher.depart is \'教工所在单位\'; 52 --添加外键 53 alter table course add constraint fk_tno foreign key(tno) 以上是关于Oracle的主要内容,如果未能解决你的问题,请参考以下文章Client / Server Interoperability Support Matrix for Different Oracle Versions (Doc ID 207303.1)(代码片段
Oracle 数据库 - 使用UEStudio修改dmp文件版本号,解决imp命令恢复的数据库与dmp本地文件版本号不匹配导致的导入失败问题,“ORACLE error 12547”问题处理(代码片段
续:纠正:ubuntu7.04可以安装,而且完美的安装 ! for《Oracle-10.2.0.1,打补丁10.2.0.5:在 debian 版本4不含4以上,及 ubuntu 7.04不含(代码片段