數據查詢是數據庫操作中最主要的功能之一;有時候數據庫查詢性能的好壞直接關系到數據庫的運行效率關系到數據庫的選型下面筆者不談大道理只是對其中對一些平時大家容易忽略的查詢小技巧做一些總結或許大家可能正在為此犯愁呢?
第一個技巧利用連接符連接多個字段
如在員工基本信息表中有員工姓名員工職位出身日期等等如果現在視圖中這三個字段顯示在同一個字段中並且中間有分割符如我現在想顯示的結果為經理Victor出身於年月日這該如何處理呢?其實這是比較簡單的我們可以在Select查詢語句中利用連接符把這些字段連接起來
如可以這麼寫查詢語句
SELECT員工職位 || ||員工姓名||出身於||出身日期 as 員工出身信息 FROM 員工基本信息表;
通過這條語句就可以實現如上的需求也就是說我們在平時查詢中可以利用||連接符把一些相關的字段連接起來這在報表視圖中非常的有用如筆者以前在設計圖書館管理系統的時候在書的基本信息處有圖書的出版社出版序列號等等內容但是有時會在打印報表的時候需要把這些字段合並成一個字段打印為此就需要利用這個連接符把這些字段連接起來而且利用連接符還可以在字段中間加入一些說明性的文字以方便大家閱讀如上面我在員工職位與員工姓名之間加入了空格;並且在員工姓名與出身日期之間加入了出身於幾個注釋性的文字這些功能看起來比較小但是卻可以大大的提高內容的可讀性這也是我們在數據庫設計過程中需要關注的一個內容
總之令後采用連接符可以提高我們報表的可讀性於靈活性
第二個技巧取消重復的行
如在人事管理系統中有員工基本信息基本表在這張表中可能會有部門職位員工姓名身份證件號碼等字段若查詢這些內容可能不會有重復的行但是我若想知道在公司內部設置了哪些部門與職位的時候並且這些部門與職位配置了相關人員此時又該如何查詢呢?
若我現在直接查詢部門表其可以知道系統中具體設置了哪些部門與職位但是很有可能這些部門或者職位由於人事變動的關系現在已經沒有人了所以這裡查詢出來的是所有的部門與職位信息而不能夠保證這個部門或者職位一定有職員存在也就是說這不能夠滿足於我們上面的要求
若我現在直接從員工信息表中查詢雖然可以保證所查詢出來的部門與職位信息一定有員工信息的存在但是此時查詢出來的部門與職位信息會有重復的行如采購部門分工合作可能會有采購采購小組長此時在查詢出來的部門與職位的信息中就會有三條重復的記錄
所以以上兩種處理方式都不能夠百分之百的滿足企業用戶的需求此時我們其實可以利用一個DISTINCT函數來消除其中查詢出來的重復行
如我們可以利用SELECT DISTINCT 部門信息職位信息 FROM 員工基本信息表通過這條加了DISTINCT約束的查詢語句不但可以查詢出所有有員工的職位與部門信息而且會把重復的記錄過濾掉從而提高可閱讀性
所以在數據庫設計過程中特別是在查詢語句的使用中這個函數特別有用
第三個技巧勤用WHERE語句
我們都知道數據庫查詢效率高不高是我們評價數據庫設計好壞的一個重要標准毋庸置疑在數據庫查詢中勤用Where條件語句是提高數據庫查詢性能的一個很重要的手段之一特別是在設計到比較大的表中查詢符合條件的記錄過程中利用WHERE條件語句加以限制可以大幅度的提高查詢的響應速度
如在圖書館管理系統中現在有人想查詢注冊會計師輔導用書的時候雖然不在書的類別或者名稱中輸入注冊會計師先查詢出全部的紀錄然後再一條條的看是否有相關的書籍信息也是可行的但是這麼處理的話一方面系統響應的速度會非常的慢因為裡面記錄很多另一方面查詢的結果看起來也會非常的頭疼
其實我們只需要在查詢中加入一些查詢的參數利用Where條件語句加以限制則即可以提高數據庫響應的速度也可以找出最符合用戶需求的數據
另外我也接觸過一些在Oracle數據庫上設計的平台型管理軟件他們可以自定義相關的報表在報表設計中只要用戶在前台設計平台中選中大表查詢的話則這個平台會在生成報表的時候自動應用Where條件語句以提高前台系統從數據庫查詢數據的效率
所以筆者認為在Oracle數據庫系統設計中要勤於使用Where語句利用Where語句來提高數據庫查詢的效率
第四個技巧靈活使用COUNT函數
在查詢處理的時候COUNT函數可以說是我們應用的比較多的函數之一如我們有時候需要統計員工的人數統計圖書的種類數的時候都需要使用到這個函數不過這個函數很多人可能會用但是到靈活應用的地步還是有一點差距
下面筆者就COUNT函數的一些應用技巧談談自己的心得
一是要靈活放置COUNT函數的位置因為利用COUNT函數統計記錄數的時候是會考慮空行的記錄的如在數據表中一般有序列字段與其它的有意義字段兩類有時候可能序列字段中有內容而其它字段中沒有內容則在利用COUNT函數統計記錄數量的時候會把這個空記錄也考慮進去很明顯則就會發生統計的錯誤所以這個COUNT函數該放在哪個位置上還是比較講究的一般的話筆者試建議不要放在序列號字段上而要放在一些關鍵的實體字段中如統計員工人數的時候則就可以放在員工姓名或者編號上等等
二是靈活跟其它函數搭配使用如在上面的例子中筆者談到有時候用戶需要知道現在有員工編制的部門與職位有哪一些我們可以利用DISTINCT函數來找出具體的部門但是我現在只想知道有編制的部門與職位具體有多少此時我們也可以利用COUNT 與DISTINCT函數結合應用找出我們所需要的數據在COUNT函數中可以指定ALL與DISTINCT選項默認的情況下是ALL選項表示統計所有的行其中也包括重復的行而DISTINCT就表示只統計不重復的行可見COUNT函數跟其它函數搭配使用的話可以簡化我們的查詢語句提高查詢效率
第五個技巧只查詢時必須的字段
有時候用戶不同的查詢需求都要用到同一張表如在員工信息表中包含了很多內容有時候用戶想要知道正式員工有多少;管理層員工有多少;生產線員工又有哪些;或者想知道合同即將到期的員工有哪些為此就遇到一個問題因為這些內容基本上都是在同一張表中那是在同一個視圖中實現而是根據需求不同設計不同的視圖呢?
若單從技術上考慮兩這都是可以實現的不會有多大的難度但是若是從數據庫性能上考慮在則還是采用不同的視圖來實現不同的需求為好
一方面若從安全方面講則可以根據不同的視圖來控制相關的訪問權限可見把視圖細化在權限控制上則會更加的靈活
另一方面數據的查詢效率跟數據內容的多少也有非常密切的關系如在查詢員工合同到期信息的時候一般不需要員工的地址信息等等若把這個信息也查詢出來的話由於這個字段比較長就會花費比較長的時間所以在數據庫設計中我們要學會根據用戶不同的需求設計不同的視圖雖然可能這在設計的時候會比較花時間但是在確可以提高數據庫的性能與安全性這筆生意還是劃得來的
From:http://tw.wingwit.com/Article/program/Oracle/201311/17049.html