尚学堂马士兵老师oracle笔记.docx

上传人:b****5 文档编号:5935877 上传时间:2023-01-02 格式:DOCX 页数:28 大小:27.31KB
下载 相关 举报
尚学堂马士兵老师oracle笔记.docx_第1页
第1页 / 共28页
尚学堂马士兵老师oracle笔记.docx_第2页
第2页 / 共28页
尚学堂马士兵老师oracle笔记.docx_第3页
第3页 / 共28页
尚学堂马士兵老师oracle笔记.docx_第4页
第4页 / 共28页
尚学堂马士兵老师oracle笔记.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

尚学堂马士兵老师oracle笔记.docx

《尚学堂马士兵老师oracle笔记.docx》由会员分享,可在线阅读,更多相关《尚学堂马士兵老师oracle笔记.docx(28页珍藏版)》请在冰豆网上搜索。

尚学堂马士兵老师oracle笔记.docx

尚学堂马士兵老师oracle笔记

版本一:

尚学堂马士兵老师oracle笔记(上)

第一课:

客户端

1.SqlPlus(客户端),命令行直接输入:

sqlplus,然后按提示输入用户名,密码。

2.从开始程序运行:

sqlplus,是图形版的sqlplus.

3.http:

//localhost:

5560/isqlplus

Toad:

管理,PlSqlDeveloper:

第二课:

更改用户

1.sqlplussys/bjsxtassysdba

2.alteruserscottaccountunlock;(解锁)

第三课:

tablestructure

1.描述某一张表:

desc表名

2.select*from表名

第四课:

select语句:

1.计算数据可以用空表:

比如:

.select2*3fromdual

2.selectename,sal*12annual_salfromemp;与selectename,sal*12"annualsal"fromemp;区别,加双引号保持原大小写。

不加全变大写。

任何含有空值的表达式,计算结果都是空值。

3.

Oracle中的||相当于是java中的连字符+

selectename||"abcd"如果连接字符串中含有单引号,用两个单引号代替一个单引号。

第五课:

distinct

selectdeptnofromemp;

selectdistinctdeptnofromemp;

selectdistinctdeptnofromemp;

selectdistinctdeptno,jobfromemp

去掉deptno,job两者组合的重复。

更多的项,就是这么多项的组合的不重复组合。

第六课:

Where

select*fromempwheredeptno=10;

select*fromempwheredeptno<>10;不等于10

select*fromempwhereename='bike';

selectename,salfromempwheresalbetween800and1500(>=800and<=1500)

空值处理:

selectename,sal,commfromempwherecommis(not)null;

selectename,sal,commfromempwhereename(not)in('smith','king','abc');

selectenamefromempwhereenamelike'_A%';_代表一个字母,%代表0个或多个字母.如果查询%

可用转义字符.\%.还可以用escape'$'比如:

selectenamefromempwhereenamelike'%$a%'escape'$';

第七课:

orderby

select*fromdept;

select*fromdeptorderbydeptnodesc;(默认:

asc)

selectename,sal,deptnofromemporderbydeptnoasc,enamedesc;

第八课:

sqlfunction1:

selectename,sal*12annual_salfromemp

whereenamenotlike'_A%'andsal>800

orderbysaldesc;

selectlower(ename)fromemp;

selectenamefromemp

wherelower(ename)like'_a%';等同于

selectenamefromempwhereenamelike'_a%'orenamelike'_A%';

selectsubstr(ename,2,3)fromemp;从第二字符截,一共截三个字符.

selectchr(65)fromdual结果为:

A

selectascii('a')fromdual结果为:

65

selectround(23.652,1)fromdual;结果为:

23.7

selectround(23.652,-1)fromdual;20

selectto_char(sal,'$99_999_999')fromemp;

selectto_char(sal,'L99_999_999')fromemp;人民币符号,L:

代表本地符号

这个需要掌握牢:

selectbirthdatefromemp;

显示为:

BIRTHDATE

----------------

17-12月-80

----------------

改为:

