- LAMP網(wǎng)站開發(fā)黃金組合Linux+Apache+MySQL+PHP
- 楊明華等編著
- 2032字
- 2018-12-29 19:23:40
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)的基表相同。
- Visualforce Development Cookbook(Second Edition)
- Go Machine Learning Projects
- 輕松學(xué)Java Web開發(fā)
- 并行數(shù)據(jù)挖掘及性能優(yōu)化:關(guān)聯(lián)規(guī)則與數(shù)據(jù)相關(guān)性分析
- Mobile DevOps
- 大數(shù)據(jù)技術(shù)入門(第2版)
- iClone 4.31 3D Animation Beginner's Guide
- 計算機網(wǎng)絡(luò)技術(shù)基礎(chǔ)
- Implementing Oracle API Platform Cloud Service
- 西門子變頻器技術(shù)入門及實踐
- Linux嵌入式系統(tǒng)開發(fā)
- 從零開始學(xué)Java Web開發(fā)
- 基于RPA技術(shù)財務(wù)機器人的應(yīng)用與研究
- 青少年VEX IQ機器人實訓(xùn)課程(初級)
- WOW!Photoshop CS6完全自學(xué)寶典