全國計算機(jī)等級考試輔導(dǎo):Sql表數(shù)據(jù)操作

字號:

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