selectto_char(birthdate,'YYYY-MM-DDHH:

MI:

SS')fromemp;

显示:

BIRTHDATE

-------------------

1980-12-1712:

00:

00

-------------------

selectto_char(sysdate,'YYYY-MM-DDHH24:

MI:

SS')fromdual;//也可以改为:

HH12

TO_CHAR(SYSDATE,'YY

-------------------

2007-02-2514:

46:

14

to_date函数:

selectename,birthdatefromempwherebirthdate>to_date('1981-2-2012:

34:

56','YYYY-MM-DDHH24:

MI:

SS');

如果直接写birthdate>'1981-2-2012:

34:

56'会出现格式不匹配,因为表中的格式为:

DD-MM月-YY.

selectsalfromempwheresal>888.88无错.但

selectsalfromempwheresal>$1,250,00;

会出现无效字符错误.

改为:

selectsalfromempwheresal>to_number('$1.250.00','$9,999,99');

把空值改为0

selectename,sal*12+nvl(comm,0)fromemp;

这样可以防止comm为空时,sal*12相加也为空的情况.

第九课:

Groupfunction组函数

max,min,avg,count,sum函数

selectto_char(avg(sal),'99999999,99')fromemp;

selectround(avg(sal),2)fromemp;

结果:

2073.21

selectcount(*)fromempwheredeptno=10;

selectcount(ename)fromempwheredeptno=10;count某个字段,如果这个字段不为空就算一个.

selectcount(distinctdeptno)fromemp;

selectsum(sal)fromemp;

第十课:

Groupby语句

需求:

现在想求,求每个部门的平均薪水.

selectavg(sal)fromempgroupbydeptno;

selectdeptnoavg(sal)fromempgroupbydeptno;

selectdeptno,job,max(sal)fromempgroupbydeptno,job;

求薪水值最高的人的名字.

selectename,max(sal)fromemp;出错,因为max只有一个值,但等于max值的人可能好几个,不能匹配.

应如下求:

selectenamefromempwheresal=(selectmax(sal)fromemp);

Groupby语句应注意,

出现在select中的字段,如果没出现在组函数中,必须出现在Groupby语句中.

第十一课:

Having对分组结果筛选

Where是对单条纪录进行筛选,Having是对分组结果进行筛选.

selectavg(sal),deptnofromemp

groupbydeptno

havingavg(sal)>2000;

查询工资大于1200雇员,按部门编号进行分组,分组后平均薪水大于1500,按工薪倒充排列.

select*fromemp

wheresal>1200

groupbydeptno

havingavg(sal)>1500

orderbyavg(sal)desc;

第十二课:

字查询

谁挣的钱最多(谁:

这个人的名字,钱最多)

select语句中嵌套select语句,可以在where,from后.

问那些人工资,在平均工资之上.

selectename,salfromempwheresal>(selectavg(sal)fromemp);

查找每个部门挣钱最多的那个人的名字.

selectename,deptnofromempwheresalin(selectmax(sal)fromempgroupbydeptno)查询会多值.

应该如下:

selectmax(sal),deptnofromempgroupbydeptno;当成一个表.语句如下:

selectename,salfromempjoin(selectmax(sal)max_sal,deptnofromempgroup

bydeptno)ton(emp.sal=t.max_salandemp.deptno=t.deptno);

每个部门的平均薪水的等级.

分析:

首先求平均薪水(当成表),把平均薪水和另外一张表连接.

第十四课:

self_table_connection

把某个人的名字以及他的经理人的名字求出来(经理人及这个人在表中同处一行)

分析:

首先求出这个人的名字,取他的编号,然后从另一张表与其相对应编号,然后找到经理的名字.

selecte1.ename,e2.enamefromempe1,empe2wheree1.mgr=e2.empno.

empno编号和MGR都是编号.

第十15课:

SQL1999_table_connections

selectename,dname,gradefromempe,deptd,sqlgrades

wheree.deptno=d.deptnoande.sqlbetweens.losalands.hisaland

job<>'CLERK';

有没有办法把过滤条件和连接条件分开来?

出于这样考虑,Sql1999标准推出来了.有许多人用的还是

旧的语法,所以得看懂这种语句.

selectename,dnamefromemp,dept;(旧标准).

selectename,dnamefromempcrossjoindept;(1999标准)

selectename,dnamefromemp,deptwhereemp.deptno=dept.deptno(旧)

selectename,dnamefromempjoindepton(emp.deptno=dept.deptno);1999标准.没有Where语句.

selectename,dnamefromempjoindeptusing(deptno);等同上句,但不推荐使用.

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

join连接语句,on过滤条件。

连接,条件一眼分开。

如果用Where语句较长时,连接语句和过滤语句混在一起。

三张表连接:

slectename,dname,gradefrom

empejoindeptdon(e.deptno=d.deptno)

joinsalgradeson(e.salbetweens.losalands.hisal)

whereenamenotlike'_A%';

把每张表连接条件不混在一起,然后数据过滤条件全部区分开来。

读起来更清晰,更容易懂一点。

selecte1.ename,e2.enamefromempe1joinempe2on(e1.mgr=e2.emptno);

左外连接:

会把左边这张表多余数据显示出来。

selecte1.ename,e2,enamefromempe1leftjoinempe2on(e1.mgr=e2.empno);left后可加outer

右外连接:

selectename,dnamefromemperightouterjoindeptdon(e.deptno=d.deptno);outer可以取掉。

即把左边多余数据,也把右边多余数据拿出来,全外连接。

selectename,dnamefromempefulljoindeptdon(e.deptno=d.deptno);

16-23课:

求部门平均薪水的等级

A.求部门平均薪水的等级。

selectdeptno,avg_sal,gradefrom

(selectdeptno,avg(sal)avg_salfromempgroupbydeptno)t

joinsalgradeson(t.avg_salbetweens.losalands.hisal)

B.求部门平均的薪水等级

selectdeptno,avg(grade)from

(selectdeptno,ename,gradefromempjoinsalgradeson(emp.salbetweens.losaland

s.hisal))t

groupbydeptno

C.那些人是经理

selectenamefromempwhereempnoin(selectmgrfromemp);

selectenamefromempwhereempnoin(selectdistinctmgrfromemp);

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

selectdistinctsalfromempwheresalnotin(

selectdistincte1.salfromempe1joinempe2on(e1.sal

E.平均薪水最高的部门编号

selectdeptno,avg_salfrom

(selectavg(sal)avg_sal,deptnofromempgroupbydeptno)

whereavg_sal=

(selectmax(avg_sal)from

(selectavg(sal)avg_sal,deptnofromempgroupbydeptno)

F.平均薪水最高的部门名称

selectdnamefromdeptwheredeptno=

selectdeptnofrom

(selectavg(sal)avg_sal,deptnofromempgroupbydeptno)

whereavg_sal=

(selectmax(avg_sal)from

(selectavg(sal)avg_sal,deptnofromempgroupbydeptno)

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

组函数嵌套

如:

平均薪水最高的部门编号,可以E.更简单的方法如下:

selectdeptno,avg_salfrom

(selectavg(sal)avg_sal,deptnofromempgroupbydeptno)

whereavg_sal=

(selectmax(avg(sal))fromempgroupbydeptno)

组函数最多嵌套两层

分析:

首先求

1.平均薪水:

selectavg(sal)fromgroupbydeptno;

2.平均薪水等级:

把平均薪水当做一张表,需要和另外一张表连接salgrade

selectdeptno,gradeavg_salfrom

(selectdeptno,avg(sal)avg_salfromempgroupbydeptno)t

joinsalgradeson(t.avg_salbetweens.losalands.hisal)

上面结果又可当成一张表。

DEPTNOGRADEAVG_SAL

-------------------------

3031566.66667

2042175

1042916.66667

3.求上表平均等级最低值

selectmin(grade)from

selectdeptno,grade,avg_salfrom

(selectdeptno,avg(sal)avg_salfromempgroupbydeptno)t

joinsalgradeson(t.avg_salbetweens.losalands.hisa)

4.把最低值对应的2结果的那张表的对应那张表的deptno,然后把2对应的表和另外一张表做连接。

selectdname,deptno,grade,avg_salfrom

selectdeptno,grade,avg_salfrom

(selectdeptno,avg(sal)avg_salfromempgroupbydeptno)t

joinsalgradeson(t.avg_salbetweens.losalands.hisal)

)t1

joindepton(t1.deptno=dept.deptno)

wheret1.grade=

selectdeptno,grade,avg_salfrom

(selectdeptno,avg(sal)avg_salfromempgroupbydeptno)t

joinsalgradeson(t.avg_salbetweens.losalands.hisal)

结果如下:

DNAMEDEPTNOGRADEAVG_SAL

-------------------------------

SALES3031566.6667

H:

视图(视图就是一张表,一个字查询)

G中语句有重复,可以用视图来简化。

connsys/bjsxtassysdba;

grantcreatetable,createviewtoscott;

connscott/tiger

创建视图:

createviewv$_dept_avg-sal_infoas

selectdeptno,grade,avg_salfrom

(selectdeptno,avg(sal)avg_salfromempgroupbydeptno)t

joinsalgradeson9t.avg_salbetweens.losalands.hisal)

然后

select*fromv$_dept_avg-sal_info

结果如下:

DEPTNOGRADEAVG_SAL

-------------------------

3031566.66667

2042175

1042916.66667

然后G中查询可以简化成:

selectdname,t1.deptno,grade,avg_salfrom

v$_dept_avg-sal_infot1

joindepton9t1.deptno=dept.deptno)

wheret1.grade=

selectmin(grade)fromv$_dept_avg-sal_infot1

版本二:

尚学堂Oracle笔记

(一)2009-01-1813:

401、http:

//127.0.0.1:

5560/isqlplus/访问自己的或者别人的oracle。

2、isqlplus不用装客户端也行。

3、sqlplussys/bjsxtassysdba

4、descemp/dept/salgrade;//显示表结构

5、selectsysdatefromdual;//显示日期

6、selecta*12"nihaoY"fromdual;//别名中有空格用双引号

7、selectemname||'aa'fromemp;//连接字符

8、select'wo'||'a''a'fromemp;两个单引号代表一个一个点印单引号,返回结果为woa'a

9、selectdistictafromdual;

10、selectnamefromdualwherenameisnull//空值查找。

11、selectnamefromdualwherenamelike'%a%'//包含a的所有name,like‘%\%%’包含%的name。

/为转义字符

12、自己定义转义字符

selectnamefromdualwherenamelike'%$%%'escape'$'//name里包含%的纪录,并定义了$为转义字符。

13、selectnamefromdualorderbyiddesc/asc;--按降序/升序排列

14、selectnamefromdualorderbyiddesc,ageasc;--先按id降序排列再按age升序排列。

15、selectlower(name)fromdual;--name都小写

16、selectsubstr(name,2,3)fromdual;--把name从第二个字母开始截取3个字符。

17、selectchr(65)fromdual;--转换成A

18、slectascii(‘A’)fromdual;--转换成ascii码65;

19、selectto_char(sal,$99,999,9999)fromemp

--结果$800.0000,$1,600.0000。

如果把$换成L则输出¥800.0000

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

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1