常用SQL系列之(四):Null值、插入方式、默認值及複製等

本系統為 在微頭條上的內容,

為便於查閱,特輯錄於此,都是常用SQL基本用法。。

前兩篇連接:

(一):

(二):

(三):


常用SQL系列之(四):Null值、插入方式、默認值及複製等

(25):如何在運算和比較時使用NULL值?


在進行SQL查詢計算和比較時,經常會碰到NULL的處理情況。但有一關鍵點需要認識到,即NULL值永遠不會等於或不等於任何值,當然,也包括NULL值本身。但是又需要像計算真實值一樣就算可能為空列的返回值。比如我們要找出比王五員工獎金小的員工(包含沒有獎金的員工)。參考SQL可以這樣來寫:
SELECT
e.empname,
e.reward ,
COALESCE(reward,0)
FROM
tx_employee e
WHERE
COALESCE ( reward, 0 ) < ( SELECT reward FROM tx_employee WHERE empname = '王五' )
這個主要就是要注意SQL中的NULL值的特殊性以及如何利用COALESCE函數。此函數就是返回列表中第一個非null值,也就是說如果這樣寫COALESCE(reward,0),那麼當reward的是null是,該函數就返回0。這個可以很好理解的,動手試試吧。

(26):實現數據庫表的數據插入3種方式 ?


比如我們有一張books書籍表(字段為:bkid,bkname,bktype,bkwriter,bkprice,bkpublisher,bkpubdate,bkcomm,其中,前三個字段為非空字段,bkid為自增長的主鍵),我們常規的數據插入方式為:
(1)、省略表列名方式:


insert into books
values(1,'Java高效入門','T001','Solo Cui',48.8,'牛旦出版社',now(),'')
這種方式,得在values列表中,匹配每一列,但可以可以省略表明books後的列名列表;
(2)、插入指定列方式:
insert into books(bkname,bktype,bkwriter)
value('Vue高效入門','T009','牛旦')
這種方式,在表名後指定插入列的列名,再在值列表中匹配必須的列值,即可。
(3)、一次插入多行值:
前兩種我們都是異常插入一條記錄,在DB2和MySQL中,我們可以一次插入多條值,示例如下:
insert into books(bkname,bktype,bkwriter)
values ('Vue高效進階-第一卷','T009','牛旦'),
('Vue終極解密-第一卷','T009','牛旦'),
('遊戲編程終極解密-第一卷','T009','牛旦')
這裡需要注意的是在values後面值列別的表現形式,即以逗號分隔的多個括號值列表。

(27):為數據表插入默認值的方式?


創建數據表時,可以為相應的列定義插入式默認值。即在沒有指定列名時,系統會自動為列插入一個值。比如如下定義表時:
create table xtable
(
xid int not null default 0,
xname varchar(128) default '無名',


xdate datetime default CURRENT_TIMESTAMP
);
我們如下方式可以插入默認值:
insert into xtable values ()
不需要在values後製定列值,直接執行上述語句,即可完成數據的插入。當然,你也可以制定某列,帶有默認值的不在values值列表中指定也可,如下SQL:
insert into xtable(xid) values(1)
這樣,插入時,其餘列將插入默認值。
default是所有數據庫系統都支持的關鍵之。但插入方式可有不同。如實SQL Server和PosgreSQL可以這樣插入:insert into xtable default values 。

(28):如何確保插入列值為null?


我們知道在設計表時,可為列指定默認值,但有時我們需要在插入值時其保證為空值null。那如何實現呢?
只要這樣:
insert into xtable(xid,xname) values(null,'killer')
這樣就可以確保列為xid插入null,之後可以根據需要對其進行相應處理。
如果不對錶的某列插入什麼值,只要把列名去掉並去掉值列表的對應列值即可,如:
insert into xtable(xname) values('jingke')
需要知道的是,如果省略的列在設計表時有缺省值的,那就會在插入數據是自動插入缺省值。當然缺省值可以為null。


(29):一條語句實現從一個表向另一表複製插入數據?


有時候我們不想一條條的向表中插入數據,而是想從已知有數據的表裡按要求查找並直接將查到的數據插入到目的表中(比如衝A表查找4列符合條件的數據,然後自動能將結果插入到B表),如何實現呢?
可以整夜來編寫SQL語句:
insert into employee (departid,ename,level)
select departid,name,level from person where city in ('shanghai','beijing')
這樣就可實現查詢並複製數據到目的表中了。
這裡需要注意的是查詢表結構和插入表結構的一致性(數據類型和大小),否則可能插入失敗。
當然,你可以根據需要對查詢的數據進行必要的轉換以便插入。
有這樣的SQL查找,借用輔助工具還可以進行異構數據庫間的數據複製插入。試試吧。


(30):如何快速複製表定義:


也就是說,創建一個與已有表的列設置相同的表,如何實現?比如我要創建一個和部門表department定義一樣的表depart,以為備用。在mysql中,可以這樣完成:


create table departs
as
select * from department where 1=0
執行上面的的語句,就可定義一個和departmen定義t完全一樣的表了。
省事吧?尤其在想做測試用表時,這個太方便了。
上面的SQL語句,也適合Oracle和postgreSQL。DB2中更簡單,形式如下:
create table sometable like xtable .
使用帶有like語法create table命令即可基於xtable創建新表sometable。而SQL Server的語法是這樣的:
select * into depart from department where 1=0.
就這麼省事,試試吧——對了,把條件改改看結果如實?


分享到:


相關文章: