官术网_书友最值得收藏!

3.5 命令方式操作表數(shù)據(jù)

對(duì)表數(shù)據(jù)的插入、修改和刪除還可以通過T-SQL語句來進(jìn)行,與界面操作表數(shù)據(jù)相比,通過T-SQL語句操作表數(shù)據(jù)更為靈活,功能更為強(qiáng)大。

3.5.1 插入記錄:INSERT

插入記錄使用INSERT語句,語法格式如下:

  INSERT    [ TOP ( 表達(dá)式 ) [ PERCENT ] ]
  [ INTO ]   表名 | 視圖名
  [ ( 列表 ) ]
  VALUES (  DEFAULT | NULL | 表達(dá)式 …   )   / *指定列值* /
  | DEFAULT VALUES                         / *強(qiáng)制新行包含為每個(gè)列定義的默認(rèn)值* /

說明

(1)表名:被操作的表的名稱。前面可以指定數(shù)據(jù)庫名和架構(gòu)名。

(2)視圖名:被操作的視圖名稱。有關(guān)視圖的內(nèi)容將在第4章中介紹。

(3)列表:需要插入數(shù)據(jù)的列的列表。包含了新插入行的各列的名稱。如果只給表的部分列插入數(shù)據(jù)時(shí),需要用“列列表”指出這些列。

例如,當(dāng)加入表中的記錄的某些列為空值或?yàn)槟J(rèn)值時(shí),可以在INSERT語句中給出的“列表”中省略這些列。沒有在“列表”中指出的列,它們的值根據(jù)默認(rèn)值或列屬性來確定,其原則如下。

① 具有IDENTITY屬性的列,其值由系統(tǒng)根據(jù)初值和增量值自動(dòng)計(jì)算得到;

② 具有默認(rèn)值的列,其值為默認(rèn)值;

③ 沒有默認(rèn)值的列,若允許為空值,則其值為空值;若不允許為空值,則出錯(cuò);

④ 類型為timestamp的列,系統(tǒng)自動(dòng)賦值;

⑤ 如果是計(jì)算列,則使用計(jì)算值。

(4)VALUES子句:包含各列需要插入的數(shù)據(jù)清單,數(shù)據(jù)的順序要與列的順序相對(duì)應(yīng)。若省略“列列表”,則VALUES子句給出每一列(除IDENTITY屬性和timestamp類型以外的列)的值。VALUES子句中的值可有以下3種。

① DEFAULT:指定為該列的默認(rèn)值。這要求定義表時(shí)必須指定該列的默認(rèn)值。

② NULL:指定該列為空值。

③ 表達(dá)式:可以是一個(gè)常量、變量或一個(gè)表達(dá)式,其值的數(shù)據(jù)類型要與列的數(shù)據(jù)類型一致。例如,列的數(shù)據(jù)類型為int,若插入的數(shù)據(jù)是'aaa'就會(huì)出錯(cuò)。當(dāng)數(shù)據(jù)為字符型時(shí),要用單引號(hào)括起來。

(5)DEFAULT VALUES:該關(guān)鍵字說明向當(dāng)前表中所有列均插入其默認(rèn)值。此時(shí),要求所有列均定義了默認(rèn)值。

【例3.6】向test1數(shù)據(jù)庫的表xsb1中插入如下一行數(shù)據(jù):

  191301, 王林, 1, 1990-02-10, 計(jì)算機(jī), 50 , NULL

在“SSMS”中單擊“新建查詢”,在“查詢編輯器”中輸入下列T-SQL命令:

  USE test1
  GO
  INSERT INTO xsb1
      VALUES('191301', '王林', 1, '1990-02-10', '計(jì)算機(jī)',50, NULL)
  GO

語句的執(zhí)行結(jié)果如圖3.6所示。

圖3.6 使用T-SQL語句向表中插入數(shù)據(jù)

注意

若插入數(shù)據(jù)行中含有與原有行中關(guān)鍵字相同的列值,則INSERT語句無法插入此行。

例如,如果重復(fù)執(zhí)行上述命令,系統(tǒng)顯示錯(cuò)誤信息,如圖3.7所示。

圖3.7 顯示錯(cuò)誤信息

說明

插入上例數(shù)據(jù)也可以使用以下命令:

  INSERT INTO xsb1 (學(xué)號(hào), 姓名, 性別, 出生時(shí)間, 總學(xué)分)
      VALUES('191301', '王林', 1, '1990-02-10', 50)

或者:

  INSERT INTO xsb1
      VALUES('191301', '王林', 1, '1990-02-10', DEFAULT,50, NULL);

INSERT語句可以一次向表中插入多條記錄,中間用逗號(hào)隔開。

【例3.7】一次向test1數(shù)據(jù)庫xsb1表中插入兩行數(shù)據(jù):

  '201301', '王海', 1, '1996-05-10', '軟件工程', 50, NULL
  '201302', '李娜', 0, '1996-04-12', '軟件工程', 52, NULL

命令如下:

  INSERT INTO xsb1 VALUES('201301', '王海', 1, '1991-05-10', '軟件工程', 50, NULL), ('201302',
'李娜', 0, '1991-04-12', '軟件工程', 52, NULL)

【例3.8】從test1數(shù)據(jù)庫表xsb1中生成計(jì)算機(jī)專業(yè)的學(xué)生表(xsb2),包括學(xué)號(hào)、姓名、出生時(shí)間、總學(xué)分、備注。

(1)用界面方式或者CREATE TABLE語句建立表xsb2,表結(jié)構(gòu)與xsb1相同。

(2)用INSERT語句向xsb2表中插入數(shù)據(jù):

  INSERT INTO xsb2
      SELECT *
          FROM xsb1
          WHERE專業(yè)= '計(jì)算機(jī)'

(3)使用SELECT語句從xsb2表中查詢結(jié)果:

  SELECT  *
      FROM  xsb2               / * xsb1表的內(nèi)容* /

執(zhí)行結(jié)果如圖3.8所示。

圖3.8 執(zhí)行結(jié)果

在執(zhí)行INSERT語句時(shí),如果插入的數(shù)據(jù)與約束或規(guī)則的要求產(chǎn)生沖突,或值的數(shù)據(jù)類型與列的數(shù)據(jù)類型不匹配,那么INSERT執(zhí)行失敗。

3.5.2 修改記錄:UPDATE

在T-SQL中,UPDATE語句可以用來修改表中的數(shù)據(jù)行。

語法格式:

  UPDATE [ TOP ( 表達(dá)式 ) [ PERCENT ] ]
  {  表名 | 視圖名  }
  SET { 列名=表達(dá)式, …  }                   / *賦予新值* /
  [ FROM  <表源> …]
  [ WHERE <查找條件> | …  ]                 / *指定條件* /
  ……

說明

(1)SET子句:用于指定要修改的列或變量名及其新值。

(2)FROM子句:指定用表來為更新操作提供數(shù)據(jù)。

(3)WHERE子句:WHERE子句中的<查找條件>指明只對(duì)滿足該條件的行進(jìn)行修改,若省略該子句,則對(duì)表中的所有行進(jìn)行修改。

【例3.9】將test1數(shù)據(jù)庫的xsb1表中學(xué)號(hào)為“191301”的學(xué)生的備注值改為“外?;フJ(rèn)學(xué)分課程”,同時(shí)將總學(xué)分+3。

  USE test1
  GO
  UPDATE xsb1
      SET  備注 = '外校互認(rèn)學(xué)分課程',
           總學(xué)分 = 總學(xué)分+3
      WHERE學(xué)號(hào)='191301'
  GO

執(zhí)行完上述語句后,xsb1表學(xué)號(hào)為“191301”的學(xué)生的記錄如圖3.9所示。

圖3.9 修改數(shù)據(jù)以后的表

說明

對(duì)于學(xué)生成績(jī)管理數(shù)據(jù)庫,一般來說,學(xué)生表(xsb)總學(xué)分字段數(shù)據(jù)增加是由于在成績(jī)表(cjb)中增加了記錄(學(xué)生上一門課成績(jī)合格),這兩個(gè)表的記錄修改命令是一起完成的。

3.5.3 刪除記錄:DELETE/TRUNCATE TABLE

在T-SQL語言中,刪除表數(shù)據(jù)可以使用DELETE語句或TRUNCATE TABLE語句來實(shí)現(xiàn),分別用于刪除表中符合條件的記錄和所有記錄。

1. 刪除符合條件記錄

