首页 > 代码库 > oracle学习笔记
oracle学习笔记
第一集:
#目前主流数据库 微软 sqlsever and access mysql ad2 sybase informix oracle #小型数据库:access:负载量小 100人,安全性要求不高 #中型数据库:mysql,sqlsever :负载在5000到15000 #大型数据库:sybase,oracle,db2:负载可以可以处理海量的 sybase《oracle《db2 #用什么数据库? 1.项目规模:a、负载量多大(用户量) 2.成本 3.安全性 oracle认证: 第二集 oracle安装 数据库标识 myOracle
#默认产生两个用户 a.sys------->change_on_install (超级用户,具有最高权限,sysdba角色,create database的权限) b.system---->manager(管理操作员,权限很大。具有sysoper角色,createdatebase权限)
#一般来说对数据库维护,使用system用户就可以了
第三集,oracle的启动、配置 #Oracle 的数据库是 多户 ---->到一个实例数据库 ①不同用户对表有不同的权限; #sqlserver 一用户----->多个数据库 #启动 ①OracleServer+数据库名; ②启动oracleOraHome90TNSListener
#卸载 ① #oracle管路工具的介绍
自带的工具软件,主要于执行sql语句,p1\sql快。 步骤: 1)开始-->oracle orachome90-->appliacation development --.sql*plus 2)在运行栏输入sqlpusw 即可 3)程序-->Oracle orahome 90-->appplication development -->sql*plus worksheet
oracle企业
主机字符串:即数据库名称;
#https://localhost:5500/em 可以查看数据库运行状态,进行新建表空间和用户配置
#show user;
#plSqlDeveloper
#scott/tiger #连接命令 1)conn 用法:conn 用户名/密码@网络服务器名 当特权用户身份连接时,必须带上 as sysdba 或是 as sysoper conn system/manager #断开连接命令 :disc #修改密码命令:passw # 退出命令:exit #文件操作命令 1)start和@ //运行脚本 start d:\aa.sql; 2)edit :编辑指定文件 3)spool:将sql*plus屏幕上的内容输出到指定文件中去。 spool d:\b.sql 最后输入 spool off
#设置显示行的宽度:set linesize 120; 分页设置:set pagesize 5;(设置每页的行数,默认为14)
第三节oracle 用户管理
#创建一个新的用户使用create user语句,一般是具有dba的权限才能使用 create user xiaoming identified by m123;
#给用户修改密码 需要有dba的权限或者是拥有alter user系统权限; password xiaoming;
#删除用户 一般以dba的身份删除某用户,不能自杀;如果其他用户去删除用户需要drop user的权限。
*在删除用户时,如果删除的用户已经创建了表,那么就需要带一个参数。(cascade)。 列入:drop user 用户名 【cascade】
#创建的新用户是没有任何权限的,甚至连登陆数据库的权限都没有,需要为其指定相应的权限,给用户赋予权限使用grant命令,回收权限使用revoke。 *grant connect to xiaoming #权限: 系统权限(用户对数据库访问的权限)和 对象权限(用户对其他用户的数据对象操作的权限select、insert、update) #数据对象:用户创建的表、视图、索引、触发器。。。。。 #角色:自定义角色和预定义角色 dba角色; connect角色; resource角色(可以在任何表空间建表);
#创建表 *grant resource to xiaoming(授予创建表的全权限) create table test(userId vachar2(30),userName vachar2(30));
#希望用户去查询scott的emp表; *grant select on emp to xiaoming #grant select on emp xiaoming//授权给小明
#select *form scott.emp;
#收回权限:revoke select on emp from xiaoming
#权限的传递(权限的维护): 小明用户可以查询scott的emp表,还希望小明可以把这个权限继续传给其他用户。
*如果是对象权限,就加入with grant option *grant select on emp to xiaoming with grant option; 如果是系统权限,就加 grant connect to xiaoming with admin option;
#使用profile 管理用户口令:profile是口令限制,资源限制的命令集合,当建立数据库时,oracle就会自动建立名称为default的profile 。当建立用户没有指定profile选项,oracle就会将default分配给用户。 1)账户锁定:指用户登录时最多可以输入密码的次数,也可以指用户锁定的时间,一般用dba的身份去执行该命令。
//①列子:创建profile文件 create profile lock_account limit//lock——account代表名称 failed_logion_attempts 3 password_lock_time 2; //②指定用户 alter user xiaoming profile lock_account;
2)给账户解锁 *alter user xiaming account unlock;
3)终止 为了让用户定期修改密码,可以使用终止口令来执行;用dba身份来操作 *create profile myprofile limit password_life_time 10 password_garce_time 2;//要求用户每隔10天修改自己的登录面膜。宽限2天。
4)口令历史 希望用户在修改密码时,不能使用以前用过的密码,可以使用口令历史。 *create profile password_history limit password_life_time 10 password_grace_time2password_reuse_time 10;
5)删除profile *drop profile password_history[cascade];
https://localhost:5500/em
第06讲 oracle 表的管理
#表名和列的命名规则 1)必须以字母开头 20不能超过30字符 3)不能使用oracle保留字
#oracle的数据类型 1)char 定长 最长2000字符 2)varchar2 变长 最大4000字符 3)clob 字符型大对象 最大4g
4)数字类型 number 范围-10的-38~10的38次方,可以表示整数,也可以表示小数
5)日期类型 date 包含年月日和分秒 timestamp是对date数据类型的扩充
6)图片(包括声音、视频) blob 二进制数据
#怎样创建表 ---学生表 create table student( StNumber number(4), StName varchar2(20), sex char(2), birthday date, sal number(7,2) ); #删除表 drop table students;
---班级表 CREATE table classes( classId number(2), cname varchar2(40));
#添加字段 alter table student add (classId number(2));
#查看表 desc student
#修改字段的长度 alter table student modify (xm varchar2(30));
#删除一个字段//尽量不使用 alter table student drop column sal;
#修改表名 rename student to stu;
#添加数据 所有字段都添加 insert into student values (‘A001’,‘张三’,‘男’,‘11-12月-1997’,’222.2‘,21) 日期的格式:oracle默认的日期格式‘DD-MON-YY’改日期的默认格式: alter session set nls_date_format=‘yyyy-mm-dd’; #插入部分字段 insert into student (xh,xm,sex)value (‘’,‘’,)
#插入空值 insert into student (xh,xm,sex)value (‘’,‘’,null)
#查询没有生日的人 select *from student where birthday is null;//is not null;
#修改一个字段 update student set sex=‘女’ where=‘A001’;
#修改多个字段 update student set sex=‘女’, birthday=‘1980-04-01’ where=‘A001’; 修改字段加逗号就可以。
#修改含有null用is修改。
#删除数据 delete from student;//删除了表里面的内容,但是表的结构还在;可以通过日志恢复;
#在删除之前添加回滚点(设置保存点) savepoint a; #回滚命令 rollback to a;
#删除表的结构和数据 drop table student;
#删除一条记录 delete from student where xh=‘A001’;
#删除表中的所有记录,表结构还在,不写日志,无法找回删除记录,熟读快 truncate table student;
#第八讲 oracle表查询
#查看表的结构 desc emp
#查询指定列 select ename ,sal,job,deptno from emp;
#set timing on;打开操作时间;
#insert into users (userid,username,userpassword) select *from users;自动增长数据;
#如何取消重复行 select distinct deptno,job from emp;
#如何smith 的薪水,工作,所在部门 select deptno,job,sal from emp where ename=‘SMITH‘;
#使用算术表达式
select sal*13,ename from emp;
#给列取别名 select sal*13+nvl(comm,0)*13 ”年工资“,ename from emp;
#如何处理null值:使用nvl函数来处理
#显示工资高于3000的员工 *select ename,sal from emp where sal>=3000;
#显示在1982后入职的职员 *select ename,hiredate from emp where hiredate>‘1-1月-1982‘
#显示工资在2000~2500的员工 *select ename,sal from emp where sal>=2000&sal在<=2500;
#如何使用like操作符 %表示任意0到多个字符; _表示任意单个字符; #如何显示首字符为S的员工姓名和工资 *select ename,sal from emp where ename like ‘S%’;
#如何显示第三个字符为S的员工姓名和工资 *select ename,sal from emp where ename like ‘__o%’;
#在where条件中使用in *select *from emp where empno in(123,213,324);
#如何显示没有上级的员工 *select *from emp where mgr is null;
#第09讲
#使用order by字句
#如何按照工资从低到高显示员工信息 *select *from emp order by sal #从高到底 *select *from emp order by sal desc;
#按照部门号升序而雇员的工资降序; *select *from emp order by deptno ,sal desc;
#使用列的别名排序 *select enamel,sal*12 ”年薪“ from emp order by “年薪”;
#oracle表复杂查询 #数据分组----max,min,avg,count
#如何显示所有员工最高最低工资 *select max(sal),min(sal) from emp;
#如何显示所有员工最高最低工资 *select ename,sal from emp where sal=(select min(sal) from emp);
#显示工资高于平均工资的员工信息 *select *from emp where sal>(select avg(sal) from emp);
#group by 和group by group by用于对查询的结果分组统计 group by用于限制分组显示结果
#显示每个部门的平均工资和最高工资 *select avg(sal),max(sal),deptno from emp gruop by deptno;
#显示每个部门的每种岗位的平均工资和最低工资 *select avg(sal),max(sal),deptno,job from emp group by deptno,job;
#显示平均工资低于2000的部门 *select avg(sal),max(sal),deptno from emp gruop by deptno having avg(sal)<2000 #注意 1)分组只能出现在选择列里面,或者出现在having 。orderby里面; 2)先出现order by再有having;
#显示平均工资高于2000的部门,再按avg排序 *select avg(sal),max(sal),deptno from emp group by deptno having avg(sal)>2000 order by avg(sal);
#多表查询:两个两个以上的表或是视图的查询。
#显示雇员工资所在部门的名字 *select a1.ename,a2.dname from emp a1,dept a2 where a1.deptno=a2.deptno;
#规定:多表查询的条件是 至少不能少于 表的个数-1;
#第10讲多表查询 #显示部门号为10的部门名、员工名和工资 *select a1.dname,a2.ename,a2.sal from dept a1,emp a2 where a1.deptno=a2.deptno and a1.deptno=10;
#显示各员工的姓名,工资,及其工资级别 #select a1.ename,a1.sal,a2.grade from emp a1,salgrade a2 where a1.sal between a2.LOSAL and a2.HISAL;
#自连接:在同一张表的连接查询;
#显示某员工的上级领导的姓名//把一张表看作两张 *select woker.ename,?boss.ename from emp worker,emp boss where wokker.mgr=boss.empno and worker.ename=KING;
#子查询(嵌套查询):嵌入在其他sql中的select语句;
#单行子查询:只返回一行数据的查询 显示SMITN同一部门的员工
*查询SIMITH的部门号 select deptno from emp where ename=‘SMITH‘ *显示 select *from emp where deptno=(select deptno from emp where ename=‘SMITH‘); #执行语句从左到右;
#多行子查询 #查询和10号部门的工作相同的雇员的名字、岗位、工资、部门号
select * from emp where job in (select distinct job from emp where deptn=10 );
注意:where job 后面写=还是in 取决于是单行还是多行,单用=;
#在多行子查询中使用all 操作符
#如何显示工资比部门30的所有员工的工资高的员工的姓名。工资和部门 *select ename,sal,dept from emp where sal> all(select sal from emp wherr deptno=30); *方法2 select *from emp where sal>(select max(sal) from emp where deptno=30);
#在多行子查询中使用any 操作符
显示工资比部门30的任意一个员工的工资的姓名、 *select ename,sal,dept from emp where sal> any(select sal from emp wherr deptno=30); *方法2 select *from emp where sal>(select min(sal) from emp where deptno=30);
#多列子查询
#如何查询与simth 部门和岗位相同的员工 //查询他的部门 select deptno,job from emp where ename=‘SMITH‘; //显示 select *from emp where (deptno,job)=(select deptno,job from emp where ename=‘SMITH‘);
#在from子句中使用子查询 #显示高于自己部门平均工资的员工的信息 //1、查询部门的平均工资和部门号 select deptno,avg(sal) mysal from emp group by deptno; //把上面的查询看作是一张子表 select a2.ename,a2.sal,a2.deptno,a1.mysal from emp a2,(select deptno,avg(sal) mysal from emp group by deptno) a1 where a2.deptno=a1.deptno and a2.sal>a1.mysal;
#分页查询 *分页一共有三种方式 1)rownum分页 select *from emp 2)显示rownum select a1.*,rownum rn from (select *from emp) a1 3)
取6~10行 select a1.*,rownum rn from (select *from emp) a1;//rn行号 步骤 1.select a1.*,rownum rn from (select *from emp) a1 where rownum<10; 2.select *from(select a1.*,rownum rn from (select *from emp) a1 where rownum<=10) where rn>=6;
注意: a。若指定查询列,只需修改最里层的查询 select *from(select a1.*,rownum rn from (select ename,sal from emp) a1 where rownum<=10) where rn>=6; b。排序 只需修改最里层的查询 select *from(select a1.*,rownum rn from (select ename,sal from emp order by sal ) a1 where rownum<=10) where rn>=6;
#用结果创建新表 这个命令是一个快捷的建标的方法 create table my table (id,name,sal,deptno) as select empno,ename,sal,job,deptno from emp; *比如create table Myemp1 (id,name,sal) as select empno,ename,sal from emp;
#合并查询:操作符号 union ,union all,intersect,minus 1)union 该操作用于取得两结果集的并集。会自动去掉结果集中重复行。 *select ename,sal,job from emp where sal >2500 union select ename,sak ,job from emp where job=‘manager‘; 2)union all:不会取消重复行 3)intersect 操作用于取得两结果集的交集 4)minus 操作用于取得两结果集的差集
#创建新的数据库 1)工具向导:adca 2)手工创建
-----------第12讲java操作oracle--------
#java连接oracle????? #
#使用特定格式插入日期 *使用to_date函数:用户指定添加日期的格式 *insert into emp values(9998,‘小红‘,‘MANAGER‘,‘7782‘,to_date(1998-12-12,‘yyyy-mm-dd‘),78.9,55.33,10);
#当用values子句时一次能插入多值 *create table kkk(myid number(4),myname varchar2(50),mydept number(5)); insert into kkk(myid,muname,mydept)select empno,ename,deptno from emp where deptno=10;
#用子查询更新数据 *希望员工scott的岗位、工资、补助与smith一样; *update emp set (job,sal,comm)=(select job,sal,comm from emp where ename=‘SMITh‘) where ename=‘SCOTT‘;
--------oracle事务处理------
#事物用于保证数据的一致性,它由一组相关的dml语句组成,该组的dml语句要么全部成功,要么全部失败;
#事物和锁:当执行一事务操作时(dml语句),oracle会在被作用的表上加锁,防止其他用户该表的结构。 #锁:文件锁。。。
#提交事务 *当使用commit语句可以提交事务,当执行commit语句后,会确认事务的变化。结束事务。删除保存点、释放锁。当使用commit语句结束事务之后,其他会话将卡哇伊查看到事务变化后的新数据
#回退事务:保存点是事务中的一点,用于取消部分事务,当结束事务时,会自动删除该事物所定义的所有保存点。当执行rollback时,通过保存点可以回退到指定的点。
#savapoint a1; #delete from emp where empno=9996; #savapoint a2; #delete from emp where empno=9999; #rollback to a2;
#第14讲 oracle的函数
#只读事务:只允许执行查询的操作,而不允许执行任何其他dml操作事务,使用只读事务可以确保用户只能取得某时间点的数据。其他会话可以提交新事务,但是只读事务将不会取得最新数据变化 #设置只读事务:set transaction read only;
#sql函数的使用 1)字符函数 lower(char):将字符串转换为小写格式; upper(char):将字符串转换为大写格式; length(char):返回字符串的长度; substr(char,m,n):取字符串的子串; replace(char1,search_string,replace_string) instr(char1,char2,[,n[,m]])取子串在字符串的位置
*将员工的名字按小写的方式显示 select lower(ename) from emp;
*将员工的名字按大写的方式显示 select upper(ename) from emp;
*显示员工名字正好为5个的字符的员工; select *from emp length(ename)=5;
*显示所有员工姓名的前三个字符; select substr(ename,1,3) from emp;
*以首字母大写的方式显示所有员工的姓名; select upper(substr(ename,1,1)) from epm;//首大写 select lower(substr(ename,1,length(ename)-1)) from epm;//小写 select upper(substr(ename,1,1)) || lower(substr(ename,1,length(ename)-1)) from emp;合并
#替换 select replace(ename,‘A‘,‘我是老虎‘);
--------数学函数-------- #包括:cos cosh,exp,il,log,sin,round,trunc,mod,floor,ceil #round(n,[m]) 该函数用于执行 四舍五入; #trunc(n,[m])该函数用于截取数字;如果省掉m,就截取小数部分,如果m是正数就截取到小数点的m位后,如果m是负数就截取到小数点的前m位, #mod取模; #floor(返回小于或等于n的最大整数);向上取整 #ceil(返回大于或等于n的最小整数);
*显示在一个月为30天的情况所有员工的日薪,忽略余数;
#SQL 函数的使用--日期函数 #日期函数用于处理date类型的数据。默认情况下日期的格式是dd-mon-yy. 1)sysdate:该函数返回系统时间; *select sysdate from dual; 2)add_months(d,n):加月份 *查找八个月多的员工 select *from emp where sysdate>add_months(hiredate,800) 3)last_day(d):返回指定日期所在月份额度最后一天 显示员工加入公司的天数 select sysdate-hiredate "入职天数",ename from emp; 4)找出各月倒数第3天受雇的所有员工 select hiredate, ename from emp where last_day(hiredate)-2=hiredate;
#转换函数