SQL基礎 理解高階SQL特性

2021-10-01 14:10:47 字數 4887 閱讀 6652

在本節課中,介紹幾種sql中的高階資料操作特性:約束、索引和觸發器

關聯式資料庫將資料儲存為多個表,每個表儲存相關資料。鍵用於建立從乙個表到另乙個表的引用(因此稱為引用完整性)。

要使關聯式資料庫設計正常工作,需要確保只有有效的資料被插入到表中。

儘管可以在插入新行之前執行檢查(在另乙個表上執行select以確保值是有效的和存在的),但出於以下原因,最好避免這種做法:

約束:資料庫輸入如何被插入或修改的規則。

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

主鍵是一種特殊的約束,用於確保列(或一組列)中的值是惟一的且永不更改,換句話說,表中的乙個列(或多個列)的值惟一地標識表中的每一行。這有助於直接操作各個行並與之互動。如果沒有主鍵,就很難安全地使用更新或刪除特定的行而不影響其他行。

表中的任何列都可以作為主鍵,只要它滿足以下條件:

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就成為了主鍵。

alter

table vendors

addconstraint

primary

key(vend_id)

;

在這裡,相同的列被定義為主鍵,但是使用了constraint語法。此語法可用於create table和alter table語句。

外來鍵是表中的列,其值必須在另乙個表的主鍵中列出。外來鍵是確保引用完整性的乙個極其重要的部分。為了理解外來鍵,我們來看乙個示例。

orders表包含系統中輸入的每個訂單的單行。客戶資訊儲存在客戶表中。訂單中的訂單通過customer id繫結到customers表中的特定行。customer id是customers表中的主鍵;每個customer都有唯一的id,訂單號是orders表中的主鍵;每個訂單都有唯一的編號。

orders表中的customer id列中的值不一定是惟一的。如果乙個客戶有多個訂單,那麼就會有多個具有相同客戶id的行(儘管每個訂單號不同)。同時,在客戶id列中唯一有效的值是客戶表中客戶的id。

這就是外來鍵的作用。在我們的示例中,在訂單中的客戶id列上定義了乙個外來鍵,因此該列只能接受客戶表主鍵中的值。

create

table orders

( order_num integer

notnull

primary

key,

order_date datetime

notnull

, cust_id char(10

)not

null

references

customers(cust_id)

);

裡,表定義使用references關鍵字來宣告cust_id中的任何值都必須位於customers表中的cust_id中。在alter table語句中使用constraint語法也可以完成相同的工作:

alter

table orders

addconstraint

foreign

key(cust_id)

references customers (cust_id)

外來鍵可以幫助防止意外刪除。定義了外來鍵之後,dbms不允許刪除其他表中具有相關行的行。例如,不允許刪除具有關聯訂單的客戶。刪除該客戶的唯一方法是首先刪除相關訂單(這意味著刪除相關訂單項)。因為外來鍵需要這樣有條理的刪除,所以可以幫助防止意外刪除資料。

然而,一些dbms支援乙個稱為級聯刪除的特性。如果啟用,當從表中刪除一行時,此功能將刪除所有相關資料。例如,如果啟用了級聯刪除,並且從客戶表中刪除了客戶,則會自動刪除任何相關的訂單行。

惟一約束用於確保乙個列(或一組列)中的所有資料都是惟一的。它們與主鍵相似,但有一些重要的區別:

惟一約束的語法類似於其他約束的語法。要麼unique關鍵字在表定義中定義,要麼使用constraint定義。

檢查約束用於確保列(或一組列)中的資料滿足您指定的一組條件。

create

table orderitems

( order_num integer

notnull

, order_item integer

notnull

, prod_id char(10

)not

null

, quantity integer

notnull

check

(quantity >0)

, item_price money not

null

);

有了這個約束,插入(或更新)的任何行都將被檢查,以確保數量大於0。

要檢查名為gender的列是否只包含m或f,可以在alter table語句中執行以下操作:

add

constraint

check

(gender like

'[mf]'

)

有些dbms允許您定義自己的資料型別。這些本質上是簡單的資料型別,定義了檢查約束(或其他約束)。例如,您可以定義自己的資料型別,稱為gender,它是乙個單字元文字資料型別,帶有乙個檢查約束,將其值限制為m或f(也可能為null)。然後可以在表定義中使用這種資料型別。自定義資料型別的優點是約束只需要應用一次(在資料型別定義中),並且每次使用資料型別時都會自動應用約束。檢查你的dbm

索引用於對資料進行邏輯排序,以提高搜尋和排序操作的速度。

