db_oracle_入门操作整理_1_基本定义

一、sql plus


--sql命令,以下17个是作为语句开头的关键字: 
alter  drop  revoke 
audit  grant  rollback* 
commit*  insert  select 
comment  lock  update 
create  noaudit  validate 
delete  rename 
--这些命令必须以“;”结尾,带*命令句尾不必加分号,并且不存入sql缓存区。 

--sql中没有的sql*plus命令,这些命令不存入sql缓存区 
@  define  pause 
#  del  quit 
$  describe  remark 
/  disconnect  run 
accept  document  save 
append  edit  set 
break  exit  show 
btitle  get  spool 
change  help  sqlplus 
clear  host  start 
column  input  timing 
compute  list  ttitle 
connect  newpage  undefine 
copy  

二、数据库查询

/*
数据字典 
tab 		用户创建的所有基表、视图和同义词清单 
dtab 		构成数据字典的所有表 
col 		用户创建的基表的所有列定义的清单 
catalog 	用户可存取的所有基表清单 
*/
select from tab; 
--describe命令 描述基表的结构信息 
describe dept 
select from emp; 
select empno,ename,job from emp; 
select from dept order by deptno desc; 

/*
逻辑运算符
= !=或<> > >= < <= 
in 
between value1 and value2 
like 
% 
_ 
in null 
not 
no in,is not null 
*/
--谓词in和not in 。例如,有哪些职员和分析员 
select ename,job 
from emp 
where job in ('clerk','analyst'); 

select ename,job 
from emp 
where job not in ('clerk','analyst'); 

--谓词between和not between 。例如,哪些雇员的工资在2000和3000之间 
select ename,job,sal from emp 
where sal between 2000 and 3000; 

select ename,job,sal from emp 
where sal not between 2000 and 3000; 

--谓词like,not like 
select ename,deptno from emp 
where ename like 's%'; 
(以字母s开头) 
select ename,deptno from emp 
where ename like '%k'; 
(以k结尾) 
select ename,deptno from emp 
where ename like 'w___'; 
(以w开头,后面仅有三个字母) 
select ename,job from emp 
where job not like 'sales%'; 
(哪些雇员的工种名不以sales开头) 

--谓词is null,is not null 。例如,没有奖金的雇员(即commision为null) 
select ename,job from emp 
where comm is null; 

select ename,job from emp 
where comm is not null; 

--多条件查询 
select ename,job 
from emp 
where deptno=20 
and job!='clerk'; 
--表达式
--算术表达式 
--选择奖金高于其工资的5%的雇员 
select ename,sal,comm,comm/sal from emp 
where comm>.05*sal 
  order by comm/sal desc; 
--算术表达式 
--选择奖金高于其工资的5%的雇员 
select ename,sal,comm,comm/sal from emp 
where comm>.05*sal 
  order by comm/sal desc; 
--日期型数据的运算 
add two days to 6mar-87 
6-mar-87 2 = 8-mar-87 
add two hours to 6-mar-87 
6-mar-87 2/24 = 6-mar-87 and 2hrs 
add 15 seconds to 6-mar-87 
6-mar-87 15/(24*60*60) = 6-mar-87 and 15 secs 
--列名的别名 
select ename employee from emp 
  where deptno=10; 
(别名:employee) 
select ename,sal,comm,comm/sal "c/s ratio" from emp 
  where comm>.05*sal 
  order by comm/sal desc; 
/*
sql命令的编辑 
list or l 显示缓冲区的内容 
list 4 显示当前sql命令的第4行,并把第4行作为当前行,在该行号后面有个*。 
change or c 用新的内容替换原来在一行中第一次出现内容 
sql>c/(...)/('analyst')/ 
input or i 增加一行或多行 
append or a 在一行后追加内容 
del  删除当前行 删除sql缓冲区中的当前行 
run  显示并运行sql缓冲区中的命令 
/  运行sql缓冲区中的命令 
edit  把sql缓冲区中的命令写到操作系统下的文本文件, 
并调用操作系统提供的编辑器执行修改。
*/

