SQL必知必會筆記(下)

十六、更新和刪除數據

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.數據庫安全

利用管理機制授予或限制對數據的訪問。

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