首页 oracle数据库10G笔记

oracle数据库10G笔记

举报
开通vip

oracle数据库10G笔记PAGE/NUMPAGESPAGE\*MERGEFORMAT66Oracle10G数据库的简介核心知识:SQL语句(不同的数据库,命令不一样,但是,SQL语句一样)Oracle发展史(了解)现在世界上最大的数据提供商,编程语言提供商,应用原件提供商,在数据库领域,等价于微软的存在Oracle在古希腊神话中,是“神谕”的意思,指的是上帝的宠儿;在中国的商周时期,将刻在龟壳上的文字,称为上天的指示,现今被称为叫"甲骨文"Oracle最早起源于IBM的以及技术人员发表的论文叫--“论关系型数据库的发展”...

oracle数据库10G笔记
PAGE/NUMPAGESPAGE\*MERGEFORMAT66Oracle10G数据库的简介核心知识:SQL语句(不同的数据库,命令不一样,但是,SQL语句一样)Oracle发展史(了解)现在世界上最大的数据提供商,编程语言提供商,应用原件提供商,在数据库领域,等价于微软的存在Oracle在古希腊神话中,是“神谕”的意思,指的是上帝的宠儿;在中国的商周时期,将刻在龟壳上的文字,称为上天的指示,现今被称为叫"甲骨文"Oracle最早起源于IBM的以及技术人员发表的论文叫--“论关系型数据库的发展”;然后被oracle公司的老板LarryEllison所发现,进而有了oracle公司Oracle的版本问题:Oracle版本简介大小Oracle8/oracle8ii是internet表示oracle开始向网络发展,但是,8i只是一个过度的版本1CDOracle9i是现在应用比较广泛的版本,可以说是8i的升级版本3CDOracle10G是一个过渡性的产品,G:表示网格计算;简单说就是将周边的区域以网格的方式进行划分,那么,在搜索数据的时候,会以就近方式进行快速搜索(博士课程)700+MOracle11G是一个完成的带有网格计算的新产品,已经投入数用1.8Goracle数据库的安装(必须会)安装前的建议:关闭防火墙,断开互联网安装文件:install文件夹下的setup.exe启动安装程序选择安装路径Next下一步然后会显示当前安装oracle数据库的版本,默认”企业版“即可Next下一步选择默认,下一步看清楚:这里是当前全局数据库的名字与SID一样的同时:点选然后下一步如果没有点选,那么在安装数据库的时候,不会有大数据用户的出现,这个事要做实验用的,必须要有;不选择,就一定没有余下都是默认,直到此图的出现点选“所有账户使用同一个口令”统一使用“orcladmin”不要擅自更改,不要忘记,忘记了,谁也帮不了你余下,next下一步,到下面页面选择“安装”启动安装程序,之后让其自行安装,并且不要做任何的操作,也就是说:点击“安装”按纽是你在安结束装oracle数据库时的最后一个操作,其余所有操作,全部禁止Oracle10G数据库的卸载和配置Oracle数据库的监听SqlPlus命令(重点)Oracle数据库操作住哟啊使用的是命令行方式,而所有的操作都是可以使用sqlplus来完成,可是对于sqlplus有2种形式:一种是dos风格的sqlplus;对应的命令式sqlplus.exe一种是windows风格的,就是带窗口的sqlplus;对应命令sqlplusw.exe在oracle10G之中,2中,是没有什么区别的,但是sqlplus.exe命令,在使用时,是不能自动换行的,所以,经常是用的是sqlplusw.exe。方便视觉效果,看着舒服。注意:这个命令,其本身,对编程是没有任何影响的。虽然sqlplus中也会出现折行的情况,但是,可以使用命令进行修改;还有折页效果,可以通过命令改变:设置每行显示的 记录 混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载 的长度:SETLINESIZE300;//每行300列宽设置每页显示的记录的长度:SETPAGESIZE30;//每页30条记录这2个命令,很多人叫做格式化命令,但是,这种格式化的命令在sqlplus下显示的不是很明显。注意:sqlplusw本身,在窗口显示上,很舒服了,但是在程序的编辑上不是很方便,因为,中间的命令行,一旦书写错误,没有办法使用“方向键”进行移动,在中间修改,必须将其后面的全部删除才可以进行修改在sqlplusw中有ed和@命令,可以进行记事本的调用和执行;使用ed,调用记事本程序:键入:eda此时会有提示,找不到a.sql文件,问是否创建;但是,使用ed命令打开记事本的时候,oracle中的sqlplusw窗口进入到“阻塞状态”,是不可操作,不可编辑的状态使用@,执行记事本上的命令:@a使用外部编译软件,编译sql的命令文件,然后,也是可以使用@命令执行文本的,但是执行的命令,稍有不同如果是一个后缀是.txt的文件,并且在硬盘上:那么必须写上完整的路径@D:/file_name.txt如果文件的后缀是.sql的,则不需要输入文件后缀:@D:/file_name或者键入@D:file_name在一个数据库中,会有许多的用户,每个用户下面,有许多的数据表,查看这个用户下的表:SELECT*FROMtab;查看当前登陆的用户命令:SHOWuser;如果用户输入错误,但是登陆成功了,那么也使可以使用sqlplusw来切换用户的,命令如下:“[]”可选择的操作[ASSYSDBA/SYSOPER]按照超级管理员/普通操作者方式登陆CONN用户名/密码[ASSYSDBA/SYSOPER]例如:CONNsys/orclASSYSDBA;一旦使用了sys登陆,则无法直接查看emp等表,因为emp不是sys用下存储的表,要想访问emp表,则必须使用scott.emp的方式表明访问的是scott这个用户下的emp表Sqlplusw命令窗口也可以调用本机的操作系统命令,使用“host”作为命令前缀HOSTCOPYd:\file_name.sqld:\hello.txt; 总结 初级经济法重点总结下载党员个人总结TXt高中句型全总结.doc高中句型全总结.doc理论力学知识点总结pdf :(重点)oracle数据的安装和卸载Oracle数据库中的四个主要用户:·超级管理员:sys/change_on_install·普通管理员:system/manager·普通用户:scott/tiger·大数据用户:sh/sh-->这个是可以自定义slqplusw中的各种命令监听服务的问题用户的表结构(重要)1.知识点SQL语法的基本格式、简单查询、限定查询、分组统计的使用;Scott用户下的主要的表的结构,需要记下单行函数的使用复习:SELECT*FROMtab;--查看当前用户下的表DESCtable_name;--查查看表结构scott用户的表结构简单查询(重点):简单查询:查询一张表中的所有数据。曾经使用过的查询语句SELECT*FROMemp;这个语句主要指的是:从emp表中查询所有列的数据*占位符,代表emp表中所有的列名该语句属于SQL语句的范围SQL语句:SQL(StructuredQueryLanguage)结构化查询语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。同时也是数据库脚本文件的扩展名。SQL通常用于数据库的通信,ANSI(美国国家标准学会)声明,SQL是关系数据库管理系统(RDBMS指的是关系型数据库管理系统(RelationshipDataBaseManagementSystem))的标准语言。Oracle是全世界最早使用SQL标准语句的数据库产品。SQL功能强大,概括起来,它可以分为以下几组:·DML:数据库操作语言(DataManipulationLanguage)--用于检索或者修改数据(最主要的,面试,笔试,都会被考到)·DDL:数据库定义语言(DataDefinitionLanguage)--用于定义数据的结构,如创建、修改或者删除数据库对象·DCL:数据库控制语言(DataControlLanguage)--用于定义数据库用户的权限语法结构:SELECT[DISTINCT]*|字段[别名][,字段别名]FROM表名称[别名]范例:查询dept表的全部记录SELECT*FROMdept;范例:查询每个雇员的编号,姓名,基本工资·确定数据表的内容:emp:编号,姓名,基本工资SELECTempno,ename,salFROMemp;范例:查询出每个雇员的职位SELECTjobFROMemp;有问题了,查询出的结果存在重复数据,主要原因是现在没有消除掉重复的记录,可以使用DISTINCT消除掉重复的记录SELECTDISTINCTjobFROMemp;重复数据:指的是一行中的每个列的记录都重复,才叫重复数据范例:查询出每个雇员的姓名,职位SELECTename,jobFROMemp;在进行简单查询的操作中,也可以使用各个数学的四则运算的操作符范例:显示每一个雇员的姓名、职位、基本年薪·需要的数据表:emp·emp表要显示的列名称:姓名、职位、年薪=月薪*12SELECTename,job,sal*12FROMemp在上面的范例中,出现了“sal*12”显示的列,此列名不使用于显示列名,那么可以起一个别名。注意:别名不要使用中文,只要是程序的开发都要避免中文(包括数据库开发也是一样)SELECTename,job,sal*12salsFROMemp范例:公司有200元/月饭食补助和100元/月车费补助,请计算年薪·需要的数据表:emp·emp表要显示的列名称:姓名、职位、年薪=(月薪+200+100)*12SELECTename,job,(sal+300)*12salsFROMemp范例:公司每年年底,都会多发放一个月的工资,作为年底奖金,计算年薪·需要的数据表:emp·emp表要显示的列名称:姓名、职位、年薪=(月薪+200+100)*12+salSELECTename,job,(sal+300)*12+salsalsFROMemp在简单查询中,可是使用“||”连接符,来连接查询字段范例:试一试“||”的使用SELECTempno||enameFROMemp;看着很讨厌的,改改SELECTempno||'<===>'||enameFROMemp;由于“,”在数据库中属于原样输出的字符串,所以必须使用“'”单引号括起来即:在SQL中,“'”单引号表示的是字符串范例:要求显示的数据按照如下格式显示:雇员编号是:7369的雇员姓名是:SMITH,基本工资是:800,职位是:CLERK!·使用的数据表:emp·需要显示的列名称:empno、ename、sal、job相当于查找:empno、ename、sal、job字段,并且使用“||”进行连接。SELECT'雇员编号是:'||empno||'的雇员姓名是:'||ename||',基本工资是:'||sal||',职位是:'||job||'!'FROMemp;看着很表头长!,取个别名SELECT'雇员编号是:'||empno||'的雇员姓名是:'||ename||',基本工资是:'||sal||',职位是:'||job||'!'雇员信息FROMemp;一定要记住,别名上的内容部要使用”'“括起来;只有在SELECT子句之中出现的内容,使用"'"单引号。子句:理论上:SELECT之后的语句叫SELECT子句,FROM之后的子句叫FROM子句。这个只是习惯上的称呼,没有什么必然或者定义。限定查询(重点)复习上一堂课的内容:在简单查询中,是将所有的记录进行显示,但是现在可以对显示的记录进行过滤的操作,那么就属于限定查询的范围了。限定查询:就是在简单查询语法的基础上,增加了一个WHERE子句,用于指定限定条件。语法结构:条件(condition)SELECT[DISTINCT]*字段[别名][,字段别名]FROM表名称[别名][WHERE条件(s)]在WHERE子句后可以增加多个条件,最长见的条件就是最基本的关系运算:>、>=、<、<=、=、!=(<>)、BETWEENAND、LIKE、IN、NULL、ISNULL、AND、OR、NOT;8.1关系运算范例:查找基本工资高于1500的所有员工信息·需要的数据表:emp表·需要显示的列名称:emp表的所有信息·条件:sal>1500SELECT*FROMempWHEREsal>1500;范例:查找职位是办事员的员工信息·需要的数据表:emp;·显示的列名称:emp下的所有列名称·条件:job='CLERK'SELECT*FROMempWHEREjob='clerk';结果未选定行--没有返回相应的查询结果!原因:在Oracle数据库中,所有的数据都是区分大小写的,所以job='clerk'没有找到相应结果行所以代码修改如下:SELECT*FROMempWHEREjob='CLERK';以上是单个条件的,也可以同时满足多个条件而多个条件之间可以使用AND或者OR进行连接操作AND多和条件之间全部满足并列存在OR多个条件之间任意满足一个即可任意其中一个范例:查询工资在1500-3000之间的全部员工信息SELECT*FROMempWHEREsal>=1500ANDsal=<3000;范例:查询职位是办事员或者是销售人员的全部员工信息SELECT*FROMempWHEREjob='CLERK'ORjob='SALESMAN';范例:查询职位是办事员或者是销售人员的全部员工信息并且工资大于1200·需要的数据表emp·需要显示的列名称:*·限定条件:(job='CLERK'ORjob='SALSMAN')ANDsal>1200SELECT*FROMempwhere(job='CLERK'ORjob='SALESMAN')ANDsal>1200注意:操作符号本身有优先级别,但是这些优先级,基本上是不会去背诵的,那么就使用“()”去改变运算有优先级别。范例:查询所有不是办事员的员工信息SELECT*FROMempWHEREjob<>'CLERK'SELECT*FROMempWHEREjob!='CLERK'SELECT*FROMempWHERENOTjob='CLERK'8.2范围操作符:BETWEEM....AND...“BETWEEM最小值AND最大值”,表示的是一个范围之间的判断过程范例:查询工资在1500-3000之间的员工信息SELECT*FROMempWHEREsalBETWEEN1500AND3000;范例:上例相反操作SELECT*FROMempWHEREsalNOTBETWEEN1500AND3000;"BETWEEMAND"操作符不仅用于数据,对于日期也能用范例:·查询1981-01-01~1981-12-31这个时间段被雇佣的员工(雇用日期:hierdate)·hiredate字段上的内容可以使用字符串表示:dd-mm月-YYSELECT*FROMempWHEREhierdateBETWEEN'01-1月-1981'AND'01-12月-81'8.3IS(NOT)NULL判断是否为空使用这个语法可以判断某个字段上的内容是否为"null"null和数字0以及空字符串是两个概念。范例:查询所有领取奖金的员工信息SELECT*FROMempWHEREcommISNOTNULL;SELECT*FROMempWHERENOTcommISNULL;范例:查询不需要领取奖金的雇员SELECT*FROMempWHEREcommISNULL;8.4指定范围的操作:IN表示的是一个查询的范围范例:查询雇员编号是7369、7566、7799的雇员信息·如果按照上面讲过的,要使用OR来链接SELECT*FROMempWHEREempno=7369ORempno=7566ORempno=7799;·但是出现问题2条7799不存在·如果使用IN操作符,代码简化了SELECT*FROMempWHEREempnoIN(7369,7566,7799);·与上述效果一样,IN表示指定范围的NOTIN:表述不再指定的范围内SELECT*FROMempWHEREempnoNOTIN(7369,7566,7799);注意:关于NOTIN的问题如果使用IN操作符,查询的范围之中存在了null,是不影响查询的;范例如下:不影响查询结果SELECT*FROMempWHEREempnoIN(7369,7566,null);如果使用NOTIN操作符,查询的范围之中存在了null,则不会有任何的查询结果返回;范例如下:SELECT*FROMempWHEREempnoNOTIN(7369,7566,null);NOTIN中不能出现null,如果出现了null,则表示查询全部数据。8.5模糊查询:LIKE子句LIKE子句的功能是提供模糊查询操作,例如:项目中的搜索操作,都数据LIKE子句的实现,但是必须注意,搜索引擎上的不是LIKE操作。LIKE搜索性能不高的情况下使用的学习LIKE,必须学习的2个匹配符·匹配单个字符:_->1个·匹配任意多个字符:%->0个、1个、多个范例:查询雇员姓名中以字母C开头的全部雇员信息SELECT*FROMempWHEREenameLIKE'C%';范例:查询雇员姓名中第二个字母是C的全部雇员信息SELECT*FROMempWHEREenameLIKE'_C%';范例:查询雇员姓名中带有字母C的全部雇员信息SELECT*FROMempWHEREenameLIKE'%C%';·在这里,也使可以使用NOT求反操作的范例:查询雇员姓名中不带有字母C的全部雇员信息SELECT*FROMempWHEREenameNOTLIKE'%C%';·LIKE子句,除了字符串,其他任意的数据,也是可以的。SELECT*FROMempWHEREenameLIKE'%1%'ORhiredateLIKE'%1%'ORsalLIKE'%1%';·说明:LIKE子句的使用在开发之中,LIKE子句,是必用的,但是使用LIKE子句的时候,需要注意:如果在模糊查询上不设置任何的查询关键字的话('%%'),则表示查询全部记录;这个特点,可以帮助我们在开发的时候,节省很多代码,必须牢记。数据的排序(重点)当数据返回查询结果后,所有数据默认是按照雇员编号排序的也可以使用"ORDERBY"子句进行排序语法如下:SELECT[DISTINCT]*字段[别名][,字段别名]FROM表名称[别名][WHERE条件(s)][ORDERBY字段[ASC|DESC][,字段[ASC|DESC]...]];"ORDERBY"子句,是写在所有SQL语句的最后面的内容对于排序的说明:排序时,可以指定多个排序的字段;排序的方式2种:ASC升序默认的DESC降序用户需要指定序列,从大到小排序范例:查询所有雇员的信息,要求按工资排序SELECT*FROMempORDERBYsal;SELECT*FROMempORDERBYsalASC;范例:查询所有雇员的信息,要求按工资降序排序SELECT*FROMempORDERBYsalDESC;范例:查询所有雇员的信息,按工资由高到低排序,如果工资相同,则按照雇用日期由早到晚排序·此时需要两个字段排序:工资(DESC),雇用日期(ASC);SELECT*FROMempORDERBYsalDESC,hiredateASC;·对于排序操作,只在需要的地方上使用。·"ORDERBY"子句是写在所有的SQL语句的最后的部分。单行函数(重点)10.1字符函数在oracle中,即使要验证字符串,也必须编写完整的SQL语句,所以在ORACLE数据库中,为了简便用户查询,专门提供了一个“dual”虚拟表。UPPER(字符串|列):将输入的字符串变为大写返回;范例:试一试转换大写函数:SELECTUPPER('helloword')hiFROMdual;一般,在用户输入数据的时候,不会去关心数据本身是大写/小写。。。。。SQL>SELECT*FROMempWHEREename=UPPER('&str');输入str的值:smith原值1:SELECT*FROMempWHEREename=UPPER('&str')新值1:SELECT*FROMempWHEREename=UPPER('smith')EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO-----------------------------------------------------------------------------------7369SMITHCLERK790217-12月-8080020如果你输入的数据时小写的,则无法查出数据,所以这个时候不呢过对用户要求过多,但是可以由程序自己去适应,加入UPPER()函数即可。“&”,是sqlplus.exe中代替变量输入的内容,可以去看 课件 超市陈列培训课件免费下载搭石ppt课件免费下载公安保密教育课件下载病媒生物防治课件 可下载高中数学必修四课件打包下载 。LOWER(字符串|列):将输入的字符串变为小写返回;范例:将所有雇员姓名按小写返回SELECTLOWER(ename)enameFROMemp;INITCAP(字符串|列):将开头首字母大写;范例:将所有雇员姓名首字母大写SELECTINITCAP(ename)enameFROMemp;LENGTH(字符串|列):求字符串长度;范例:将所有雇员姓名的长度SELECTLENGTH(ename)enameFROMemp;范例:将所有姓名长度为5的所有雇员信息SELECT*FROMempWHERELENGTH(ename)=5;REPLACE(字符串|列):进行替换;范例:使用“_”替换名字中的所有“A”SELECTREPLACE(ename,'A','_')FROMemp;SUBSTR(字符串|列,开始点[,结束点]):字符串截取;字符串截取操作有两种语法:语法一:SUBSTR(字符串|列,开始点),表示从开始点一直截取到结尾;范例:SELECTename,SUBSTR(ename,3)FROMemp;语法二:SUBSTR(字符串|列,开始点,结束点),表示从开始点截取到结束点,截取部分内容;范例:SELECTename,SUBSTR(ename,0,3)FROMemp;SELECTename,SUBSTR(ename,1,3)FROMemp;范例:要求截取每个雇员姓名的后三个字母SELECTename,SUBSTR(ename,LENGTH(ename)-2)FROMemp;·或者设置负数,表示从后指定截取位置SELECTename,SUBSTR(ename,-3)FROMemp;面试题:问SUBSTR()函数截取的时候下标从0,还是1开始?·在ORACLE数据库中,SUBSTR()函数,从0或1开始,都是一样的;·SUBSTR()函数也可以设置负数,表示由后指定截取的开始点。10.2数字函数数字函数一共有3个:ROUND(数字|列[,保留小数的位数]):四舍五入的操作;TRUNC(数字|列[,保留小数的位数]):舍弃指定位置的内容;MOD(数字1,数字2):取模,取余数;范例:验证ROUND()函数SELECTROUND(805.53567),ROUND(-805.53567),ROUND(-805.53567,2),ROUND(805.53567,-1)FROMdual;范例:验证TRUNC()函数--截取小数点后面所有的位数SELECTTRUNC(805.53567),TRUNC(-805.53567),TRUNC(-805.53567,2),TRUNC(805.53567,-1)FROMdual;范例:验证MOD()函数SELECTMOD(10,3)FROMdual;10.3日期函数学习日期,首先要解决的问题是获取当前的日期,可以使用"SYSDATE";代码如下:SELECTSYSDATEFROMdual;除了获取当前日期外,在日期中,也可以进行若干的运算:·日期+数字=日期,表示若干天之后的日期SELECTSYSDATE+3,SYSDATE+300FROMdual;·日期-数字=日期,表示若干天之前的日期SELECTSYSDATE-3,SYSDATE-300FROMdual;·日期-日期=数字,表示两个日期间天数,但必须是大日期-小日期范例:求出每个雇员到今天为止雇佣的天数SELECTename,hiredate,SYSDATE-hiredateFROMemp;注意:上述公式只有3个,没有日期+日期,它没有代表意义,什么都不是除了上述三个公式外,oracle提供了4个操作函数·LAST_DAY(日期):求出指定日期的最后一天范例:求出本月最后一天的日期SELECTLAST_DAY(SYSDATE)FROMdual;·NEXT_DAY(日期,星期数):求出下一个指定星期X的日期范例:下一个星期一是几号?SELECTNEXT_DAY(SYSDATE,'星期一')dFROMdual;范例:下一个星期二是几号?SELECTNEXT_DAY(SYSDATE,'星期二')dFROMdual;·ADD_MONTHS(日期,数字):求出若干月之后的日期;数字表示的是月;范例:计算出在座各位最晚毕业时间(即找工作的时间)SELECTADD_MONTHS('11-6月-12',2)dFROMdual;·MONTHS_BETWEEN(日期1,日期2):求出两个日期之间所经过的月份范例:计算每个雇员,到今天为止的雇佣月份SELECTename,hiredate,TRUNC(MONTHS_BETWEEN(SYSDATE,hiredate))datesFROMemp;在所有的开发中,如果是日期的操作,建议使用以上的函数,因为这些函数可以避免闰年的问题。10.4转换函数(重点-核心)在oracle数据库中常用的三种数据:·数字(NUMBER)·字符串(VARVHAR2)·日期(DATE)转换函数的主要功能是:完成上述三种数据之间的相互转换的操作一共有三种转换函数:·TO_CHAR(字符串|列,格式字符串):将日期或者数字变为字符串显示·TO_DATE(字符串,格式字符串):将字符串变为DATE显示·TO_NUMBER(字符串):将字符串变为数字显示TO_CHAR()函数范例:使用SYSDATE()显示当前系统时间SELECTSYSDATEFROMdual;这个在oracle数据库中是以“日-月-年”的格式显示的,这个种格式不适用于开发和中国人的想法。这种情况下,可以使用TO_CHAR()函数,但是使用此函数需要一些格式字符串:年(yyyy),月(mm),日(dd)。范例:使用SYSDATE()显示当前系统时间,格式:“年-月-日”SELECTTO_CHAR(SYSDATE,'yyyy-mm-dd')FROMdual;SELECTTO_CHAR(SYSDATE,'yyyy-mm-dd'),TO_CHAR(SYSDATE,'yyyy')y,TO_CHAR(SYSDATE,'mm')m,TO_CHAR(SYSDATE,'dd')dFROMdual;·问题:在这个时候,会有前导“0”的出现,即0302诸如此类·消除0的做法是加入fm,正常是加“0”的SELECTTO_CHAR(SYSDATE,'fmyyyy-mm-dd')FROMdual;·在DATE中,是包含时间的但是,之前的代码没有显示时间,加入时间,就需要增加标记:时(hh),分(mi),秒(ss)SELECTTO_CHAR(SYSDATE,'yyyy-mm-ddhh:mi:ss')FROMdual;问题:显示结果是:2012-03-0203:20:24十二小时制的,在hh后添加24即可SELECTTO_CHAR(SYSDATE,'yyyy-mm-ddhh24:mi:ss')FROMdual;·使用了TO_CHAR()函数后,所有的内容都是字符串不再是DATE行数据了·TO_CHAR()函数也可用于数字的格式化上:此时你遇到的每一个“9”表示一位数字的概念,而不是数字9的概念。SELECTTO_CHAR(85098654132168,'999,999,999,999,999,999')numsFROMdual;·实现效果nums------------------------85,098,654,132,168如果要在数字前面显示货币,那么在形如'999,999,999,999,999,999'前,添加L.L表示Local的含义,表示当前系统语言环境的货币符号。TO_DATE()函数·此函数的主要功能是将一个字符串变为DATE型数据。范例:将字符串'1983-04-07'使用TO_DATE()函数,转换成DATE类型数据SELECTTO_DATE('1983-04-07','yyyy-mm-dd')FROMdual;一般此函数,在更新数据库的时候,使用很多TO_NUMBER()函数将字符串转换成数字,现在使用较少了范例:将字符串'1'使用TO_NUMBER函数,转换成DATE类型数据SELECTTO_NUMBER('1')FROMdual;SELECTTO_NUMBER('1')+TO_NUMBER('5')FROMdual;在oracle中,以上的功能不使用TO_NUMBER()函数,也可以完成,所以基本上TO_NUMBER()函数已经是不考虑了10.5通用函数(重点-核心)通用函数主要有两个:NVL()、DECODE()是oracle的特性函数;NVL()函数,是处理null的范例:查询每个雇员的全部年薪SELECTename,sal,comm,(sal+comm)*12FROMemp;此时,会有null字段出现,原因在于COMM提成字段上为null,要解决,就必须使用NVL()函数进行处理:将null变为0;以上就是NVL()函数的作用。SELECTename,sal,comm,(sal+comm)*12,NVL(comm,0)FROMemp;SELECTename,sal,comm,(sal+NVL(comm,0))*12,NVL(comm,0)FROMemp;DECODE()函数:多数值判断相当于之前java中的if..else..语句,唯一不同的是DECODE()函数判断的是数值,而不是逻辑判断范例:查询全部雇员的职位,但是这些职位要求替换中文显示·CLERK办事员·SALESMAN销售员·MANAGER经理·ANALYST 分析 定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析 员·PRESIDENT总裁以上显示的数据,一定是逐行显示的,所以这个时候就必须采取DECODE()函数,函数语法如下:DECODE(数值|列,判断值1,显示值1,判断值2,显示值2,判断值3,显示值3,。。。)实现上面范例代码如下:SELECTempno,ename,job,DECODE(job,'CLERK','办事员','SALESMAN','销售员')FROMemp;DECODE()函数,在oracle中很具有特点的函数,是一定要会的习题选择部门30中的所有员工列出所有办事员(CLERK)的姓名,编号和部门编号找出佣金高于薪金的雇员找出佣金高于薪金60%的雇员找出部门10中所有经理(MANAGER)和部门20中所有办事员(CLERK)的详细资料。找出部门10中所有经理MANAGER,部门20中所有办事员CLERK,既不是经理又不是办事员但其薪金大于或等于2000的所有雇员的详细信息找出收取佣金的员工的不同工作找出不收取佣金或后去的佣金低于100的员工找出各月倒数第3天受雇的所有员工找出早于12年前受雇的员工以首字母大写的方式显示所有员工的姓名显示正好为5个字符的员工的姓名显示不带有“R”的员工姓名显示所有员工姓名的前三个字符显示所有与昂的姓名,用“a”替换所有“A”显示满10年服务年限的员工的姓名和受雇日期显示员工的详细资料,按姓名排序显示所有员工姓名和受雇日期,根据其服务年限,将最老的员工排在前面显示所有员工的姓名、工作和薪金,按工作的降序排列,若工作相同则按薪金排序显示左右雇员姓名、加入公司的年份和月份,按受雇日期所在月份排序,若月份相同则将最早的员工排在最前面显示在一个月为30填的情况下所有雇员的日薪资,忽略余数找出在(任何年份的)2月受聘的所有雇员计算每个雇员加入公司的天数显示姓名字段的任何位置包含“A”的所有雇员姓名以年月日的方式显示所有雇员的服务年限第一步:求出每个雇员的雇佣年数:被雇佣的总月数/12=年数;第二步:求出月数,以上计算之中被忽略的小数点实际上都是月份,所以直接取余即可第三步:求出天数,最准确的做法是在不超过30天的范围之内求;现在已经知道当前的时间使用SYSDATE取出,而雇佣的日期使用hiredate取出,可是hiredate和SYSDATE之间的差距太大了,所以肯定会有误差,那么就必须想办法将hiredate的日期提升到与SYSDATE差距在30天的范围之内。在之前学习过两个函数:·MONTHS_BETWEEN():求出两个日期间的月数,如果是:MONTHS_BETWEEN(SYSDATE,hiredate)求出的是雇佣日期到今天为止的雇佣月份;·ADD_MONTHS():在一个日期上加入指定的月之后的日期,如果说hiredate+与今天相距的月数=一个新的日期,而且这个新的日期肯定和SYSDATE相距不超过30天。以上的这道程序,属于日期函数的综合应用,本身已经超过了SQL的掌握程度,知道就行了,如果真遇到了这种问题,也轮不到你解决。多表查询(重点)12.1多表查询的介绍12.2多表查询的基本概念·一条SQL语句,从一张表中查询出所需要的内容,叫单表查询。·一条SQL语句,从多张表中查询出所需要的内容,叫多表查询。·多表查询语法如下SELECT[DISTINCT]*字段[别名][,字段别名]FROM表名称[别名],[表名称[别名],.....][WHERE条件(s)]范例:查询雇员表和部门表中的总记录数·可以使用COUNT()函数完成SELECTCOUNT(*)FROMemp;--14条记录SELECTCOUNT(*)FROMdept;--4条记录注意问题:·SELECT*FROM表名;以后是不可以这样写的原因:语句简单,书写方便,属于新人做法(没有任何开发经验的人)如果数据量较大的话,浏览器无法浏览数据,切可能会造成系统死机·SELECTCOUNT(*)FROM表名原因:语句简单,书写方便,有经验的人会做的事情如果数据量较小则可以查询全部数据,如果数据量较大,则不能直接使用SELECT语句查询,这样是稳妥的做法范例:查询雇员表和部门表中的总记录数SQL>SELECTCOUNT(*)FROMemp,dept;COUNT(*)----------56·以上表的数据来自哪里?共计56=员工表的14条记录*部门表的4条记录为什么:是由于数据库的查询机制所决定的。根据上图所示:每条emp的记录,会与dept表的数据匹配4次,所以会有56条数据SQL>SELECT*FROMemp,dept;EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNODEPTNODNAMELOC--------------------------------------------------------------------------------------------7369SMITHCLERK790217-12月-808002010ACCOUNTINGNEWYORK7499ALLENSALESMAN769820-2月-8116003003010ACCOUNTINGNEWYORK7521WARDSALESMAN769822-2月-8112505003010ACCOUNTINGNEWYORK7566JONESMANAGER783902-4月-8129752010ACCOUNTINGNEWYORK7654MARTINSALESMAN769828-9月-81125014003010ACCOUNTINGNEWYORK7698BLAKEMANAGER783901-5月-8128503010ACCOUNTINGNEWYORK7782CLARKMANAGER783909-6月-8124501010ACCOUNTINGNEWYORK7788SCOTTANALYST756619-4月-8730002010ACCOUNTINGNEWYORK7839KINGPRESIDENT17-11月-8150001010ACCOUNTINGNEWYORK7844TURNERSALESMAN769808-9月-81150003010ACCOUNTINGNEWYORK7876ADAMSCLERK778823-5月-8711002010ACCOUNTINGNEWYORK7900JAMESCLERK769803-12月-819503010ACCOUNTINGNEWYORK7902FORDANALYST756603-12月-8130002010ACCOUNTINGNEWYORK7934MILLERCLERK778223-1月-8213001010ACCOUNTINGNEWYORK7369SMITHCLERK790217-12月-808002020RESEARCHDALLAS7499ALLENSALESMAN769820-2月-8116003003020RESEARCHDALLAS7521WARDSALESMAN769822-2月-8112505003020RESEARCHDALLAS7566JONESMANAGER783902-4月-8129752020RESEARCHDALLAS7654MARTINSALESMAN769828-9月-81125014003020RESEARCHDALLAS7698BLAKEMANAGER783901-5月-8128503020RESEARCHDALLAS7782CLARKMANAGER783909-6月-8124501020RESEARCHDALLAS7788SCOTTANALYST756619-4月-8730002020RESEARCHDALLAS7839KINGPRESIDENT17-11月-8150001020RESEARCHDALLAS7844TURNERSALESMAN769808-9月-81150003020RESEARCHDALLAS7876ADAMSCLERK778823-5月-8711002020RESEARCHDALLAS7900JAMESCLERK769803-12月-819503020RESEARCHDALLAS7902FORDANALYST756603-12月-8130002020RESEARCHDALLASEMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNODEPTNODNAMELOC--------------------------------------------------------------------------------------------7934MILLERCLERK778223-1月-8213001020RESEARCHDALLAS7369SMITHCLERK790217-12月-808002030SALESCHICAGO7499ALLENSALESMAN769820-2月-8116003003030SALESCHICAGO7521WARDSALESMAN769822-2月-8112505003030SALESCHICAGO7566JONESMANAGER783902-4月-8129752030SALESCHICAGO7654MARTINSALESMAN769828-9月-81125014003030SALESCHICAGO7698BLAKEMANAGER783901-5月-8128503030SALESCHICAGO7782CLARKMANAGER783909-6月-8124501030SALESCHICAGO7788SCOTTANALYST756619-4月-8730002030SALESCHICAGO7839KINGPRESIDENT17-11月-8150001030SALESCHICAGO7844TURNERSALESMAN769808-9月-81150003030SALESCHICAGO7876ADAMSCLERK778823-5月-8711002030SALESCHICAGO7900JAMESCLERK769803-12月-819503030SALESCHICAGO7902FORDANALYST756603-12月-8130002030SALESCHICAGO7934MILLERCLERK778223-1月-8213001030SALESCHICAGO7369SMITHCLERK790217-12月-808002040OPERATIONSBOSTON7499ALLENSALESMAN769820-2月-8116003003040OPERATIONSBOSTON7521WARDSALESMAN769822-2月-8112505003040OPERATIONSBOSTON7566JONESMANAGER783902-4月-8129752040OPERATIONSBOSTON7654MARTINSALESMAN769828-9月-81125014003040OPERATIONSBOSTON7698BLAKEMANAGER783901-5月-8128503040OPERATIONSBOSTON7782CLARKMANAGER783909-6月-8124501040OPERATIONSBOSTON7788SCOTTANALYST756619-4月-8730002040OPERATIONSBOSTON7839KINGPRESIDENT17-11月-8150001040OPERATIONSBOSTON7844TURNERSALESMAN769808-9月-81150003040OPERATIONSBOSTON7876ADAMSCLERK778823-5月-8711002040OPERATIONSBOSTON7900JAMESCLERK769803-12月-819503040OPERATIONSBOSTONEMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNODEPTNODNAMELOC--------------------------------------------------------------------------------------------7902FORDANALYST756603-12月-8130002040OPERATIONSBOSTON7934MILLERCLERK778223-1月-8213001040OPERATIONSBOSTON在上面的表示中,大家也看见了,这个问题,就叫做笛卡尔积·笛卡尔积:就表示多张表的数据乘积的意思这样的查询结构不是我们所希望的,应该怎么去掉这种笛卡尔积呢?·最简答的方式,就是采用关联字段的方式,那么上面的图就是这样表述的当在多表查询中,不同的表中有了相同的字符按名称的时候,访问这些字段就必须加上表名称,即“表.字段”。SQL>SELECT*FROMemp,dept2WHEREemp.deptno=dept.deptno;EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNODEPTNODNAMELOC--------------------------------------------------------------------------------------------7782CLARKMANAGER783909-6月-8124501010ACCOUNTINGNEWYORK7839KINGPRESIDENT17-11月-8150001010ACCOUNTINGNEWYORK7934MILLERCLERK778223-1月-8213001010ACCOUNTINGNEWYORK7566JONESMANAGER783902-4月-8129752020RESEARCHDALLAS7902FORDANALYST756603-12月-8130002020RESEARCHDALLAS7876ADAMSCLERK778823-5月-8711002020RESEARCHDALLAS7369SMITHCLERK790217-12月-808002020RESEARCHDALLAS7788SCOTTANALYST756619-4月-8730002020RESEARCHDALLAS7521WARDSALESMAN769822-2月-8112505003030SALESCHICAGO7844TURNERSALESMAN769808-9月-81150003030SALESCHICAGO7499ALLENSALESMAN769820-2月-8116003003030SALESCHICAGO7900JAMESCLERK769803-12月-819503030SALESCHICAGO7698BLAKEMANAGER783901-5月-8128503030SALESCHICAGO7654MARTINSALESMAN769828-9月-81125014003030SALESCHICAGO已选择14行。以上数据显示,已经消除了笛卡尔积。现在这个,只是在显示上消除笛卡尔积,而实际上笛卡尔积依然存在。因为数据库放入操作机制就是“逐行的数据的判断”,那么按照这个理解,如果有2张表,数据量都很大,那么使用这个多表查询的性能怎样呢?范例:以大数据量的表为例:SELECTCOUNT(*)FROMsales,costsWHEREsales.prod_id=costs.prod_id;这两只表,即使消除了笛卡尔积的现实,但是其本身也是有笛卡尔积的问题存在,所以最终的查询结果会显示的很慢,甚至是不现实,所以通过这个可以知道,多表查询的性能是很差的(性能差,是有一个前提的:数据量大)所以:在工作中,性能与数据量是成正比的,数据量越大,性能越差SLQServer大概在8000W以上出现性能瓶颈,oracle上亿条,DB2几十亿条数据·在使用多表联合查询的时候,为了防止表名称很长,即可以给表使用别名,可以使用别名.字段名的方式进行列名的现实。范例:SELECT*FROMempe,deptdWHEREe.deptno=d.deptno;范例:查询出每一位雇员的编号、姓名、职位、部门名称、位置·分析上面的例题:确定所要的表:emp:可以查询出编号、姓名、职位dept:部门名称、位置确定关联字段:e.deptno=d.deptno;SELECTe.empno,e.ename,e.job,d.dname,d.locFROMempe,deptdWHEREe.deptno=d.deptno;范例:查询出每一位雇员的姓名、职位、领导的姓名分析:从上面的表中可以看出,满足查询条件要准备2张emp表,形如这样的emp表关联自己表的叫做自身关联。分析如下:确定所需要的数据表Emp(雇员):能取得雇员的姓名,职位,领导编号Emp(领导):能取得雇员的姓名(领导的姓名)确定关联字段emp.mgr=memp.empno(雇员的领导编号=领导(雇员)的雇员编号)第一步:查询每一位雇员的姓名和职位,领导的编号SELECTe.ename,e.job,e.mgrFROMempe第二步:查询领导信息,加入自身关联SELECTe.ename,e.job,m.enamemgrFROMempe,empmWHEREe.mgr=m.empno;此时查询结果缺少了“king”的记录,因为king没有领导,要解决,那么就需要使用左右链接查询。范例:查询每个雇员的编号、姓名、基本工资、领导的姓名、部门名称及位置。·确定所需要的数据表:emp表:每个雇员的编号、姓名、基本工资、职位emp表(领导):领导的姓名dept表:部门的名称和位置·确定已知的关联字段:雇员和部门:emp.deptno=dept.deptno雇员和领导:emp.mgr=memp.empno第一步:查询
本文档为【oracle数据库10G笔记】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
机构认证用户
夕夕资料
拥有专业强大的教研实力和完善的师资团队,专注为用户提供合同简历、论文写作、PPT设计、计划书、策划案、各类模板等,同时素材和资料部分来自网络,仅供参考.
格式:doc
大小:1MB
软件:Word
页数:0
分类:互联网
上传时间:2021-05-21
浏览量:4