三、数据操纵 

--数据的插入 
insert into dept values (10,'accounting','new york'); 
insert into dept (dname,deptno) values ('accounting',10); 

--从其它表中选择插入数据 
insert into emp (empno,ename,deptno) select id,name,department from old_emp where department in(10,20,30,40); 

--使用参数 
insert into dept values(&deptno,&dname,&loc); 
--执行时,sql/plus对每个参数将有提示用户输入 

--参数对应日期型或字符型数据时,可在参数上加引号,输入时就可不用引号 
insert into dept values(&deptno,'&dname','&loc'); 

--插入空值(null) 
insert into dept values(50,'education',null); 

--插入日期型数据 
--日期型数据缺省格式:dd-mon-yy 
insert into emp (empno,ename,hiredate) values(7963,'stone','07-apr-87'); 

--系统时间:sysdate 
insert into emp (empno,ename,hiredate) values(7600,'kohn',sysdate); 

--数据更新 
update emp set job='manager' where ename='martin'; 
update emp set job='market rep' where ename='salesman'; 
update emp set deptno=40,job='market rep' where job='salesman'; 

--数据删除 
delete emp where empno=765; 

--更新的提交 
commit 

--自动提交方式 
set autocommit on 
--如果状态设为开,则使用inesrt,update,delete会立即提交。 

--更新取消 
rollback 

--两次连续成功的commit之间的操作,称为一个事务 

四、创建基表、视图 

--创建基表 
create table dept (deptno number(2), dname char(14), loc char(13)); 
/*
数据字典会自动更新。 
一个基表最多254列。 

表名列名命名规则: 
限制 
第一个字符必须是字母,后面可任意(包括 $ # 但不能是逗号)。 
名字不得超过30个字符。 

唯一 
某一用户的基表名必须唯一,不能是oracle的保留字,同一基表的列名互不相同。 

使用双引号 
如果表名用双引号括起来,则可不满足上述规则; 
只有使用双引号,才能区别大、小写; 
命名时使用了双引号,在以后的操作也必须使用双引号。 

数据类型: 
char(n)    (不得超过240字符) 
number(n,d) 
date 
long    (最多65536字符) 
raw    (二进制原始数据) 

空值处理 
有时要求列值不能为空 
create table dept 
(deptno number(2) not null, 
dname char(14), 
loc char(13)); 

在基表中增加一列 
alter table dept 
add (headcnt number(3)); 

修改已有列属性 
alter table dept 
modify dname char(20); 
注:只有当某列所有值都为空时,才能减小其列值宽度。 
只有当某列所有值都为空时,才能改变其列值类型。 
只有当某列所有值都为不空时,才能定义该列为not null。 

alter table dept modify (loc char(12)); 
alter table dept modify loc char(12); 
alter table dept modify (dname char(13),loc char(12)); 
*/
--创建视图 
create view managers as select ename,job,sal from emp where job='manager'; 

--为视图列名取别名 
create view mydept (person,title,salary) as select ename,job,sal from emp where deptno=10; 
/*
with check option选项 
使用with check option,保证当对视图插入或更新数据时, 
该数据必须满足视图定义中select命令所指定的条件。
*/

create view dept20 as select ename,job,sal,deptno from emp where deptno=20 with check option; 
--在做下述操作时,会发生错误 
update dept20 
set deptno=30 
where ename='ward'; 

--基表、视图的拷贝 
create table emp2 
as select from emp; 

--基表、视图的删除 
drop table 表名 
drop view 视图名 

五、sqlplus报表功能

