Oracle.docx

上传人:b****6 文档编号:6530827 上传时间:2023-01-07 格式:DOCX 页数:36 大小:361.49KB
下载 相关 举报
Oracle.docx_第1页
第1页 / 共36页
Oracle.docx_第2页
第2页 / 共36页
Oracle.docx_第3页
第3页 / 共36页
Oracle.docx_第4页
第4页 / 共36页
Oracle.docx_第5页
第5页 / 共36页
点击查看更多>>
下载资源
资源描述

Oracle.docx

《Oracle.docx》由会员分享,可在线阅读,更多相关《Oracle.docx(36页珍藏版)》请在冰豆网上搜索。

Oracle.docx

Oracle

Oracle服务:

其中只需要启动OracleServiceSID,Listener就可以了

在sqlplus中注视用”--”

Oracle数据类型:

在Oracle数据库中,本身提供的关键字是不区分大小写,但是再Oracle中所有的都默认大写;

Char

12,如果没有填满,那么用空格补充

NChar

最多可以存储2000个字节信息,只是记录符合长度范围内的数据,不会填充空格

Varchar2变长字符串

默认的是12,最多可以存储4000个字节信息

NVarchar

Unicode

Number

(p,s)例如:

Number(7,2)

Date

时间类型

No1

No2

No3

No4

RowId

SqlPlus:

cmd—sqlplus

用户名:

scott

密码:

tiger

ERR:

accountislocked;

切换登录:

conn

先用sys账户登录:

sys/systemassysdba

然后执行命令:

alteruserscottaccountunlock;

SQL语句:

*常用DML操作

SELECT(查找)

设置窗口的属性:

setlinesize300;

setpagesize30;

查看当前用户下有哪些表:

SELECT*FROMtab;

查询完后,显示的效果为上图;

列出某个表中的所有字段描述:

DESC“tablname”;

雇员表(EMP)

字段名称

类型

说明

EMPNO

NUMBER(4)

雇员编号(pk)

ENAME

VARCHAR2(10)

雇员姓名

JOB

VARCHAR2(9)

职位

MGR

NUMBER(4)

领导

HIREDATE

DATE

受雇日期

SAL

NUMBER(7,2)

工资

COMM

NUMBER(7,2)

佣金(奖金)

DEPTNO

NUMBER

(2)

部门编号(fK)

部门表(DEPT)

字段名称

类型

说明

DEPTNO

NUMBER

(2)

部门编号(pk)

DNAME

VARCHAR2(14)

部门名称

LOC

VARCHAR2(13)

地址

查询emp表中的所有内容:

select*fromemp;

想按照字段去查询:

select{empno,ename,hiredate}|*fromemp;

想给每个字段设置查询展示别名:

selectempnoas雇员编号,enameas雇员姓名,hiredateas受雇日期fromemp;

说明:

”as”是可以省略的。

限制约束WHERE

查询工资大于2000的雇员的编号,姓名和工资;

selectempno,ename,salfromempwheresal>2000;

查询工资大于2000,并且是部门编号为20的所有雇员

说明:

多个限制条件用and连接

select*fromempwheresal>2000anddeptno=20;

如果屏幕显示:

未选定行说没有符合条件的数据,

Oracle对值的大小写是敏感的

查询所有领导和所有的职员,计算“和”用OR

select*fromempwherejob='MANAGER'orjob='CLERK';

去重复关键字:

DISTINCT

查询雇员里面所有描述的部门编号

selectdistinctdeptnofromemp;

找出佣金高于薪金60%的员工(comm>sal*0.6)

select*fromempwherecomm>sal*0.6;

ISNULL/ISNOTNULL

selectdistinctjob,enamefromempwherecommisnotnull;

模糊查询:

LIKE:

模糊查询,分为左、右、全模糊

模糊的方向是有“%”决定的:

例如:

‘S%’右模糊

‘%S’左模糊

‘%S%’全模糊

下划线:

“_”属于展位,占一个字符

排序ORDERBY(升序:

asc默认,降序:

desc)

说明:

默认的为asc

select*fromemporderbysaldesc;

select*fromemporderbysalasc;

