韩顺平oracle0-30教学笔记.docx

上传人:小飞机 文档编号:1676728 上传时间:2022-12-13 格式:DOCX 页数:90 大小:115.85KB
返回 下载 相关 举报
韩顺平oracle0-30教学笔记.docx_第1页
第1页 / 共90页
韩顺平oracle0-30教学笔记.docx_第2页
第2页 / 共90页
韩顺平oracle0-30教学笔记.docx_第3页
第3页 / 共90页
韩顺平oracle0-30教学笔记.docx_第4页
第4页 / 共90页
韩顺平oracle0-30教学笔记.docx_第5页
第5页 / 共90页
点击查看更多>>
资源描述

《韩顺平oracle0-30教学笔记.docx》由会员分享,可在线阅读,更多相关《韩顺平oracle0-30教学笔记.docx(90页珍藏版)》请在三一办公上搜索。

1、韩顺平玩转Oracle9i1. Oracle认证和安装,与其他数据库比较Oracle安装会自动的生成sys用户和system用户:(1)sys用户是超级用户,具有最高权限,具有sysdba角色,有create database的权限,该用户默认的密码是change_on_install(2)system用户是管理操作员,权限也很大。具有sysoper角色,没有create database的权限,默认的密码是manager(3)一般讲,对数据库维护,使用system用户登录就可以拉也就是说sys和system这两个用户最大的区别是在于有没有create database的权限。2. Oracl

2、e的基本使用-基本命令sql*plus的常用命令n 连接命令 1.connect用法:conn 用户名/密码网络服务名as sysdba/sysoper当用特权用户身份连接时,必须带上as sysdba或是as sysoper远程连接:sqlplus usr/pwd/host:port/sid 如:conn sys/admin127.0.0.1:1521/orcl as sysdba;2.disconnect说明: 该命令用来断开与当前数据库的连接3.psssword说明: 该命令用于修改用户的密码,如果要想修改其它用户的密码,需要用sys/system登录。4.show user说明: 显示

3、当前用户名5.exit说明: 该命令会断开与数据库的连接,同时会退出sql*plus n 文件操作命令 1.start和说明: 运行sql脚本案例: sql d:a.sql或是sqlstart d:a.sql2.edit说明: 该命令可以编辑指定的sql脚本案例: sqledit d:a.sql,这样会把d:a.sql这个文件打开3.spool说明: 该命令可以将sql*plus屏幕上的内容输出到指定文件中去。案例: sqlspool d:b.sql 并输入 sqlspool off n 交互式命令 1.&说明:可以替代变量,而该变量在执行时,需要用户输入。select * from emp

4、where job=&job;2.edit说明:该命令可以编辑指定的sql脚本案例:SQLedit d:a.sql3.spool说明:该命令可以将sql*plus屏幕上的内容输出到指定文件中去。spool d:b.sql 并输入 spool offn 显示和设置环境变量概述:可以用来控制输出的各种格式,set show如果希望永久的保存相关的设置,可以去修改glogin.sql脚本1.linesize说明:设置显示行的宽度,默认是80个字符show linesize set linesize 902.pagesize说明:设置每页显示的行数目,默认是14用法和linesize一样至于其它环境参

5、数的使用也是大同小异3. oracle用户管理n 创建用户概述:在oracle中要创建一个新的用户使用create user语句,一般是具有dba(数据库管理员)的权限才能使用。create user 用户名 identified by 密码; (oracle有个毛病,密码必须以字母开头,如果以字母开头,它不会创建用户) n 给用户修改密码概述:如果给自己修改密码可以直接使用password 用户名如果给别人修改密码则需要具有dba的权限,或是拥有alter user的系统权限SQL alter user 用户名 identified by 新密码n 删除用户概述:一般以dba的身份去删除某个

6、用户,如果用其它用户去删除用户则需要具有drop user的权限。比如 drop user 用户名 【cascade】在删除用户时,注意:如果要删除的用户,已经创建了表,那么就需要在删除的时候带一个参数cascade; n 用户管理的综合案例概述:创建的新用户是没有任何权限的,甚至连登陆的数据库的权限都没有,需要为其指定相应的权限。给一个用户赋权限使用命令grant,回收权限使用命令revoke。为了给讲清楚用户的管理,这里我给大家举一个案例。SQL conn xiaoming/m12; ERROR: ORA-01045: user XIAOMING lacks CREATE SESSION

