十六、更新和刪除數據
1.更新數據
兩種方式:更新表中的特定行,更新表中的所有行
update語句
三部分:要更新的表,列名和它們的新值,確定要更新哪些行的過濾條件
UPDATE Customers
SET cust_contact = 'Sam Roberts',
cust_email = '[email protected]'
WHERE cust_id = '10086';
要刪除某列的值,可設置其爲NULL。
2.刪除數據
兩種方式:從表中刪除特定的行;從表中刪除所有行
DELETE語句
兩部分:要刪除數據的表名,要過濾的行名
DELETE FROM Customers
WHERE cust_id = '10086';
不要遺忘where子句,否則會刪除表中所有數據
使用TRUNCATE TABLE語句,可以快速刪除所有行
3.更新和刪除的指導原則
保證每個表都有主鍵,儘可能像使用where子句那樣使用它。
在update或delete語句使用where子句之前,應先用select進行測試,保證它過濾的是正確的記錄。
使用強制實施引用完整性的數據庫,這樣DBMS將不允許刪除其數據與其他表相關的行。
十七、創建和操縱表
1.創建表
兩種方式:
使用交互式創建和管理數據庫表的工具;直接使用SQL語句操縱。
1.1表創建基礎
必要信息:新表名字;表列的名字和定義;指定表位置
CREATE TABLE Products
(
prod_id CHAR(10) NOT NULL,
prod_name CHAR(10) NOT NULL,
prod_price DECIMAL(8,2) NOT NULL,
prod_desc VARCHAR(1000) NULL
);
注:對於MySQL,varchar必須替換成text。
創建表語句不能覆蓋已存在的表。
1.2使用NULL值
在不指定NOT NULL時,多數DBMS認爲指定的是NULL。
允許NULL值的列不能作爲唯一標識。
空字符串''在NOT NULL列中是允許的。
1.3指定默認值
在列定義中用關鍵字DEFAULT指定。
默認值常用於日期或時間戳列。如MySQL中獲得系統日期的函數爲CURRENT_DATE()
2.更新表
必要信息:要更改的表名;要做哪些更改。
ALTER TABLE Vendors
ADD vend_phone CHAR(20);
注:更改無法撤銷,應該在進行改動前做完整的備份。
複雜表結構更改涉及步驟:
創建新表
使用INSERT SELECT從舊錶複製數據到新表
檢驗新表
重命名舊錶(或刪除)
用舊錶原名重命名新表
根據需要重新創建觸發器、存儲過程、索引和外鍵
3.刪除表
DROP TABLE CustCopy;
注:刪除表沒有確認,也不能撤銷。
十八、使用視圖
1.視圖
視圖是虛擬的表,包含的不是數據而是使用時動態檢索數據的查詢。視圖提供了一種封裝select語句的層次,可用來簡化數據處理,重新格式化或保護基礎數據。
1.1爲什麼使用視圖
視圖的常見應用:
重用SQL語句,簡化SQL操作;
使用表的一部分而不是整個表;
授予用戶訪問表的特定部分的權限,從而保護數據;
更改數據格式和表示。
1.2視圖的規則和限制
視圖必須唯一命名
視圖可以嵌套,即可以利用從其他視圖中檢索數據的數據的查詢來構造視圖,但這樣可能會嚴重降低查詢的性能,所以使用前需要全面測試。
視圖不能索引,也不能有關聯的觸發器或默認值。
有些DBMS要求對返回的所有列進行命名,如果列是計算字段,則需要使用別名。
2.創建視圖
2.1利用視圖簡化複雜的聯結
CREATE VIEW ProductCustomers AS
SELECT cust_name, cust_contact, prod_id
FROM Customers, Orders, OrderItems
WHERE Customers.cust_id = Orders.cust_id
AND OrderItems.order_num = Orders.order_num;
這樣就用視圖聯結了三張表,
如要檢索訂購了某產品的顧客,可用以下查詢
SELECT cust_name, cust_contact
FROM ProductCustomers
WHERE prod_id = 'RGAN01';
2.2用視圖重新格式化檢索出的數據
REATE VIEW VendorLocations AS
SELECT RTRIM(vend_name)+'('+RTRIM(vend_coutry)+')'
AS vend_title
FROM Vendors;
創建視圖完成後,就可以通過檢索數據創建新的郵件標籤
SELECT *
FROM VendorLocations;
輸出
vend_title
Bear Emporium(USA)
Fun Games(England)
Jouets et ours(France)
...
2.3用視圖過濾不想要的數據
創建視圖
CREATE VIEW CustomerEmailList AS
SELECT cust_id, cust_name, cust_email
FROM Customers
WHERE cust_email IS NOT NULL;
使用視圖
SELECT *
FROM CustomerEmailList;
2.4使用視圖與計算字段
CREATE VIEW OrderItemsExpanded AS
SELECT order_num,
prod_id,
quantity,
item_price,
quantity*item_price AS expanded_price
FROM OrderItems;
檢索訂單201809的詳細內容
SELECT *
FROM OrderItemsExpanded
WHERE order_num = 201809;
十九、使用存儲過程
1.存儲過程
存儲過程就是爲以後使用而保存的一條或多條SQL語句。可將其視爲批文件,事實上它們的作用不僅限於批處理。
2.爲什麼要使用存儲過程
簡化複雜的操作,提高工作性能;
保證數據的一致性、降低出錯可能性;
簡化對變動的管理,通過存儲過程限制對基礎數據的訪問,減少數據訛誤的機會;
提高代碼靈活性和可移植性。
3.執行存儲過程
EXECUTE接受存儲過程名和需要傳遞給它的任何參數。
EXECUTE AddNewProduct('JS011',
'Stuffed Eiffel Tower',
659);
三個參數匹配存儲過程中3個預期變量,不包括主鍵。
存儲過程:
驗證傳遞的數據,保證3個參數都有值
生成用作主鍵的唯一ID
將新產品插入Products表,在合適的列中存儲生成的主鍵和傳遞的數據。
4.創建存儲過程
聲明一個變量來保存存儲過程返回的任何值,然後執行存儲過程,載使用SELECT語句顯示返回的值。
CREATE PROCEDURE MilingListCount
AS
DECLARE @cnt INTEGER
SELECT @cnt = COUNT(*)
FROM Customers
WHERE NOT cust_email IS NULL;
RETURN @cnt;
注:SQLServer中所有局部變量名都以@起頭。
調用例子:
DECLARE @ReturnValue INT
EXECUTE @ReturnValue=MailingListCount;
SELECT @ReturnValue;
第20課、管理事務處理
1.事務處理
通過確保成批的SQL操作要麼完全執行,要麼完全不執行,來維護數據庫的完整性。
事務(transaction)指一組SQL語句;
回退(rollback)指撤銷指定SQL語句的過程;
提交(commit)指將未儲存的SQL語句結果寫入數據庫表;
保留點(savepoint)指事務處理中設置的臨時佔位符(placeholder),可以對它發佈回退。
2.控制事務處理
SQL Sever
BEGIN TRANSACTION
...
COMMIT TRANSACTION
MySQL
START TRANSACTION
...
2.1 使用ROLLBACK回退
可以回退INSERT、UPDATE、DELETE,不能回退CREATE、DROP。
2.2 使用COMMIT提交
保證整個事務操作完整可靠。
2.3 使用保留點
創建佔位符
SQL Sever
SAVE TRANSACTION delete1;
MySQL
SAVEPOINT delete1;
回退到保留點
SQL Sever
ROLLBACK TRANSACTION delete1;
MySQL
ROLLBACK TO delete1;
第21課、使用遊標
1.遊標
是一個存儲在DBMS服務器上的數據庫查詢,不是SELECT語句,而是被檢索出來的結果集。
作用:
能夠標記遊標爲只讀,使數據能讀取,但不能更新和刪除。
能控制可以執行的定向操作。
規定範圍,使遊標對創建它的特定/所有請求可訪問。
指示DBMS對檢索出的數據進行復制,使數據在遊標打開和訪問期間不變化。
2.使用遊標
先聲明,再使用,結束使用後關閉或釋放。
2.1創建遊標
創建一個遊標來檢索沒有電郵地址的所有顧客
DECLARE CustCursor CURSOR
FOR
SELECT * FROM Customers
WHERE cust_email IS NULL
2.2使用遊標
打開遊標,同時執行了查詢
OPEN CURSOR CustCursor
訪問遊標數據
FETCH指出要檢索哪些行,從何處檢索它們以及將它們放於何處(如變量名)。
2.3關閉遊標
CLOSE CustCursor
再次使用它時不需要再聲明,只需要OPEN它即可。
第22課、高級SQL特性
1.約束
關係數據庫存儲分解爲多個表的數據,每個表存儲相應的數據。利用鍵來建立從一個表到另一個表的引用。引用完整性(referential integrity)由此而來。
1.1主鍵
主鍵是一種特殊的約束,用來保證一列(或一組列)的值是唯一的,而且永不改動。
1.2外鍵
外鍵是表中的一列,其值必須在另一表的主鍵中。外鍵是保證引用完整性的極其重要部分。
1.3唯一約束
用來保證一列(或一組列)中的數據是唯一的。
與主鍵不同,唯一約束不能用來定義外鍵,表可以包含多個唯一約束,但每個表只允許一個主鍵。
1.4檢查約束
用來保證一列(或一組列)中的數據滿足一些指定條件。
2.索引
索引用來排序數據以加快搜索和排序操作的速度。
但降低了數據插入、修改和刪除的性能。所以需要經常更新的內容不適合作爲索引。
3.觸發器
觸發器是特殊的存儲過程,它在特定的數據庫活動發生時自動執行。
觸發器可以與特定表上的INSERT、UPDATE、DELETE操作相關聯。
4.數據庫安全
利用管理機制授予或限制對數據的訪問。