DUAL哑元表

在oracle中用dual去确定一个变量查询时所引用的实体(Entity)

函数在查询中的应用

时间类型函数

sysdate:

返回当前系统时间

selectadd_months(sysdate,5)fromdual;--增月

selectadd_months(sysdate,-2)fromdual;--减月

受雇日期:

select*fromempwherehiredate=last_day(hiredate)-1;

字符串函数

在oracle中连接通常不会concat,一般直接使用“||”符号

特殊函数:

casewhenthen:

selecttable_name,

CASE

  WHENowner='SYS'THEN'TheownerisSYS'

  WHENowner='SYSTEM'THEN'TheownerisSYSTEM'

  ELSE'Theownerisanothervalue'

END

fromall_tables;

DECODE

selectdecode(job,'MANAGER','经理','CLERK','职员','普通员工')fromemp;

基本的嵌套查询:

遗留问题:

Using

知识点回顾

sysassysdbc/orcl

setlinesizenum;

setpagesizenum;

切换连接:

conn(connection)username/password;

常用的数据类型

CHAR

12,如果没有填满,那么用空格补充

VARCHAR2

默认的是12,最多可以存储4000个字节信息

NUMBER

(p,s)例如:

Number(7,2)

TIMESTAMP

DATE

时间类型

常用函数

时间类型:

Sysdate

Add_months

Last_day

Months_between

Trunc

字符类型

UPPER

返回字符串,并将所有的字符大写

LOWER

返回字符串,并将所有的字符小写

INITCAP

返回字符串并将字符串的第一个字母变为大写

SUBSTR

SUBSTR(string,start,count)取子字符串,从start开始,取count个

LENGTH

返回字符串的长度

INSTR

INSTR(C1,C2,I,J)

在一个字符串中搜索指定的字符,返回发现指定的字符的位置;

C1被搜索的字符串

C2希望搜索的字符串

I搜索的开始位置,默认为1

J出现的位置,默认为1

TRIM

TRIM('s'from'string')

LEADING剪掉前面的字符

TRAILING剪掉后面的字符

如果不指定,默认为空格符

REPALCE

REPLACE('string','s1','s2')

string希望被替换的字符或变量

s1被替换的字符串

s2要替换的字符串

数字类型

dbms_random.value(p,s)

round返回舍入小数点右边n2位的n1的值,n2的缺省值为0,这回将小数点最接近的整数,如果n2为负数就舍入到小数点左边相应的位上,n2必须是整数

mod返回一个n1除以n2的余数

其他的类型

TO_DATE

TO_NUMBER

TO_CHAR

CASEWHENTHEN

…..

ELSE

END

DECODE(columnName,exp,’value’,exp,’’,default)

基本查询语句:

Select*fromtablename;

ORACLE复杂查询

单行查询

多表查询

关联查询

分组统计

ORDERBY排序:

DESC:

降序ASC(默认):

升序

多表查询

查询员工名称为SMITH的部门编号,部门名称,工资,部门位置

第一步:

查询出SMITH的信息

SELECT*FROMEMPWHEREENAME='smith'

SELECT*FROMemp,dept;

运行结果为56条=雇员表中的数据总数*部门表中的数据总数

上述计算成为笛卡尔乘积

聚合函数:

Count:

计算总数

Max:

计算最大值

Min:

计算最小值

Avg:

取平均值

count(*|columnname)

selectcount(*)fromemp;查询emp表中一共有多少条数据

selectcount(*)fromdept;

为了规避大量运算,在笛卡尔乘积的基础上加上过滤运算

select*fromemp,dept

whereemp.deptno=dept.deptno;

意思就是:

雇员表中的编号值=部门表中的编号值

Max取得最大值

selectmax(sal)fromemp;

Min

selectmin(sal)fromemp;

Avg

selectavg(sal)fromemp;

查询所有雇员的姓名,工资,部门编号,部门名称:

selectename,sal,emp.deptno,dept.dname

fromemp,dept

whereemp.deptno=dept.deptno;

上述引用字段名称的表名比较长的时候,最好是给每个表取别名:

取别名要比不取别名的效率高。

