您好,登錄后才能下訂單哦!
第一章 SQL基礎回顧
在INSERT語句中省略字段名的做法,非常少見,也有很大的風險,除非有什么特殊的理由,不然就別這么做,別把你的SQL語句搞得太脆弱,因為無法預知在何時表的結構會發生變化。舉例來說,如果將來有人重建表,而且表中的字段排序順序發生變化,碰巧你的INSERT語句通過字段類型和其他約束性檢查,你就在沒有錯誤提示的情況下,把數據寫入了表中錯誤的字段,那將是長災難。所以, 強烈建議在寫INSERT語句時,一定要指定字段名。
查看表的表述:
desc 表名;
如果用DELETE語句來刪除所有行,則Oracle會完整地把刪除行為記入日志,以便如果是誤操作,我們還有機會將數據回滾。但正應為要記日志,所以需要花一定的時間,有時達不到我們希望的速度。
作為補充,Oracle提供了一個TRUNCATE(截斷)語句來刪除表中的所有數據。可以用下面的語句來截斷HR.EMPLOYEES表:
truncate table hr.employee;
TRUNCATE語句不帶WHERE子句或其他限制條件。TRUNCATE語句的處理是按DDL(Data Definition Language,數據定義語言)的方式,因此同時也隱含了數據庫的一些操作,如隱式地提交其他open事務。
Oracel對空字符串的非標準處理
SQL標準做法是用空或零長度的字符串來代表NULL值,而Oracle并非如此。其中歷史的、地域的原因我們無需深究,但一定要記住,Oracle對NULL的規定和用法。對于幾乎所有的其他數據庫,SQL都把空字符串當做一個獨立的、已知的值。
有編程背景的人會發現一些類似的規定,一個0長度的字符串只有一個字符串終結符(\0)作為其內容。相反,一個加密的字符串沒有確定的狀態……即使是一個終結符。我們不能把0長度和未知狀態的字符串進行互換,這類似于Oracle如何對待NULL。
在SQL中涉及NULL值的使用訣竅,也是每天必須面對的功課,這經常讓人不知所措。每個SQL表達式的結果都是三個值選一:“真”、“假”或“空”。在各種比較、邏輯操作和判斷中都是如此。但為避免偶爾的遺忘,我們還是要一再強調:NULL不跟任何值相等,任何值不跟NULL相等,NULL不等于NULL。
Oracel默認用二進制的排序方法。
有時候,我們希望看見兩個字段值相同的排在一起,忽略大小寫。用這個NLS環境變量可以達到目的:
alert session set NLS_SORT = 'BINARY_CI';
Oracle支持區分大小寫和不區分大小寫兩種排序方式。有個環境變量NLS_SORT進行區分大小寫和不區分大小寫的控制。默認的排序操作區分大小寫,即NLS_SORT=BINARY。如果我們希望排序不區分大小寫的方式,則需把環境變量NLS_SORT設置為BINARY_CI。
顧名思義,NLS_SORT僅僅影響排序結果,并不對其他大小寫操作構成影響。即使把NLS_SORT設置為BINARY_CI,以不區分大小寫的方式比較數據的操作仍然延續了Oracle默認的方式。
小技巧:比較傳統的方式不是使用NLS環境變量,而是用UPPER和LOWER函數把要比較的字段名,文字都轉換成大寫或小寫后再比較。這種方式的不足之處在于,使用函數后,標準的索引就不能使用了,優化器無法工作,應對的方式是使用基于功能的索引(function-based index)。
通過對會話的環境變量的設置,引導Oracle用自然語言的方式進行比較,雖然表中都是這種形式的Simth而非全小寫,但NLS_COMP環境變量可以控制Oracle對字符的比較方式,設置為LINGUISTIC,可以用自然語言的方式比較,符合人類的思維習慣。
alert session set NLS_COMP = 'LINGUISTIC'; select first_name,last_name from hr.employee where last_name = 'simth';
-----------------------< 查詢結果>-------------------------
William SMITH
Lindsey Smith
-----------------------</查詢結果>--------------------------
MERGE 語句的功能是將新數據插入一個表中。記錄是否存在,由主(PRIMARY) 鍵進行判斷。如果主鍵不存在于表中,則插入該行。如果主鍵匹配表中已有的行,則通過匹配鍵的其他詳細信息更新該行。
在示例中,假設要把NEW_COUNTRIES表中一些國家的信息添加到HR.COUNTIES表中:
merge into hr.countries c using (select country_id,country_name from hr.new_countries) nc on (c.country_id=nc.country_id) when matched then update set c.country_name = nc.country_name when not matched then insert (c.country_id,c.country_name) values (nc.country_id,nc.country_name);
ON子句后面跟著另兩個子句,當鍵值相匹配時,執行“WHEN MATCHED CLAUSE”子句內容,當鍵值不匹配時,執行“WHEN NOT MATCHED”子句,會把新的記錄插入目標表中。
match和not-match子句都可以包含更多的篩選條件,當滿足刪除條件時,也可以刪除記錄:
merge into hr.countries c using (select country_id,country_name,region_id from hr.new_countries) nc on(c.country_id = nc.country_id) when matched then update set c.country_name = nc.country_name, c.region_id = nc.region_id delete where nc.region_id = 4 when not matched then insert (c.country_id,c.country_name,c.region_id) values (nc.country_id,nc.country_name,nc.region_id) where (nc.region_id !=4);
在這個修改后的版本中,除了REGION_ID的新值是4的行,其他根據COUNTRY_ID匹配的HR.CONTRIES的行都會修改COUNTR_NAME的值,而REGION_ID是4的行最終會刪除。沒有匹配上的行,除了REGION_ID的值是4的行,其他行都會被插入HR.COUNTRIES中,而REGION_ID的值是4的行會被忽略。
看完記得點贊哦O(∩_∩)O!
2015-03-17 23:40
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。