--sql*plus的一些基本格式命令 
column deptno heading department 
column ename heading name 
column sal heading salary 
column sal format $99,999.00 
ttitle sample report for|hitech corp 
btitle strictly confidential 
break on deptno 
compute sum of sal on deptno 
run 
--表头和表尾 
ttitle sample report for|hitech corp 
btitle right strictly confidential 
/*
“|”表示换行,结尾不必加分号 
选项有三种:left right center 

使用ttitle,系统将自动地在每页的顶部显示日期和页号。 
ttitlet和btitle命令有效,直至重新设置表头或表尾,或退出sql*plus。 

下面命令使标题语句失效 
ttitle off 
btitle off 
*/
--列名 
--column命令定义用于显示列名 ,若名字为一个单词,不必加引号(|为换行) 
column ename heading employee 
column ename heading 'employee|name' 
--取消栏定义 
column ename clear 
--列的格式 
column ename format a15 
column sal format $9,999.99 
column comm like sal 
--like子句,使得某一列的格式参照另一列格式,它拷贝列名及其格式 
--控制记录显示分组顺序 break on deptno (不显示重复值) 

select deptno,ename from emp order by deptno; 
(order by子句用于控制break) 
--显示为 
10 clark 
   niller 
20 smith 
   scott 
30 allen 
   blake 
   
--每次只有一个break命令起作用,但一次可以在多个列上使用break命令 
--break on 列名1 on 列名2 
--记录分组 
break on deptno skip 2 
select deptno,ename 
from emp 
order by deptno; 

--每个deptno之间空两行 
clear break(取消break命令) 
break on page(每次从一新页开始) 
break on report(每次从一新报表开始) 
break on page on report(联合使用) 
--分组计算 
break on deptno skip 2 
compute sum of sal on deptno 
计算每个部门的工资总和 
skip子句使部门之间的信息分隔开 
--其他计算命令 
compute avg of sal on deptno(平均值) 
count 非空值的总数 
max 最大值 
min 最小值 
std 标准偏差 
var 协方差 
number 行数 
--使compute命令失效 
一旦定义了compute,则一直有效,直到 
关闭compute(clear compute) 

sql/plus环境命令

show 选项 		--显示当前参数设置情况
show all		--显示全部参数 
--设置参数 
set 选项 值或开关 
set autocommit on 

--set命令包括 
set autocommit {off|on|immediate} 	--自动提交,off缺省
set echo {off|on} 			--命令文件执行,是否在终端上显示命令本身,off缺省
set feedback {off|on} 			--on:查询结束时,给出结果,记录数的信息,缺省; 
					--off:无查询结果,记录数的信息
set heading {off|on} 			--on:列的头标在报表上显示,缺省;off:不在报表上显示
set linesize {n} 			--一行显示的最大字符数,缺省为80 
set pagesize {n} 			--每页的行数,缺省是14 
set pause {off|on|text} 	--on:当报表超过一页时,每显示一屏就暂停显示,等待用户打回车键,再接着显示; 
				--off:页与页不停顿,缺省;text:页与页停顿,并向用户提示信息

set buffer buffer 
/*设置当头的命令缓冲区,通常情况下,sql命令缓冲区已为当前缓冲区。 
由于sql命令缓冲区只能存放一条sql命令, 
所以可用其它缓冲区来存放sql命令和sql*plus命令。 
经常用到的设置可放在login.sql文件中。 */

set null 
set null 'no data' 
select ename,comm 
from emp 
where deptno=30; 
--把部门30中无佣金雇员的佣金显示为“no data”。 
--set null是sql*plus命令,用它来标识空值(null),可以设置为任意字符串。 
--存盘命令save 
--save 文件名 
--input 
select empno,ename,job from emp where job='analyst' 
save research 
--目录中会增加一个research.sql文件。 
--编辑命令edit 
edit 
--edit编辑当前缓冲区中的内容。 

--编辑一个文件 
edit research 

--调入命令get 
get research 
--把磁盘上的文件内容调入缓冲区,并显示在屏幕上,文件名尾不必加.sql。 
--start命令 
--运行指定的文件 
start research 

--输出命令spool 
spool tryfile 
--不仅可以使查询结果在屏幕上显示,还可以使结果存入文件 

--停止向文件输出 
spool off 

--把查询结果在打印机上输出,先把它们存入一个文件中, 
--然后不必使用spool off,而用: 
spool out 
--spool out关闭该文件并在系统缺省的打印机上输出 

制作报表举例

