最新韩顺平oracle课件.docx

上传人:b****3 文档编号:26610015 上传时间:2023-06-20 格式:DOCX 页数:99 大小:135.47KB
下载 相关 举报
最新韩顺平oracle课件.docx_第1页
第1页 / 共99页
最新韩顺平oracle课件.docx_第2页
第2页 / 共99页
最新韩顺平oracle课件.docx_第3页
第3页 / 共99页
最新韩顺平oracle课件.docx_第4页
第4页 / 共99页
最新韩顺平oracle课件.docx_第5页
第5页 / 共99页
点击查看更多>>
下载资源
资源描述

最新韩顺平oracle课件.docx

《最新韩顺平oracle课件.docx》由会员分享,可在线阅读,更多相关《最新韩顺平oracle课件.docx(99页珍藏版)》请在冰豆网上搜索。

最新韩顺平oracle课件.docx

最新韩顺平oracle课件

Oracle的基本使用--基本命令

.连接命令

1.conn[ect]

用法:

conn用户名/密码@网络服务名[assysdba/sysoper]当用特权用户身份连接时,必须带上assysdba或是assysoper

2.disc[onnect]说明:

该命令用来断开与当前数据库的连接

3.psssw[ord]

说明:

该命令用于修改用户的密码,如果要想修改其它用户的密码,需要用sys/system登录。

4.showuser说明:

显示当前用户名

5.exit说明:

该命令会断开与数据库的连接,同时会退出sql*plus

.文件操作命令

1.start和@说明:

运行sql脚本

案例:

sql>@d:

\a.sql或是sql>startd:

\a.sql

2.edit说明:

该命令可以编辑指定的sql脚本

案例:

sql>editd:

\a.sql,这样会把d:

\a.sql这个文件打开

3.spool说明:

该命令可以将sql*plus屏幕上的内容输出到指定文件中去。

案例:

sql>spoold:

\b.sql并输入sql>spooloff

.交互式命令

1.&

说明:

可以替代变量,而该变量在执行时,需要用户输入。

select*fromempwherejob='&job';

2.edit

说明:

该命令可以编辑指定的sql脚本

案例:

SQL>editd:

\a.sql

3.spool

说明:

该命令可以将sql*plus屏幕上的内容输出到指定文件中去。

spoold:

\b.sql并输入spooloff

.显示和设置环境变量

概述:

可以用来控制输出的各种格式,setshow如果希望永久的保存相关的设置,可以去修改glogin.sql脚本

1.linesize

说明:

设置显示行的宽度,默认是80个字符

showlinesize

setlinesize90

2.pagesize说明:

设置每页显示的行数目,默认是14

用法和linesize一样

至于其它环境参数的使用也是大同小异

3.oracle用户管理

.创建用户

概述:

在oracle中要创建一个新的用户使用createuser语句,一般是具有dba(数据库管理员)的权限才能使用。

createuser用户名identifiedby密码;

(oracle有个毛病,密码必须以字母开头,如果以字母开头,它不会创建用户)

.给用户修改密码

概述:

如果给自己修改密码可以直接使用

password用户名

如果给别人修改密码则需要具有dba的权限,或是拥有alteruser的系统权限

SQL>alteruser用户名identifiedby新密码

.删除用户

概述:

一般以dba的身份去删除某个用户,如果用其它用户去删除用户则需要具

有dropuser的权限。

比如dropuser用户名【cascade】

在删除用户时,注意:

如果要删除的用户,已经创建了表,那么就需要在删除的时候带一个参数

cascade;

概述:

创建的新用户是没有任何权限的,甚至连登陆的数据库的权限都没有,需

要为其指定相应的权限。

给一个用户赋权限使用命令grant,回收权限使用命令revoke。

为了给讲清楚用户的管理,这里我给大家举一个案例。

SQL>connxiaoming/m12;

ERROR:

ORA-01045:

userXIAOMINGlacksCREATESESSIONprivilege;logondenied

警告:

您不再连接到ORACLE。

