----start
我們經常需要對資料庫進行插入、更新、刪除等操作,如果我們想在更新資料的同時查看一下更新後的值,該怎麼辦呢?怎麼樣?是不是不太明白我說的話,不要緊,考慮下面的情況:
CREATE TABLE USER<br />(<br />NAME VARCHAR(20) NOT NULL,--姓名<br />SALARY FLOAT NOT NULL--工資<br />);<br />INSERT INTO USER (NAME,SALARY) VALUES<br />('張三', 1000),<br />('李四', 2000),<br />('王五', 2400),<br />('趙六', 2800),<br />('高七', 3000);
假設現在要給工資<=2000的員工漲工資,在原來的基礎上提供20%,我們可以這麼寫:
UPDATE USER SET SALARY=SALARY*(1+0.2) WHERE SALARY<=2000
當你更新完上面的語句後,發現自己很衝動,沒有查看有哪些員工就給更新了,然後你可能覺得不要緊,用如下語句查看一下:
SELECT * FROM USER WHERE SALARY<=2400
遺憾的是上面語句查詢出來的結果已經不全是你更新的資料了,王五也被查詢出來了,而王五並沒有漲工資。那麼,有沒有一種方法,在更新的同時查看一下哪些值被更新了,更新前或更新後的值是多少呢?答案是有,如下:
SELECT * FROM FINAL TABLE<br />(<br /> UPDATE USER SET SALARY=SALARY*(1+0.2) WHERE SALARY<=2000<br />)
如果更新操作影響的行有很多,而我們只想看一下有沒有姓李的人,只取10條查看一下,該怎麼辦呢?如下:
SELECT * FROM FINAL TABLE<br />(<br /> UPDATE USER SET SALARY=SALARY*(1+0.2) WHERE SALARY<=2000<br />)<br /> WHERE NAME LIKE '李%'<br />FETCH FIRST 10 ROWS ONLY;
看到這,如果你執行了上面的語句,那麼你可能發現,以上語句的查詢結果是更新後的值,那麼,我們想查看更新前的值,該怎麼辦呢?很簡單,我們只要把
FINAL TABLE 換成 OLD ABLE 就可以了,如下:
SELECT * FROM OLD TABLE<br />(<br /> UPDATE USER SET SALARY=SALARY*(1+0.2) WHERE SALARY<=2000<br />)<br /> WHERE NAME LIKE '李%'<br />FETCH FIRST 10 ROWS ONLY;
那麼,我既想看一下更新前的值,又想看一下更新後的值,該怎麼呢?是不是把關鍵字FINAL和OLD一起使用就可以了呢?答案沒有直接的方法同時查看更新前和更新後的值,但是我們可以通過INCLUDE關鍵字,創造虛擬欄位來包含更新前的值,如下:
SELECT * FROM FINAL TABLE<br />(<br /> UPDATE USER<br /> INCLUDE (OLD_SALARY FLOAT)<br /> SET SALARY=SALARY*(1+0.2),OLD_SALARY=SALARY<br /> WHERE SALARY<=2000<br />)
除了FINAL和OLD關鍵字外,其實還有個關鍵字:NEW,它的作用是,查看SQL更新後,trigger(觸發器)執行前的值。
另外把上面的UPDATE語句換成INSERT和DELETE語句同樣適用。
上面的這個例子不是很實用,其實這個功能最典型的用途是,當我們向自動產生主鍵的表插入資料後,我們很可能需要查看產生的主索引值,這個時候,這個功能將相當有用。
---更多參見:DB2 SQL 精萃
----聲明:轉載請註明出處。
----last updated on 2010.1.9
----written by ShangBo on 2009.11.5
----end