假設您希望查詢本書**現的所有單詞datatype。最簡單的方法是翻到第1頁,掃瞄每一頁的每一行,尋找匹配的內容。雖然這是可行的,但顯然不是乙個可行的解決方案。掃瞄幾頁文字可能是可行的,但以這種方式掃瞄整本書就不可行了。隨著要搜尋的文字數量的增加,查明所需資料所需的時間也會增加。

這就是書籍有索引的原因。索引是乙個按字母順序排列的單詞列表,其中的單詞在書中有相應的位置。要搜尋資料型別,可以在索引中找到該單詞,以確定它出現在什麼頁面上。然後,你翻到那些特定的頁面去尋找你的匹配項。

什麼使索引起作用?簡單地說,它的排序是正確的。在一本書中找到單詞的困難不在於必須搜尋的內容的數量;更確切地說,是內容沒有按單詞排序。如果內容像字典一樣排序,就不需要索引(這就是字典沒有索引的原因)。

資料庫索引的工作方式大致相同。主鍵資料總是排序的;這就是dbms為你做的事情。因此,通過主鍵檢索特定的行始終是一種快速而有效的操作。

但是,在其他列中搜尋值通常效率不高。例如,如果您想檢索居住在某個國家下的所有客戶,該怎麼辦?由於表不是按狀態排序的,dbms必須讀取表中的每一行(從第一行開始)查詢匹配項,就像在不使用索引的情況下在書中查詢單詞一樣。

解決方案是使用索引。您可以在乙個或多個列上定義乙個索引,以便dbms保留乙個排序的內容列表供自己使用。在定義了索引之後,dbms使用索引的方式與使用圖書索引的方式非常相似。它搜尋已排序的索引以查詢任何匹配項的位置,然後檢索那些特定的行。

但是在匆忙建立幾十個索引之前,請記住以下幾點:

對於應該索引什麼以及什麼時候索引,沒有硬性規定。大多數dbms提供可以用來確定索引有效性的實用程式,您應該經常使用它們。

索引是用create index語句建立的(不同dbms之間的差異很大)。

create

index prod_name_ind on products (prod_name)

;

每個索引必須唯一命名。在這裡,名稱prod_name_ind是在關鍵字create index之後定義的。on用於指定被索引的表,索引中包含的列(本例中只有乙個列)在表名後面的括號中指定。

索引有效性隨著表資料的新增或更改而變化。許多資料庫管理員發現,經過幾個月的資料操作之後,曾經理想的索引集可能不再那麼理想了。定期重新訪問索引並根據需要對它們進行調優始終是乙個好主意。

觸發器是在特定資料庫活動發生時自動執行的特殊儲存過程。觸發器可能與插入、更新和刪除特定表上的操作(或其任何組合)關聯。

與儲存過程(僅儲存sql語句)不同,觸發器繫結到單個表。只有在將行插入orders表時,才會執行與orders表上的插入操作相關的觸發器。類似地,只有在客戶表上執行插入和更新操作時,才會執行這些特定操作。

在觸發器中,您的**可以訪問以下內容:

根據使用的dbms,可以在執行指定操作之前或之後執行觸發器。

以下是觸發器的一些常見用法:

對於乙個組織來說,沒有什麼比它的資料更有價值的了,而且資料應該始終受到保護,以免被小偷或偶然的瀏覽器竊取。當然,同時需要訪問資料的使用者必須能夠訪問資料,因此大多數dbms為管理員提供了授予或限制訪問資料的機制。

任何安全系統的基礎都是使用者授權和身份驗證。這是驗證使用者的過程,以確保他是他所說的那個人,並允許他執行他試圖執行的操作。有些dbms為此與作業系統安全性整合,有些則維護自己的使用者和密碼列表,還有一些與外部目錄服務伺服器整合。

一些操作通常是安全的

摘錄自書籍《sams teach yourself sql in 10 minutes, fourth edition》

SQL高階特性

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

22 高階SQL特性

1.約束為正確地進行關聯式資料庫設計,需要一種方法來保證只在表中插入合法的資料。例如,如果 orders 表儲存訂單資訊,orderitems 表儲存訂單詳細內容,應該保證 orderitems 中引用的任何訂單 id存在於 orders 中。類似地,在 orders 表中引用的任意使用者必須存在於...

SQL 基礎 高階高階

sql高階 1 top子句 top 子句用於規定要返回的記錄的數目。select top 2 from persons select top 50 percent from persons 3 萬用字元 1 通過使用 not 關鍵字,我們可以從 persons 表中選取居住在不包含 lon 的城市裡...