7、privilege; logon denied警告: 您不再连接到 ORACLE。SQL show user; USER 为 SQL conn system/p;已连接。 SQL grant connect to xiaoming;授权成功。 SQL conn xiaoming/m12;已连接。 SQL注意:grant connect to xiaoming;在这里,准确的讲,connect不是权限,而是角色。 看图: 现在说下对象权限,现在要做这么件事情: * 希望xiaoming用户可以去查询emp表 * 希望xiaoming用户可以去查询scott的emp表 grant select o

8、n emp to xiaoming * 希望xiaoming用户可以去修改scott的emp表 grant update on emp to xiaoming* 希望xiaoming用户可以去修改/删除,查询,添加scott的emp表 grant all on emp to xiaoming* scott希望收回xiaoming对emp表的查询权限 revoke select on emp from xiaoming /对权限的维护。* 希望xiaoming用户可以去查询scott的emp表/还希望xiaoming可以把这个权限继续给别人。-如果是对象权限,就加入 with grant opt

9、iongrant select on emp to xiaoming with grant option我的操作过程: SQL conn scott/tiger;已连接。SQL grant select on scott.emp to xiaoming with grant option;授权成功。SQL conn system/p;已连接。SQL create user xiaohong identified by m123;用户已创建。SQL grant connect to xiaohong;授权成功。 SQL conn xiaoming/m12;已连接。SQL grant select

10、 on scott.emp to xiaohong;授权成功。 -如果是系统权限。system给xiaoming权限时: grant connect to xiaoming with admin option问题:如果scott把xiaoming对emp表的查询权限回收,那么xiaohong会怎样?答案:被回收。下面是我的操作过程:SQL conn scott/tiger;已连接。SQL revoke select on emp from xiaoming;撤销成功。 SQL conn xiaohong/m123;已连接。SQL select * from scott.emp; select

11、* from scott.emp *第 1 行出现错误:ORA-00942: 表或视图不存在结果显示:小红受到诛连了。 n 使用profile管理用户口令概述:profile是口令限制,资源限制的命令集合,当建立数据库的,oracle会自动建立名称为default的profile。当建立用户没有指定profile选项,那么oracle就会将default分配给用户。 1.账户锁定概述:指定该账户(用户)登陆时最多可以输入密码的次数,也可以指定用户锁定的时间(天)一般用dba的身份去执行该命令。例子:指定scott这个用户最多只能尝试3次登陆,锁定时间为2天,让我们看看怎么实现。创建profil

12、e文件SQL create profile lock_account limit failed_login_attempts 3 password_lock_time 2; SQL alter user scott profile lock_account; 2.给账户(用户)解锁 SQL alter user tea account unlock; 3.终止口令为了让用户定期修改密码可以使用终止口令的指令来完成,同样这个命令也需要dba的身份来操作。例子:给前面创建的用户tea创建一个profile文件,要求该用户每隔10天要修改自己的登陆密码,宽限期为2天。看看怎么做。SQL create

13、 profile myprofile limit password_life_time 10 password_grace_time 2; SQL alter user tea profile myprofile;口令历史概述:如果希望用户在修改密码时,不能使用以前使用过的密码,可使用口令历史,这样oracle就会将口令修改的信息存放到数据字典中,这样当用户修改密码时,oracle就会对新旧密码进行比较,当发现新旧密码一样时,就提示用户重新输入密码。例子:1)建立profileSQLcreate profile password_history limit password_life_time

14、 10 password_grace_time 2 password_reuse_time 10 password_reuse_time /指定口令可重用时间即10天后就可以重用2)分配给某个用户 n 删除profile概述:当不需要某个profile文件时,可以删除该文件。SQL drop profile password_history 【casade】注意:文件删除后,用这个文件去约束的那些用户通通也都被释放了。加了casade,就会把级联的相关东西也给删除掉4. oracle表的管理(数据类型,表创建删除,数据 CRUD操作)内容介绍 1.上节回顾 2.oracle的表的管理 3.基本

15、查询 4.复杂查询 5.oracle数据库的创建期望目标 1.掌握oracle表的管理(创建/维护) 2.掌握对oracle表的各种查询技巧 3.学会创建新的oracle数据库 oracle的表的管理表名和列的命名规则 必须以字母开头 长度不能超过30个字符 不能使用oracle的保留字 只能使用如下字符 A-Z,a-z,0-9,$,#等oracle支持的数据类型n 字 符类 char 定长 最大2000个字符。例子:char(10) 小韩前四个字符放小韩,后添6个空格补全 如小韩 varchar2(20) 变长 最大4000个字符。例子:varchar2(10) 小韩 oracle分配四个字

