1、主要內容
● 通過SSMS,插入、更新和刪除表數據
● 通過INSERT語句向表中插入數據
● 通過UPDATE語句更新表內數據
● 通過DELETE語句刪除表內數據
● 使用INSERT、UPDATE和DELETE語句的幾個技巧
2、 使用INSERT語句插入數據
(1) 插入完整的行
INSERT INTO 表名
VALUES (字段1的值,字段2的值,字段3的值,……,字段n的值)
VALUES子句中必須列出所有字段的值,而且必須按表中字段順序排列
說明:兼容的數據類型是指同一數據類型或SQL Server能自動轉換成兼容類型的數據類型,例如,SQL Server能夠將日期格式的字符串自動轉換為日期型數據,因此,日期格式的字符串與日期型數據是兼容的。
【例1】向數據表course添加如下表所示的課程內容。
INSERT INTO course VALUES ('009','法律基礎', '必修',3); INSERT INTO course VALUES ('010','素描', '選修',2)
(2) 向日期時間型字段插入數據
【例5】向數據表stu_info添加如表所示的學生信息。
INSERT INTO stu_info VALUES ('0016','瑪麗','女','1989-02-07',' marry@163.com ','13716161616','物理系')
(3) 將數據插入到指定字段
【例6】向數據表stu_info添加如表所示的學生信息。
INSERT INTO stu_info(sno,sname, sex, birth, depart) VALUES ('0017', '周倫傑','男','1987-05-07', '中文系') INSERT INTO stu_info VALUES ('0017','周倫傑','男','1987-05-07', NULL,NULL,'中文系')
(4) 將查詢結果插入表
INSERT INTO表名[(字段列表)]
SELECT語句
下面創建一個數據表,並命名為stu_info_copy。
CREATE TABLE stu_info_copy ( 學號 char(4) NOT NULL, 姓名 nchar(20) NOT NULL, 性別 nchar(1) NOT NULL, 出生日期 date, 電子信箱 char(50), 手機號碼 char(11), 所屬院系 nchar(30) )
【例7】將stu_info表中所有數據,通過INSERT SELECT插入到stu_info_sopy表。
分析:因為兩個表的表結構相同,而且要將stu_info中所有字段的內容都插入到stu_info_copy表中,所以在INSERT子句中可以省略字段列表。
INSERT INTO stu_info_copy SELECT * FROM stu_info
因為兩表的表結構一致,而且要將stu_info表所有字段的內容都復制過去,所以在INSERT子句中沒有列出字段列表。但是,如果兩表的表結構不同或者只復制一部分字段,則應當在INSERT子句中列出字段列表。
3 使用UPDATE語句更新數據
(1) 更新單個字段的數據
UPDATE 表名 SET 字段名 = 更新值 WHERE 條件表達式
(1)UPDATE子句。指定SQLServer要使用的表,並打開表。
(2)WHERE子句。將表中滿足條件的記錄放入結果集。
(3)SET子句。更新結果集中所有記錄的特定字段的數據。
注意:UPDATE語句中的WHERE子句可以被省略,這樣一來,所有記錄都會被更新。因此,在省略WHERE子句前應當考慮清楚,是否真的要更新所有記錄的數據。
【例8】在stu_info表中,將名叫“張三”的學生的email更改為“zhangsan@163.com”。
UPDATE stu_info SET email='zhangsan@163.com ' WHERE sname='張三'
(2) 更新多個字段的數據
UPDATE 表名 SET 字段名1=更新值1, 字段名2=更新值2, 字段名3=更新值3 WHERE 條件表達式
【例9】在stu_info表中,將沒有院系的學生全部歸為“國際交流學院”所屬,並將email統一更改為“gjjl@imnu.edu.cn”。
UPDATE stu_info SET depart ='國際交流學院', email='gjjl@imnu.edu.cn' WHERE depart IS NULL
(3) 使用表連接更新數據
通過FROM子句和WHERE子句配合,可以進行多表連接。
【例10】score表中,在每個學生“大學英語”的平時成績上加5分。
分析:因為score表中只有課程編號,而並沒有課程名稱,因此,必須從course表中得到“大學英語”的課程編號后,然后才能根據該編號更新score表中的數據。所以解決問題的最佳方式是連接score表和course表進行更新操作。
UPDATE score SET usually= usually +5 FROM score AS s,course AS c WHERE c.cname='大學英語' AND s.cno=c.cno
(4) 使用UPDATE語句刪除指定字段的數據
UPDATE語句還有一個作用,即刪除指定字段的數據。所謂刪除,只是使用NULL值替換原有的字段值而已。
注意:用NULL值替換字段值時,首先必須保證該字段可以為空,否則會出現錯誤。
【例11】在stu_info表中,將所有外語系學生的“telephone”字段的值刪除。
UPDATE stu_info SET telephone = NULL WHERE depart='外語系'
4、 使用DELETE語句刪除數據
(1) 使用DELETE語句刪除指定記錄
使用DELETE語句刪除的是整行記錄,而並非是記錄中的某個字段值。
DELETE FROM 表名 WHERE 條件表達式
【例12】從stu_info_copy表,刪除名叫“安娜”的學生。
DELETE FROM stu_info_copy WHERE 姓名 = '安娜'
【例13】從stu_info_copy表,刪除所有外語系的學生。
DELETE FROM stu_info_copy WHERE 所屬院系 ='外語系'
(2) 在DELETE語句中使用多表連接
創建一個score表的復制表score_copy。
SELECT * INTO score_copy FROM score
【例14】從score_copy表中,刪除“張三”的所有相關記錄。
先查看score_copy表中關於“張三”的全部記錄。
SELECT s.* FROM score_copy AS s,stu_info AS st WHERE st.sname = '張三' AND st.sno=s.sno
其次,使用下面的語句刪除記錄。
DELETE score_copy FROM score_copy AS s,stu_info AS st WHERE st.sname ='張三' AND st.sno=s.sno
說明:刪除語句中,DELETE關鍵字后的表名指定要從哪個數據表刪除數據,在本語句中DELETE關鍵字后是score_copy,因此,只刪除score_copy表中的相關數據,而與FROM子句中列出的其他表無關,例如與stu_info表無關。
再次使用上面的SELECT語句,查看“張三”的相關內容。
(3) 使用DELETE語句刪除所有記錄
如果DELETE語句后不加WHERE子句,則會將表內所有記錄全部刪除。這里需要注意區分的是,DELETE語句刪除的是所有記錄,而並不是數據表本身。
【例15】刪除stu_info_copy表內的所有記錄。
DELETE FROM stu_info_copy
5、 使用TRUNCATE語句刪除所有記錄
實際上使用DELETE語句刪除表中所有記錄的效率有時非常低,因為SQL Server會向事務處理日志寫入一些內容,這些內容在刪除執行失敗時,可以幫助用戶將數據回滾(回退)到刪除執行前的狀態。
TRUNCATE是刪除表中所有記錄的另一種語句,與DELETE語句相比,TRUNCATE運行效率非常高,因為使用TRUNCATE語句時,SQL Server不會寫入任何內容,換個角度說,TRUNCATE語句所做的修改是不能回滾的。
【例16】刪除stu_info_copy表內的所有記錄。
TRUNCATE TABLE stu_info_copy
6、 綜合練習
1.判斷以下INSERT語句是否能夠將數據正確插入到stu_info_copy表。
INSERT INTO stu_info_copy VALUES ('0016', '瑪麗','女', '198927', 'marry@163.com ', '13716161616','物理系')
分析:從錯誤信息(從字符串轉換日期和/或時間時,轉換失敗)。分析INSERT語句后發現,給出生日期(birth)字段插入的值“198927”不是日期格式的字符串,所以該語句運行錯誤。在本例中如果將值改為“19890207”,則插入語句會正確運行,如下所示。
INSERT INTO stu_info_copy VALUES ('0016', '瑪麗', '女', '19890207', 'marry@163.com ', '13716161616', '物理系')
2.將計算機系所有學生的“信息基礎”課程的考試成績更改為95分。
分析:在score表中沒有學生的院系信息,也沒有課程的課程名稱信息,而stu_info表中有院系信息,course表中有課程名稱信息,因此必須將stu_info表和course表連接到score表上進行更新。
UPDATE score SET exam= 95 FROM stu_info AS st ,score AS s,course AS c WHERE st.depart='計算機系 ' AND c.cname='信息基礎' AND s.cno=c.cno AND st.sno=s.sno UPDATE score SET exam= 95 FROM stu_info INNER JOIN score ON stu_info.sno = score.sno INNER JOIN course ON score.cno = course.cno WHERE stu_info.depart = N'計算機系' AND course.cname = N'信息基礎'