Oracle笔记.docx

上传人:b****3 文档编号:5520457 上传时间:2023-05-08 格式:DOCX 页数:71 大小:3.01MB
下载 相关 举报
Oracle笔记.docx_第1页
第1页 / 共71页
Oracle笔记.docx_第2页
第2页 / 共71页
Oracle笔记.docx_第3页
第3页 / 共71页
Oracle笔记.docx_第4页
第4页 / 共71页
Oracle笔记.docx_第5页
第5页 / 共71页
Oracle笔记.docx_第6页
第6页 / 共71页
Oracle笔记.docx_第7页
第7页 / 共71页
Oracle笔记.docx_第8页
第8页 / 共71页
Oracle笔记.docx_第9页
第9页 / 共71页
Oracle笔记.docx_第10页
第10页 / 共71页
Oracle笔记.docx_第11页
第11页 / 共71页
Oracle笔记.docx_第12页
第12页 / 共71页
Oracle笔记.docx_第13页
第13页 / 共71页
Oracle笔记.docx_第14页
第14页 / 共71页
Oracle笔记.docx_第15页
第15页 / 共71页
Oracle笔记.docx_第16页
第16页 / 共71页
Oracle笔记.docx_第17页
第17页 / 共71页
Oracle笔记.docx_第18页
第18页 / 共71页
Oracle笔记.docx_第19页
第19页 / 共71页
Oracle笔记.docx_第20页
第20页 / 共71页
亲,该文档总共71页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

Oracle笔记.docx

《Oracle笔记.docx》由会员分享,可在线阅读,更多相关《Oracle笔记.docx(71页珍藏版)》请在冰点文库上搜索。

Oracle笔记.docx

Oracle笔记

1、登录oracle的三种方式:

【1】、oracle的图形界面

【2】、命令行[输入sqlplus]

【3】、浏览器[如图]

【4】、如果自己机器装不上,可以访问其他装好的ip,使用isqlplus也行。

2、登录时候遇到的蛋疼问题【如图】

3、登录时候可以这样写

sqlplussys/Mm901401assysdba

注:

在sqlplus/assysdba执行后,SQL>selectnamefromv$database;可以查看sid查出来ORCL大写

selectINSTANCE_NAMEfromv$instance查出来结果是orcl小写—使用后面的连接字符串正确

 

4、alteruserscottaccountunlock;//用户解锁

5、oracle加快开机速度,修改三个自动为手动,使用时开启那三个即可

6、sql语言四大类(查询语句dml(数据操作)ddl(数据定义))

【1】******(select)查询语句(记住背过):

7、descemp(表名)//用来描述emp表中有些什么字段

EMPNO//雇员编号

ENAME//雇员名字

JOB//雇员职位

MGR//雇员经理人

HIREDATE//入职日期

SAL//薪水

COMM//津贴

DEPINO//部门编号

Descdept//部门

Descdalgrade//薪水等级

补充:

varchar2表示可变字符串

8、select*fromsalgrade;

9、select*fromdual;//算一行数据

10、selectsysdatefromdual;//系统时间此处如果用emp表之类的,仍然显示14行。

11、selectename,sal*12“anuual_sal”fromdual;//把sal*12的字段重命名为anuual_sal,注意,此处如果anuual和sal中间是特殊字符。

例如空格的话,必须把anuual和sal俩边加双引号。

此处的双引号有俩个作用【1】、特殊字符必须俩边有双引号;【2】、保持字段原来的格式

试一下以下俩条命令:

selectename,sal*12“anuualsal”fromdual;//显示跟原来一样

selectename,sal*12anuual_salfromdual;//变成了ANUUAL_SAL,此处的anuual和sal之间的下划线不算特殊字符。

可以不需要引号

12、selectename,sal*12+comm.fromemp;//任何含有空值的数学表达式最后的值都是空值。

13、字符串连接符selectename||salfromemp;

Selectename||‘dsjlfkjaslfjlasjflasjflakjs’fromemp;//在oracle中使用单引号括起来的一段字符表示字符串。

14、selectename||‘asdfa’ldsjflsj’fromemp;//这里的写法是错误的,在需要连接的字符串中如果有单引号,应该使用俩个单引号代替,正确如下