selecte.ename,e.sal,d.deptno,d.dname

fromempe,deptd

wheree.deptno=d.deptno;

selecte.ename雇员姓名,e.sal工资,d.deptno部门编号,d.dname部门名称

fromempe,deptd

wheree.deptno=d.deptno;

关联查询

内联

外联

交叉

查处所有的人员信息和所有的部门信息,显示效果:

有部门的职员列出部门信息,有职员的部门列出部门下所有的职员,如果某一部门没有职员同一出现在列表中;

内联:

关联表:

innerjoin(innser可以省略)+on+关联表之间的关系

过滤数据的原则:

完全符合条件的数据

select*fromempinnerjoindeptonemp.deptno=dept.deptno;

外联:

左联(左外联),右联(右外联),全联

左联:

select*fromempe,deptdwheree.deptno=d.deptno(+);

“+”在那一遍,说明是被连接的对象(table),是以连接一方为基准

右联:

select*fromempe,deptdwheree.deptno(+)=d.deptno;

Sql1999标准中对连接进行关键字定义

左联:

LEFTJOINtable+on+关联条件

select*fromempeleftjoindeptdone.deptno=d.deptno;

右联:

RIGHTJOINtable+on+关联条件

select*fromemperightjoindeptdone.deptno=d.deptno;

全联:

fulljoin

select*fromempefulljoindeptdone.deptno=d.deptno;

查询’10’部门的所有领导和’20’部门所有办事员的姓名,部门名称,工资

selecte.ename姓名,d.dname部门名称,e.sal

fromempeleftjoindeptdone.deptno=d.deptno

where(e.deptno=10ande.job='MANAGER')or(e.deptno=20ande.job='CLERK');

交叉连接:

CROSSJOIN

Select*fromempecorssjoindeptd.?

分组

Groupby:

分组

查询每个部门都有多少人

selectcount(*),deptno

fromemp

wheredeptnoisnotnull

groupbydeptno;

限制条件

Where

Where限制的条件中是不允许使用聚合函数

Having

运算是在基本运算之后执行,在having中可以使用聚合函数进行运算

查询平均工资大于2000的部门

selectavg(sal),deptno

fromemp

groupbydeptno

havingavg(sal)>2000;

Orderby拼接

selectavg(sal),deptno

fromemp

groupbydeptno

havingavg(sal)>2000

orderbydeptnoasc;

执行顺序:

groupby-having--orderby

groupby-orderby-having:

在过滤脏数据之前,不允许排序

数据的修改

添加

删除

更新

Update:

更新

updatedeptsetdname='RESEARCH'wheredeptno=20;

update

updateempsetsal=decode(deptno,10,sal*1.1,20,sal*1.15,30,sal*1.2,sal*1.18);

查找雇员姓名,工资,部门名称,工资级别,所属领导,领导的工资级别

1.查找雇员姓名,工资,部门名称,工资级别

selecte.ename,e.sal,d.dname,s.grade

fromempe,deptd,salgrades

wheree.deptno=d.deptnoande.salbetweens.losalands.hisal;

2.加上领导和对应的工资级别

selecte.ename,e.sal,d.dname,s.grade,m.ename,ms.grade

fromempe,deptd,salgrades,empm,salgradems

wheree.deptno=d.deptnoande.salbetweens.losalands.hisal

ande.mgr=m.empnoandm.salbetweenms.losalandms.hisal;

显示结果:

要求:

grade=1:

第五级别工资

grade=2:

第四级别工资

grade=3:

第三级别工资

grade=4:

第二级别工资

grade=5:

第一级别工资

selecte.ename,e.sal,d.dname,

decode(s.grade,1,'第五级别',2,'第四级别',3,'第三级别',4,'第二界别',5,'第一级别'),

m.ename,ms.grade

fromempe,deptd,salgrades,empm,salgradems

wheree.deptno=d.deptnoande.salbetweens.losalands.hisal

ande.mgr=m.empnoandm.salbetweenms.losalandms.hisal;

子查询

子查询就是在当前查询中包含其他查询

要查询比7654工资还要高的员工

1.查询7654相关信息