edit tryfile 

set echo off 
set autocommit on 
set pagesize 25 
insert into emp (empno,ename,hiredate) values(9999,'geiger',sysdate); 
insert into emp (empno,ename,deptno) values(3333,'samson',20); 
spool newemp 
select from emp where deptno=20 or deptno is null 
/ 
spool off 
set autocommit off 

--用start命令执行这个文件 

六、函数

--字符型函数 
initcap(ename);		--将ename中每个词的第一个字母改为大写。 
length(ename);		--计算字符串的长度。 
substr(job,1,4); 
--其它 
lower 
upper 
least 		--取出字符串列表中按字母排序排在最前面的一个串 
greatest 	--取出字符串列表中按字母排序排在最后的一个串 

--日期函数 
add_month(hiredate,5) 		--在雇佣时间上加5个月 
month_between(sysdate,hiredate) --计算雇佣时间与系统时间之间相差的月数 
next_day(hiredate,'friday') 	--计算受雇日期之后的第一个星期五的日期 

--例,as_of是别名
select ename,sal,next_day(sysdate,'friday') as_of from emp where deptno=20; 
 
--如果不用to_char函数,日期在oracle中的缺省格式是'dd_mon_yy' 
to_char(date,date picture) 
select ename,to_char(hiredate,'dy mon dd,yyyy') hired from emp where deptno=10; 

to_date(字符串,格式) 
insert into emp(empno,ename,hiredate) values(7999,'asms',to_date('070387083000','mmddyyhhmiss')); 

--日期型数据的格式 
dd 12 
dy fri 
day friday 
ddspth twelfth 

mm 03 
mon mar 
month march 

yy 87 
yyyy 1987 

例 
mar 12,1987    'mon dd,yyyy' 
mar 12,1987    'mon dd,yyyy' 
thursday march 12    'day month dd' 
mar 12 11:00am    'mon dd hh:miam' 
thu,the twelfth    'dy,"the"ddspth' 

--算术函数 
least(v1,v2) 
select ename,empno,mgr,least(empno,mgr) lownum from emp where empno0 
--取sal的近似值(截断)
trunc(sal,0) 

--空值函数 
nvl(v1,v2) 
--v1为列名,如果v1不是空值,nvl返回其列值。 
--v1为空值,返回v2的值。
--聚组函数 
select sum(comm) from emp; 
--返回一个汇总信息;不能把sum用在select语句里除非用group by 
--字符型、日期型、数字型的聚组函数 
min max count
--可用于任何数据类型 
select min(ename) from emp; 
select min(hiredate) from emp; 
select min(sal) from emp; 
--有多少人有工作? 
select count(job) from emp; 

--有多少种不同的工种? 
select count(distinct job) from emp; 

count distinct 
--计算某一字段中不同的值的个数 

--其它聚组函数(只用于数字型数据) 
avg 计算平均工资 
select avg(sal) 
from emp; 

--stddev 计算工资的平均差 
select stddev(sal) 
from emp; 

--sum 计算总工资 
select sum(sal) 
from emp; 

--group by子句 
select deptno,sum(sal),avg(sal) 
from emp 
group by deptno; 

--按多个条件分组 
--每个部门的雇员数 
select deptno,count() 
from emp 
group by deptno; 

--每个部门的每个工种的雇员数 
select deptno,job,count(*) 
from emp 
group by deptno,job; 

--满足条件的分组 
-where是针对select的,having是针对group by的 
--哪些部门的工资总和超过了9000 
select deptno,sum(sal) 
from emp 
group by deptno 
having sum(sal)>9000; 

--select小结 
--除去职员,哪些部门的工资总和超过了8000 
select deptno,sum(sal) 
from emp 
where job!='clerk' 
group by deptno 
having sum(sal)>8000 
order by sum(sal); 

七、高级查询

--等值联接 
select empno,ename,job,emp.deptno,dname 
from emp,dept 
where emp.deptno=dept.deptno; 

