本文共 19062 字,大约阅读时间需要 63 分钟。
第一篇 基本操作
--解锁用户 alter user 用户 account unlock; --锁定用户 alter user 用户 account lock; alter user scott account unlock; --创建一个用户yc 密码为a create user 用户名 identified by 密码; create user yc identified by a; --登录不成功,会缺少create session 权限,赋予权限的语法 grant 权限名 to 用户; grant create session to yc; --修改密码 alter user 用户名 identified by 新密码; alter user yc identified by b; --删除用户 drop user yc ; --查询表空间 select *from dba_tablespaces; --查询用户信息 select *from dba_users; --创建表空间 create tablespace ycspace datafile 'E:\oracle\app\product\11.2.0\dbhome_1\oradata\ycspace.dbf' size 2m autoextend on next 2m maxsize 5m offline ; --创建临时表空间 create temporary yctempspace tempfile 'E:\oracle\app\product\11.2.0\dbhome_1\oradata\ycspace.dbf' size 2m autoextend on next 2m maxsize 5m offline ; --查询数据文件 select *from dba_data_files; --修改表空间 --1、修改表空间的状态 --默认情况下是online,只有在非离线情况下才可以进行修改 alter tablespace ycspace offline ; --离线状态,不允许任何对象对该表空间的使用,使用情况:应用需要更新或维护的时候;数据库备份的时候 alter tablespace ycspace read write;--读写状态 alter tablespace ycspace online; alter tablespace ycspace read only; --只读,可以查询信息,可以删除表空间的对象,但是不能创建对象和修改对象 。使用情况:数据存档的时候 --2、修改表空间的大小 --增加文件的大小 alter database datafile 'E:\oracle\app\product\11.2.0\dbhome_1\oradata\ycspace.dbf' resize 10m; --增加数据文件 alter tablespace ycspace add datafile 'E:\oracle\app\product\11.2.0\dbhome_1\oradata\add.dbf' size 2m; --删除表空间的数据文件 alter tablespace 表空间的名字 drop datafile 数据文件名; --删除表空间 drop tablespace ycspace; --删除表空间且表空间中的内容和数据文件 drop tablespace ycspace including contents and datafiles; --指定表空间 的 创建用户的语法 create user yc1 identified by a default tablespace ycspace temporary tablespace temp; --删除用户 drop user yc1; --权限 --赋予创建会话的权限 grant create session to yc1; --创建一个表 create table studentInfo( sid int, sname varchar2(10) ); --赋予yc1用户创建表的权限 grant create table to yc1; --赋予yc1使用表空间的权限 grant unlimited tablespace to yc1; --系统权限 --对象权限 --插入 insert into studentInfo values (2,'abcd'); --查询 select *from studentInfo; --修改 update studentInfo set sid=1; --删除 delete studentInfo ; drop table studentInfo; --系统权限删除表 --赋权的语法 --系统权限 grant 权限名(系统权限或对象权限,角色,all) to 用户(角色,public) with admin option; --对象权限 grant 权限名(系统权限或对象权限,角色,all) on 用户(角色,public) with grant option; --收权语法 --系统权限 revoke 权限名(系统权限或对象权限,角色,all) from 用户(角色,public) with admin option; --对象权限 revoke 权限名(系统权限或对象权限,角色,all) from 用户(角色,public) with grant option; --赋予创建用户的权限并且把这个权限传递下去,即yc1可以给别人赋权 grant create user to yc1 with admin option; --收回权限,只能收回scottd ,不能收回由scott赋权的yc1的权限 revoke create user from scott; --查看用户所具有的权限 select *from user_sys_privs; --对象权限详解 select * from emp; --使用yc1来查询scott里面的emp表 select * from scott.emp; --赋予yc1查询emp表和插入的权限 grant select on emp to yc1; grant insert on emp to yc1; grant update(empno,ename) on emp to yc1; grant delete on emp to yc1; --对scott的emp表添加数据 insert into scott.emp(empno,ename) value(111,'acv'); update scott.emp set ename='yc'where empno=111; --赋予查询、赋予删除、添加、修改 grant select on 表名 to 用户 --grant select,delete,update,insert on 表名 to 用户 grant select,delete,update,insert on emp to yc1; grant all on dept to yc1; --all代表所有的对象权限 select *from scott.emp; select *from scott.dept; insert into scott.dept values(50,'企事业文化部','bumen'); --查看角色 --dba:数据库管理员,系统最高权限,可以创建数据结构(表空间等) --resource:可以创建实体(表、视图),不可以创建数据库的结构 --connect:连接的权限,可以登录数据库,但是不可以创建实体和不可以创建数据库结构 select *from role_sys_privs; grant connect to yc1; --将可以连接的角色赋予给yc1,则yc1就是应该可以连接数据库的人,类似于 create session 。 create table StuInfos(sid int); select *from StuInfos; create table stuInfo( sid int primary key , --主键 primary key 非空且唯一 (主键约束) sname varchar2(10) not null, --姓名不能为空,(非空约束) sex char(2) check(sex in('男','女')), --(检查约束),check, age number(3,1) constraint ck_stuInfo_age check(age>10 and age<100) , --也可以用varchar ;age between 10 and 100 ,在10和100之间,是一个闭区间 tel number(15) unique not null, --唯一约束, address varchar2(200) default '什么鬼' ) insert into stuInfo values(3,'大大','男',18,4321543,default); insert into stuInfo values(1,'张三','男',10); select *from stuInfo; drop table stuInfo; create table classInfo( cid int primary key, --班级id cname varchar2(20) not null unique --班级名 ) create table stuInfo( sid int primary key, sname varchar2(20), cid int constraint fofk_stuInfo_cid references classInfo(cid) on delete cascade ) insert into classInfo values(1,'1班'); insert into classInfo values(2,'2班'); insert into classInfo values(3,'3班'); insert into classInfo values(4,'4班'); select *from classInfo; select *from stuInfo; insert into stuInfo values(1001,'张三',2); insert into stuInfo values(1002,'张四',4); update classInfo set cid=1 where cid=8; drop table stuInfo;--要先删除这个 drop table classInfo; --再删除这个 delete classInfo where cid=4 ;--同时删除这两个表中的4 --删除用户的时候 drop user yc1 [cascade] --删除用户的同时把它创建的对象都一起删除 --修改表 --1、添加表中字段 --alter table 表名 add 字段名 类型 alter table classInfo add status varchar2(10) default '未毕业' --2、修改已有字段的数据类型 --alter table 表名 modify 字段名 类型 alter table classInfo modify status number(1) --3、修改字段名 --alter table 表名 rename column 旧字段名 to 新的字段名 alter table classInfo rename column cname to 班级名; --4、删除字段 --alter table 表名 drop column 字段名 alter table classInfo drop column status ; --5、修改表名 --rename 旧表名 to 新表名 rename classInfo to 班级信息; --删除表 --1、截断表效率高,每删除一次会产生一次日志 2、截断会释放空间,而delete不会释放空间 --删除表结构和数据 drop table 表名; --删除表中所有数据 truncate table classInfo; delete classInfo; create table classInfo( cid int primary key, --班级id cname varchar2(20) not null unique , --班级名 stasuts varchar2(100) ); select *from classInfo; --数据的操作 --增加数据语法 --insert into 表名[(列名,....)] values (对应的数据的值); insert into classInfo values(1,'一班','未毕业');--需要按照表结构的顺序插入 insert into classInfo values(4,'六班','未毕业'); insert into classInfo(cname,cid) values('二班',2); --需要按照括号中的顺序插入,但是 not null primary key 必须插入的。 insert into classInfo(cname,cid) values('三班',3); --删除的语法 --delete 表名 [where 条件] delete classInfo where cid>=2; --修改记录的语法 --update 表名 set [字段='值' ] [where 条件] update classInfo set cname='三班'; --会修改所有该字段 update classInfo set cname='四班' where cid=1; update classInfo set cname='五班', stasuts ='未毕业' where cid=3; --alter table classInfo drop constraint SYS_C0011213; --添加多个时可以使用序列 --用序列来做自动增长 create sequence seq_classInfo_cid start with 1001 increment by 1; insert into classInfo values(seq_classInfo_cid.Nextval,'七班','未毕业'); insert into classInfo values(seq_classInfo_cid.Nextval,'八班','未毕业'); insert into classInfo values(seq_classInfo_cid.Nextval,'九班','未毕业'); insert into classInfo values(seq_classInfo_cid.Nextval,'十班','未毕业'); create table classInfo2( cid int primary key, --班级id cname varchar2(20) not null unique , --班级名 stasuts varchar2(100) ); select *from classInfo2; drop table classInfo2; insert into classInfo2 select *from classInfo; insert into classInfo(cname,cid) select cname,cid from classInfo; alter table classInfo2 drop constraint SYS_C0011213; select seq_classInfo_cid.nextval from dual; select seq_classInfo_cid.Currval from dual; --直接创建一个新表,并拿到另一个表其中的数据 create table newTable as select cname,cid from classInfo; create table newTable1 as select *from classInfo; select *from newTable; select *from newTable1; insert into newTable1 values(1008,'dg','');第二篇:高级操作
直接在使用scott登陆,进行查询操作 ---------------------------------------------------------------------------------- --简单查询 select *from emp; select empno as id,ename as name from emp; select empno 编号,ename 姓名 from emp; --去除重复 select job from emp; select distinct job from emp; select job,deptno from emp; select distinct job,deptno from emp; --字符串的连接 select '员工编号是' ||empno || '姓名是' ||ename ||'工作是'||job from emp; --乘法 select ename,sal *12 from emp; --加减乘除都类似 --------------------------------------------------------------------- --限定查询 --奖金大于1500的 select *from emp where sal>1500; --有奖金的 select *from emp where comm is not null; --没有奖金的 select *from emp where comm is null; --有奖金且大于1500的 select *from emp where sal>1500 and comm is not null; --工资大于1500或者有奖金的 select *from emp where sal>1500 or comm is not null; --工资不大于1500且没奖金的 select *from emp where sal<=1500 and comm is null; select *from emp where not (sal >1500 or comm is not null); --工资大于1500但是小于3000的 select *from emp where sal>1500 and sal<3000; select *from emp where sal between 1500 and 3000; --between是闭区间,是包含1500和3000的 --时间区间 select *from emp where hiredate between to_date('1981-01-01','yyyy-MM-dd') and to_date('1981-12-31','yyyy-MM-dd'); --查询雇员名字 select *from emp where ename='SMITH'; --查询员工编号 select *from emp where empno=7369 or empno=7499 or empno=7521; select *from emp where empno in(7369,7499,7521); select *from emp where empno not in(7369,7499,7521); --排除这3个,其他的都可以查 --模糊查询 select *from emp where ename like '_M%'; --第2个字母为M的 select *from emp where ename like '%M%'; select *from emp where ename like '%%'; --全查询 --不等号的用法 select * from emp where empno !=7369; select *from emp where empno<> 7369; --对结果集排序 --查询工资从低到高 select *from emp order by sal asc; select *from emp order by sal desc,hiredate desc; --asc 当导游列相同时就按第二个来排序 --字符函数 select *from dual;--伪表 select 2*3 from dual; select sysdate from dual; --变成大写 select upper('smith') from dual; --变成小写 select lower('SMITH') from dual; --首字母大写 select initcap('smith') from dual; --连接字符串 select concat('jr','smith') from dual; --只能在oracle中使用 select 'jr' ||'smith' from dual; --推荐使用 --截取字符串 select substr('hello',1,3) from dual; --索引从1开始 --获取字符串长度 select length('hello') from dual; --字符串替换 select replace('hello','l','x') from dual; --把l替换为x -------------------------------------------------------------------------------------------------- --通用函数 --数值函数 --四舍五入 select round(12.234) from dual;--取整的四舍五入 12 select round (12.657,2) from dual; --保留2位小数 select trunc(12.48) from dual;--取整 select trunc(12.48675,2) from dual; --保留2位小数 --取余 select mod(10,3) from dual;--10/3取余 =1 --日期函数 --日期-数字=日期 日期+数字=日期 日期-日期=数字 --查询员工进入公司的周数 select ename,round((sysdate -hiredate)/7) weeks from emp; --查询所有员工进入公司的月数 select ename,round(months_between(sysdate,hiredate)) months from emp; --求三个月后的日期 select add_months(sysdate,6) from dual; select next_day(sysdate,'星期一') from dual; --下星期 select last_day(sysdate) from dual; --本月最后一天 select last_day(to_date('1997-1-23','yyyy-MM-dd')) from dual; --转换函数 select ename , to_char(hiredate,'yyyy') 年, to_char(hiredate,'mm')月, to_char(hiredate,'dd') 日 from emp; select to_char(10000000,'$999,999,999') from emp; select to_number('20')+to_number('80') from dual; --数字相加 --查询员工年薪 select ename,(sal*12+nvl(comm,0)) yearsal from emp; --空和任何数计算都是空 --Decode函数,类似if else if (常用) select decode(1,1,'one',2,'two','no name') from dual; --查询所有职位的中文名 select ename, decode(job, 'CLERK', '业务员', 'SALESMAN', '销售', 'MANAGER', '经理', 'ANALYST', '分析员', 'PRESIDENT', '总裁', '无业') from emp; select ename, case when job = 'CLERK' then '业务员' when job = 'SALESMAN' then '销售' when job = 'MANAGER' then '经理' when job = 'ANALYST' then '分析员' when job = 'PRESIDENT' then '总裁' else '无业' end from emp; ------------------------------------------------------------------------------------------- --多表查询 select *from dept; select *from emp,dept order by emp.deptno; select *from emp e,dept d where e.deptno=d.deptno; select e.*,d.dname,d.loc from emp e,dept d where e.deptno=d.deptno; --查询出雇员的编号,姓名,部门编号,和名称,地址 select e.empno,e.ename,e.deptno,d.dname,d.loc from emp e,dept d where e.deptno=d.deptno; --查询出每个员工的上级领导 select e.empno,e.ename,e1.empno,e1.ename from emp e,emp e1 where e.mgr=e1.empno; select e.empno,e.ename,d.dname from emp e,dept d ,salgrade s, emp e1 where e.deptno=d.deptno and e.sal between s.losal and s.hisal and e.mgr=e1.empno; select e.empno,e.ename,e1.empno,e1.ename from emp e,emp e1 where e.mgr=e1.empno(+) ; --外连接 select *from emp order by deptno; --查询出每个部门的员工 /* 分析:部门表是全量表,员工表示非全量表, 在做连接条件时,全量表在非全量表的哪端,那么连接时全量表的连接条件就在等号哪断 */ --左连接 select * from dept d,emp e where d.deptno=e.deptno(+) order by e.deptno; --右连接 select * from emp e,dept d where e.deptno(+)=d.deptno order by e.deptno; -----------------------------作业 --查询与smith相同部门的员工姓名和雇佣日期 select *from emp t where t.deptno= (select e.deptno from emp e where e.ename='SMITH') and t.ename<> 'SMITH'; --查询工资比公司平均工资高的员工的员工号,姓名和工资 select t.empno,t.ename,t.sal from emp t where t.sal>(select avg(sal) from emp); --查询各部门中工资比本部门平均工资高的员工号,姓名和工资 select t.empno,t.ename,t.sal from emp t, (select avg(e.sal) avgsal,e.deptno from emp e group by e.deptno) a where t.sal>a.avgsal and t.deptno=a.deptno; --查询姓名中包含字母u的员工在相同部门的员工的员工号和姓名 select t.empno,t.ename from emp t where t.deptno in( select e.deptno from emp e where e.ename like '%U%') and t.empno not in ( select e.empno from emp e where e.ename like '%U%') ; --查询管理者是king的员工姓名和工资 select t.ename,t.sal from emp t where t.mgr in (select e.empno from emp e where e.ename='KING'); ------------------------------------------------------------------------------------- ---sql1999语法 select *from emp join dept using(deptno) where deptno=20; select *from emp natural join dept; select *from emp e join dept d on e.deptno=d.deptno; select *from dept; select *from dept d left join emp e on d.deptno=e.deptno; select *from dept d,emp e where d.deptno=e.deptno(+); ---分组 select count(empno) from emp group by deptno; select deptno,job,count(*) from emp group by deptno,job order by deptno; select *from EMP for UPDATE; --group by 后面有的字段,select后才可以有,group by后面没有的字段,select后面绝对不能有 select d.dname, d.loc, count(e.empno) from emp e, dept d where e.deptno = d.deptno group by d.dname, d.loc ; ---------------------------------------------------------------------------------------------------- --子查询 select *from emp t where t.sal>(select *from emp e where e.empno=7654); select rownum ,t.* from emp t where rownum <6 ; --pagesize 5 select *from(select rownum rw,a.* from (select *from emp ) a where rownum <16) b where b.rw>10; select *from (select *from emp) where rownum>0; --索引 create index person_index on person(p_name); --视图 create view view2 as select *from emp t where t.deptno=20; select *from view2; -------------------------------------------------------------------------------------------------------- --pl/sql --plsql是对sql语言的过程化扩展 ----- declare begin dbms_output.put_line('hello world'); end; ------- declare age number(3); marry boolean := true; --boolean不能直接输出 pname varchar2(10) := 're jeknc'; begin age := 20; dbms_output.put_line(age); if marry then dbms_output.put_line('true'); else dbms_output.put_line('false'); end if ; dbms_output.put_line(pname); end; --常量和变量 --引用变量,引用表中的字段的类型 Myname emp.ename%type; --使用into来赋值 declare pname emp.ename%type; begin select t.ename into pname from emp t where t.empno=7369; dbms_output.put_line(pname); end; --记录型变量 Emprec emp%rowtype; --使用into来赋值 declare Emprec emp%rowtype; begin select t.* into Emprec from emp t where t.empno=7369; dbms_output.put_line(Emprec.empno || ' '||Emprec.ename||' '||Emprec.job); end; --if分支 语法1: IF 条件 THEN 语句1; 语句2; END IF; 语法2: IF 条件 THEN 语句序列1; ELSE 语句序列 2; END IF; 语法3: IF 条件 THEN 语句; ELSIF 条件 THEN 语句; ELSE 语句; END IF; --1 declare pname number:=# begin if pname = 1 then dbms_output.put_line('我是1'); else dbms_output.put_line('我不是1'); end if; end; --2 declare pname number := # begin if pname = 1 then dbms_output.put_line('我是1'); elsif pname = 2 then dbms_output.put_line('我是2'); else dbms_output.put_line('我不是12'); end if; end; --loop循环语句 语法2: Loop EXIT [when 条件]; …… End loop --1 declare pnum number(4):=0; begin while pnum < 10 loop dbms_output.put_line(pnum); pnum := pnum + 1; end loop; end; --2 (最常用的循环) declare pnum number(4):=0; begin loop exit when pnum=10; pnum:=pnum+1; dbms_output.put_line(pnum); end loop; end; --3 declare pnum number(4); begin for pnum in 1 .. 10 loop dbms_output.put_line(pnum); end loop; end; ---------------------------------- --游标 语法: CURSOR 游标名 [ (参数名 数据类型,参数名 数据类型,...)] IS SELECT 语句; 例如:cursor c1 is select ename from emp; declare cursor c1 is select * from emp; emprec emp%rowtype; begin open c1; loop fetch c1 into emprec; exit when c1%notfound; dbms_output.put_line(emprec.empno || ' ' || emprec.ename); end loop; close c1; --要记得关闭游标 end; --------例外 --异常,用来增强程序的健壮性和容错性 -- no_data_found (没有找到数据) --too_many_rows (select …into语句匹配多个行) --zero_divide ( 被零除) --value_error (算术或转换错误) --timeout_on_resource (在等待资源时发生超时) --写出被0除的例外程序 declare pnum number(4) := 10; begin pnum := pnum / 0; exception when zero_divide then dbms_output.put_line('被0除了'); when value_error then dbms_output.put_line('算术或转换错误'); when others then dbms_output.put_line('其他异常'); end; --自定义异常 --No_data exception; --要抛出raise no_data; declare cursor c1 is select * from emp t where t.deptno = 20; no_data exception; emprec emp%rowtype; begin open c1; loop fetch c1 into emprec; if c1%notfound then raise no_data; else dbms_output.put_line(emprec.empno || ' ' || emprec.ename); end if; end loop; close c1; exception when no_data then dbms_output.put_line('无员工'); when others then dbms_output.put_line('其他异常'); end; --存储过程 语法: create [or replace] PROCEDURE 过程名[(参数名 in/out 数据类型)] AS begin PLSQL子程序体; End; 或者 create [or replace] PROCEDURE 过程名[(参数名 in/out 数据类型)] is begin PLSQL子程序体; End 过程名; -----创建一个存储过程helloworld create or replace procedure helloworld is begin dbms_output.put_line('hello world'); end helloworld; ------创建一个涨工资的 create or replace procedure addsal(eno in emp.empno%type) is emprec emp%rowtype; begin select * into emprec from emp t where t.empno = eno; update emp t set t.sal = t.sal + 100 where t.empno = eno; dbms_output.put_line('涨工资前是' || emprec.sal || ',涨工资后是' || (emprec.sal + 100)); end addsal; ---------------------------------------------- --java代码调用存储过程和函数 --存储过程 -- create or replace procedure acc_yealsal(eno in emp.empno%type,yearsal out number) is pcomm emp.comm%type; psal emp.sal%type; begin select t.sal,t.comm into psal,pcomm from emp t where t.empno=eno; yearsal :=psal*12 +nvl(pcomm,0); end; ----存储函数 create or replace function 函数名(Name in type, Name in type, .. .) return 数据类型 is 结果变量 数据类型; begin return(结果变量); end函数名; --存储函数计算年薪 create or replace function accf_yearsal(eno in emp.empno%type) return number is Result number; psal emp.sal%type; pcomm emp.comm%type; begin select t.sal, t.comm into psal, pcomm from emp t where t.empno = eno; Result := psal * 12 + nvl(pcomm, 0); return(Result); end accf_yearsal; ----------------------------------- ---触发器 --触发语句:增删改: 语法: CREATE [or REPLACE] TRIGGER 触发器名 {BEFORE | AFTER} {DELETE | INSERT | UPDATE [OF 列名]} ON 表名 [FOR EACH ROW [WHEN(条件) ] ] begin PLSQL 块 End 触发器名 ---插入一个新员工则触发 create or replace trigger insert_person after insert on emp begin dbms_output.put_line('插入新员工'); end; select *from emp; insert into emp values(1001,'李四','管理',7902,sysdate,100,100,20); --raise_application_error(-20001, '不能在非法时间插入员工') --============================================================================== SQL> @ E:\powerDesigner\A_脚本\user.sql --导入脚本文件 select *from H_USER ; insert into h_user valuer(sequserid.nextval,'a','a',sysdate,'北京',1); -------------------------------------------------------------- --数据库建模 --一对多:多的一端是2,箭头指向的是表1,即少的一端 --在实体类中一的一端的实体类有多的一端的实体类的集合属性 --使用powerDesiger进行数据库建模,然后将数据导入,导入到plsql中进行使用 --------------------连接远程数据库 --方法1,修改localhost的地址 ORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl.lan) ) ) --方法2 --或者直接在登陆界面在database中输入远程数据库的ip地址和端口号进行远程登陆转载地址:http://waqya.baihongyu.com/