首页 oracle最全面的错误疑难解决方法跟总结文档

oracle最全面的错误疑难解决方法跟总结文档

举报
开通vip

oracle最全面的错误疑难解决方法跟总结文档Ⅰ.oracleitcast本文档对应程序在myeclipse的jdbc/src/下Oracle安装自动生成sys用户和system用户sys超级用户具有最高权限具有sysDBA角色,有createdatabase权限该用户默认密码是change_in_installsystem管理操作员权限也比较大,具有sysoper角色,没有createdatabase权限。该用户默认密码是manager这是通过sqlplus客户端连接数据库时有多个实例采用下面DOS命令:sqlplusscott/tiger@zhulin见2...

oracle最全面的错误疑难解决方法跟总结文档
Ⅰ.oracleitcast本文档对应程序在myeclipse的jdbc/src/下Oracle安装自动生成sys用户和system用户sys超级用户具有最高权限具有sysDBA角色,有createdatabase权限该用户默认密码是change_in_installsystem管理操作员权限也比较大,具有sysoper角色,没有createdatabase权限。该用户默认密码是manager这是通过sqlplus客户端连接数据库时有多个实例采用下面DOS命令:sqlplusscott/tiger@zhulin见2.13oracle创建数据库实例启动sqlplus,然后登陆数据库出现错误:TNS: 协议 离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载 适配器错误原因有3个:1.监听服务没有启动:services.msc或开始—>程序—>管理工具—>服务,打开服务面板:启动oraclehome92TNSlistener服务2.databaseinstance没有启动:services.msc或开始—>程序—>管理工具—>服务启动oralceserviceXXX,XXX就是你databaseSID如zhulin3.注册 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 问题:regedit.msc进入HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraDb11g_home1下的ORACLE_SID值修改为zhulin你的全局数据库名字你的数据库SID即可。ORACLE用SYS和SYSTEM默认密码登录提示ORA-01017:invalidusername/password;logonddenied该怎么解决?解决办法:有可能是你在建数据库的时候,修改了默认的密码而自己又忘记你可再重新修改过来sqlplus/assysdbaalterusersystemidentifiedbymanager;alterusersysidentifiedbymanager;或者改成其他的你自己容易记住的默认scott用户密码是tiger1.oralce解锁步骤先使用system登录然后输入alteruserscottaccountunlock;//解锁scott账号SQL语句必须带分号!!!!!!!!!!!!!最好都分号结束2.oralce开发工具sqlpulsw和sqlus工具在开始→程序→oracleoradb_home10g→applicationdevelopment→sqlplus或在运行栏输入sqlpluspl/sqldeveloper这款软件用的很多第三方软件需要单独安装企业管理器(web)首先保证相关服务启动即oracleDBconsole+实例名启动在浏览器中输入http://ip:1158//emip是指你的具体ip地址或者你的机器名1158是端口一般情况下这个服务是不启动很不安全3.oracle常用sqlplus命令(1)请使用scott用户登录oracle数据库实例,然后切换为身份为system简单使用conn用户名/密码登录后,使用conn[ect]用户名/密码@网络[assysdba/sysoper](2)showuser显示当前用户名(3)断开连接disc[onnect](4)exit断开连接和退出sqlplus窗口(5)修改密码(前提是system或sys用户)passw[ord]基本用法password用户名如果给自己修改密码则可以不带用户名如果给别人修改密码则需要带用户名(6)&交互命令可以替代变量的值select*fromempwherejob=”&job”;(7)edit用于编辑脚本(文本)SQL>editd:\(8)spool把屏幕上显示的记录,保存到文件中spoolonspoold:/bak.sql查询语句spooloff(9)linesize用户控制每行显示多少个字符,默认80个字符每次都要重新设置基本用法:setlinesize120(10)pagesize用于每页显示多少行基本用法:setpagesize1004.oracle用户管理(1)创建用户只有具有DBA权限才能创建比如systemsys基本用法:createuser用户名identifiedby密码举例:createuserxiaoqiangidentifiedbyhao200881037[oracle要求用户密码不能用数字开头]后面我将密码修改为了200881037?为什么创建的用户无法登陆这是因为oracle刚刚创建的用户是没有任何权限,需要管理员给用户分配适应的权限,才能够登陆grantcreatesessiontoxiaoqiang//会话权限(1)权限系统权限:和数据库管理相关的权限:createsession;createtable;createindex;createview;createsequence;createtrigger对象权限:和用户操作数据对象相关的权限:update;insert;delete;select(2)角色预定义角色:把常用的权限集中起来,形成角色(套餐)比如dbaconnectresource三种角色自定义角色:自己定义套餐(3)方案(schema)在一个数据库实例下:当一个用户,创建好后,如果该用户创建了任意一个数据对象(表或触发器等),这时我们的DBMS就会创建一个对应的方案与该用户对应,并且该方案名字和用户名一致。小技巧:如果希望看到某个用户的方案的数据对象,可以使用PL/SQLdeveloper工具案例1:完成一个功能;让xiaoqiang用户去查询scott的emp表步骤1:先用scott登录connscott/tiger步骤2:在scott账号上给xiaoqiang赋权限grantselect[update|delete|insert|all]onemptoxiaoqiang这里就可以看出来方案A和方案B可以有相同名的数据库,但是方案A中不可以有相同名的数据库步骤3:登录xiaoqiang用户去查询emp表错误用法:select*fromemp原因是在xiaoqiang登录状态下需要制定emp表来自哪里?正确用法:select*fromscott.emp;查询时如果查询其他方案一定要用带上其他方案名。如果不带,就默认是select*fromxiaoqiang.emp案例2:完成一个功能想办法将xiaoqiang拥有的对scott.emp的权限转给stu用户。scott—>xiaoqiang—>stu[权限转移]connscott/tiger;grantallonscott.emptostuwithgrantoption;//withgrantoption对象权限表示得到权限的用户可以把权限继续分配//withadminoption系统权限如果是系统权限,则带withadminiption创建了普通账户xiaoqiang密码hao200881037修改密码(前提是system或sys用户)passw[ord]基本用法password用户名如果给自己修改密码则可以不带用户名如果给别人修改密码则需要带用户名表空间:表存在的空间,一个表空间就是指向具体的数据文件(4)用户管理的综合案例创建的新用户是没有任何权限的,甚至连登录(会话)的数据库的权限都没有,需要为其指定响应的权限,给一个用户赋权限使用命令grant,回收权限revokegrant权限/角色to用户(1)使用system创建xiaoqiang后面我将密码修改为了200881037(2)使用system给小红分配2个常用角色grantconnecttoxiaoqianggrantresourcetoxiaoqiangdisconn//切断连接(3)让xiaoqiang登录connxiaoqiang/200881037(4)xiaoqiang修改密码pasw[ord]xiaoqiang即可然要求你输入旧密码当然超级管理员不需要输入旧密码(5)xiaohong创建一张最简单的表(6)使用system登录,然后回收角色。revokeconnectfromxiaoqiangrevokeresourcefromxiaoqiang(7)删除xiaoqiang用户:dropuser用户名[cascade]☞当我们删除一个用户的时候,若这个用户自己已经创建了数据对象(表、触发器等),需要加选项cascade表示把这个用户删除同时,把该用户创建的数据对象一并删除。否则无法删除该用户,oracle用户认为删除了该用户就彻底抛弃了(5)账号锁定使用profile管理用户口令,账号锁定指用户登录时最多可以输入密码的次数,也可以指定用户锁定的时间(天)一般用DBA的身份去执行该命令。profile文件[规则]eg:createprofilelock_accountlimitfailed_login_attempts3paswword_lock_time2;alteruserteaprofilelock_account;//其中lock_account是文件名(6)账号解锁alteruser用户名accountunlock;(7)终止口令eg:给tea创建一个profile文件,要求该用户每隔10天必须修改自家的登录密码,款限期为2天。createprofilemyprofilelimitpassword_life_time10password_grace_time2;//可以继续加限制条件alteruserteaprofilemyprofile;(8)删除profile文件当不需要某个profile文件时,可以删除该文件。dropprofileprofile文件名。5.oracle数据库启动 流程 快递问题件怎么处理流程河南自建厂房流程下载关于规范招聘需求审批流程制作流程表下载邮件下载流程设计 oracle可以通过命令行的方式启动,我们看看具体如何操作:windows下:(1)lsnrctlstart(启动监听)(2)oradim–startup–sid数据库实例名linux下:(1)lsnrctlstart(启动监听)(2)sqlplussys/chang_on_installassysdba(以sysdba身份登录)sqlplus/nologconnsys/chang_on_installassysdba(3)startup6.oracle登录认证方式oracle在windows和linux下是不完全相同的:windows下:如果当前用户属于本地操作系统的ora_dba组(对于windows操作系统而言),即可通过操作系统认证。普通用户:默认是以数据库方式认证,比如connscott/tiger;特权用户:默认是以操作系统认证(即:只要当前用户是在ora_dba组中则可以通过认证),比如connsystem/managerassysdba;DBMS一看到assysdba则认为要以特权用户登录,前面的用户名和密码不看,登录后自动切换成sys用户<=>connsys/manager。如果当前用户(win7系统账号)不在ora_dba组中,connsys/manager输对了密码还是可以登录进去的(这时是采用了数据库方式验证)sqlnet.ora文件在D:\xiaoqiang\oracle\product\11.2.0\dbhome_1\NETWORK\ADMIN目录下:同时如果你安装第三方工具PL/SQLDeveloper,同时也需要修改D:\xiaoqiang\oracle\product\instantclient_11_2目录下的sqlnet.ora文件通过配置sqlnet.ora文件,可以修改oracle登录认证方式:SQLNET.AUTHENTICATION_SERVICES=(NTS)是基于操作系统验证SQLNET.AUTHENTICATION_SERVICES=(NONE)是基于Oracle验证SQLNET.AUTHENTICATION_SERVICES=(NONE,NTS)是二者共存linux下:默认情况下linux下的oracle数据库sqlnet.ora文件没有SQLNET.AUTHENTICATION_SERVICES参数,此时是基于操作系统认真和oracle密码验证共存,加上SQLNET.AUTHENTICATION_SERVICES参数后,不管SQLNET.AUTHENTICATION_SERVICES设置为NONE还是NTS都是基于oracle密码验证。7.oracle丢失管理员密码怎么办数据库实例名是根据实际情况命名的。恢复办法:把原有密码文件删除,生成一个新的密码文件恢复步骤如下:(1)搜索名为PWD数据库实例名.ora文件(2)删除该文件,为以防万一,建议备份(3)生成新的密码文件,在DOS控制台下输入命令orapwdfile=原来密码文件的全路径\密码文件名.orapassword=新密码entries=10;这里密码文件名是原来的密码文件名=PWD数据库实例名entries表示登录sys的最多用户(特权用户)如果希望新的密码生效,则需要重新启动数据库实例服务.dos下services.exe还有出现以下情况:ORACLE用SYS和SYSTEM默认密码登录提示ORA-01017:invalidusername/password;logonddenied该怎么解决?解决办法:有可能是你在建数据库的时候,修改了默认的密码而自己又忘记你可再重新修改过来sqlplus/assysdbaalterusersystemidentifiedbymanager;alterusersysidentifiedbymanager;或者改成其他的你自己容易记住的默认scott用户密码是tiger8.oracle表管理类(对象)和表(记录)之间的关系◆创建表基本语法◆数据类型①char(size)存放字符串最大2000个字符,是定长eg:char(32)最多只能放入32个字符如果超过就报错,如果不够’abc’则用空格补全②varchar2(size)变长最大可以存放4000个字符③nchar(size)定长编码方式unicode最大字符数是2000个一个汉字占用nchar的一个字符空间,一个汉字,占用char的两个字符空间④nvarchar2(size)变长编码方式unicode最大字符数是4000个⑤clob字符型大对象变长最大8TB⑥blob变长说明:我们在实际开发中很少把文件存放在数据库中(效率问题),实际上我们一般记录文件的一个路径(URL或本地路径),然后通过IO或网络来操作。如果我们要求对文件安全性比较高,可以考虑放入数据库。⑦number(p,s)p为整数位,s为小数位,范围是1<=p<=38,-84<=s<=-127变长保存数据范围:-1.0e-130<=numbervalue<=1.0e+126保存机器位数1-22bytee.gnumber(5,2)表示一个小数有5位有效位,2位小数,范围-999,99-999,99比如你输入573.316则真正保存是573.32,无法保存数据1000number(5)等价于number(5,0),表示一个5位整数,范围-99999-99999,输入57523.316则保存57523原则:如果在做实际开发中,我们没有指定数据小数位,则直接使用number⑧date日期类型包含年月日,时分秒插入数据时要使用默认格式是:'dd-mm-yyy';当然如果用自己格式需要借用to_date函数SQL>insertintotest1values(to_date('2005-11-11','YYYY-MM-DD'));1rowinsertedto_char你可以使用selectename,hiredate,salfromempwheredeptno=10;显示信息,可是,在某些情况下,这个并不能满足你的需求。问题:日期是否可以显示时/分/秒SQL>selectename,to_char(hiredate,'yyyy-mm-ddhh24:mi:ss')fromemp;9.oracle基本查询oracle的crud操作(createretrieve/readupdatedelete)添加一个字段SQL>ALTERTABLEstudentadd(classIdNUMBER(2));修改一个字段的长度SQL>ALTERTABLEstudentmodify(xmVARCHAR2(30));修改字段的类型/或是名字(不能有数据)不建议做SQL>ALTERTABLEstudentmodify(xmCHAR(30));删除一个字段 不建议做(删了之后,顺序就变了。加就没问题,应为是加在后面)SQL>ALTERTABLEstudentDROPCOLUMNsal;修改表的名字  很少有这种需求SQL>RENAMEstudentTOstu;删除表SQL>DROPTABLEstudent;添加数据所有字段都插入数据INSERTINTOstudentVALUES('A001','张三','男','01-5月-05',10);oracle中默认的日期格式‘dd-mon-yy’dd日子(天)mon月份 yy 2位的年 ‘09-6月-99’1999年6月9日修改日期的默认格式(临时修改,数据库重启后仍为默认;如要修改需要修改注册表)ALTERSESSIONSETNLS_DATE_FORMAT='yyyy-mm-dd';修改后,可以用我们熟悉的格式添加日期类型:INSERTINTOstudentVALUES('A002','MIKE','男','1905-05-06',10);插入部分字段INSERTINTOstudent(xh,xm,sex)VALUES('A003','JOHN','女');插入空值INSERTINTOstudent(xh,xm,sex,birthday)VALUES('A004','MARTIN','男',null);问题来了,如果你要查询student表里birthday为null的记录,怎么写sql呢?错误写法:select*fromstudentwherebirthday=null;正确写法:select*fromstudentwherebirthdayisnull;如果要查询birthday不为null,则应该这样写:select*fromstudentwherebirthdayisnotnull;修改数据修改一个字段UPDATEstudentSETsex='女'WHERExh='A001';修改多个字段UPDATEstudentSETsex='男',birthday='1984-04-01'WHERExh='A001';修改含有null值的数据不要用=null而是用isnull;SELECT*FROMstudentWHEREbirthdayISnull;删除数据DELETEFROMstudent;删除所有记录,表结构还在,写日志,可以恢复的,速度慢。Delete的数据可以恢复。savepointa;--创建保存点DELETEFROMstudent;rollbacktoa; --恢复到保存点一个有经验的DBA,在确保完成无误的情况下要定期创建还原点。DROPTABLEstudent;--删除表的结构和数据;deletefromstudentWHERExh='A001';--删除一条记录;truncateTABLEstudent;--删除表中的所有记录,表结构还在,不写日志,无法找回删除的记录,速度快。oracle基本所有查询案例在我们讲解的过程中我们利用scott用户存在的几张表(emp,dept)为大家演示如何使用select语句,select语句在软件编程中非常有用,希望大家好好的掌握。查看表结构DESCemp;查询所有列SELECT*FROMdept;切忌动不动就用select*SETTIMINGON;打开显示操作时间的开关,在下面显示查询时间。CREATETABLEusers(userIdVARCHAR2(10),uNameVARCHAR2(20),uPasswVARCHAR2(30));INSERTINTOusersVALUES('a0001','啊啊啊啊','aaaaaaaaaaaaaaaaaaaaaaa');--从自己复制,加大数据量大概几万行就可以了 可以用来测试sql语句执行效率INSERTINTOusers(userId,UNAME,UPASSW)SELECT*FROMusers;SELECTCOUNT(*)FROMusers;统计行数查询指定列SELECTename,sal,job,deptnoFROMemp;如何取消重复行DISTINCTSELECTDISTINCTdeptno,jobFROMemp;查询SMITH所在部门,工作,薪水SELECTdeptno,job,salFROMempWHEREename='SMITH';注意:oracle对内容的大小写是区分的,所以ename='SMITH'和ename='smith'是不同的使用算术表达式 nvl null问题:如何显示每个雇员的年工资?SELECTsal*13+nvl(comm,0)*13"年薪",ename,commFROMemp;使用列的别名SELECTename"姓名",sal*12AS"年收入"FROMemp;如何处理null值使用nvl函数来处理如何连接字符串(||)SELECTename ||'isa'||jobFROMemp;使用where子句问题:如何显示工资高于3000的员工?SELECT*FROMempWHEREsal>3000;问题:如何查找1982.1.1后入职的员工?SELECTename,hiredateFROMempWHEREhiredate>'1-1月-1982';问题:如何显示工资在2000到3000的员工?SELECTename,salFROMempWHEREsal>=2000ANDsal<=3000;如何使用like操作符%:表示0到多个字符 _:表示任意单个字符问题:如何显示首字符为S的员工姓名和工资?SELECTename,salFROMempWHEREenamelike'S%';如何显示第三个字符为大写O的所有员工的姓名和工资?SELECTename,salFROMempWHEREenamelike'__O%';在where条件中使用in问题:如何显示empno为7844,7839,123,456的雇员情况?SELECT*FROMempWHEREempnoin(7844,7839,123,456);使用isnull的操作符问题:如何显示没有上级的雇员的情况?错误写法:select*fromempwheremgr='';正确写法:SELECT*FROMempWHEREmgrisnull;使用逻辑操作符号问题:查询工资高于500或者是岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J?SELECT*FROMempWHERE(sal>500orjob='MANAGER')andenameLIKE'J%';使用orderby字句  默认asc问题:如何按照工资的从低到高的顺序显示雇员的信息?SELECT*FROMempORDERbysal;问题:按照部门号升序而雇员的工资降序排列SELECT*FROMempORDERbydeptno,salDESC;使用列的别名排序问题:按年薪排序selectename,(sal+nvl(comm,0))*12"年薪"fromemporderby"年薪"asc;别名需要使用“”号圈中,英文不需要“”号Clear清屏命令数据分组——max,min,avg,sum,count问题:如何显示所有员工中最高工资和最低工资?SELECTMAX(sal),min(sal)FROMempe;     最高工资那个人是谁?错误写法:selectename,salfromempwheresal=max(sal);正确写法:selectename,salfromempwheresal=(selectmax(sal)fromemp);注意:selectename,max(sal)fromemp;这语句执行的时候会报错,说ORA-00937:非单组分组函数。因为max是分组函数,而ename不是分组函数.......但是selectmin(sal),max(sal)fromemp;这句是可以执行的。因为min和max都是分组函数,就是说:如果列里面有一个分组函数,其它的都必须是分组函数,否则就出错。这是语法规定的问题:如何显示所有员工的平均工资和工资总和?问题:如何计算总共有多少员工问题:如何扩展要求:查询最高工资员工的名字,工作岗位SELECTename,job,salFROMempewheresal=(SELECTMAX(sal)FROMemp);显示工资高于平均工资的员工信息SELECT*FROMempewheresal>(SELECTAVG(sal)FROMemp);groupby和having子句groupby用于对查询的结果分组统计having子句用于限制分组显示结果问题:如何显示每个部门的平均工资和最高工资?SELECTAVG(sal),MAX(sal),deptnoFROMempGROUPbydeptno;(注意:这里暗藏了一点,如果你要分组查询的话,分组的字段deptno一定要出现在查询的列表里面,否则会报错。因为分组的字段都不出现的话,就没办法分组了)问题:显示每个部门的每种岗位的平均工资和最低工资?SELECTmin(sal),AVG(sal),deptno,jobFROMempGROUPbydeptno,job;问题:显示平均工资低于2000的部门号和它的平均工资?SELECTAVG(sal),MAX(sal),deptnoFROMempGROUPbydeptnohavingAVG(sal)<2000;对数据分组的 总结 初级经济法重点总结下载党员个人总结TXt高中句型全总结.doc高中句型全总结.doc理论力学知识点总结pdf 1分组函数只能出现在选择列表、having、orderby子句中(不能出现在where中)2如果在select语句中同时包含有groupby,having,orderby那么它们的顺序是groupby,having,orderby3在选择列中如果有列、表达式和分组函数,那么这些列和表达式必须有一个出现在groupby子句中,否则就会出错。如SELECTdeptno,AVG(sal),MAX(sal)FROMempGROUPbydeptnoHAVINGAVG(sal)<2000;这里deptno就一定要出现在groupby中问题:显示雇员名,雇员工资及所在部门的名字【笛卡尔集】?规定:多表查询的条件是至少不能少于表的个数-1才能排除笛卡尔集(如果有N张表联合查询,必须得有N-1个条件,才能避免笛卡尔集合)SELECTe.ename,e.sal,d.dnameFROMempe,deptdWHEREe.deptno=d.deptno;问题:显示部门号为10的部门名、员工名和工资?SELECTd.dname,e.ename,e.salFROMempe,deptdWHEREe.deptno=d.deptnoande.deptno=10;问题:显示各个员工的姓名,工资及工资的级别?先看salgrade的表结构和记录SQL>select*fromsalgrade;   GRADE        LOSAL         HISAL-------------  -------------  ------------       1         700          1200       2         1201         1400       3         1401         2000       4         2001         3000       5         3001         9999SELECTe.ename,e.sal,s.gradeFROMempe,salgradesWHEREe.salBETWEENs.losalANDs.hisal;扩展要求:问题:显示雇员名,雇员工资及所在部门的名字,并按部门排序?SELECTe.ename,e.sal,d.dnameFROMempe,deptdWHEREe.deptno=d.deptnoORDERbye.deptno;(注意:如果用groupby,一定要把e.deptno放到查询列里面)自连接自连接是指在同一张表的连接查询问题:显示某个员工的上级领导的姓名?比如显示员工‘FORD’的上级SELECTworker.ename,boss.enameFROMempworker,empbossWHEREworker.mgr=boss.empnoANDworker.ename='FORD';请思考:显示与SMITH同部门的所有员工?思路:1查询出SMITH的部门号selectdeptnofromempWHEREename='SMITH';2显示SELECT*FROMempWHEREdeptno=(selectdeptnofromempWHEREename='SMITH');数据库在执行sql是从左到右扫描的,如果有括号的话,括号里面的先被优先执行。请思考:如何查询和部门10的工作相同的雇员的名字、岗位、工资、部门号SELECTDISTINCTjobFROMempWHEREdeptno=10;SELECT*FROMempWHEREjobIN(SELECTDISTINCTjobFROMempWHEREdeptno=10);(注意:不能用job=..,因为等号=是一对一的)在多行子查询中使用all操作符问题:如何显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号?SELECTename,sal,deptnoFROMempWHEREsal>all(SELECTsalFROMempWHEREdeptno=30);扩展要求:大家想想还有没有别的查询方法。SELECTename,sal,deptnoFROMempWHEREsal>(SELECTMAX(sal)FROMempWHEREdeptno=30);执行效率上,函数高得多在多行子查询中使用any操作符问题:如何显示工资比部门30的任意一个员工的工资高的员工姓名、工资和部门号?SELECTename,sal,deptnoFROMempWHEREsal>ANY(SELECTsalFROMempWHEREdeptno=30);扩展要求:大家想想还有没有别的查询方法。SELECTename,sal,deptnoFROMempWHEREsal>(SELECTmin(sal)FROMempWHEREdeptno=30);多列子查询单行子查询是指子查询只返回单列、单行数据,多行子查询是指返回单列多行数据,都是针对单列而言的,而多列子查询是指查询返回多个列数据的子查询语句。请思考如何查询与SMITH的部门和岗位完全相同的所有雇员。SELECTdeptno,jobFROMempWHEREename='SMITH';SELECT*FROMempWHERE(deptno,job)=(SELECTdeptno,jobFROMempWHEREename='SMITH');在from子句中使用子查询请思考:如何显示高于自己部门平均工资的员工的信息思路:1.查出各个部门的平均工资和部门号SELECTdeptno,AVG(sal)mysalFROMempGROUPbydeptno;2.把上面的查询结果看做是一张子表SELECTe.ename,e.deptno,e.sal,ds.mysalFROMempe,(SELECTdeptno,AVG(sal)mysalFROMempGROUPbydeptno)dsWHEREe.deptno=ds.deptnoANDe.sal>ds.mysal;如何衡量一个程序员的水平?网络处理能力,数据库,程序代码的优化程序的效率要很高小总结:在这里需要说明的当在from子句中使用子查询时,该子查询会被作为一个视图来对待,因此叫做内嵌视图,当在from子句中使用子查询时,必须给子查询指定别名。注意:别名不能用as,如:SELECTe.ename,e.deptno,e.sal,ds.mysalFROMempe,(SELECTdeptno,AVG(sal)mysalFROMempGROUPbydeptno)asdsWHEREe.deptno=ds.deptnoANDe.sal>ds.mysal;在ds前不能加as,否则会报错 (给表取别名的时候,不能加as;但是给列取别名,是可以加as的)10.oracle分页查询mysql:select*from表名where条件limit从第几条取,取几条见mysql分页查询sqlserver:selecttop取几条*from表名whereidnotin(selecttop4idfrom表名where条件)也可以使用行集函数见3.sqlserver分页查询排除前4条,再取4条,这个案例实际上是取5-8条oracle:以scott/tiger账号登陆进行查询:[分页查询模板]selectt2.*from(selectt1.*,rownumrnfrom(select*fromemp)t1whererownum<=6)t2wherern>=4;先找到小于6的然后找到大于4的【顺序可以反】selectt2.*from(selectt1.*,rownumrnfrom(select*fromemp)t1whererownum>=4)t2wherern<=6;oracle使用三层过滤:第一层:select*fromemp第二层:selectt1.*,rownumrnfrom(select*fromemp)t1whererownum<=6第三层:selectt2.*from(selectt1.*,rownumrnfrom(select*fromemp)t1whererownum<=6)t2wherern>=4;上面是一个分页模板,6表示取到第几条,4表示从第几条取(1)删除重复记录在几千条记录里,存在着些相同的记录,请用sql语句删除。【注意】1.表中肯定是没有主键的,这才叫记录相同2.若有主键(主键肯定不同),那请你把其他字段变成一个临时表,再使用下面方法准备:11.oracle合并查询有时在实际应用中,为了合并多个select语句的结果,可以使用集合操作符号union,unionall,intersect,minus多用于数据量比较大的数据局库,运行速度快。1).union该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中重复行。SELECTename,sal,jobFROMempWHEREsal>2500UNIONSELECTename,sal,jobFROMempWHEREjob='MANAGER';2).unionall该操作符与union相似,但是它不会取消重复行,而且不会排序。SELECTename,sal,jobFROMempWHEREsal>2500UNIONALLSELECTename,sal,jobFROMempWHEREjob='MANAGER';该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中重复行。3).intersect使用该操作符用于取得两个结果集的交集。SELECTename,sal,jobFROMempWHEREsal>2500INTERSECTSELECTename,sal,jobFROMempWHEREjob='MANAGER';4).minus使用改操作符用于取得两个结果集的差集,他只会显示存在第一个集合中,而不存在第二个集合中的数据。SELECTename,sal,jobFROMempWHEREsal>2500MINUSSELECTename,sal,jobFROMempWHEREjob='MANAGER';(MINUS就是减法的意思)12.oracle连接(1)内连接:使我们用的最多的一种连接,前面我们使用的都是内连接。eg:显示员工的信息和部门名称selectemp.ename,dept.dnamefromemp,deptwhereemp.deptno=dept.deptno;等价于selectemp.ename,dept.dnamefromempinnerjoindeptonemp.deptno=dept.deptno;基本语法:select字段1,字段2…from表名1innerjoin表名2on条件(2)外连接:我们创建2种表做测试:①左外连接(显示所有人的成绩,如果没有成绩,也要显示该人的姓名和id号,成绩显示为空)selectstu.id,stu.name,exam.gradefromstuleftjoinexamonstu.id=exam.id;有的程序员喜欢这样写左外连接:selectstu.id,stu.name,exam.gradefromstu,examwherestu.id=exam.id(+);②右外连接(显示所有成绩,如果没有名字匹配,显示为空)selectstu.id,stu.name,exam.gradefromsturightjoinexamonstu.id=exam.id;有的程序员喜欢这样写左外连接:selectstu.id,stu.name,exam.gradefromstu,examwherestu.id(+)=exam.id;③完全外连接(显示所有成绩和所有人的名字,如果响应的匹配值,则显示为空)不管有无匹配均显示selectstu.id,stu.name,exam.gradefromstufullouterjoinexamonstu.id=exam.id;13.oracle函数(1)字符函数字符函数是oracle中最常用的函数,我们来看看有哪些字符函数:lower(char):将字符串转化为小写的格式.upper(char):将字符串转化为大写的格式.length(char):返回字符串的长度。substr(char,m,n):取字符串的子串;n代表取n个的意思,不是代表取到第n个replace(char1,search_string,replace_string)instr(char1,char2,[,n[,m]])取子串在字符串的位置问题:将所有员工的名字按小写的方式显示SQL>selectlower(ename)fromemp;问题:将所有员工的名字按大写的方式显示。SQL>selectupper(ename)fromemp;问题:显示正好为5个字符的员工的姓名。SQL>select*fromempwherelength(ename)=5;问题:显示所有员工姓名的前三个字符。SQL>selectsubstr(ename,1,3)fromemp;问题:以首字母大写,后面小写的方式显示所有员工的姓名。SQL>selectupper(substr(ename,1,1))||lower(substr(ename,2,length(ename)-1)) fromemp;问题:以首字母小写,后面大写的方式显示所有员工的姓名。SQL>selectlower(substr(ename,1,1))||upper(substr(ename,2,length(ename)-1)) fromemp;问题:显示所有员工的姓名,用“我是老虎”替换所有“A”SQL>selectreplace(ename,'A','我是老虎')fromemp;(2)数学函数数学函数的输入参数和返回值的数据类型都是数字类型的。数学函数包括cos,cosh,exp,ln,log,sin,sinh,sqrt,tan,tanh,acos,asin,atan,round,我们讲最常用的:round(n,[m])该函数用于执行四舍五入,如果省掉m,则四舍五入到整数,如果m是正数,则四舍五入到小数点的m位后。如果m是负数,则四舍五入到小数点的m位前。trunc(n,[m])该函数用于截取数字。若省掉m,就截去小数部分(等价于trunc(n,0)),如果m是正数就截取到小数点的m位后,若m是负数,则截取到小数点的前m位。mod(m,n)floor(n)返回小于或是等于n的最大整数ceil(n)返回大于或是等于n的最小整数问题:显示在一个月为30天的情况下,所有员工的日薪金,忽略余数。SQL>selecttrunc(sal/30),enamefromemp;orSQL>selectfloor(sal/30),enamefromemp;在做oracle测试的时候,可以使用dual表selectmod(10,2)fromdual;结果是0selectmod(10,3)fromdual;结果是1其它的数学函数,有兴趣的同学可以自己去看看:abs(n):返回数字n的绝对值selectabs(-13)fromdual;acos(n):返回数字的反余弦值asin(n):返回数字的反正弦值atan(n):返回数字的反正切值cos(n):exp(n):返回e的n次幂log(m,n):返回对数值power(m,n):   返回m的n次幂(3)日期函数日期函数用于处理date类型的数据。默认情况下日期格式是dd-mon-yy即12-7月-78(1)sysdate:该函数返回系统时间(2)add_months(d,n)在日期d上增加n个月(3)last_day(d):返回指定日期所在月份的最后一天问题:查找已经入职8个月多的员工SQL>select*fromempwheresysdate>=add_months(hiredate,8);问题:显示满10年服务年限的员工的姓名和受雇日期。SQL>selectename,hiredatefromempwheresysdate>=add_months(hiredate,12*10);问题:对于每个员工,显示其加入公司的天数。SQL>selectfloor(sysdate-hiredate)"入职天数",enamefromemp;orSQL>selecttrunc(sysdate-hiredate)"入职天数",enamefromemp;(4)给表取别名的时候,不能加as;但是给列取别名,是可以加as问题:找出各月倒数第3天受雇的所有员工。SQL>selecthiredate,enamefromempwherelast_day(hiredate)-2=hiredate;(5)转换函数 转换函数用于将数据类型从一种转为另外一种。在某些情况下,oracleserver允许值的数据类型和实际的不一样,这时oracleserver会隐含的转化数据类型比如:createtablet1(idint);//这里注意int不是关键字在oracle下insertintot1values('10');-->这样oracle会自动的将10-->'10’createtablet2(idvarchar2(10));insertintot2values(1);-->这样oracle就会自动的将1-->'1';我们要说的是尽管oracle可以进行隐含的数据类型的转换,但是它并不适应所有的情况,为了提高程序的可靠性,我们应该使用转换函数进行转换。(6)to_char(date,'format')你可以使用selectename,hiredate,salfromempwheredeptno=10;显示信息,可是,在某些情况下,这个并不能满足你的需求。问题:日期是否可以显示时/分/秒SQL>selectename,to_char(hiredate,
本文档为【oracle最全面的错误疑难解决方法跟总结文档】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
伊人
暂无简介~
格式:doc
大小:1MB
软件:Word
页数:0
分类:房地产
上传时间:2020-02-06
浏览量:2