oracle教程从入门到精通之欧阳治创编.docx
- 文档编号:15442639
- 上传时间:2023-07-04
- 格式:DOCX
- 页数:52
- 大小:453.20KB
oracle教程从入门到精通之欧阳治创编.docx
《oracle教程从入门到精通之欧阳治创编.docx》由会员分享,可在线阅读,更多相关《oracle教程从入门到精通之欧阳治创编.docx(52页珍藏版)》请在冰点文库上搜索。
oracle教程从入门到精通之欧阳治创编
韩顺平—玩转oracle视频教程笔记
时间2021.03.10
创作:
欧阳治
一:
Oracle认证,与其它数据库比较,安装
Oracle安装会自动的生成sys用户和system用户:
(1)sys用户是超级用户,具有最高权限,具有sysdba角色,有createdatabase的权限,该用户默认的密码是change_on_install
(2)system用户是管理操作员,权限也很大。
具有sysoper角色,没有createdatabase的权限,默认的密码是manager
(3)一般讲,对数据库维护,使用system用户登录就可以拉
也就是说sys和system这两个用户最大的区别是在于有没有createdatabase的权限。
二:
Oracle的基本使用--基本命令
sql*plus的常用命令连接命令
1.conn[ect]用法:
conn用户名/密码@网络服务名[assysdba/sysoper]当用特权用户身份连接时,必须带上assysdba或是assysoper2.disc[onnect]说明:
该命令用来断开与当前数据库的连接3.psssw[ord]说明:
该命令用于修改用户的密码,如果要想修改其它用户的密码,需要用sys/system登录。
4.showuser说明:
显示当前用户名5.exit说明:
该命令会断开与数据库的连接,同时会退出sql*plus文件操作命令1.start和@说明:
运行sql脚本案例:
sql>@d:
\a.sql或是sql>startd:
\a.sql2.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.sql3.spool说明:
该命令可以将sql*plus屏幕上的内容输出到指定文件中去。
spoold:
\b.sql并输入spooloff显示和设置环境变量
概述:
可以用来控制输出的各种格式,setshow如果希望永久的保存相关的设置,可以去修改glogin.sql脚本
1.linesize
说明:
设置显示行的宽度,默认是80个字符
showlinesize
setlinesize90
2.pagesize说明:
设置每页显示的行数目,默认是14
用法和linesize一样
至于其它环境参数的使用也是大同小异
三:
oracle用户管理
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_attempts3password_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)建立profileSQL>createprofilepassword_historylimitpassword_life_time10password_grace_time2password_reuse_time10password_reuse_time//指定口令可重用时间即10天后就可以重用2)分配给某个用户删除profile概述:
当不需要某个profile文件时,可以删除该文件。
SQL>dropprofilepassword_history【casade】注意:
文件删除后,用这个文件去约束的那些用户通通也都被释放了。
加了casade,就会把级联的相关东西也给删除掉
四:
oracle表的管理(数据类型,表创建删除,数据CRUD操作)
oracle的表的管理
表名和列的命名规则
∙必须以字母开头
∙长度不能超过30个字符
∙不能使用oracle的保留字
∙只能使用如下字符A-Z,a-z,0-9,$,#等
oracle支持的数据类型字符类char 定长最大2000个字符。
例子:
char(10) ‘小韩’前四个字符放‘小韩’,后添6个空格补全如‘小韩’varchar2(20) 变长 最大4000个字符。
例子:
varchar2(10)‘小韩’oracle分配四个字符。
这样可以节省空间。
clob(characterlargeobject)字符型大对象最大4Gchar查询的速度极快浪费空间,查询比较多的数据用。
varchar节省空间数字型number范围-10的38次方到10的38次方可以表示整数,也可以表示小数number(5,2)表示一位小数有5位有效数,2位小数范围:
-999.99到999.99number(5)表示一个5位整数范围99999到-99999
日期类型date包含年月日和时分秒 oracle默认格式 1-1月-1999timestamp这是oracle9i对date数据类型的扩展。
可以精确到毫秒。
图片blob二进制数据可以存放图片/声音 4G 一般来讲,在真实项目中是不会把图片和声音真的往数据库里存放,一般存放图片、视频的路径,如果安全需要比较高的话,则放入数据库。
怎样创建表建表--学生表createtablestudent( ---表名 xh number(4), --学号 xm varchar2(20), --姓名 sex char
(2), --性别 birthdaydate, --出生日期 sal number(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月份 yy 2位的年 ‘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;--删除表中的所有记录,表结构还在,不写日志,无法找回删除的记录,速度快。
五:
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),uPasswVARCHAR2(30));INSERTINTOusersVALUES('a0001','啊啊啊啊','aaaaaaaaaaaaaaaaaaaaaaa');--从自己复制,加大数据量大概几万行就可以了 可以用来测试sql语句执行效率INSERTINTOusers(userId,UNAME,UPASSW)SELECT*FROMusers;SELECTCOUNT(*)FROMusers;统计行数
查询指定列SELECTename,sal,job,deptnoFROMemp;如何取消重复行DISTINCTSELECTDISTINCTdeptno,jobFROMemp;查询SMITH所在部门,工作,薪水SELECTdeptno,job,salFROMempWHEREename='SMITH';注意:
oracle对内容的大小写是区分的,所以ename='SMITH'和ename='smith'是不同的
使用算术表达式 nvl null问题:
如何显示每个雇员的年工资?
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;
六:
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表复杂查询说明在实际应用中经常需要执行复杂的数据统计,经常需要显示多张表的数据,现在我们给大家介绍较为复杂的select语句
数据分组——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子句用于限制分组显示结果。
问题:
如何显示每个部门的平均工资和最高工资?
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- oracle 教程 入门 精通 欧阳 创编