select*fromempwheresal>(selecte.salfromempewheree.empno=7654)

2.要求查询不比7654工资高,同时与7788从事相同工作的全部雇员的信息

select*fromempwheresal<=(

selectsalfromempwhereempno=7654)

andjob=(

selectjobfromempwhereempno=7844)

3.要求查询出工资最低的雇员的姓名、工作、工资

selecte.ename姓名,e.job工作,e.sal工资fromempewheresal=(

selectmin(sal)fromemp)

4.要求查询出部门名称,部门的员工数、部门的平均工资、部门的最低收工资和最高的工资

selectmxiDept.dname,mxiDept.ag,mxiDept.mi,mxiDept.ma,count(oute.empno)

fromempoute,

selectd.deptno,d.dname,min(e.sal)mi,max(e.sal)ma,avg(e.sal)ag

fromempe,deptd

wheree.deptno=d.deptno

groupbyd.deptno,d.dname

)mxiDept

whereoute.deptno=mxiDept.deptno

groupbymxiDept.dname,mxiDept.ag,mxiDept.mi,mxiDept.ma

子查询中有相应的操作符:

IN

ANY

ALL

IN:

规范的跟已有的结果集对应的值相同的范围

select*from

empwheresalin

(selectsalfromempewheree.ename=upper('smith'))

select*fromempwheredeptnoin(10,20)

ANY:

>any:

比较的是最小的

select*from

empwheresal>any

(selectsalfromempewheree.enamein(upper('smith'),upper('MARTIN')))

select*fromempwheredeptnoin(10,20)

比较的是最大的

select*from

empwheresal

(selectsalfromempewheree.enamein(upper('smith'),upper('MARTIN')))

ALL

>All比最大的都大

对数据的更改:

--提交

commit;

--回滚

rollback;

rollback;

拷贝表:

createtableMYEMPasselect*fromemp;

插入数据:

/*

insertintotablename(字段1,字段2,字段3....字段n)values(字段1的值,字段2的值,字段3的值....字段n的值)

在values中的值必须是符合字段对应类型的

*/

insertintomyemp--(empno,ename,job,mgr,hiredate,sal,comm,deptno)

values(8001,'JACK','ANALYST',7566,to_date('1985-03-04','yyyy-MM-dd'),1900,0,20)

insertintomyemp(empno)values(8003)

修改数据

/*

updatetablenameset字段1=值1,字段2=值2......

{where条件字段=条件值......}

*/

updatemyempsetename='HUGO'whereempno=8003

删除数据

/*

delete{from}tablename{where条件}

*/

deletefrommyempwhereempno=7369

Where1=1用法

UpdatetablenamesetcolumnName=valuewhere1=1

表管理和约束

表的创建和管理

约束管理

表的创建(重点)

复制表

(1):

复制了表的结构同时复制了表中的数据

createtablemyempasselect*fromempwhere1=1

复制表

(2)复制表结构,而不复制表中数据,其实就是用where进行限制

createtabletestempasselect*fromempwhere1=2

创建表:

createtable表明(

字段1类型default默认值,

字段2类型default默认值,

.....

字段n类型default默认值,

);

USER不能作为数据库的表名称

创建一个org_user表,其中的字段为

用户表(ORG_USER)

No.

ColumnName

Type

Desc

1

userid

NUMBER(10),

用户ID

2

username

VARCHAR2(50)

用户姓名

3

login

VARCHAR2(15)

用户登录名

4

pass

Varchar2(10)

登录密码

5

uidentity

varchar2(20)

身份证号

createtableorg_user(

useridNUMBER(10),

usernameVARCHAR2(50),

loginVARCHAR2(15),

passVarchar2(10),

uidentityvarchar2(20)

);

表删除

如果当前表创建失误,那么就需要删除

关键字:

DORPTABLETABLENAME

droptabletestemp;

这样删除会出现一个亿“BIN”开头的垃圾表,原因是oracle为了防止用户将数据库表误删除,将所删除的表放入到垃圾回收站中,这样用户就可以通过回闪(flashback)将所删

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

当前位置:首页 > 经管营销 > 人力资源管理

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

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