【正文】
使用all_objects行比較多 其中:all_objects 為一個(gè)系統(tǒng)視圖,大約有40000條記錄。 補(bǔ)空行from dual connect by rownum=(select shumu from t)??招屑舆M(jìn)去select null,nullwith t as (select 10mod(count(*),10) shumu from trademark) –查詢比10的倍數(shù)差幾個(gè)空行Oracle 10g寫法:select id,name from trademarkunion all例如:select * from trademark這個(gè)查詢。注意:列別名不能在where中使用.那么第1步with查詢查出所有部門的總薪水,第2步用with從第1步獲得的結(jié)果表中查詢出平均薪水,最后利用這兩次的with查詢比較總薪水大于平均薪水的結(jié)果,如下:部門表s_dept,員工表s_emp。 from s_emp where dept_id in (select * from a)。 order by id)select last_name,title(select id from s_dept where name=39。With子句目的是為了重用查詢。,只通過右括號(hào)分割,查詢必須用括號(hào)括起來(lái),而在查詢中不使用,那么會(huì)報(bào)ora32035錯(cuò)誤:未引用在with子句中定義的查詢名。,只做一次查詢,提高效率。Sales39。 x39。 其他一樣。 )。from s_dept s where = and =39。 把查詢結(jié)果定為constant,提高效率 (select 39。exists where from s_emp e使用existsselect last_name,titleSales39。 最優(yōu)化匹配原則,拿最小記錄匹配大記錄。,優(yōu)先使用exists。re telling the rulebased optimizer that you want the inner query to drive the outer query.When you write EXISTS in a where clause, you39。二、exists和not exists的使用1. 謂詞exists和in概述Exists用于只能用于子查詢,可以替代in,若匹配到結(jié)果,則退出內(nèi)部查詢,并將條件標(biāo)志為true,傳回全部結(jié)果資料.in不管匹配到匹配不到都全部匹配完畢.使用exists可以將子查詢結(jié)果定為常量,不影響查詢效果,而且效率高。 (2)對(duì)于MINUS運(yùn)算,在WHERE子句中所有的列都必須在SELECT子句中。 . minus差集操作相減運(yùn)算 用相減運(yùn)算返回由第一個(gè)查詢返回的行,那些行不出現(xiàn)在第二個(gè)查詢中 (第一個(gè)SELECT語(yǔ)句減第二個(gè)SELECT語(yǔ)句)。 (3). 使用:Select statement intersect all Select statement。 相交的表的倒序排序不改變結(jié)果。 無(wú)重復(fù)行。 不能使用DISTINCT關(guān)鍵字。 原則: 在例子中將輸出empno,ename,mgr三列數(shù)據(jù)。 列的名字不必相同。 原則 :emp,unionemp, 例:Sql代碼 1. select allUNION(聯(lián)合)運(yùn)算 UNION運(yùn)算返回所有由任一查詢選擇的行。你應(yīng)該使用圓括號(hào)來(lái)明確地指定帶另外的集合運(yùn)算的INTERSECT (相交) 運(yùn)算查詢中的賦值順序。 差集在第一個(gè)查詢中,不在后面查詢中,并且結(jié)果行不重復(fù) 交集MINUS由每個(gè)查詢選擇的所有不重復(fù)的相交行完全并集包含重復(fù)值INTERSECT由每個(gè)查詢選擇的所有的行,包括所有重復(fù)的行 并集不包含重復(fù)值UNION ALL由每個(gè)查詢選擇的所有不重復(fù)的行按筆畫排序一、集合操作UNIONNLS_SORT=SCHINESE_STROKE_M39。中華人民共和國(guó)39。東39。東39。Select level xh from dual connect by level=100。 01 first 序列 可以保證多個(gè)用戶對(duì)同一張表進(jìn)行操作時(shí)生成唯一的整數(shù),通常用來(lái)做表的主鍵。 05 fifth 08 eighth ID NAME 輸出結(jié)果為: order by rownum asc where rownum=3 (select * from customer order by name) 則按NAME的字母順抽出前三個(gè)顧客的SQL語(yǔ)句如下所示:select * from 10 last 09 ninth 08 eighth 07 seventh 06 sixth 05 fifth 04 forth 03 third 02 Second 01 first顧客表customer(id,name)有如下數(shù)據(jù):ID NAME 由于oracle不支持select top語(yǔ)句,所以在oracle中經(jīng)常是用order by跟rownum的組合來(lái)實(shí)現(xiàn)select top n的查詢。 rownum是隨著結(jié)果集生成的,一旦生成,就不會(huì)變化了;同時(shí),生成的結(jié)果是依次遞加的,沒有1就永遠(yuǎn)不會(huì)有2! rownum 是在查詢集合產(chǎn)生的過程中產(chǎn)生的偽列,并且如果where條件中存在 rownum 條件的話,則:1: 假如判定條件是常量,則: 只能 rownum = 1, = 大于1 的自然數(shù), = 大于1 的數(shù)是沒有結(jié)果的;大于一個(gè)數(shù)也是沒有結(jié)果的 即 當(dāng)出現(xiàn)一個(gè) rownum 不滿足條件的時(shí)候則 查詢結(jié)束 this is stop key(一個(gè)不滿足,系統(tǒng)將該記錄過濾掉,則下一條記錄的rownum還是這個(gè),所以后面的就不再有滿足記錄,this is stop key);2: 假如判定值不是常量,則:若條件是 = var , 則只有當(dāng) var 為1 的時(shí)候才滿足條件,這個(gè)時(shí)候不存在 stop key ,必須進(jìn)行full scan ,對(duì)每個(gè)滿足其他where條件的數(shù)據(jù)進(jìn)行判定,選出一行后才能去選rownum=2的行……以下摘自《中國(guó)IT實(shí)驗(yàn)室》 top n由于rownum是一個(gè)總是從1開始的偽列,Oracle 認(rèn)為這種條件不成立。返回的是前9條記錄。(先選再排序)注意:只能用以上符號(hào)(、=、!=)。N;假如要返回前5條記錄:select * from tablename where rownum6。 后經(jīng)筆者試驗(yàn),只需在order by 的字段上加主鍵或索引即可讓oracle先按該字段排序,然后再rownum;方法不變:系統(tǒng)是按照記錄插入時(shí)的順序給記錄排的號(hào),rowid也是順序分配的。select rownum ,id,name from student order by name。但是這樣的操作會(huì)在大數(shù)據(jù)集中影響速度。2 200002 王二查詢r(jià)ownum在某區(qū)間的數(shù)據(jù),必須使用子查詢。 NAME ROWNUM ID 4 200004 趙四(3)rownum對(duì)于小于某值的查詢條件rownum對(duì)于rownumn((n1的自然數(shù))的條件認(rèn)為是成立的,所以可以找到記錄。 3 200003 李三 NAME