oracle的查詢 函式 效率問題

2021-08-07 12:19:30 字數 3078 閱讀 7626

oracle資料庫分組查詢時,查詢條件只能寫聚合函式或者是分組查詢的條件,不可寫其他。

select e.deptno/count(*) from emp e group

by e.deptno;

null 很特殊 null 不等於null ,null 跟誰運算誰就變成null

查詢過程中 null值參加任何比較 結果都為false

在in的比較時無影響。因為in:a in (1,2,3,null) 相當於 a=1 or a=2 or a=3 or a=null 就算有null也不影響其他結果輸出。

然而,not in :a not in (1,2,3,null) 相當於 a=1 and a=2 and a=3 and a=null 此時,a=null為fales 所以乙個資料都查不出來 。

在做子查詢時,需要先去null值(is not null)

oracle通過rownum實現分頁查詢, rownum,rowid為偽列

rownum 表示行號,實際上此是乙個列,但是這個列是乙個偽列,此列可以在每張表中出現。

rowid 表中每行資料指向磁碟上的實體地址。

—–rownum 不支援 大於 (因為在查詢的過程中rownum並不知道之後的資料,只知道當前行之前查詢出來的資料) —————–

select * from (select t.*,rownum rm from (select * from emp order

by sal desc) t) tt

where tt.rm <7

and tt.rm >3;

——–不常用分頁————-

select * from (select row_number() over(order

by sal desc) rm , e.* from emp e) t

where t.rm<7

and t.rm >3;

分頁:

——-oracle 通過 rownum——

——-mysql limit———–

——-sqlserver top———-

oracle中的行轉列可以利用case when then 來完成

select

sum(x) "total",

sum(case t.y

when

'1980'

then t.x

end) "1980",

sum(case t.y

when

'1981'

then t.x

end) "1981",

sum(case t.y

when

'1982'

then t.x

end) "1982",

sum(case t.y

when

'1987'

then t.x

end) "1987"

from (select

count(*) x ,to_char(e.hiredate,'yyyy') y from emp e group

by to_char(e.hiredate,'yyyy')) t

其中聚合函式可以自動去掉null值。

select

count(*) from emp ;

select

count(1) from emp ;

兩者的效率是一樣的。

原因:

count()中寫的值分為兩種,欄位名和其他。count(*),count(1)都代表其他。

首先count(1)並不代表查詢第一行,因為count(999)也可以查出資料並不會報錯,就算寫count(「字串」)也可以查詢出資料。

count()中寫其他值時,oracle預設查詢表的主鍵總數。如果沒有主鍵,查詢記錄總數。

count()中寫其他欄位時,oracle查詢的是對應欄位的記錄數。

exists() 函式用來判斷()裡的查詢語句是否有結果 有結果為true 沒有則為false (與in的功能相當):

select d.* from dept d where

exists (select e.* from emp e where d.deptno=e.deptno);

select * from dept d where d.deptno in (select

distinct e.deptno from emp e);

但是查詢效率不同,2023年之前是exists效率高,但是資料庫廠商一直在提高in的效能,現在in和exists的效率差不多,區別是:

—-左表大 (資料量多) 右錶小 (資料量少) 的時候 in效率高

—-左表小 (資料量少) 右表大 (資料量多) 的時候 exists效率高

因為in是從左向右查,exists是從右向左查。

集合運算:

並集:union 、union all ( union去重複)

交集: intersect

差集:minus

只要 保證 查詢 列的數量 列的型別一致 就可以做集合操作

select e.empno ,e.ename from emp e

union

select d.deptno,d.dname from dept d;

Oracle的SQL語句執行效率問題查詢與解決方法

一 識別占用資源較多的語句的方法 4種方法 1.測試組和終端使用者反饋的與反應緩慢有關的問題。2.利用v sqlarea檢視提供了執行的細節。執行 讀取磁碟和讀取緩衝區的次數 資料列 executions 執行次數 disk reads 讀盤次數 command type 命令型別 3 select...

MySQL查詢效率問題

最近在使用python在mysql中讀寫資料時遇到了,兩個程式插入查詢語句格式相同,卻效率相差約百倍的問題。原因是mysql欄位型別為字串,使用字串資料條件查詢比使用數值型資料效率高的很多,個人估算有百倍,而我兩個程式就使用了兩種資料型別,花了兩天才找出效率慢的問題。後來去搜了一下相關問題,看到有人...

分頁查詢語句的效率問題

size large b 一般的分頁sql如下所示 b size sql1 select from select t.rownum rn from t where rn 0 and rn 10 sql2 select from select t.rownum rn from t where rown...