語法格式:

  DELETE [ TOP ( 表達(dá)式 ) [ PERCENT ] ]
  [ FROM  表名 | 視圖名 |  <表源>  ]
  [ WHERE  <查找條件>  |  …  ]            / *指定條件* /

說明

(1)[TOP(表達(dá)式)[PERCENT]]:指定將要?jiǎng)h除的任意行數(shù)或任意行的百分比。

(2)FROM子句:說明從何處刪除數(shù)據(jù)??梢詮囊韵?種類型的對(duì)象中刪除數(shù)據(jù)。

表:由“表名”指定要從其中刪除數(shù)據(jù)的表,關(guān)鍵字WITH指定目標(biāo)表所允許的一個(gè)或多個(gè)表提示,一般情況下不需要使用WITH關(guān)鍵字。

視圖:由“視圖名”指定要從其中刪除數(shù)據(jù)的視圖,注意該視圖必須可以更新,并且正確引用了一個(gè)基本表。

表源:將在介紹SELECT語句時(shí)詳細(xì)討論。

(3)WHERE子句:為刪除操作指定條件。若省略WHERE子句,則DELETE語句將刪除所有數(shù)據(jù)。

【例3.10】將test1數(shù)據(jù)庫的xsb1表中總學(xué)分為0的行刪除,使用如下語句:

  USE test1
  GO
  DELETE
      FROM  xsb1
      WHERE總學(xué)分 = 0
  GO

2. 刪除表中所有記錄

使用TRUNCATE TABLE語句將刪除指定表中的所有數(shù)據(jù),因此也稱為清除表數(shù)據(jù)語句。

語法格式:

  TRUNCATE TABLE  表名

說明

(1)使用TRUNCATE TABLE語句刪除了指定表中的所有行,但表結(jié)構(gòu)及其列、約束、索引等保持不變,而新行標(biāo)識(shí)所用的計(jì)數(shù)值重置為該列的初始值。如果要保留標(biāo)識(shí)計(jì)數(shù)值,則要使用DELETE語句。

(2)“TRUNCATE TABLE表名”與“DELETE表名”二者均刪除表中的全部行。但TRUNCATE TABLE比DELETE速度快,且使用的系統(tǒng)和事務(wù)日志資源少。DELETE語句每次刪除一行,并在事務(wù)日志中為所刪除的每一行記錄一項(xiàng)。而TRUNCATE TABLE通過釋放存儲(chǔ)表數(shù)據(jù)所用的數(shù)據(jù)頁來刪除數(shù)據(jù),并且只在事務(wù)日志中記錄頁的釋放。

對(duì)于由外鍵(FOREIGN KEY)約束引用的表,不能使用TRUNCATE TABLE語句刪除數(shù)據(jù),而應(yīng)使用不帶WHERE子句的DELETE語句。另外,TRUNCATE TABLE語句也不能用于參與了索引視圖的表。

(3)表記錄刪除后不能恢復(fù)。

(4)如果刪除表記錄的同時(shí)刪除表結(jié)構(gòu),則使用“DROP TABLE表名”命令。

例如,刪除test1數(shù)據(jù)庫的xsb1和xsb2表中的所有行。

  USE test1
  GO
  DELETE  xsb1
  GO
  TRUNCATE TABLE xsb2
  GO
  DROP TABLE xsb3
  GO
  SELECT  * FROM  xsb1             / *顯示沒有記錄* /
  GO
  SELECT  * FROM  xsb2             / *顯示沒有記錄* /
  GO
  SELECT  * FROM  xsb3             / *顯示錯(cuò)誤信息,因?yàn)閤sb3已經(jīng)沒有了* /
  GO
主站蜘蛛池模板: 中宁县| 苗栗市| 四平市| 乌拉特中旗| 河西区| 崇左市| 承德市| 湘乡市| 涿鹿县| 云和县| 贞丰县| 清徐县| 辰溪县| 广河县| 扎赉特旗| 渭南市| 库车县| 图片| 永胜县| 宝坻区| 枣强县| 运城市| 资中县| 浪卡子县| 苏尼特右旗| 汾西县| 阿克苏市| 山西省| 织金县| 连平县| 新乡县| 浦江县| 安平县| 葫芦岛市| 抚顺县| 彩票| 从化市| 赣榆县| 隆德县| 上虞市| 达孜县|