直播中
在向表中添加數(shù)據(jù)時(shí)應(yīng)該注意兩點(diǎn):第一是用戶權(quán)限,只有sysadmin角包成員、數(shù)據(jù)庫(kù)和數(shù)據(jù)庫(kù)對(duì)
象所有者及其授權(quán)用戶才有權(quán)限向表中添加數(shù)據(jù);第二是數(shù)據(jù)格式,對(duì)于不同的數(shù)據(jù)類型,插入數(shù)據(jù)的
格式也不一樣,應(yīng)嚴(yán)格遵守它們各自的格式要求。
Transact-SQL語(yǔ)言中用INSERT語(yǔ)句向表或視圖中插入新的數(shù)據(jù)行。INSERT語(yǔ)句的語(yǔ)法格式為:
INSERT [INTO] table_source
{[column_list]
VALUES ({DEFAULT | constant_expression} [,…n])
|DEFAULT VALUES
|select_statement
|execute_statement
}
}
其中,column_list參數(shù)為新插入數(shù)據(jù)行中一列或多列列名列表,它說(shuō)明INSERT 語(yǔ)句只為指定列插
入數(shù)據(jù)。在給表或視中部分列插入數(shù)據(jù)時(shí),必須使用列名列表方式指出這部分列名。其余未指定列的列
值要根據(jù)它們的默認(rèn)值和空值屬性情況而定,它們有以下幾種可能取值:
(1)對(duì)于timestamp列或具有IDENTITY屬性列,它們的列值由SQL Server計(jì)算后自動(dòng)賦值。
(2)如果這些列有默認(rèn)值或關(guān)聯(lián)有默認(rèn)數(shù)據(jù)庫(kù)對(duì)象,插入新列時(shí),它們的值為默認(rèn)值。
(3)當(dāng)這些列沒(méi)有默認(rèn)值設(shè)置時(shí),但它們?cè)试S空值時(shí),該列值為空。
(4)當(dāng)這些列既沒(méi)有默認(rèn)值設(shè)置,也不允許空值時(shí),SQL Server在執(zhí)行INSERT 語(yǔ)句時(shí)將產(chǎn)生錯(cuò)誤,
導(dǎo)致插入操作失敗。
當(dāng)未指定column_list 參數(shù)時(shí),為各列所提供的數(shù)據(jù)順序應(yīng)嚴(yán)格按照表中各列的定義順序,而使用
column_list參數(shù)則可以調(diào)整向表中所插入數(shù)據(jù)的列順序,只要VALUES子句所提供的數(shù)據(jù)順序與column_
list參數(shù)中指定的列順序相同即可。
VALUES子句為新插入行中column_list 參數(shù)所指定列提供數(shù)據(jù),這些數(shù)據(jù)可以以常量表達(dá)式形式提
供,或使用DEFAULT關(guān)鍵字說(shuō)明向列中插入其默認(rèn)值。
DEFAULT VALUES說(shuō)明向表中所有列插入其默認(rèn)值。對(duì)于具有INDENTITY 屬性或timestamp 數(shù)據(jù)類型
列,系統(tǒng)將自動(dòng)插入下一個(gè)適當(dāng)值。對(duì)于沒(méi)有設(shè)置默認(rèn)值的列,如果它們?cè)试S空值,SQL Server將插入
null,否則返回一錯(cuò)誤消息。
select_statement是標(biāo)準(zhǔn)的數(shù)據(jù)庫(kù)查詢語(yǔ)句,它是SQL Server為INSERT語(yǔ)句所提供的又一種數(shù)據(jù)插
入方式。INSERT語(yǔ)句將select_statement子句所返回的結(jié)果集合數(shù)據(jù)插入到指定表中。查詢語(yǔ)句結(jié)果集
合每行中的數(shù)據(jù)數(shù)量、 數(shù)據(jù)類型和排列順序也必須與表中所定義列或 column_list 參數(shù)中指定列的數(shù)
量、數(shù)據(jù)類型和排列順序完全相同。
SQL Server為INSERT語(yǔ)句提供的第四種數(shù)據(jù)插入方式是通過(guò)執(zhí)行系統(tǒng)存儲(chǔ)過(guò)程,其數(shù)據(jù)來(lái)自于過(guò)程
執(zhí)行后所產(chǎn)生的結(jié)果集合。所執(zhí)行的過(guò)程可以為存儲(chǔ)過(guò)程、系統(tǒng)存儲(chǔ)過(guò)程或擴(kuò)展存儲(chǔ)過(guò)程,它們既可以
為本地存儲(chǔ)過(guò)程,又可以是遠(yuǎn)程服務(wù)器上的存儲(chǔ)過(guò)程,只要用戶具有它們的執(zhí)行權(quán)限即可。有關(guān)存儲(chǔ)過(guò)
程請(qǐng)參閱對(duì)應(yīng)的內(nèi)容。
table_source說(shuō)明INSERT語(yǔ)句插入數(shù)據(jù)時(shí)所操作的表或視圖,其語(yǔ)法格式可簡(jiǎn)單書(shū)寫為:
{table_name [[AS] table_alias]
| view_name [[AS] table_alias]
}
table_name和view_name說(shuō)明被插入數(shù)據(jù)的表或視圖名稱,table_alias參數(shù)為表或視圖設(shè)置別名。
使用別名有兩方面原因:第一、當(dāng)表或視圖名稱較長(zhǎng)時(shí),使用別名可以簡(jiǎn)化書(shū)寫工作;第二,在自連接
或子查詢中,使用別名可以區(qū)別同一個(gè)表或視圖。
在向表中插入數(shù)據(jù)時(shí), 如果所插入的數(shù)據(jù)與約束或規(guī)則的要求沖突, 或是它們的數(shù)據(jù)類型不兼容
時(shí),將導(dǎo)致INSERT 語(yǔ)句執(zhí)行失敗。當(dāng)使用SELECT或EXECUTE子句向表中一次插入多行數(shù)據(jù)時(shí),如果其中
有任一行數(shù)據(jù)有誤,它將導(dǎo)致整個(gè)插入操作失敗,使SQL Server停止所有數(shù)據(jù)行的插入操作。
例一、使用數(shù)值列表方式( 假定 usertable 表中只定義了name、age和sex字段,且name、sex均為
char類型,age為int類型)。
INSERT usertable
VALUES ('張三','女',18)
例二、使用列名列表方式
INSERT usertable (age,name)
VALUES (18,'張三')
例三、在數(shù)值列表中,還可以將變量的值插入到表中。在使用變量為列提供數(shù)據(jù)時(shí),應(yīng)保證變量的
數(shù)據(jù)類型與列數(shù)據(jù)類型相同,或是可以自動(dòng)將它們轉(zhuǎn)換為相同的數(shù)據(jù)類型。例如:
DECLARE @name char(16)
SET @name='張三'
INSERT usertable
VALUES (@name,DEFAULT,20)
本例中Asp中是這樣的:
dim name
name="張三"
sqlstr="INSERT usertable VALUES ('"&name&"','女',20)"
……
例四、將SELECT子句的所返回的結(jié)果集合插入到表中。例如:
INSERT usertable (name,sex,age)
SELECT 's'+name,sex,age
FROM usertable
WHERE name like '張%%'
二、修改數(shù)據(jù)
Transact-SQL中的UPDATE語(yǔ)句用于修改表中數(shù)據(jù),該語(yǔ)句的語(yǔ)法格式為:
UPDATE ()
SET (
column_name={expression | DEFAULT }
| @variable = expression
} [,…n]
[FROM
{
| (select_statement) [AS] table_alias [,…m]) ]
}
[,…n]
]
[WHERE
| CURRENT OF ({[GLOBAL] cursor_name } | cursor_variable_name} }
]
別看寫了一大堆,最常用的只是下列格式:
UPDATE table_name
SET column_name1=variable1,column_name2=variable2
WHERE search_conditions
其中table_or_view參數(shù)指出待修改的表或視圖名稱,其格式與INSERT語(yǔ)句中該參數(shù)的格式相同。
SET子句指出表中被修改的列或變量,以及它們的新值。column_name為被修改的列名,@variable
為一個(gè)已經(jīng)聲明的局部變量名稱,它們修改后的值由expression表達(dá)式提供,或使用DEFAULT關(guān)鍵字將
默認(rèn)值賦給指定列。
FROM子句引出另一個(gè)表,它為UPDATE語(yǔ)句的數(shù)據(jù)修改操作提供條件。
WHERE子句中的search_conditions 參數(shù)說(shuō)明UPDATE語(yǔ)句的修改條件,它指出表或視圖中的哪些行
需要修改。省略WHERE子句時(shí),說(shuō)明對(duì)指定的表或視圖中的所有行進(jìn)行修改?。。?!
WHERE子句中的CURRENT OF說(shuō)明在游標(biāo)的當(dāng)前位置處執(zhí)行修改操作,游標(biāo)由curror_name 或游標(biāo)變
量cursor_variable_name指定。
UPDATE不能修改具有IDENTITY屬性列的列值。
例一、將usertable表中所有人員的性別改為'男'
UPDATE usertable
SET sex='男'
例二、將性別為null的所有人員的性別改成'男'
UPDATE usertable
SET sex='男'
WHERE sex IS NULL
例三、將所有姓名為null的人員的姓名改為'張三'、性別改為'女',年齡改為18
UPDATE usertable
SET name='張三',sex='女',age=18
WHERE name IS NULL
三、刪除數(shù)據(jù)
Transact-SQL中,DELETE和TRUNCATE TABLE語(yǔ)句均可以刪除表中的數(shù)據(jù)。DELETE語(yǔ)句的語(yǔ)法格式為:
DELETE
{table_name | view_name}
FROM
{
| (select_statement) [AS] table_alias [(column_alias [,…m])]
}[,…n]
[WHERE
{
|{ [CURRENT OF {{[global] cursor_name}
|cursor_variable_name
}
DELETE語(yǔ)句的結(jié)構(gòu)與UPDATE語(yǔ)句有些類似,其中也包含F(xiàn)ROM子句和WHERE子句。WHERE子句為數(shù)據(jù)刪
除指定條件。不使用WHERE子句時(shí),DELETE語(yǔ)句將把有或視圖中所有的數(shù)據(jù)刪除。FROM子句是Transact-
SQL在ANSI基礎(chǔ)上對(duì)DELETE語(yǔ)句的擴(kuò)展,它指定要連接的表名,提供與相關(guān)子查詢相似的功能。
TRUNCATE TABLE語(yǔ)句語(yǔ)法格式為:
TRUNCATE TABLE table_name
TRUNCATE TABLE語(yǔ)句刪除指定表中的所有數(shù)據(jù)行,但表結(jié)構(gòu)及其所有索引繼續(xù)保留,為該表所定義
約束、規(guī)則、默認(rèn)和觸發(fā)器仍然有效。如果所刪除表中包含有IDENTITY列,則該列將被復(fù)位到其原始基
值。使用不帶WHERE子句的DELETE語(yǔ)句也可以刪除表中所有行,但它不復(fù)位IDENTITY列。
與DELETE語(yǔ)句相比,TRUNCATE TABLE語(yǔ)句的刪除速度更快。因?yàn)镈ELETE語(yǔ)句在每刪除一行時(shí)都要把
刪除操作記錄到日志中,而TRUNCATE TABLE語(yǔ)句則是通過(guò)釋放表數(shù)據(jù)頁(yè)面的方法來(lái)刪除表中數(shù)據(jù),它只
在釋放頁(yè)面做一次事務(wù)日志記錄。所以使用TRUNCATE TABLE語(yǔ)句刪除數(shù)據(jù)后,這些行是不可恢復(fù)的,而
DELETE操作則可回滾,能夠恢復(fù)原來(lái)數(shù)據(jù)。
因?yàn)門RUNCATE TABLE語(yǔ)句不做操作日志,它不能激活觸發(fā)器,所以TRUNCATE TABLE語(yǔ)句不能刪除一
個(gè)被其它表通過(guò)FOREIGN KEY約束所參照的表。
例一、使用DELETE語(yǔ)句刪除usertable表中name為'張三'的數(shù)據(jù)行
DELETE usertable
WHERE name='張三'
例二、下面使用FROM子句和WHERE子句指定條件,然后從TB_update表中刪除數(shù)據(jù)
DELETE TB_update
FROM TB_constraint AS a,TB_update AS b
WHERE a.name=b.name
AND a.country='China'
DELETE TB_update
FROM (SELECT * FROM TB_constraint
WHERE country='USA') AS a
WHERE a.name=TB_update.name