【數據庫知識掃描】 | SQL複習-中篇 第16課 更新和刪除數據

一個特殊的假期留在家裏一日三餐接受投餵,還瘦了五六斤。終於恢復到有網有機子的狀態,所以學習整理工作恢復,心態上要調整好。只有不斷練習深入,才能夠專精,數據庫要繼續跟完。

所以今天跟的第16課主要講的是數據的更新與刪除:

目錄

16.1 更新數據

16.2 刪除數據

16.3 更新和刪除的指導原則


16.1 更新數據

首先,更新修改表中數據,用的是UPDATE語句,有兩種方式,通過更新表中特定行、更新表中的所有行

WHERE子句的省略問題,關係到是否更新表中所有行;UPDATE還有安全權限問題,在客戶端或服務器的DBMS中,使用UPDATE語句可能需要特殊的安全權限。

UPDATE語句的組成(要更新的表/列名和對應新值/確定要更新哪些行的過濾條件)

讓我們試試這個用法,將顧客表中顧客編號爲1000000005的顧客郵箱更新:

UPDATE Customers SET cust_email = '[email protected]' WHERE cust_id = '1000000005';

如果沒有WHERE子句後面跟的約束條件,那麼DBMS會執行Customers表中的所有行,那就慘了!

更新多列的話,需要這樣做:

UPDATE Customers SET cust_contact = 'Sam Roberts', cust_email = '[email protected]' WHERE cust_id = '1000000006';

爲什麼會有兩種結果,因爲之前在臺式機上完成,customers表都已經測試新增到了8,而這張表示回來後按照最新的插入數據操作的。所以只有五條數據,而對於第六條顧客信息的更新,當然,行匹配結果爲0,修改失敗了。

在手動添加編號六的顧客信息後再執行一次上面代碼,就修改成功了。

關於子查詢的問題,可以使用子查詢。

還有FROM關鍵字,是否支持得看DBMS是否支持,在文檔中有,可以去看。

再來一個練習,我們嘗試一下刪除(假定表定義允許NULL的情況哈):

UPDATE Customers SET cust_email = NULL WHERE cust_id = '1000000005';

NULL就是去除cust_email列中值的作用,和我們空字符串(" ",是一個值)不同,NULL沒值。

16.2 刪除數據

刪除用DELETE語句,有兩種,刪除特定行,刪除所有行。

WHERE子句省略的問題,別不小心省略了,因爲沒了WHERE,仔細想一想,不就是刪除所有行嗎?!包括安全權限問題,有就可以用沒有是用不了刪除的。

走個例子:

DELETE FROM Customers  WHERE cust_id = '1000000006';

 可以看到,確實刪除了找到的一行記錄。

這裏引入一個外鍵,簡單聯結兩個表只需要這兩個標準公用字段,也可以讓DBMS使用外鍵來實施關係(引用完整性)。

例如這段,我直接引用了書上原文:

例如要向Products表中插入一個新產品,DBMS不允許通過未知的供應商id插入它,因爲vend_id列是作爲外鍵連接到Vendors表的。那麼,這與DELETE有什麼關係呢?使用外鍵確保引用完整性的一個好處是,DBMS通常可以防止刪除某個關係需要用到的行。例如,要從Products表中刪除一個產品,而這個產品用在OrderItems的已有訂單中,那麼DELETE語句將拋出錯誤並中止。這是總要定義外鍵的另一個理由。

爲了保證SQL代碼的可移植性,最好把後面的FROM帶上,不要輕易省略。

DELETE不需要列名或者通配符,刪除整行而不是列,如果刪除列的話,還是用UPDATE語句吧。

刪除的是表的內容,可以刪所有行,但是不刪表本身

如果覺得不夠快,可以使用TRUNCATE TABLE語句刪除,因爲不記錄數據的變動,也刪除所有行。

16.3 更新和刪除的指導原則

帶WHERE就是後接約束條件,不帶就是操作針對所有行。

那麼我們在使用這兩種操作時,必須要遵循以下幾點:

□ 除非確實打算更新和刪除每一行,否則絕對不要使用不帶WHERE子句的UPDATE或DELETE語句。

□ 保證每個表都有主鍵,儘可能像WHERE子句那樣使用它(可以指定各主鍵、多個值或值的範圍)。

□ 在UPDATE/DELETE語句使用WHERE子句前,先用SELECT測試,保證過濾的是正確記錄,以防編寫的WHERE子句不正確。

□ 使用強制實施引用完整性的數據庫,這樣DBMS將不允許刪除其數據與其他表相關聯的行。

□ 有的DBMS允許數據庫管理員施加約束,防止執行不帶WHERE子句的UPDATE或DELETE語句。如果所採用的DBMS支持這個特性,應該使用它。若是SQL沒有撤銷(undo)按鈕,應該非常小心地使用UPDATE和DELETE,否則你會發現自己更新或刪除了錯誤的數據。

這部分就學習完了,本來是要在3號完成的,一天的時光過於短暫,又過的飛快。在我睜眼閉眼間,天已經轉換到第二天。既然這樣,就不堅持完成兩部分的學習,跟完這一課,明天繼續。

還是那句鼓勵自己的老話!

刻意練習,每日精進。加油~小夥伴們!還有偶有沮喪,一直治癒!

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章