selectename||‘asdfa’’ldsjflsj’fromemp;

15\selectdistinctdeptnofromemp;//去掉deptno中重复的数字

16、selectdistinctdeptno,jobfromemp;//去掉每一行他俩个都重复的

17、select*fromempwheredeptno=10;

Select*fromempwhereename=‘CLARK’;//此处clark必须为大写,否则会出现显示为找不到行

***Selectename,sal,deptnofromempwheredeptno<>10;******//<>在sql语句中表示不等于

Selectename,salfromempwhereename>‘CBA’;//此处比较字母的ascii吗

Selectename,salfromempwheresalbetween800and1500;这个sql语句和下面这个selectename,salfromempwheresal>=800andsal<=1500;//等价的。

And可以用来连接俩个条件。

18、selectename,sal,commfromempwherecomm.isnull;//找空值

19、selectename,sal,comm.fromenpwheresalin(800,1500,2000);//谁的sal等于800或1500或2000。

selectename,sal,comm.fromenpwhereenamein(CLARK,KING,);//找字符串也行

20、selectename,sal,hiredatefromempwherehiredate>’20-2月-81’;

等价于selectename,sal,hiredatefromempwherehiredate>’20-2月-1981’//日期的写的形式必须是这样子

注意:

不能省略月这个字,不能写成20-2-81

21、连接符andornot

Selectename,salfromempwheresalnotin<800,1500>;

selectename,salfromempwheresal>100ordeptno<1000;

22、selectenamefromempwhereenamelike‘%ALL%’;//%表示一个或多个字母

Selectenamefromempwhereenamelike‘_A%’;

23、正则表达式.代表一个字母*代表零个或多个字母?

代表零个或者一个字母

+代表一个或者多个字母%代表零个或多个

如果字符串中带有%号,那么使用转义字符,默认是\,也可以自定义成$如图

24、数据排序:

select*fromdeptorderbydeptno(默认是升序排列);

也可以写成select*fromdeptorderbydeptnoasc;//生序排列

select*fromdeptorderbydeptnodesc;//降序排列

selectempno,enamefromempwheredeptno<>10orderbyempnoasc;//where和order的混合

25、如果有俩个排序,先按照前面的排列,如果前面数据相同,再按照后面的顺序排列

26、sql函数(包括单行函数和多行函数)

单行函数(26-29)

Loweruppersubstr(截子串)

Selectlower(ename)fromemp;

Selectsubstr(ename,1,3)fromemp;//从第一个开始截取三个

selectchr(65)fromdual;//吧一个数字转换成字母

selectascii(’A’)fromdual;//吧字符转换成ascii吗

selectround(23.652)fromdual;//四舍五入

selectround(23.652,2)fromdual;//四舍五入到小数点后俩位

selectround(23.652,-1)fromdual;//四舍五入到十位数,默认为0是个位

****selectto_char(sal,’$99,999.9999’)fromemp;*********//9代表一位数字,把sal转换为小数点后四位数字,十万位之前没有的形式。

selectto_char(sal,’L99,999.9999’)fromemp;\\本地货币

selectto_char(sal,’$00,000.0000’)fromemp;\\跟9一样也是表示数字,但是用0时如果该位没有数字强制变为0。

****selecthiredatefromemp;

Selectto_char(hiredate,’YYYY-MM-DDHH:

MI:

SS’)fromemp;

Selectto_char(sysdate,’YYYY-MM-DDHH:

MI:

SS’)fromemp;//系统当前时间

Selectto_char(sysdate,’YYYY-MM-DDHH24:

MI:

SS’)fromemp;//24进制

27、selectename,hiredatefromempwherehiredate>to_date(‘1981-2-2012:

34:

56’,’YYYY-MM-DDHH24:

MI:

SS’);//将字符串转换成日期,第二个参数为了告诉怎么转换。