SQL>showuser;

USER为""

SQL>connsystem/p;

已连接。

SQL>grantconnecttoxiaoming;

授权成功。

SQL>connxiaoming/m12;

已连接。

SQL>

注意:

grantconnecttoxiaoming;在这里,准确的讲,connect不是权限,而

是角色。

看图:

现在说下对象权限,现在要做这么件事情:

*希望xiaoming用户可以去查询emp表

*希望xiaoming用户可以去查询scott的emp表

grantselectonemptoxiaoming

*希望xiaoming用户可以去修改scott的emp表

grantupdateonemptoxiaoming

*希望xiaoming用户可以去修改/删除,查询,添加scott的emp表

grantallonemptoxiaoming

*scott希望收回xiaoming对emp表的查询权限

revokeselectonempfromxiaoming

//对权限的维护。

*希望xiaoming用户可以去查询scott的emp表/还希望xiaoming可以把这个

权限继续给别人。

--如果是对象权限,就加入withgrantoption

grantselectonemptoxiaomingwithgrantoption

我的操作过程:

SQL>connscott/tiger;

已连接。

SQL>grantselectonscott.emptoxiaomingwithgrantoption;

授权成功。

SQL>connsystem/p;

已连接。

SQL>createuserxiaohongidentifiedbym123;

用户已创建。

SQL>grantconnecttoxiaohong;

授权成功。

SQL>connxiaoming/m12;

已连接。

SQL>grantselectonscott.emptoxiaohong;

授权成功。

--如果是系统权限。

system给xiaoming权限时:

grantconnecttoxiaomingwithadminoption

问题:

如果scott把xiaoming对emp表的查询权限回收,那么xiaohong会怎样?

答案:

被回收。

下面是我的操作过程:

SQL>connscott/tiger;

已连接。

SQL>revokeselectonempfromxiaoming;

撤销成功。

SQL>connxiaohong/m123;

已连接。

SQL>select*fromscott.emp;

select*fromscott.emp

*

第1行出现错误:

ORA-00942:

表或视图不存在

结果显示:

小红受到诛连了。

.使用profile管理用户口令

概述:

profile是口令限制,资源限制的命令集合,当建立数据库的,oracle会自动建立名称为default的profile。

当建立用户没有指定profile选项,那么oracle就会将default分配给用户。

1.账户锁定

概述:

指定该账户(用户)登陆时最多可以输入密码的次数,也可以指定用户锁定的时间(天)一般用dba的身份去执行该命令。

例子:

指定scott这个用户最多只能尝试3次登陆,锁定时间为2天,让我们看看怎么实现。

创建profile文件

SQL>createprofilelock_accountlimitfailed_login_attempts3

password_lock_time2;

SQL>alteruserscottprofilelock_account;

2.给账户(用户)解锁

SQL>alteruserteaaccountunlock;

3.终止口令

为了让用户定期修改密码可以使用终止口令的指令来完成,同样这个命令也需要

dba的身份来操作。

例子:

给前面创建的用户tea创建一个profile文件,要求该用户每隔10天要修改自己的登陆密码,宽限期为2天。

看看怎么做。

SQL>createprofilemyprofilelimitpassword_life_time10password_grace_time2;

SQL>alteruserteaprofilemyprofile;

口令历史

概述:

如果希望用户在修改密码时,不能使用以前使用过的密码,可使用口令历

史,这样oracle就会将口令修改的信息存放到数据字典中,这样当用户修改密码时,oracle就会对新旧密码进行比较,当发现新旧密码一样时,就提示用户重新输入密码。

例子:

1)建立profile

SQL>createprofilepassword_historylimitpassword_life_time10

password_grace_time2password_reuse_time10

password_reuse_time//指定口令可重用时间即10天后就可以重用

2)分配给某个用户

.删除profile

概述:

当不需要某个profile文件时,可以删除该文件。

SQL>dropprofilepassword_history【casade】

注意:

文件删除后,用这个文件去约束的那些用户通通也都被释放了。

