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

4.8 數(shù)據(jù)操縱語言(DML)

為了修改數(shù)據(jù)庫中的數(shù)據(jù),SQL的數(shù)據(jù)操縱語言提供了增(INSERT)、刪(DELETE)、改(UPDATE)語句,下面分別介紹。

4.8.1 INSERT語句

插入數(shù)據(jù)是把新的記錄插入到一個存在的表中。插入數(shù)據(jù)使用語句INSERT INTO,可分為以下幾種情況。

1.插入一個新記錄

插入一個新元組到表中的語法格式如下:

    INSERT INTO <表名>[(<列名1>[,<列名2>…])] VALUES(<值>);

其中,<表名>是指要插入新記錄的表,<列名>是可選項,指定待添加數(shù)據(jù)的列,VALUES子句指定待添加數(shù)據(jù)的具體值。若沒有指定列名表,則VALUES子句值的排列順序必須和原表的定義相同、個數(shù)相等、數(shù)據(jù)類型一一對應(yīng),否則會被系統(tǒng)拒絕。在插入新元組時,會對主鍵列的值進行主鍵唯一性檢查。

在INSERT INTO語句中可以在表名后面添加列名表,這有兩個好處:

● 當(dāng)插入元組的某列為NULL時,只要在列名表中不列出這個列即可,前提是將列允許改為空;

● 列的次序也不必嚴格與表的定義語句一致。但是VALUES子句值的排列順序必須和列名表中的列名排列順序一致,個數(shù)相等,數(shù)據(jù)類型一一對應(yīng)。

例如要在STUDENTS表中插入一條學(xué)生記錄(學(xué)號:0406345;姓名:白霧;性別:女;年齡:21;系別:英語系)。SQL語句如下:

    INSERT INTO STUDENTS VALUES ('0406345','白霧','女',21,'English');

★ 注意 ★

必須用逗號將各個數(shù)據(jù)分開,字符型數(shù)據(jù)要用單引號括起來。

2.插入記錄的部分值

在表中插入記錄時,有時可以只插入部分字段的值,有些字段暫時不插入值。例如,在學(xué)生選課表SC中插入一條新的選課記錄,但沒有成績(學(xué)號:0406321;選課號:C003),SQL語句如下:

    INSERT INTO SC (SNO,CNO) VALUES ('0406321','C003');

將VALUES子句中的值按照INTO子句中指定列名的順序插入到表中,對于INTO子句中沒有出現(xiàn)的列,則新插入的記錄在這些列上將取空值,如上例的GRADE即賦空值。但在表定義時有NOT NULL約束的屬性列不能取空值。

3.插入多行記錄

有時要插入一個表中的數(shù)據(jù)是數(shù)據(jù)庫表中已經(jīng)有的,可以用一個查詢語句作為插入值,此時插入數(shù)據(jù)可能不止一個元組。插入數(shù)據(jù)的語法格式如下:

    INSERT INTO <表名> [(<列名1>[,<列名2>…])]
    SELECT子查詢;

例如,需要生成一個英語系學(xué)生的成績表ENGGRADE,表中包括SNAME、CNO、GRADE四個屬性。首先定義一個新表ENGGRADE,SQL語句如下:

    CREATE TABLE ENGGRADE
    (SNAME VARCHAR(8)NOT NULL,CNO CHAR(4)NOT NULL,GRADE SMALLINT);

然后,在新表中插入有關(guān)的數(shù)據(jù),SQL語句如下:

    INSERT INTO ENGGRADE SELECT SNAME,STUDENTS.SNO,CNO,GRADE FROM STUDENTS,SC
    WHERE STUDENTS.SNO=SC.SNO AND SDEPT='English';

插入后,表ENGGRADE的內(nèi)容為如表4-11所示,子查詢得到的所有記錄都插入了表中。

表4-11 ENGGRADE表的內(nèi)容

4.8.2 DELETE語句

DELETE語句用來刪除表中的一行或多行記錄,其語法格式入如下:

    DELETE
    FROM<表名>
    [WHERE <條件>];

其中WHERE子句表示要刪除的記錄應(yīng)滿足的條件。如果沒有WHERE子句,則表示刪除表的所有元組(記錄),但表本身仍作為一個空表存在。要刪除表本身,必須使用DROP TABLE語句。刪除數(shù)據(jù)又可以具體分為刪除一個記錄,刪除多個記錄或刪除全部記錄。

1.刪除一條記錄

刪除記錄的個數(shù)實際上是由WHERE條件決定的,例如要刪除SC表中學(xué)號為0406321、課程號為C001的記錄,SQL語句如下:

    DELETE
    FROM SC
    WHERE SNO='0406321' AND CNO='C001';

