最新韩顺平oracle课件.docx
《最新韩顺平oracle课件.docx》由会员分享,可在线阅读,更多相关《最新韩顺平oracle课件.docx(99页珍藏版)》请在冰豆网上搜索。
最新韩顺平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子句用于限制分组显示结果。
问题:
如何显示每个部门的平均