加了casade,就会把级联的相关东西也给删除掉

4.oracle表的管理(数据类型,表创建删除,数据CRUD操作)

oracle的表的管理

表名和列的命名规则

.必须以字母开头

.不能使用oracle的保留字

.长度不能超过30个字符

.只能使用如下字符A-Z,a-z,0-9,$,#等

oracle支持的数据类型.

字符类

char定长最大2000个字符。

例子:

char(10)‘小韩’前四个字符放‘小韩’,后添6个空格补全如‘小韩’

varchar2(20)变长最大4000个字符。

例子:

varchar2(10)‘小韩’oracle分配四个字符。

这样可以节省空间。

clob(characterlargeobject)字符型大对象最大4G

char查询的速度极快浪费空间,查询比较多的数据用。

varchar节省空间

数字型.

number范围-10的38次方到10的38次方可以表示整数,也可以表示小数

number(5,2)表示一位小数有5位有效数,2位小数范围:

-999.99到999.99

number(5)表示一个5位整数范围99999到-99999

.日期类型

date包含年月日和时分秒oracle默认格式1-1月-1999

timestamp这是oracle9i对date数据类型的扩展。

可以精确到毫秒。

图片.

blob二进制数据可以存放图片/声音4G一般来讲,在真实项目中是不会把图片和声音真的往数据库里存放,一般存放图片、视频的路径,如果安全需要比较高的话,则放入数据库。

建表.

--学生表

createtablestudent(---表名

xhnumber(4),--学号

xmvarchar2(20),--姓名

sexchar

(2),--性别

birthdaydate,--出生日期

salnumber(7,2)--奖学金);

--班级表

CREATETABLEclass(

classIdNUMBER

(2),

cNameVARCHAR2(40)

);

修改表

添加一个字段.

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月份yy2位的年‘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;--删除表中的所有记录,表结构还在,不写日志,无法找回删除的记录,速度快。

5.oracle表查询

(1)

oracle表基本查询

在我们讲解的过程中我们利用scott用户存在的几张表(emp,dept)为大家演示如何使用select语句,select语句在软件编程中非常有用,希望大家好好的掌握。

emp雇员表

clerk普员工

salesman销售

manager经理

analyst分析师

president总裁

mgr上级的编号

hiredate入职时间

sal月工资

comm奖金

deptno部门

dept部门表

deptno部门编号

accounting财务部

research研发部

operations业务部

loc部门所在地点

salgrade工资级别

grade级别

losal最低工资

hisal最高工资

查看表结构.

DESCemp;

查询所有列.

SELECT*FROMdept;

切忌动不动就用select*

SETTIMINGON;打开显示操作时间的开关,在下面显示查询时间。

CREATETABLEusers(userIdVARCHAR2(10),uNameVARCHAR2(20),uPassw

INSERTINTOusersVALUES('a0001','啊啊啊啊','aaaaaaaaaaaaaaaaaaaaaaa');

--从自己复制,加大数据量大概几万行就可以了可以用来测试sql语句执行效率

INSERTINTOusers(userId,UNAME,UPASSW)SELECT*FROMusers;

SELECTCOUNT(*)FROMusers;统计行数

查询指定列.

SELECTename,sal,job,deptnoFROMemp;

如何取消重复行DISTINCT.

SELECTDISTINCTdeptno,jobFROMemp;

?

查询SMITH所在部门,工作,薪水

SELECTdeptno,job,salFROMempWHEREename='SMITH';

注意:

oracle对内容的大小写是区分的,所以ename='SMITH'和ename='smith'是不同的

使用算术表达式.nvlnull

问题:

如何显示每个雇员的年工资?

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;

6.oracle表查询

(2)

使用逻辑操作符号.

问题:

查询工资高于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清屏命令

oracle表复杂查询

数据分组——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子句用于限制分组显示结果。

问题:

如何显示每个部门的平均

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

当前位置:首页 > 高等教育 > 艺术

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

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