文章詳情頁
我的oracle筆記一(sql語句方面)
瀏覽:81日期:2023-11-19 16:05:48
一.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。語句后面跟';'
排行榜
