22 高階SQL特性

2022-09-02 09:54:06 字數 4769 閱讀 8890

1.

約束為正確地進行關聯式資料庫設計,需要一種方法來保證只在表中插入合法的資料。例如,如果

orders

表儲存訂單資訊,

orderitems

表儲存訂單詳細內容,應該保證

orderitems

中引用的任何訂單

id存在於

orders

中。類似地,在

orders

表中引用的任意使用者必須存在於

customers

表中。最好不要在插入新行時進行檢查,原因如下:

約束(constraint

):管理如何插入或處理資料庫資料的規則。

dbms

通過在資料庫表上施加約束來實施引用完整性。大多數約束是在表定義中定義的。

(1)主鍵

主鍵是一種特殊的約束,它用來保證乙個列(或一組列)中的值是唯一的,並且永不改動。換句話說,表中的乙個列(或多個列)的值唯一標識表中的行。

表中任意列只要滿足以下條件,都可以用於主鍵:

定義主鍵的一種方法是建立它,輸入:

create table vendors

( vend_id char(10) not null primary key,

vend_name char(50) not null,

vend_address char(50) null,

vend_city char(50) null,

vend_state char(5) null,

vend_zip char(10) null,

vend_country char(50) null

); 給

vend_id

列定義新增關鍵字

primary key

,使其成為主鍵。

輸入:alter table vendors

add constraint primary key(vend_id);

這裡使用

constraint

語法將vend_id

列設為主鍵。

(2)外來鍵

外來鍵是表中的乙個列,其值必須在另乙個表的主鍵中列出。外來鍵是保證引用完整性的乙個極重要的成分。

例如:orders

表對每個錄入到系統的訂單包含一行。

顧客資訊儲存在

customers

表中。

orders

表中的訂單通過客戶id與

customers

表中特定行相關聯。

客戶id為

customers

表的主鍵;每個客戶都有唯一的

id。

訂單號為

orders

表的主鍵;每個訂單都有唯一的訂單號。

orders

表中顧客

id列的值不一定是唯一的,若某個顧客有多個定

damn

,則有多個行具有相同的顧客

id。

同時,

orders

表中顧客

id列的合法值為

customers

表中顧客的

id。

上例中,在

orders

的顧客id

列上定義了乙個外來鍵,因此該列只能接受

customers

表的主鍵值。

定義外來鍵的的一種方法,輸入:

create table orders

( order_num integer not null primary key,

order_date datetime not null,

cust_id char(10) not null references customers(cust_id)

); 也可以在

alter table

語句中使用

constraint

語法來完成,輸入:

alter table customers

add constraint

foreign key (cust_id) references customers (cust_id);

外來鍵有助防止意外刪除:

幫助保證引用完整性外;

‚在定義外來鍵後,

dbms

不允許刪除在另乙個表中具有關聯行的行。

(3)唯一約束

唯一約束用來保證乙個列中的資料唯一。

類似於主鍵,但存在幾個重要區別:

唯一約束的語法類似於其他約束的語法。唯一約束既可以用

unique

關鍵字在表定義中定義,也可以用單獨的

constraint

定義。(4)

檢查約束

檢查約束用來保證乙個列中的資料滿足一組指定的條件。

常見用途:

檢查最小或最大值。

‚指定範圍。

ƒ只允許特定的值。

下面對orderitems

表施加了檢查約束,保證所有物品數量大於0。

輸入:create table orderitems

( order_num integer not null,

order_item integer not null,

prod_id char(10) not null,

quantity integer not null check(quantity > 0),

item_price money not null

); 檢查名為

gender

的列只包含m或

f,使用

altet table

語句,輸入:

add constraint check (gender like '[mf]');

2.索引

索引用來排序資料以加快搜尋和排序操作的速度。

可以在乙個或多個列上定義索引,使

dbms

儲存其內容的乙個排過序的列表。定義索引後,

dbms

搜尋排過序的索引,找出匹配的位置,然後檢索這些行。

在開始建立索引前,應該記住以上內容:

(1)索引改善檢索操作的效能,但降低資料插入、修改和刪除的效能。在執行這些操作時,

dbms

必須動態地更新索引。

(2)索引資料可能要占用大量的儲存空間。

(3)並非所有資料都適合於索引。

(4)索引用於資料過濾和資料排序。

(5)可以在索引中定義多個列。

索引用create index

語句建立。

下面在products

表的產品名列上建立乙個簡單索引,輸入:

create index prod_name_ind

on products(prod_name);

索引必須唯一命名。這裡的索引名在關鍵字

create index

之後定義。

on用來指定被索引的表,而索引中包含的列在表名後的圓括號中給出。

檢查索引:索引的效率隨錶資料的增加或改變而變化。

3.觸發器

觸發器是特殊的儲存過程,它在特定的資料庫活動發生時自動執行。觸發器可以與特定表上的

insert

、update

和delete

操作相關聯。

與儲存過程不一樣,觸發器與單個的表相關聯。與

orders

表上的insert

操作相關聯的觸發器只在

orders

表中插入行時執行。類似地,

customers

表上的insert

和update

操作的觸發器只在表上出現這些操作時執行。

觸發器內的**具有以下資料的訪問權:

觸發器的一些常見用途:

建立乙個觸發器,它對所有

insert

和update

操作,轉換

customers

表中的cust_state

列為大寫。

sql server

版本,輸入:

create trigger customer_state

on customers

for insert, update

as update customers

set cust_state = upper(cust_state)

where customers.cust_id = inserted.cust_id;

一般來說,約束的處理比觸發器快,因此在可能的時候,應該盡量使用約束。

4.資料庫安全

大多數的

dbms

都給管理員提供了管理機制,可利用管理機制授予或限制對資料的訪問。

任何安全系統的基礎都是使用者授權和身份確認。這是一種處理,通過這種處理對使用者進行確認,以保證其為有權使用者,允許執行其試圖執行的操作。有的

dbms

為此目的結合使用了作業系統的安全措施,而有的維護自己的使用者及密碼列表,還有一些結合使用外部目錄服務伺服器。

需要保護的操作:

安全性通過

sql的

grant

和revoke

語句來管理,不過,大多數

dbms

提供了互動式的管理使用程式,這些使用程式在內部使用

grant

和revoke

語句。

SQL必知必會 22 高階SQL特性

主鍵是一種特殊的約束,用來保證一列 或一列組 中的值是唯一的,而且永不改動。表中任意列只要滿足以下條件,都可以用於主鍵 外來鍵是表中的一列,其值必須列在另一表的主鍵中。唯一約束用來保證一列 或一組列 中的資料是唯一的,他們類似於主鍵,存在以下重要區別 檢查約束用來保證一列 或一列組 中的資料滿足一組...

SQL高階特性

1 約束 constraint 約束是表示管理如何插入或處理資料庫資料的規則。dbms通過在資料庫上施加約束來實施引用完整性。有的約束是在建立表的時候定義的,有的約束可以在建立表之後再定義。下面列舉一些常見的約束 在建立表的時候定義主鍵 create table table name 在表建立後定義...

SQL基礎 理解高階SQL特性

在本節課中,介紹幾種sql中的高階資料操作特性 約束 索引和觸發器 關聯式資料庫將資料儲存為多個表,每個表儲存相關資料。鍵用於建立從乙個表到另乙個表的引用 因此稱為引用完整性 要使關聯式資料庫設計正常工作,需要確保只有有效的資料被插入到表中。儘管可以在插入新行之前執行檢查 在另乙個表上執行selec...