文章详情页
我的oracle笔记一(sql语句方面)
一.sql语句1.增加主键 alter table TABLE_NAME add constraint KEY_NAME primary key (TABLE_COLUMN); 指定表空间 alter table TABLE_NAME add constraint KEY_NAME primary key (TABLE_COLUMN) using index; tablespace TABLE_SPACE_NAME;2.增加外键 alter table TABLE_NAME add constraint FK_NAME; foreign key (TABLE_COLUMN) references KEY_TABLE_NAME;3.使主键或外键失效、生效 alter table TABLE_NAME; disable(enable) constraint KEY_NAME;4、查看各种约束 select constraint_name,table_name,constraint_type,status from user_constraints; select constraint_name, constraint_type,search_condition, r_constraint_name; from user_constraints where table_name = upper('&table_name'); select c.constraint_name,c.constraint_type,cc.column_name; from user_constraints c,user_cons_columns cc where c.owner = upper('&table_owner') and c.table_name = upper('&table_name') and c.owner = cc.owner and c.constraint_name = cc.constraint_name order by cc.position; 5、删除主键或外键 alter table TABLE_NAME; drop constraint KEY_NAME;6、建外键 单字段时:create table 表名 (col1; char(8), cnochar(4); REFERENCE course); 多个字段时,在最后加上 Foreign Key (字段名) REFERENCE 表名(字段) 连带删除选项 (on delete cascade 当指定时,假如父表中的记录被删除,则依靠于父表的记录也被删除 REFERENCE 表名() on delete cascade;7、删除带约束的表 Drop table 表名 cascade; constraints;8:索引治理<1>.creating function-based indexes sql> create index summit.item_quantity on summit.item(quantity-quantity_shipped); <2>.create a B-tree index sql> create [unique] index index_name on table_name(column,.. asc/desc) tablespace sql> tablespace_name [pctfree integer] [initrans integer] [maxtrans integer] sql> [logging nologging] [nosort] storage(initial 200k next 200k pctincrease 0 sql> maxextents 50); <3>.pctfree(index)=(maximum number of rows-initial number of rows)*100/maximum number of rows <4>.creating reverse key indexes sql> create unique index xay_id on xay(a) reverse pctfree 30 storage(initial 200k sql> next 200k pctincrease 0 maxextents 50) tablespace indx; <5>.create bitmap index sql> create bitmap index xay_id on xay(a) pctfree 30 storage( initial 200k next 200k sql> pctincrease 0 maxextents 50) tablespace indx; <6>.change storage parameter of index sql> alter index xay_id storage (next 400k maxextents 100); 7.allocating index space sql> alter index xay_id allocate extent(size 200k datafile 'c:/Oracle/index.dbf'); <8>.alter index xay_id deallocate unused; <9>、查看索引 ;SQL>select index_name,index_type,table_name from user_indexes order by table_name;<10>、查看索引被索引的字段 ;SQL>select * from user_ind_columns where index_name=upper('&index_name');11、创建序列 select * from user_sequences; create; sequence SEQ_NAME; start with 1000 maxvalue; 1000 increment by 1; alter sequence; SEQ_NAME minvalue 50 maxvalue 100;12、删除重复行 update a set aa=null where aa is not null; delete from a where rowid!= (select max(rowid) from a; b where; a.aa=b.aa);13、删除同其他表相同的行 delete from a; where exits (select 'X' from b where b.no=a.no); 或 delete from a; where no in (select no from b);14、查询从多少行到多少行的记录(可以用在web开发中的分页显示);select * from ( select rownum row_id,b.* from (select a.* from sys_oper a) b )where row_id between 15 and 2015、对公共授予访问权 grant select on 表名 to public; create public synonym 同义词名; for 表名;16、填加注释 comment on table 表名 is; '注释'; comment on column 表名.列名 is '注释';17、分布式数据库,创建数据库链路 create [public] database link LINKNAME [connect to USERNAME identified by PASSWord] [using 'CONNECT_STRING'] 可以在服务器端,也可以在客户端建立,但必须注重,两台服务器之间 数据库必须可以互访,必须各有各自的别名数据库18、查看数据库链路 select * from; all_db_links; select * from user_db_links; 查询; select * from TABLENAME@DBLNKNAME 创建远程数据库同义词 create synonym; for TABLENAME@DBLNKNAME 操纵远程数据库记录 insert into TABLENAME@DBLNKNAME (a,b); values (va,vb); update;TABLENAME@DBLNKNAME set a='this'; delete from TABLENAME@DBLNKNAME 怎样执行远程的内嵌过程 begin otherdbpro@to_html(参数); end;19、数据库链路用户密码有非凡字符的时候,可以用双引号把密码引起来create public database link dblink1 connect to db1 identified by '123*456' using 'db11'20.oracle8中扩充了group by rollup和cube的操作。有时候省了你好多功夫的。<1>下面的语句可以进行总计select region_code,count(*) from aicbs.acc_woff_notifygroup by rollup(region_code);<2> 对第1个字段小计,最后合计select region_code,write_status,count(*) from aicbs.acc_woff_notifygroup by rollup(region_code,write_status);----------------------570;;0;;;;3570;;1;;;;2570;;5--此处小计了570的记录571;;0;;;;10571;;1;;;;2571;;12; --此处小计了571的记录.....100 --此处有总计<3> 复合rollup表达式,只做总计select region_code,write_status,count(*) from aicbs.acc_woff_notifygroup by rollup(region_code,write_status);<4> 对第1个字段小计,再对第2个字段小计,最后合计select region_code,write_status,count(*) from aicbs.acc_woff_notifygroup by cube(region_code,write_status);----------------------100 ;--此处有总计0;;60;;--对write_status=0的小计1;;39;;--对write_status=1的小计3;;1;;--对write_status=3的小计570;;;;5;;--此处小计了570的记录570;;0;;3570;;1;;2571;;;;12;;--此处小计了571的记录571;;0;;10571;;1;;2....<3> 复合cube表达式,只做总计select region_code,write_status,count(*) from aicbs.acc_woff_notifygroup by cube(region_code,write_status);<4>下面的语句可以按照rollup不同的字段进行小计select region_code,write_status,count(*) from aicbs.acc_woff_notifygroup by region_code,rollup(write_status);21.查询view的创建语句 sql>set long 1000 sql>select * from user_views where view_name='MY_VIEW_NAME'; orsql>select * from all_views where view_name='MY_VIEW_NAME';22、去除数据库中非凡字符 ;<1>.字符串字段中含有''',假如用来组合sql语句,会造成语句不准确。 比如:replace(f1,'''','')<2>.字符串字段中含有't n',假如用来在c或者c++程序中输出到文件,格式无法保证。比如:replace(f2,'t','')<3>.清除换行和回车比如: replace(f2,chr(13)chr(10),'')23、如何在字符串里加回车或者tab键 在sqlplus中执行 sql>select 'UserId=1233111'chr(10)'AccId=13431'chr(9)'AccId2=11111' from dual;24、树形查询create table zj(bm;;number(8),bmmcvarchar2(20),sjbmnumber(8))insert into zj values(1,'aaa',0)insert into zj values(11,'aaa1',1)insert into zj values(12,'aaa2',1)insert into zj values(111,'aaa11',11)insert into zj values(112,'aaa12',11)insert into zj values(113,'aaa13',11)insert into zj values(121,'aaa21',12)insert into zj values(122,'aaa22',12)insert into zj values(123,'aaa23',12)--select bm,bmmc,sjbm,levelfrom zjstart with sjbm=0connect by prior; bm = sjbm或者select bm,bmmc,sjbm,levelfrom zjstart with sjbm=0connect by; sjbm = prior; bm 25、快照 create snapshot SNAPSHOT_NAME [storage (storage parameter)] [tablespace; TABLESPACE_NAME] [refresh; [fastcompleteforce] [start with; START_DATE next NEXT_DATE] as QUERY; create snapshot snapshot_to_study as select * from TABLE_NAME@to_study 创建角色 create role aa identified by aaa; 授权; grant create snapshot,alter snapshot to aaa; grant; aaa to emp; create snapshot SNAPSHOT_TO_Html refresh; complete start with sysdate next sysdate+5/(24*60*60) as; select * from a@to_html 删除; drop snapshot snap_to_html 手工刷新快照,(调用DBMS_SNAPSHOT包中的refresh过程)DBMS_SNAPSHOT.refresh(snapshot_name,refresh_type); begin DBMS_SNAPSHOT.REFRESH('snap_to_html','c'); end; 对所有快照进行刷新 begin DBMS_SNAPSHOT.REFRESH_ALL; end; 怎样执行远程的内嵌过程 begin otherdbpro@to_html(参数); ;;;;end;26、用户治理create a user: database authentication sql> create user juncky identified by oracle default tablespace users sql> temporary tablespace temp quota 10m on data password eXPire sql> [account lockunlock] [profile profilenamedefault]; ;<1>.查看当前用户的缺省表空间SQL>select username,default_tablespace from user_users;<2>生成用户时指定缺省表空间create user 用户名 identified by 口令; default;;;tablespace 表空间名;<3>重新指定用户的缺省表空间 ;;alter user 用户名 default tablespace 表空间名<4>查看当前用户的角色SQL>select * from user_role_privs;<5>查看当前用户的系统权限和表级权限SQL>select * from user_sys_privs;SQL>select * from user_tab_privs;<6>查看用户下所有的表 ;;SQL>select * from user_tables;<7> alter user语句的quota子句限制用户的磁盘空间 ;;如:alter user jf; quota 10M; on system;27、查看放在ORACLE的内存区里的表;; ;SQL>select table_name,cache from user_tables where instr(cache,'Y')>0;28、约束条件 create table employee (empno; number(10); primary key, namevarchar2(40) not null, deptno; number(2); default 10, salary; number(7,2); check; salary<10000, birth_date date, soc_see_num; char(9); unique, foreign key(deptno) references dept.deptno) tablespace users; 要害字(primary key)必须是非空,表中记录的唯一性 not null; 非空约束 default缺省值约束 check;;检查约束,使列的值符合一定的标准范围 unqiue; 唯一性约束 foreign key 外部键约束29、查看创建视图的select语句 ;SQL>set view_name,text_length from user_views; ;SQL>set long 2000;;;说明:可以根据视图的text_length值设定set long 的大小 ;SQL>select text from user_views where view_name=upper('&view_name');30、查看同义词的名称 ;SQL>select * from user_synonyms;31、用Sql语句实现查找一列中第N大值 select * from (select t.*,dense_rank() over (order by sal) rank from employee) where rank = N;32 虚拟自段 <1>. CURRVAL 和 nextval 为表创建序列 CREATE SEQUENCE EMPSEQ ... ; SELECT empseq.currval FROM DUAL ; 自动插入序列的数值 INSERT INTO emp VALUES (empseq.nextval, 'LEWIS', 'CLERK', 7902, SYSDATE, 1200, NULL, 20) ;<2>. ROWNUM ;按设定排序的行的序号 ;SELECT * FROM emp WHERE ROWNUM < 10 ;<3>. ROWID ;返回行的物理地址 ;SELECT ROWID, ename FROM emp; WHERE deptno = 20 ;33、对CLOB字段进行全文检索SELECT * FROM A WHERE dbms_lob.instr(a.a,'K',1,1)>0;34. 非凡字符的插入,比如'&' insert into a values (translate ('at{&}t','at{}','at')); 35.表治理<1>.create a table sql> create table table_name (column datatype,column datatype]....) sql> tablespace tablespace_name [pctfree integer] [pctused integer] sql> [initrans integer] [maxtrans integer] sql> storage(initial 200k next 200k pctincrease 0 maxextents 50) sql> [loggingnologging] [cachenocache] ;<2>.copy an existing table sql> create table table_name [loggingnologging] as subquery <3> create table ... as 方式建表的时候,指定表参数 create table a storage( initial 1M/*第一次创建时分配空间*/ next 1M;;;/*第一次分配的存储空间用完时在分配*/ ) as; select * from b;<4>.创建临时表sql> create global temporary table xay_temp as select * from xay; on commit preserve rows/on commit delete rows 在Oracle中,可以创建以下两种临时表: a 会话特有的临时表:create global temporary table () on commit preserve rows;会话指定,当中断会话时ORACLE将截断表b 事务特有的临时表:create global temporary table () on commit delete rows;事务指定,每次提交后ORACLE将截断表(删除全部行) c 说明 临时表只在当前连接内有效 临时表不建立索引,所以假如数据量比较大或进行多次查询时,不推荐使用 数据处理比较复杂的时候时表快,反之视图快点 在仅仅查询数据的时候建议用游标: open cursor for 'sql clause';<5> pctfree = (average row size - initial row size) *100 /average row size pctused = 100-pctfree- (average row size*100/available data space) <6>.change storage and block utilization parameter sql> alter table table_name pctfree=30 pctused=50 storage(next 500k sql> minextents 2 maxextents 100); ;<7>.manually allocating extents sql> alter table table_name allocate extent(size 500k datafile 'c:/oracle/data.dbf'); <8>.move tablespace sql> alter table employee move tablespace users; <9>.deallocate of unused space sql> alter table table_name deallocate unused [keep integer] <10>.drop a column sql> alter table table_name drop column comments cascade constraints checkpoint 1000; alter table table_name drop columns continue; <11>.mark a column as unused sql> alter table table_name set unused column comments cascade constraints; alter table table_name drop unused columns checkpoint 1000; alter table orders drop columns continue checkpoint 1000 data_dictionary : dba_unused_col_tabs37. 中文是如何排序的? Oracle9i之前,中文是按照二进制编码进行排序的。 在oracle9i中新增了按照拼音、部首、笔画排序功能。设置NLS_SORT值 SCHINESE_RADICAL_M 按照部首(第一顺序)、笔划(第二顺序)排序 SCHINESE_STROKE_M 按照笔划(第一顺序)、部首(第二顺序)排序 SCHINESE_PINYIN_M 按照拼音排序 38. 数据表中的字段最大数:表或视图中的最大列数为 100039. oracle中的裸设备: 裸设备就是绕过文件系统直接访问的储存空间40. 在Oracle服务器上通过SQLPLUS查看本机IP地址 ? select sys_context('userenv','ip_address') from dual; 假如是登陆本机数据库,只能返回127.0.0.141. 在ORACLE中取毫秒? 9i之前不支持,9i开始有timestamp. 9i可以用select systimestamp from dual;42. 将N秒转换为时分秒格式? set serverout on declare N number := 1000000; ret varchar2(100); begin ret := trunc(n/3600) '小时' to_char(to_date(mod(n,3600),'sssss'),'fmmi'分'ss'秒'') ; dbms_output.put_line(ret); end; 43、在某个用户下找所有的索引 select user_indexes.table_name, user_indexes.index_name,uniqueness, column_name from user_ind_columns, user_indexes where user_ind_columns.index_name = user_indexes.index_name and user_ind_columns.table_name = user_indexes.table_name order by user_indexes.table_type, user_indexes.table_name, user_indexes.index_name, column_position;44. not in的替代。 一般not in的效率比较低。非凡是数据量大的时候,几乎不能执行。 用下面几种方式可以替换写法 比如要查询在fee_rev_info表中已经销户的用户(不在cm_user中的)(不过下面的例子不是很好,因为bill_id是cm_user的唯一索引) select * from fee_rev_info where bill_id not in (select bill_id from cm_user) <1> 用not exists select * from fee_rev_info a where not exists (select 'p' from cm_user b where b.bill_id = a.bill_id) <2> 用外连接(+)select a.* from fee_rev_info a,cm_user bwhere a.bill_id = b.bill_id (+)and b.bill_id is null <3> 用hash_aj select /*+HASH_AJ*/* from fee_rev_info where bill_id not in (select bill_id from cm_user)45.怎么样查询非凡字符,如通配符%与_ 假如数据库中有表 STATIONTYPE,STATION_571 STATION_572 ... select * from tab; where tname like 'STATION_%'会显示 STATIONTYPE,STATION_571 ... 可以用下面的语句select * from tab; where tname like 'STATION_%' escape''46.假如存在就更新,不存在就插入可以用一个语句实现吗9i已经支持了,是Merge,但是只支持select子查询,假如是单条数据记录,可以写作select .... from dual的子查询。语法为:MERGE INTO tableUSING data_sourceON (condition)WHEN MATCHED THEN update_clauseWHEN NOT MATCHED THEN insert_clause;如MERGE INTO cm_user_credit; USING (select * from dual) ON (user_id =1302514690 )when MATCHED then update set credit_value = 1000when NOT MATCHED then insert (user_id,acc_id,bill_id,plan_id,region_code,credit_value) values(1302514690,1305032158,'13857141218',10070247,'571',1000);47.怎么实现一条记录根据条件多表插入9i以上可以通过Insert all语句完成,仅仅是一个语句,如:INSERT ALLWHEN (id=1) THENINTO table_1 (id, name)values(id,name)WHEN (id=2) THENINTO table_2 (id, name)values(id,name)ELSEINTO table_other (id, name)values(id, name)SELECT id,nameFROM a;假如没有条件的话,则完成每个表的插入,如INSERT ALLINTO table_1 (id, name)values(id,name)INTO table_2 (id, name)values(id,name)INTO table_other (id, name)values(id, name)SELECT id,nameFROM a;48.如何实现行列转换<1>、固定列数的行列转换如student subject grade---------------------------student1 语文 80student1 数学 70student1 英语 60student2 语文 90student2 数学 80student2 英语 100...转换为 语文 数学 英语student1 80 70 60student2 90 80 100...语句如下:select student,sum(decode(subject,'语文', grade,null)) '语文',sum(decode(subject,'数学', grade,null)) '数学',sum(decode(subject,'英语', grade,null)) '英语'from tablegroup by student<2>、不定列行列转换如c1 c2--------------1 我1 是1 谁2 知2 道3 不...转换为1 我是谁2 知道3 不这一类型的转换必须借助于PL/SQL来完成,这里给一个例子CREATE OR REPLACE FUNCTION get_c2(tmp_c1 NUMBER) RETURN VARCHAR2 IS Col_c2 VARCHAR2(4000); BEGINFOR cur IN (SELECT c2 FROM t WHERE c1=tmp_c1) LOOP Col_c2 := Col_c2cur.c2; END LOOP; Col_c2 := rtrim(Col_c2,1);RETURN Col_c2; END;/SQL> select distinct c1 ,get_c2(c1) cc2 from table;即可--例子:create table okcai_1(user_id varchar2(10),user_number varchar2(10),user_num number(8))user_id user_number user_num---------------------1;123 ;21;456 ;51;789 ;62;11; ;22;22; ;32;33; ;42;44; ;52;55; ;62;66; ;72;77; ;83;1234;13;5678;2方式一:create or replace function get_col( p_userId number, p_col;number) return varcharasv_tmp varchar2(255); begin select user_numberchr(9)user_num into v_tmp from (select user_number,user_num,rownum row_id from okcai_1 where user_id = p_userId) a where row_id = p_col; return ltrim(v_tmp); --return v_tmp;end;然后select distinct user_id,get_col(user_id,1),get_col(user_id,2),get_col(user_id,3) .... from okcai_1方式二:create or replace function get_col( p_userId number, p_col;number) return varcharasv_tmp varchar2(255);begin select user_numberchr(9)user_num into v_tmp from (select user_number,user_num,rownum row_id from okcai_1 where user_id = p_userId) a where row_id = p_col; return ltrim(v_tmp); --return v_tmp;end;select distinct user_id,get_col_new(user_id) from okcai_1;49.怎么设置存储过程的调用者权限普通存储过程都是所有者权限,假如想设置调用者权限,请参考如下语句create or replaceprocedure ...()AUTHID CURRENT_USERAsbegin...end;50.Oracle有哪些常见要害字具体信息可以查看v$reserved_words视图51.怎么查看数据库参数<1> show parameter 参数名如通过show parameter spfile可以查看9i是否使用spfile文件其中参数名是可以匹配的。比如show parameter cursor ,则会显示跟cursor相关的参数<2>select * from v$parameter<3>除了这部分参数,Oracle还有大量隐含参数,可以通过如下语句查看:SELECT NAME ,VALUE ,decode(isdefault, 'TRUE','Y','N') as 'Default' ,decode(ISEM,'TRUE','Y','N') as SesMod ,decode(ISYM,'IMMEDIATE', 'I', 'DEFERRED', 'D', 'FALSE', 'N') as SysMod ,decode(IMOD,'MODIFIED','U', 'SYS_MODIFIED','S','N') as Modified ,decode(IADJ,'TRUE','Y','N') as Adjusted ,description FROM ( --GV$SYSTEM_PARAMETER SELECT x.inst_id as instance ,x.indx+1 ,ksppinm as NAME ,ksppity ,ksppstvl as VALUE ,ksppstdf as isdefault ,decode(bitand(ksppiflg/256,1),1,'TRUE','FALSE') as ISEM ,decode(bitand(ksppiflg/65536,3), 1,'IMMEDIATE',2,'DEFERRED','FALSE') as ISYM ,decode(bitand(ksppstvf,7),1,'MODIFIED','FALSE') as IMOD ,decode(bitand(ksppstvf,2),2,'TRUE','FALSE') as IADJ ,ksppdesc as DESCRIPTION FROM x$ksppi x ,x$ksppsv y WHERE x.indx = y.indx AND substr(ksppinm,1,1) = '_' AND x.inst_id = USERENV('Instance') ) ORDER BY NAME52.怎样建立基于函数索引8i以上版本,确保Query_rewrite_enabled=trueQuery_rewrite_integrity=trustedCompatible=8.1.0以上Create index indexname on table (function(field));53.怎么样移动表或表分区[A]移动表的语法Alter table tablename move[Tablespace new_name Storage(initial 50M next 50M pctincrease 0 pctfree 10 pctused 50 initrans 2) nologging]移动分区的语法alter table tablename move (partition partname)[update global indexes]之后之后必须重建索引Alter index indexname rebuild假如表有Lob段,那么正常的Alter不能移动Lob段到别的表空间,而仅仅是移动了表段,可以采用如下的方法移动Lob段alter table tablename move lob(lobsegname) store as (tablespace newts);54.怎么样修改表的列名[A]9i以上版本可以采用rname命令ALTER TABLE UserName.TabName RENAME COLUMN SourceColumn TO DestColumn9i以下版本可以采用create table …… as select * from SourceTable的方式。另外,8i以上可以支持删除列了ALTER TABLE UserName.TabName SET UNUSED (ColumnName) CASCADE CONSTRAINTSALTER TABLE UserName.TabName DROP (ColumnName) CASCADE CONSTRAINTS55.case的用法在sql语句中CASE test_valueWHEN expression1 THEN value1[[WHEN expression2 THEN value2] [...]][ELSE default_value]END 比如1SELECT last_name, job_id, salary CASE job_id WHEN 'IT_PROG' THEN 1.10*salary WHEN 'ST_CLERK' THEN 1.15*salary WHEN 'SA_REP' THEN 1.20*salary ELSE salary END 'REVISED_SALARY'FROM employees; 比如2select case when; real_charge>=20000 and real_charge<30000 then 5000 when; real_charge>=30000 and real_charge<40000 then 9000 when; real_charge>=40000 and real_charge<50000 then 10000 when; real_charge>=50000 and real_charge<60000 then 14000 when; real_charge>=60000 and real_charge<70000 then 18000 when; real_charge>=70000 and real_charge<80000 then 19000 when; real_charge>=80000 and real_charge<90000 then 24000 when; real_charge>=90000 and real_charge<100000 then 27000;;;;; when; real_charge>=100000 and real_charge<110000 then 27000 when; real_charge>=110000 and real_charge<120000 then 29000;;;; when; real_charge>=120000;;;then 36000 ;;;;;else 0; end ,acc_id,user_id,real_charge from okcai_jh_charge_200505在存储过程中 case v_strGroupClassCode when; '1'then v_nAttrNum := v_nAttrNum + 300; v_strAttrFlag := '1'substr(v_strAttrFlag,2,7); when; '2'then v_nAttrNum := v_nAttrNum + 200; v_strAttrFlag := '2'substr(v_strAttrFlag,2,7); else NULL; end case;注重的是存储过程和sql语句有的细微差别是用end case,而不是end。语句后面跟';'
排行榜