程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> Oracle數據庫的高級查詢(基礎部分)

Oracle數據庫的高級查詢(基礎部分)

編輯:Oracle教程

Oracle數據庫的高級查詢(基礎部分)


雖然標題寫的是Oralce數據庫,但對於SQL語句,是大同小異的,因此其他數據庫也可以參照下面的邏輯。每個程序員都知道,在項目中,在增刪改查中用得最多的,最復雜的還是查詢功能。各種查詢,各種檢索,項目中的查詢條件因客戶需求而改變。在這裡,我介紹幾種比較常見的高級查詢。所謂高級查詢就是除select * from user; 這樣的以外的查詢了。

在以下的實例中,我針對一個員工表(EMP)來查詢,員工工資字段為(SAL),員工號(EMPNO)

1.查詢員工平均工資(這裡介紹三種方法)

 

	SELECT AVG(SAL) FROM EMP;
	SELECT SUM(SAL)/COUNT(*) FROM EMP;
	SELECT SUM(SAL)/COUNT(SAL) FROM EMP;
2.查詢員工工資總和

 

 

	SELECT SUM(SAL) FROM EMP;
3.查詢員工最高工資

 

 

	SELECT MAX(SAL) FROM EMP;
4.查詢員工最底工資

 

 

	SELECT MIN(SAL) FROM EMP;
5.查詢員工表中有多少條記錄

 

 

	SELECT COUNT(*) FROM EMP;
6.查詢員工表中所有的員工號(得到的結果和上面第5個事例是一樣的)
	SELECT COUNT(EMPNO) FROM EMP;
7.查詢員工表中所有的員工號(去除重復的員工號,注:因為有時候我們查出來的數據是有重復的,而我們又不需要這些重復數據時,就可以使用下面的DISTINCT語句)
	SELECT COUNT(DISTINCT EMPNO) FROM MEP;
8.分組函數非空判斷(NVL)上面第1條查詢平均工資時,如果有人的工資是空的,也就是沒有工資值,那三種方法中的第一第三查詢方法就有問題,他把工資空值的員工去除 了,這是不合常理的,因為沒有工資的員工,他也是公司員工。因此求公司員工平均工資時,也要把空值算進去才行。我解釋一下下面的語句,COUNT()自然是算 個數了,而NVL(SAL,0) 這的意思是:如果SAL為空,那我們就取第二個值,也就是0,如果不為空,我們就取SAL本來的值,這樣工資為空的員工就賦予一個0值給 他,得到的結果就是SELECT COUNT(*) FROM EMP;是等同的。當然,如果你的需求是計算有工資的員工人數,那就不用判斷非空問題了。

 

 

	SELECT COUNT(NVL(SAL,0)) FROM EMP;
9.WHERE與HAVING的區別(他們都是條件查詢,唯一不同的就是,WHERE裡的條件是不可以是函數或是分組函數,反之,HAVING就可以更加實用了,接下來我們來一個實例,求出員工工資平均工資大於3000的人數);GROUP BY為分組 DEPTNO為員工字段部門編號

 

 

	SELECT COUNT(*) FROM EMP WHERE AVG(SAL) > 3000 GROUP BY DEPTNO;//這樣寫是錯誤的,語句不通,會報錯,WHERE條件裡有函數存在,
	SELECT COUNT(*) FROM EMP GROUP BY DEPTNO HAVING AVG(SAL) > 3000;//使用HAVING就可以正確執行並得到我們所要的結果了。
9.1按下面的語句中,都可以得到我們想要的結果,那我們是使用哪一種條件查詢呢,從SQL優化的角度來說,盡量使用WHERE語句,因為他們的執行順序不同,WHERE 是先過濾再分組,這樣查詢速度也更快,而HAVING正好相反,是先分組後過濾,這樣分組是很龐大的,然後再一一過濾。WHERE使得分組記錄數大大降低,從而提高SQL執行效率。這就是為什麼我們熟悉WHERE條件查詢,卻對HAVING不怎麼常用的道理了。

 

 

	SELECT COUNT(*) FROM EMP WHERE SAL > 3000 GROUP BY DEPTNO; 和 SELECT COUNT(*) FROM EMP GROUP BY DEPTON HAVING SAL > 3000; // 這兩條查詢都是正常的
10.排序 ORDER BY

 

 

	SELECT * FROM EMP WHERE 1=1 ORDER BY SAL DESC // 按員工工資降序排序
11.分組函數的嵌套查詢(查詢平均工資的最大值)

 

 

	SELECT MAX(AVG(SAL)) FROM EMP GROUP BY DEPTNO;


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved