1.2 SQL Server 2000資料表管理表是包含資料庫中所有資料的資料庫物件,設計完資料庫後就可建立資料庫中將儲存資料的表。任何有相應許可權的使用者都可以對之進行操作,除非它已被刪除。表格儲存體在資料庫檔案中,每個表至多可定義102列。表和列的命名要遵守標識符的規定,在特定表中必須是惟一的,但同一資料庫中的不同表可使用相同的列名。必須為每列指定資料類型。本節我們將以Student資料庫作為執行個體,對其資料表進行管理。
1.2.1 建立資料表SQL Server 2000提供了3種方法建立資料庫表:一種方法是使用資料表設計工具建立表;另一種方法是使用資料庫圖表建立表;最後一種是使用Transact-SQL語句中的CREATE命令建立表。(1) 使用資料表設計工具建立表 在SQL Server企業管理器中,展開指定的伺服器和資料庫,開啟Student資料庫,用按右鍵表對象,從彈出的捷徑功能表中選擇“建立表”命令,就會出現“資料表設計工具”對話方塊,4-7所示。 圖4-7 資料表設計工具在對話方塊中,可以定義列的以下屬性:列名稱、資料類型、長度、精度、小數位元、是否允許為空白、預設值、識別欄位、識別欄位的初始值、識別欄位的增量值和是否有行的標識。 然後根據提示進行設定。輸入完成後,單擊“儲存”按鈕 ,將彈出“選擇名稱”對話方塊,4-8所示。輸入StudentsInfo,單擊“確定”按鈕。圖4-8 輸入表名(2) 使用資料庫圖表建立表在SQL Server企業管理器中,展開指定的伺服器和資料庫,開啟Student資料庫,用按右鍵關係圖對象,從彈出的捷徑功能表中單擊“建立資料庫圖表”命令,就會出現“建立資料庫圖表嚮導”對話方塊,4-9所示。在該對話方塊中,單擊“下一步”按鈕,開啟“選擇要添加的表”對話方塊。在“選擇要添加的表”對話方塊中,左側的列表裡列出了Student資料庫中的所有表,其中也包括系統建立的表。選中表StudentsInfo,單擊“添加”按鈕,將它添加到右側的列表中,4-10所示。 圖4-9 建立資料庫圖表嚮導 圖4-10 選擇要添加的表單擊“下一步”按鈕,開啟“完成資料庫圖表嚮導”對話方塊,表StudentsInfo出現在列表中,單擊“完成”按鈕,開啟“新關係圖”對話方塊。我們可以看到,表StudentsInfo出現在關係圖中。接下來,我們在關係圖中建立表Department。在資料庫圖表的空白處單擊滑鼠右鍵,選擇“建立表”命令。在出現的“輸入表名”對話方塊中輸入要建立的表名Department,單擊“確定”按鈕。然後,在出現的表編輯對話方塊中,輸入各列資訊,4-11所示。圖4-11 在資料庫圖表中建立表Department編輯完畢後,單擊對話方塊中“儲存”按鈕 ,並在彈出的“另存新檔”對話方塊中輸入關係圖的名稱Stu_Diagram,4-12所示。單擊“確定”按鈕,會出現“儲存”對話方塊,4-13所示,提示使用者是否將表Department儲存到Student資料庫中。單擊“是”按鈕,完成儲存。 圖4-12 儲存新關係圖Stu_Diagram 圖4-13 詢問儲存到此,表Department被成功儲存到資料庫中,關係圖Stu_Diagram也會出現在資料庫圖表的列表中。以後,可以開啟關係圖Stu_Diagram,對其中的表進行編輯。(3) 使用Transact-SQL語句中的CREATE TABLE命令建立表 其文法形式如下:CREATE TABLE [
database_name.[
owner ] .|
owner.]
table_name ( { <
column_definition >|
column_name AS
computed_column_expression|< table_constraint >} [,…n])[ ON {
filegroup | DEFAULT } ] [ TEXTIMAGE_ON{
filegroup | DEFAULT } ]其中各參數說明如下。●
database_name:是要在其中建立表的資料庫名稱。●
owner:是新表所有者的使用者ID名,
owner必須是
database_name所指定的資料庫中的現有使用者ID,
owner預設為與
database_name所指定的資料庫中的當前串連相關聯的使用者ID。●
table_name:是新表的名稱。表名必須符合標識符規則。資料庫中的
owne r.table_name 組合必須惟一。
table_name最多可包含128個字元,但本地暫存資料表的表名(名稱前有一個編號符 #)最多隻能包含116個字元。●
column_name:是表中的列名。列名必須符合標識符規則,並且在表內惟一。●
computed_column_expression:是定義計算資料行值的運算式。運算式可以是非計算資料行的列名、常量、函數、變數,也可以是用一個或多個運算子串連的上述元素的任意組合。運算式不能為子查詢。● ON {
filegroup | DEFAULT}:用於指定儲存表的檔案組名。● TEXTIMAGE_ON:用於指定text、ntext 和 image列的資料存放區的檔案組。●
data_type:用於指定列的資料類型。● DEFAULT:用於指定列的預設值。例如,在已經存在的資料庫Student中建立一個學生表StudentsInfo表,文法如下:CREATE TABLE StudentsInfo(Stu_Id Int not null,Sname varchar(20) not null,Sgender char(2) ,Sage int,Sdept varchar(20) not null)
1.2.2 插入和修改表中的資料建立完一個表結構之後,最重要的工作就是向表中插入資料,這也是最基本的操作。假設要向表StudentsInfo中插入學生記錄,可以在企業管理器中按右鍵表StudentsInfo,指向“開啟表”,然後選擇“返回所有行”命令,開啟“查詢表內容”對話方塊。使用者可以在對話方塊中添加和修改表中的資料。每插入新的一行,在表格下方就會新增一個空白行,用於添加新的內容。如果輸入的資料格式或長度不符合要求,系統會提示出錯資訊。圖4-14是我們插入資料後的對話方塊顯示。圖4-14 向表StudentsInfo插入學生記錄同樣可以使用Transact-SQL語句中的INSERT命令向表中插入記錄,其文法如下:INSERT [INTO] {
table_name WITH ( < table_hint_limited> [ …n ] )|
view_name |
rowset_function_limited } { [(
column_list)]{ VALUES({ DEFAULT | NULL |
expression} [ ,…n ] ) |
derived_table |
execute_statement } }其中各參數說明如下。● [INTO]:一個可選的關鍵字,可以將它用在INSERT和目標表之間。●
table_name:將要接收資料的表或table變數的名稱。 ● WITH (<table_hint_limited> [...
n]):指定目標表所允許的一個或多個表提示。需要有 WITH 關鍵字和圓括弧。●
view_name:視圖的名稱及可選的別名。通過
view_name來引用的視圖必須是可更新的。由INSERT語句所做的修改不能影響視圖的FROM子句中引用的多個基表。●
rowset_function_limited:是OPENQUERY或OPENROWSET函數。 ● (
column_list):要在其中插入資料的一列或多列的列表。必須用圓括弧將
column_list 括起來,並且用逗號進行分隔。 ● VALUES:引入要插入的資料值的列表。對於
column_list (如果已指定)中或者表中的每個列,都必須有一個資料值。必須用圓括弧將值列表括起來。如果VALUES列表中的值與表中列的順序不相同,或者未包含表中所有列的值,那麼必須使用
column_list 明確地指定儲存每個傳入值的列。● DEFAULT:強制 SQL Server 裝載為列定義的預設值。●
Expression:一個常量、變數或運算式。運算式不能包含SELECT或EXECUTE語句。●
derived_table:從資料庫中檢索行的子查詢,
derived_table用作對外部查詢的輸入。●
execute_statement:任何有效EXECUTE語句,它使用SELECT或READTEXT語句返回資料。例如,在Student表中插入資料文法如下:INSERT INTO Student(Stu_Id, Sname, Sgender, Sage ,Sdpt)VALUES(994101, '張濤', '男', 21, '電腦系')如果使用者需要修改資料,可以在查詢表內容的對話方塊(4-14所示)中找到目標行,將其要修改的資料刪除,然後輸入新資料即可。這種方法適用於記錄較少的表,可以很方便地找到要修改的行,但如果表中含有大量記錄,就會消耗很長時間。我們可以使用Transact-SQL語句中的UPDATE命令修改表中資料,其文法如下:UPDATE {
table_name WITH ( < table_hint_limited > [ …n ] )}SET{
column_name ={
expression | DEFAULT | NULL} WHERE <
search_condition>其中各參數說明如下。●
table_name:需要更新的表的名稱。如果該表不在當前伺服器或資料庫中,或不為目前使用者所有,這個名稱可用連結的伺服器、資料庫和所有者名稱來限定。● WITH
( < table_hint_limited > [ ...n ]
):指定目標表所允許的一個或多個表提示。需要有WITH關鍵字和圓括弧。● SET:指定要更新的列或變數名稱的列表。●
column_name:含有要更改資料的列的名稱。
column_name必須駐留於UPDATE子句中所指定的表或視圖中。識別欄位不能進行更新。●
expression:變數、字面值、運算式或加上括弧的返回單個值的subSELECT語句。
expression返回的值將替換
column_name中的現有值。● DEFAULT:指定使用對列定義的預設值替換列中的現有值。如果該列沒有預設值並且定義為允許空值,這也可用來將列更改為NULL。例如,在Student表中把學生編號Stu_Id為994103的年齡改為20歲,文法如下:UPDATE Student SET Sage=20WHERE Stu_Id=994103
1.2.3 查詢表中的資料在SQL Server資料庫的實際應用中,如何從表中的大量資料中準確地查詢到有效資訊,是一個很關鍵的問題。本段我們就來介紹資料的查詢。在SQL Server企業管理器中,展開指定的伺服器和資料庫,開啟Student資料庫,用按右鍵表對象,指向“開啟表”,然後選擇“查詢”命令,開啟“查詢設計工具”對話方塊,4-15所示。
圖4-15 查詢設計工具可以看到,查詢設計工具分為4個窗格:關係圖窗格、網格窗格、SQL窗格和結果窗格。關係圖窗格顯示正在查詢的表和其他表結構化對象。每個矩形代表一個表或表結構化對象,並顯示可用的資料列以及表示每列如何用於查詢的表徵圖。矩形之間的連線表示聯結。網格窗格包含一個類似試算表的網格,使用者可以在其中指定選項,比如要顯示哪些資料列、要選擇什麼行、如何對各行進行分組,等等。SQL窗格顯示用於查詢或視圖的SQL語句。可以對設計器所建立的SQL語句進行編輯,也可以輸入自己的SQL語句。對於不能用關係圖窗格和網格窗格建立的SQL語句(如聯集查詢等),輸入SQL語句尤其有益。結果窗格顯示最近執行的選取查詢的結果。可以通過編輯該網格單元中的值對資料庫進行修改,而且可以添加或刪除行。讀者可以在任意窗格內進行操作以建立查詢或視圖:可以通過在關係圖窗格中選擇某列並將該列輸入到網格窗格中,或者使其成為SQ窗格中SQL語句的一部分等方法,指定要顯示的列。關係圖窗格、網格窗格和SQL窗格都是同步的——當在某一窗格中變更時,其他窗格自動反映所做的更改。使用查詢設計工具進行表查詢,可以分為以下5個過程。(1) 添加表在關係圖窗格中右擊背景,然後從捷徑功能表中選擇“添加表”命令。在“添加表”對話方塊中,選擇要添加到查詢中的物件類型的選項卡。在項目列表中,雙擊要添加的每一項。完成添加項目後,單擊“關閉”按鈕。 查詢設計工具將相應地更新關係圖窗格、網格窗格和SQL窗格。(2) 添加列若要在查詢中使用某列,必須將該列添加到查詢中。添加某列的原因可能有:在查詢輸出中顯示該列、用該列進行排序、搜尋該列的內容或匯總其內容。添加列的方式有以下選擇:● 添加個別的列在關係圖窗格中,選擇要添加的資料列旁邊的複選框。或者在網格窗格中移動到要添加列的第一個空白網格行,單擊Column列中的欄位,然後從列表中選擇列名。應注意的是,若要在網格窗格中的特定位置添加資料行,請選擇要添加新列的網格行並按INS鍵,在該行上面將添加一個新列。 ● 添加一個表或表結構化對象中的所有列在關係圖窗格中,選擇“(所有列)”旁邊的複選框。或者在SQL窗格的SQL語句中指定對象名.*,並用表或表結構化對象的名稱代替對象名。● 添加所有表和表結構化對象中的所有列確保沒有選定關係圖窗格中的聯結線。在查詢對話方塊中右擊,並從捷徑功能表中選擇“屬性”命令。然後在彈出的對話方塊中選擇“查詢”選項卡,選擇“輸出所有列”。或者,在SQL窗格的SQL語句輸出資料行表中指定*。例如,要在結構集中顯示表StudentsInfo中學生的姓名、性別、年齡,則可以在關係圖窗格中選中Sname、Sgender、Sage列旁邊的複選框,可以看到,查詢設計工具將相應地更新關係圖窗格、網格窗格和SQL窗格中的內容。(3) 設定查詢條件設定查詢條件的操作較為簡單。在網格窗格中,找到要設為查詢條件的行,然後在該行所對應的“準則”列中輸入查詢條件。例如,要在結果集中顯示數學系學生的姓名、性別、年齡,首先添加相應的列,然後從網格窗格中,找到行Sdpt,並在其對應的“準則”列中輸入“=數學系”。注意,最後將Sdpt所在行中的輸出標記去掉,因為結果集中不需要顯示系別資訊。(4) 重新排列輸出資料行在網格窗格中,單擊行左邊的資料列選取器按鈕 以選擇包含列的行,然後將行拖到新的位置。或者,直接在SQL窗格中編輯列名的順序。 例如,要讓學生的年齡資訊在性別之前顯示,我們可以單擊Sgender行的資料列選取器按鈕 ,然後將其拖到Sage的下方。如果需要顯示的資料按照指定列的升序或降序排列。可以使用以下設定方法。● 在關係圖窗格中設定:選中要排序的資料列(例如,按學生編號Stu_Id排序),單擊滑鼠右鍵,在彈出的捷徑功能表中選擇“升序排列”或“降序排列”命令。● 在網格窗格中設定:如果要排序的資料列不在網格的列中,則在空白行中添加此列,然後在其對應的“排序類型”列中選擇“升序”或“降序”命令,最後再將該行的輸出標記去掉。● 在SQL窗格中設定:在SQL語句中添加ORDER BY子句,例如,按學生編號Stu_Id升序排序,則添加 ORDER BY Stu_Id ASC在這裡,因為ORDER BY 預設升序排序,所以ASC可以不必填寫。但如果需要降序排序,只需填寫DESC。(5) 執行查詢當完成查詢設計後,可以執行查詢。在查詢對話方塊中的任意位置右擊,從捷徑功能表中選擇“運行”命令,或單擊工具列中的“運行”表徵圖 。查詢結果將出現在結果窗格中,4-16所示。 圖4-16 在查詢設計工具中查詢學生資訊的結果從資料庫表中查詢資料行或列,也可以使用Transact-SQL語句中的SELECT命令,它的基本文法格式如下。SELECT select_list [ INTO new_table ]FROM table_Source[ WHERE search_condition ][ GROUP BY group_by_expression ][ HAVING search_condition ][ ORDER BY order_expression [ ASC | DESC ] ]其中各參數說明如下。● select_list:挑選清單,它指出查詢結果集中的列數和屬性。● INTO:用查詢結果集合構造一個新表。● new_table:表示INTO語句構造的新表的表名。● FROM:指出所查詢的表名以及各表之間的邏輯關係。● table_source:指出用於SELECT語句的表、視圖、派生表和聯結表。● WHERE:指出查詢條件,它說明將表中哪些資料行返回到結果集合中。● search_condition:通過使用謂詞限制結果集內返回的行。● GROUP BY:指出查詢結果集合中各行的排列順序。● group_by_expression:指出進行分組所依據的運算式。● HAVING:通常和GROUP BY一起使用,指出組或集合的搜尋條件。● search_condition:指定組或彙總應滿足的搜尋條件。● ORDER BY:指定查詢條件集合中各行的排列順序。例如,在上面我們要在StudentsInfo表中查詢數學系學生的姓名、年齡、性別,並按學生編號進行升序排序,其文法為:SELECT Sname, Sage, SgenderFROM StudentsInfoWHERE(Sdpt=N’數學系’)ORDER BY Stu_Id1.2.4 刪除資料表有時需要刪除表(如,當要實現新的設計或釋放資料庫的空間時)。刪除表時,表的結構定義、資料、全文索引、約束和索引都永久地從資料庫中刪除,原來存放表及其索引的儲存空間可用來存放其他表。(1) 使用企業管理器刪除表在SQL Server企業管理器中,展開指定的伺服器和資料庫,開啟資料庫Student,用按右鍵表對象,從彈出的捷徑功能表中單擊“刪除”命令,則會出現“除去對象”對話方塊。單擊“全部刪除”按鈕,即可刪除表。 (2) 使用DROP TABLE語句刪除表DROP TABLE語句可以刪除一個表和表中的資料及其與表有關的所有索引、觸發器、約束、許可對象。DROP TABLE語句的文法形式如下:DROP TABLE { table_name } [ ,…n]其中,table_name用於指定要刪除的資料表名稱。例如,刪除StudentsInfo表的文法如下:DROP TABLE StudentsInfo也可以使用該命令同時刪除多個表,只需在要刪除的表名稱之間用逗號隔開即可。