16、符。这样可以节省空间。clob(character large object) 字符型大对象 最大4Gchar 查询的速度极快浪费空间,查询比较多的数据用。varchar 节省空间 n 数字型number范围 -10的38次方 到 10的38次方可以表示整数,也可以表示小数 number(5,2)表示一位小数有5位有效数,2位小数范围:-999.99到999.99number(5)表示一个5位整数范围99999到-99999 n 日期类型 date 包含年月日和时分秒 oracle默认格式 1-1月-1999 timestamp 这是oracle9i对date数据类型的扩展。可以精确到毫秒。n

17、 图片 blob 二进制数据 可以存放图片/声音 4G 一般来讲,在真实项目中是不会把图片和声音真的往数据库里存放,一般存放图片、视频的路径,如果安全需要比较高的话,则放入数据库。怎样创建表 n 建表 -学生表 create table student ( -表名 xh number(4), -学号 xm varchar2(20), -姓名 sex char(2), -性别 birthday date, -出生日期 sal number(7,2) -奖学金); -班级表 CREATE TABLE class(classId NUMBER(2),cName VARCHAR2(40);修改表n 添

18、加一个字段SQLALTER TABLE student add (classId NUMBER(2); n 修改一个字段的长度SQLALTER TABLE student MODIFY (xm VARCHAR2(30); n 修改字段的类型/或是名字(不能有数据) 不建议做SQLALTER TABLE student modify (xm CHAR(30); n 删除一个字段 不建议做(删了之后,顺序就变了。加就没问题,应为是加在后面) SQLALTER TABLE student DROP COLUMN sal; n 修改表的名字 很少有这种需求SQLRENAME student TO st

19、u; n 删除表 SQLDROP TABLE student;添加数据 n 所有字段都插入数据INSERT INTO student VALUES (A001, 张三, 男, 01-5月-05, 10); oracle中默认的日期格式dd-mon-yy dd日子(天) mon 月份 yy 2位的年 09-6月-99 1999年6月9日修改日期的默认格式(临时修改,数据库重启后仍为默认;如要修改需要修改注册表)ALTER SESSION SET NLS_DATE_FORMAT =yyyy-mm-dd;修改后,可以用我们熟悉的格式添加日期类型: INSERT INTO student VALUES

20、 (A002, MIKE, 男, 1905-05-06, 10); n 插入部分字段INSERT INTO student(xh, xm, sex) VALUES (A003, JOHN, 女); n 插入空值INSERT INTO student(xh, xm, sex, birthday) VALUES (A004, MARTIN, 男, null);问题来了,如果你要查询student表里birthday为null的记录,怎么写sql呢?错误写法:select * from student where birthday = null;正确写法:select * from student

21、where birthday is null;如果要查询birthday不为null,则应该这样写: select * from student where birthday is not null;修改数据n 修改一个字段UPDATE student SET sex = 女 WHERE xh = A001; n 修改多个字段UPDATE student SET sex = 男, birthday = 1984-04-01 WHERE xh = A001;修改含有null值的数据不要用 = null 而是用 is null; SELECT * FROM student WHERE birthd

22、ay IS null;n 删除数据DELETE FROM student;删除所有记录,表结构还在,写日志,可以恢复的,速度慢。Delete 的数据可以恢复。savepoint a; -创建保存点DELETE FROM student; rollback to a; -恢复到保存点一个有经验的DBA,在确保完成无误的情况下要定期创建还原点。DROP TABLE student; -删除表的结构和数据; delete from student WHERE xh = A001; -删除一条记录; truncate TABLE student; -删除表中的所有记录,表结构还在,不写日志,无法找回删

23、除的记录,速度快。5. oracle表查询(1)n 介绍在我们讲解的过程中我们利用scott用户存在的几张表(emp,dept)为大家演示如何使用select语句,select语句在软件编程中 非常有用,希望大家好好的掌握。emp 雇员表 clerk 普员工salesman 销售manager 经理analyst 分析师president 总裁mgr 上级的编号hiredate 入职时间sal 月工资comm 奖金deptno 部门dept部门表deptno 部门编号accounting 财务部research 研发部operations 业务部loc 部门所在地点salgrade 工资级别g

24、rade 级别losal 最低工资hisal 最高工资简单的查询语句n 查看表结构DESC emp; n 查询所有列SELECT * FROM dept;切忌动不动就用select *SET TIMING ON; 打开显示操作时间的开关,在下面显示查询时间。CREATE TABLE users(userId VARCHAR2(10), uName VARCHAR2 (20), uPassw VARCHAR2(30); INSERT INTO users VALUES(a0001, 啊啊啊啊, aaaaaaaaaaaaaaaaaaaaaaa); -从自己复制,加大数据量 大概几万行就可以了 可以

25、用来测试sql语句执行效率INSERT INTO users (userId,UNAME,UPASSW) SELECT * FROM users; SELECT COUNT (*) FROM users;统计行数n 查询指定列SELECT ename, sal, job, deptno FROM emp; n 如何取消重复行DISTINCTSELECT DISTINCT deptno, job FROM emp;?查询SMITH所在部门,工作,薪水SELECT deptno,job,sal FROM emp WHERE ename = SMITH;注意:oracle对内容的大小写是区分的,所以

26、ename=SMITH和ename=smith是不同的n 使用算术表达式 nvl null问题:如何显示每个雇员的年工资?SELECT sal*13+nvl(comm, 0)*13 年薪 , ename, comm FROM emp; n 使用列的别名SELECT ename 姓名, sal*12 AS 年收入 FROM emp; n 如何处理null值使用nvl函数来处理n 如何连接字符串(|)SELECT ename | is a | job FROM emp; n 使用where子句问题:如何显示工资高于3000的 员工? SELECT * FROM emp WHERE sal 3000

27、;问题:如何查找1982.1.1后入职的员工? SELECT ename,hiredate FROM emp WHERE hiredate 1-1月-1982;问题:如何显示工资在2000到3000的员工? SELECT ename,sal FROM emp WHERE sal =2000 AND sal 500 or job = MANAGER) and ename LIKE J%; n 使用order by 字句 默认asc问题:如何按照工资的从低到高的顺序显示雇员的信息? SELECT * FROM emp ORDER by sal;问题:按照部门号升序而雇员的工资降序排列SELECT

28、* FROM emp ORDER by deptno, sal DESC; n 使用列的别名排序问题:按年薪排序select ename, (sal+nvl(comm,0)*12 年薪 from emp order by 年薪 asc;别名需要使用“”号圈中,英文不需要“”号n 分页查询等学了子查询再说吧。Clear 清屏命令oracle表复杂查询n 说明在实际应用中经常需要执行复杂的数据统计,经常需要显示多张表的数据,现在我们给大家介绍较为复杂的select语句n数据分组 max,min, avg, sum, count问题:如何显示所有员工中最高工资和最低工资?SELECT MAX(sal

29、),min(sal) FROM emp e; 最高工资那个人是谁?错误写法:select ename, sal from emp where sal=max(sal);正确写法:select ename, sal from emp where sal=(select max(sal) from emp);注意:select ename, max(sal) from emp;这语句执行的时候会报错,说ORA-00937:非单组分组函数。因为max是分组函数,而ename不是分组函数.但是select min(sal), max(sal) from emp;这句是可以执行的。因为min和max都是

30、分组函数,就是说:如果列里面有一个分组函数,其它的都必须是分组函数,否则就出错。这是语法规定的问题:如何显示所有员工的平均工资和工资总和?问题:如何计算总共有多少员工问题:如何扩展要求:查询最高工资员工的名字,工作岗位SELECT ename, job, sal FROM emp e where sal = (SELECT MAX(sal) FROM emp);显示工资高于平均工资的员工信息SELECT * FROM emp e where sal (SELECT AVG(sal) FROM emp); n group by 和 having子句group by用于对查询的结果分组统计,hav

31、ing子句用于限制分组显示结果。问题:如何显示每个部门的平均工资和最高工资?SELECT AVG(sal), MAX(sal), deptno FROM emp GROUP by deptno;(注意:这里暗藏了一点,如果你要分组查询的话,分组的字段deptno一定要出现在查询的列表里面,否则会报错。因为分组的字段都不出现的话, 就没办法分组了)问题:显示每个部门的每种岗位的平均工资和最低工资? SELECT min(sal), AVG(sal), deptno, job FROM emp GROUP by deptno, job;问题:显示平均工资低于2000的部门号和它的平均工资?SELE

32、CT AVG(sal), MAX(sal), deptno FROM emp GROUP by deptno having AVG(sal) 2000; n 对数据分组的总结1 分组函数只能出现在选择列表、having、order by子句中(不能出现在where中) 2 如果在select语句中同时包含有group by, having, order by 那么它们的顺序是group by, having, order by 3 在选择列中如果有列、表达式和分组函数,那么这些列和表达式必须有一个出现在group by 子句中,否则就会出错。如SELECT deptno, AVG(sal),

33、MAX(sal) FROM emp GROUP by deptno HAVING AVG(sal) select * from salgrade;GRADE LOSAL HISAL - - - 1 700 200 2 1201 1400 3 1401 2000 4 2001 3000 5 3001 9999 SELECT e. ename, e.sal, s.grade FROM emp e, salgrade s WHERE e.sal BETWEEN s.losal AND s.hisal;扩展要求:问题:显示雇员名,雇员工资及所在部门的名字,并按部门排序? SELECT e.ename,

34、 e.sal, d.dname FROM emp e, dept d WHERE e.deptno = d.deptno ORDER by e.deptno;(注意:如果用group by,一定要把e.deptno放到查询列里面)n 自连接自连接是指在同一张表的连接查询问题:显示某个员工的上级领导的姓名?比如显示员工FORD的上级SELECT worker.ename, boss.ename FROM emp worker,emp boss WHERE worker.mgr = boss.empno AND worker.ename = FORD;子查询 n 什么是子查询子查询是指嵌入在其他s

35、ql语句中的select语句,也叫嵌套查询。n 单行子查询单行子查询是指只返回一行数据的子查询语句请思考:显示与SMITH同部门的所有员工?思路:1 查询出SMITH的部门号select deptno from emp WHERE ename = SMITH; 2 显示SELECT * FROM emp WHERE deptno = (select deptno from emp WHERE ename = SMITH);数据库在执行sql 是从左到右扫描的, 如果有括号的话,括号里面的先被优先执行。n 多行子查询多行子查询指返回多行数据的子查询请思考:如何查询和部门10的工作相同的雇员的名字

36、、岗位、工资、部门号SELECT DISTINCT job FROM emp WHERE deptno = 10; SELECT * FROM emp WHERE job IN (SELECT DISTINCT job FROM emp WHERE deptno = 10);(注意:不能用job=.,因为等号=是一对一的)n 在多行子查询中使用all操作符问题:如何显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号? SELECT ename, sal, deptno FROM emp WHERE sal all (SELECT sal FROM emp WHERE deptno

37、= 30);扩展要求:大家想想还有没有别的查询方法。SELECT ename, sal, deptno FROM emp WHERE sal (SELECT MAX(sal) FROM emp WHERE deptno = 30);执行效率上, 函数高得多 n 在多行子查询中使用any操作符问题:如何显示工资比部门30的任意一个员工的工资高的员工姓名、工资和部门号? SELECT ename, sal, deptno FROM emp WHERE sal ANY (SELECT sal FROM emp WHERE deptno = 30);扩展要求:大家想想还有没有别的查询方法。SELECT

38、 ename, sal, deptno FROM emp WHERE sal (SELECT min(sal) FROM emp WHERE deptno = 30); n 多列子查询单行子查询是指子查询只返回单列、单行数据,多行子查询是指返回单列多行数据,都是针对单列而言的,而多列子查询是指查询返回多个列数据的子查询 语句。请思考如何查询与SMITH的部门和岗位完全相同的所有雇员。SELECT deptno, job FROM emp WHERE ename = SMITH; SELECT * FROM emp WHERE (deptno, job) = (SELECT deptno, jo

39、b FROM emp WHERE ename = SMITH); n 在from子句中使用子查询请思考:如何显示高于自己部门平均工资的员工的信息思路:1. 查出各个部门的平均工资和部门号SELECT deptno, AVG(sal) mysal FROM emp GROUP by deptno; 2. 把上面的查询结果看做是一张子表SELECT e.ename, e.deptno, e.sal, ds.mysal FROM emp e, (SELECT deptno, AVG(sal) mysal FROM emp GROUP by deptno) ds WHERE e.deptno = ds

40、.deptno AND e.sal ds.mysal;如何衡量一个程序员的水平?网络处理能力, 数据库, 程序代码的优化程序的效率要很高小总结:在这里需要说明的当在from子句中使用子查询时,该子查询会被作为一个视图来对待,因此叫做内嵌视图,当在from子句中使用子查询时,必须给 子查询指定别名。注意:别名不能用as,如:SELECT e.ename, e.deptno, e.sal, ds.mysal FROM emp e, (SELECT deptno, AVG(sal) mysal FROM emp GROUP by deptno) as ds WHERE e.deptno = ds.d

41、eptno AND e.sal ds.mysal;在ds前不能加as,否则会报错 (给表取别名的时候,不能加as;但是给列取别名,是可以加as的)n 分页查询按雇员的id号升序取出oracle的分页一共有三种方式1.根据rowid来分 select * from t_xiaoxi where rowid in (select rid from (select rownum rn, rid from(select rowid rid, cid from t_xiaoxi order by cid desc) where rownum9980) order by cid desc;执行时间0.03秒2.按分析函数来分select * from (select t.*, row_number() over(order by cid desc) rk from t_xiaoxi t) where rk9980;执行时间1.01秒 3.按rownum来分 select * from (select

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号