(这里使用系统默认格式,不转换怎么写即09-6月-81这种形式的?

28、selectsalfromempwheresal>to_number(‘$1,250.00’,’$9,999.99’);//字符串转换数字

29、selectename,sal*12+nvl(comm.,0)fromemp;//这个函数意思是如果comm为null,用0代替,不为null就是原来的comm的值

*******多行函数(组函数)作用:

把多条记录作为输入,最后产生一个输出。

********重点

30、selectmax(sal)fromemp;selectmin(sal)fromemp;selectavg(sal)fromemp;//取出薪水的最大,最小,平均值

Selectto_char(avg(sal),’99999.99’)fromemp;//取平均值到小数点后俩位

Selectround(avg(sal),2)fromemp;//取平均值四舍五入小数点后俩位

Selectsum(sal)fromemp;//每个月总共的薪水

Selectcount(*)formemp;//求出这张表一共多少条记录

Selectconut(*)fromempwheredeptno=10;

Selectconut(ename)fromemp;

Selectcount(comm.)fromemp;//conut的作用是统计字段中非空数据个数

Selectcount(distinctdeptno)fromemp;//去掉deptno字段重复数据后数据的个数

******五个多行函数特别重要min、max、avg、sum、count牢牢记住*********

31、(牢牢掌握住)selectavg(sal)fromempgroupbydeptno;//按照deptno10,30,20的进行分组,算出不同分组sal的平均值。

Selectsal,avg(sal)fromempgroupbydeptno;

Selectdeptno,job,max(sal)fromempgroupbydeptno,job;//按照deptno和job都相同的分为一组。

分为了9组

Selectenamefromempwheresal=(selectmax(sal)fromemp);//这里使用了子查询

注意:

这个语句是错误的selectename,max(sal)fromemp;(max是多行函数,与ename不匹配)

*****************************************************************

出现在select查询列表中的字段,没有出现在组函数里,必须出现在groupby函数字段里。

这就是为什么selectename,max(sal)fromempgroupbydeptno;错误

而selectdeptno,max(sal)fromempgroupbydeptno;正确的原因

**********************************************************************

求在所有人中,薪水值最高的这些人的名字以及他的薪水,编号

Selectename,deptno,salfromempwheresal=(selectmax(sal)fromemp);

**********************************************************************************

如何求出,每个部门里面,薪水最高的这些人的名字?

(不严密的方法)可能想到利用19的in来求

Selectename,sal,deptnofromempwheresalin(selectmax(sal)fromempgroupbydeptno);

(表面看正确,但是假如10这个部门再有一个3000,同样会取出来,它只要是等于2850,3000,5000都会取出来视频13讲)

正确的写法:

自己总结的几点:

1、子句中select语句中出现的字段在主句中不能再出现

(错误)

(正确)

2、括号位置不影响语句正确性

3、字据中join里面的max(xx)函数必须起别名(否者出现下面的错误)

(错误)

32selectavg(sal),deptnofromempgroupbydeptnohavingavg(sal)>2000;//having用来限制groupby,where不能限制groupby

***************************************************************************

Sql语句的顺序:

(记住)

1Selectxxfromemp

2Wheresal>1000//数据过滤

3Groupbydeptno//数据分组

4Having//分组过滤

5Orderby//对最后结果进行排序

执行时候也是按照这个顺序进行,牢牢记住(having这一讲)

***************************************************************************

例题:

要求薪水大于一千二的雇员,按照部门编号进行分组,分组之后的平均薪水必须大于一千五,查询分组之内的平均工资,按照工资的倒序进行排列。

33、子查询:

那些人的工资位于平均薪水之上

Selectename,salfromempwheresal>=(selectavg(sal)fromemp);

理解子查询的关键,把他当成一张表(理解:

如何求出,每个部门里面,薪水最高的这些人的名字?

例题:

求每个部门平均薪水等级(16讲)

34、自连接(自己和自己连接,同一张表,起不同的别名,当成俩张表用)

例题:

求一个人和其对应的经理人名字

35、1992,1999

(新的语法规则下,where只负责数据过滤,只写数据过滤条件,而连接条件放在joinon里)

Selectename,dnamefromemp,dept;1992

Selectename,dnamefromempcrossjoindept;1999(交叉连接)

Selectename,dnamefromemp,deptwhereemp.deptno=dept.deptno;(1992)

Selectename,dnamefromempjoindepton(emp.deptno=dept.deptno);(1999)

一个简单的写法

Selectename,dnamefromempjoindeptusing(deptno);//这句话意思是ename,和dname中都有一个deptno字段,并且ename的deptno等于dname的deptno。

等价于上面的写法,但是不推荐使用。

非等值连接:

Selectename,gradefromempejoinsalgradeson(e.salbetweens.losalands.hisal);

Selectename,dname,gradefromempejoindeptdon(e.deptno=d.deptno)joinsalgradeson(e.salbetweens.losalands.hisal)whereenamenotlike‘_A%’;

经理人例题:

Selecte1.ename,e2.enamefromempe1joinempe2on(e1.mgr=e2.empno);

想要把king显示出来

Selecte1.ename,e2.enamefromempe1leftouterjoinempe2on(e1.mgr=e2.empno);

上面这个句子叫做左外连接,可以把左边这个表中多余的数据显示出来,即不能和右边产生链接的数据显示出来。

其中outer可以省略,效果如下:

右连接:

(outer可以省略)

全外连接:

Selectename,dnamefromempfullouterjoindepton(emp.deptno=dept.deptno);

--求部门的平均的薪水等级

Ed命令:

--雇员中有哪些人是经理人

selectenamefromempwhereempnoin(selectdistinctmgrfromemp);

--不准用组函数,求薪水的最高值(面试题)

自己写的语句如下:

1999年语法,自连接写法:

--求平均薪水最高的部门的部门编号

思路:

首先求各个部门的平均薪水

Selectdeptno,avg(sal)fromempgroupbydeptno;(表)

其次求出来薪水的最高值

Selectmax(avg_sal)from(selectdeptno,avg(sal)avg_salfromempgroupbydeptno);

上面这个表当做值

最后通过第一个表,找到最高值的对应的部门

Selectdeptno,max_salfrom(selectdeptno,avg(sal)max_salfromempgroupbydeptno)wheremax_sal=(selectmax(avg_sal)from(selectdeptno,avg(sal)avg_salfromempgroupbydeptno));效果如下图图:

也可以按照马士兵的格式如下:

组函数函数嵌套写法:

--求平均薪水最高的部门的部门名称

上面求出来薪水最高的部门编号,只要再把上面的结果中deptno当成值,当成下面的一个where条件,从dept表中找即可。

组函数嵌套写法:

--求平均薪水最低的部门的部门名称

四步:

类似上面求最大的,结果如下

组函数可以互相嵌套,但是最多嵌套俩层(21讲)实际效果见(1和2)

--求平均薪水等级最低的部门的部门名称

selectd.deptno,dname,avg_salfrom(selectdeptno,avg_sal,gradefrom

selectdeptno,avg(sal)avg_salfromempgroupbydeptno)tjoinsalgradeson(t.avg_salbetweens.losalands.hisal))t1joindeptdon(t1.deptno=d.deptno)

wheregrade=(selectmin(grade)from

selectdeptno,avg_sal,gradefrom

selectdeptno,avg(sal)avg_salfromempgroupbydeptno

)t

joinsalgradeson(t.avg_salbetweens.losalands.hisal)

简化的写法:

注意:

直接使用别名的方法不可以,例如

正确的方法是:

首先可以创建一个视图(就是一个虚表,实际的数据还在原来的表中)

提示scott权限不足

提升权限

Connsys/Mm901401assysdba;//进去管理员账户

Grantcreatetable,createviewtoscott;//赋权限

如图:

重新连接scott

Connscott/tiger;

创建视图

createviewv$_dept_avg_sal_infoas

selectdeptno,avg_sal,gradefrom

selectdeptno,avg(sal)avg_salfromempgroupbydeptno

)t

joinsalgradeson(t.avg_salbetweens.losalands.hisal)

/

效果如下:

简化的写法:

selectd.deptno,dname,avg_salfromv$_dept_avg_sal_infot1

joindeptdon(t1.deptno=d.deptno)

wheregrade=(selectmin(grade)from(selectdeptno,avg_sal,gradefrom

v$_dept_avg_sal_info))

/

视图以v$开头

视图就是一个子查询,或者说就是一张表,这张表示虚表,实际当中数据存在实际的表里面。

当成一张表用。

--求部门经理人中平均薪水最低的部门名称(思考题)

--比普通员工最高薪水还要高的经理人名称

求出普通员工最高薪水

经理人名称

--求薪水最高的前5名雇员

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2