該語句就刪除了學(xué)生選課表的一條記錄,因為符合WHERE子句條件的記錄只有一條。

2.刪除多條記錄

在WHERE子句中可以使用SELECT子查詢語句來選擇符合條件的記錄,進行刪除。子查詢可能產(chǎn)生多條記錄。例如要從學(xué)生選課表SC中刪除英語系學(xué)生的選課記錄,SQL語句如下:

    DELETE FROM SC WHERE SNO=
        (SELECT SNO FROM STUDENTS WHERE SDEPT='English');

3.刪除所有記錄

刪除所有記錄的方法前面已經(jīng)提過,在DELETE語句中沒有WHERE子句時就表示刪除表的所有元組。

4.8.3 UPDATE語句

SQL語言可以使用UPDATE語句對表中的一個或多個元組的某些屬性值進行修改,其語法格式為:

    UPDATE <表名>
    SET <列名>=<表達式> [,<列名>=<表達式>]…
    [WHERE <條件>];

其中<表名>是指要修改的表,SET子句給出要修改的列及其修改后的值,WHERE子句指定待修改的記錄應(yīng)當(dāng)滿足的條件,WHERE子句省略時,則修改表中的所有記錄。

UPDATE語句一般分為下面4種操作。

1.修改一個記錄

例如把學(xué)號為0406321的學(xué)生的C001課程的成績改為60,SQL語句如下:

    UPDATE STUDENTS SET GRADE=60
    WHERE SNO='0406321' AND CNO='C001';

2.修改多個記錄

例如把所有學(xué)生的年齡都增加1,SQL語句如下:

    UPDATE STUDENTS SET SAGE=SAGE+1;

該語句中沒有WHERE條件,所以對表中所有記錄都執(zhí)行修改操作。當(dāng)符合WHERE條件的元組有多個時,對這多個元組進行修改。

例如要把英語系學(xué)生的年齡都減1,SQL語句如下:

    UPDATE STUDENTS SET SAGE=SAGE-1
    WHERE SDEPT='English';

3.利用查詢子句提供要修改的元組

例如要把英語系學(xué)生的選課成績都加10分,SQL語句如下:

    UPDATE SC
    SET GRADE=GRADE+10 WHERE SNO IN
        (SELECT STUDENTS.SNO FROM STUDENTS,SC WHERE STUDENTS.SNO=SC.TNO
            AND STUDENTS.SDEPT='English');

在這種修改操作中,子查詢的作用是查詢需要修改的元組;在本例中,子查詢提供英語系學(xué)生的學(xué)號。

4.利用查詢子句提供要修改的值

子查詢除了能夠提供需要修改的元組外,在UPDATE語句中還能用子查詢語句提供修改的值。例如,把所有選課的學(xué)分改為平均學(xué)分數(shù)的兩倍,SQL語句如下:

    UPDATE COURSE
    SET CCREDIT=
        (SELECT 2*AVG(CCREDIT) FROM COURSE);

在該修改語句中,SELECT查詢子句的作用就是提供修改的值。

4.8.4 視圖的更新

前面講過視圖的定義、刪除以及查詢,本節(jié)繼續(xù)介紹SQL語言對于視圖的操作。視圖的更新必須最終落實到有關(guān)基表的更新。視圖的更新是一個比較復(fù)雜的問題,在理論上可以深入研究,但在實際應(yīng)用中,都作了簡單化處理;或者有的DBMS對視圖更新做了嚴格的限制。一般的限制有:

● 由一個基表定義的視圖,只有含有基表的主鍵或候補鍵,并且視圖中沒有用表達式或函數(shù)的屬性,才允許更新;

● 由多表連接所定義的視圖不允許更新;

● 定義中用到GROUP BY子句或聚集函數(shù)的視圖不允許更新。

以上限制是簡化了的、偏向保守的規(guī)定。讀者用到更新視圖時可以參考具體使用的DBMS的規(guī)定。對于可以更新的視圖,語法與更新有關(guān)的基表相同。

主站蜘蛛池模板: 稷山县| 庆阳市| 临高县| 迭部县| 白山市| 称多县| 洪洞县| 梅州市| 合水县| 岢岚县| 垫江县| 永清县| 远安县| 永昌县| 乌兰察布市| 石棉县| 策勒县| 安新县| 肃南| 祁阳县| 峨眉山市| 株洲县| 龙山县| 庐江县| 庆城县| 万州区| 丰县| 宜阳县| 钟祥市| 通化县| 高雄县| 岳普湖县| 沙田区| 鄯善县| 开平市| 文水县| 乌拉特前旗| 阜新| 菏泽市| 泗水县| 乾安县|