--外联接 
select ename,dept.deptno,loc 
from emp,dept 
where emp.deptno(+)=dept.deptno; 
--如果在dept.deptno中有的数值,在emp.deptno中没有(如deptno=40), 则作外联接时,结果中会产生一个空值 

--自联接:同一基表的不同行要做联接,可使用自联接 
--指出每个雇员的经理名字 
select worker.ename,manager.ename manager 
from emp worker,emp manager 
where worker.mgr=manager.empno; 

--非等值联接 
--哪些雇员的工资属于第三级别 
select ename,sal 
from emp,salgrade 
where grade=3 
and sal between losal and hisal; 
(基表salgrade:grade losal hisal) 

--集合运算 
--行的连接 
--集合运算把2个或多个查询结果合并为一个 
union-set union 
rows of first query plus of second query, less duplicate rows 

intersect-set intersection 
rows both queries have in common 

minus-set difference 
rows unique to the first query 
--介绍几个视图 
account view 
ename sal job 

sales view 
ename sal job 

research view 
ename sal job 

--union运算 
--返回一个查询结果中有但又不重要的行,它将基表或视图中的记录合并在一起 
--所有部门中有哪些雇员工资超过2000 
--对应列的数据类型必须相同 
select ename,sal 
from account 
where sal>2000 
union 
select ename,sal 
from research 
where sal>2000 
union 
select ename,sal 
from sales 
where sal>2000; 
--intersect运算 
--返回查询结果中相同的部分 
--各个部门中有哪些相同的工种 
select job 
from account 
intersect 
select job 
from research 
intersect 
select job 
from sales; 
--minus运算 
--返回在第一个查询结果中与第二个查询结果不相同的那部分行记录。 
--有哪些工种在财会部中有,而在销售部中没有? 
select job from account 
minus 
select job from sales; 
--子查询 
slect ename,deptno 
from emp 
where deptno= 
(select deptno 
from emp 
where ename='smith'); 
--多级子查询 
select ename,job,sal 
from emp 
where job= 
(select job 
from emp 
where ename='clark') 
or sal> 
(select sal 
from emp 
where ename='clark'); 
--多个基表与子查询 
select ename,job,sal 
from emp,dept 
where loc='new york' 
and emp.deptno=dept.deptno 
and sal> 
(select sal 
from emp 
where ename='scott'); 
--子查询中使用聚组函数 
select ename,hiredate 
from emp 
where hiredate= 
(select min(hiredate) 
from emp); 

八、授权 

/*
系统权限 
dba 所有权限 
resource 注册,创建新的基表 
connect,注册,查询
*/
--只有dba才有权创建新的用户 
grant connect to scott identified by tiger; 

--dba或用户自己可以改变用户口令 
grant connect to scott identified by leopard; 


--有两种方法获得对基表操作的权限 
--基表权限1 
--创建自己的基表 ,获得基表创建用户的许可 
grant select,insert 
on emp 
to scott; 
--这些权限有 
select insert update delete alter index 
--把所有权限授于他人 
grant all on emp to scott; 

--同义词 
select  
from scott.emp 

--创建同义词,为用户allen的emp基表创建同义词employee 
create synonym employee 
for allen.emp 

--基表权限2 
你可以使其他用户有这样的权力,即其他用户可以把你的基表权限授予他人 
grant all 
on emp 
to scott 
with grant option; 
/*
收回权限 
系统权限 只有被dba收回 
基表权限 随时都可以收回 
*/
revoke insert 
on emp 
from scott; 

九、索引

--建立索引 
create index emp_ename 
on emp(ename); 

--删除索引 
drop index emp_ename; 
/*
关于索引 
只对较大的基表建立索引(至少50条记录) 
建立索引之前插入数据 
对一个基表可建立任意多个索引 
一般是在作为主键的列上建立索引 
建立索引之后,不影响sql命令的执行 
建立索引之后,oracle自动维护和使用索引 
*/
--保证数据唯一性 
--提高执行速度的同时,索引还可以保证每个记录中的每个列值是不重复的。 
create unique index emp_empno 
on emp(empno); 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值