雖然標題寫的是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;