SQL語言學習完全版(詳細與精闢)

--  SQL語言學習完全版(詳細與精闢)

組成數據庫的對像!
A:表(table)具體組織和存儲數據的對像,由列和行組成.
1:行和列順序可以是任意的.在同一個表中列名必須是唯一的.
2:在同一個數據庫裏面表名也必須要是唯一.

B:主鍵(primary key)
1:表中一列或多列的組合,其值唯一確定表的一行.
2:主鍵不能重複
3:作爲主鍵各列都不能爲空.

C:外鍵(foreign key)
表中一列或多列的組合,它本身不是本表的主鍵,而是另外一個表的主鍵.[一對多關係]  
外鍵是兩個表發生關係一個紐帶.

D:視圖(view)從一個或幾個基本表中根據用戶需要而做成一個虛表.
1:視圖是虛表,它在存儲時只存儲視圖的定義,而沒有存儲對應的數據
2:視圖只在剛剛打開的一瞬間,通過定義從表中搜集數據,並展現給用戶

E:約束(constraint)
對錶中各列的取值範圍進行限制,以確保表中數據的合理有效.

F:默認值(default)
在向表中插入數據時,爲沒有指定數據的列提供一個默認的數據

G:事務(constran)
1:在關係型數據庫裏面一般使用“事務“來處理用戶提交的修改表和數據的操作
2:事務就是一次性完成的一組數據的操作.
3:事務的持徵:位於事務中的操作要麼全部都做,要麼全部取消,從而維護了數據庫中數據的合理性.
4:關係數據庫中一般按照先寫日誌的方法進行事務操作.即:在實施事務之前先將要進行操作的記錄寫入日誌,再進行實際的數據修改.
5:是記錄關係數據修改的情況的筆記.
6:在用戶對數據庫實施之前,sql會把兩種形式的情況寫入日誌.  
   1:實施事務之間的數據狀態.
   2:實施事務之後的數據狀態.
當事務由於中途被破壞時,sqlserver會利用日誌記錄把數據恢復成實施事務之前的數據狀態,即撤消事務(回滾);
如果事務順利的執行則把數據恢復成實施事務之後的狀態,即執行事務(前滾).

H:規則(rule)同約束一樣,對特定的列進行限制:單價*數量=總額
  
I:索引(index)提供一種無需掃描整張表就能實現對數據快速訪問的途徑.可以使用索引來優化查詢.[用索引可以實現排序]

J:存儲過程(store procedure)
   一組經過編譯好的可以重複使用的sql代碼.存儲過程是在服務器中執行,用戶可以調用存儲過程並接收存儲過程返回的結果.
   1:由於存儲過程是存儲在服務器,所有可以讓每一個客戶重複使用,減少sql代碼書寫量.
   2:由於存儲過程是事先編譯好的sql代碼,所以在執行時,並不做語法檢驗,可以大大提高sql語句的執行效率.

K:觸發器(trigger)
  一種特殊的存儲過程.
  1:觸發器與表相關.
  2:當用戶對指定的表進行某種操作時,觸發器會自動執行,去做它裏面sql代碼

L:數據類型(data type)
  兩種類型:系統數據類型,用戶自定義數據類型.
  系統數據類型:int,float,char,varchar,text[備註,工作簡歷],image[存儲圖像]

M:日誌(log)
  sql server使用日誌記載用戶對數據庫進行的一系列的操作.日誌是維護數據庫完整性的重要工具.sql server遵守先寫日誌再對數據庫進行操作.所以某一天,如果數據庫損壞,但可以通過日誌進行恢復.
SQL系統組成
1:sql server系統數據庫.
  A:master:最重要的一個數據庫.保存了:
     服務器的用戶名密碼.
     服務器的配置信息
     使用的數據類型
     錯誤信息
     系統或者用戶建立的所有對像
   說明:由於master數據庫比較重要所以不要在裏面建表,不要修改裏面的任何內容.  
  
  B:tempdb:臨時數據庫
    1:記錄所有的臨時表格或者數據.
    2:tempdb是一個全局資源,任何連接到sql server都可以使用.
    3:該數據庫所放有的數據全部是臨時,這就是說當sql server服務停止之後,所有數據將會消失

  C:model數據庫:模板數據庫.
    1:是建立新的數據庫一個樣式.
    2:當用戶建立一個數據庫的時候,首先要從model數據庫裏面複製所有的表.

  D:msdb數據庫:  
    主要被sql server agent服務用於操作作業調度以及管理報警.
  
2:系統表
  A:服務器級系統表:[master數據庫裏面]
     1:sysdatabases:記錄所有的數據庫的相關信息
     2:sysmessages:記錄了系統錯誤和警告信息
     3:syslangues:記錄了服務器能夠識別的語言
     4:sysconfigures:記錄了服務器配置情況
     5:systype:記錄了服務器所有數據類型

  B:數據庫級系統表:[保存在不同的數據庫裏面]
     1:sysbojects:所有數據庫的對像的相關資料.[類型:u:表,V:視圖,P:存儲過程,tr:觸發器]
     2:sysusers:所有數據庫的用戶的信息.
     3:syscolumns:所有數據庫表中的列.

3:系統的存儲過程:  
  1:sp_help 表名:查看錶的信息:
  2:sp_renamedb 舊名字,新名字:把數據庫更名.

4:示列數據庫:
    pubs,northwind.


創建和維護數據庫(上)
1:數據庫的邏輯結構:
2:數據庫的物理結構:
3:如何創建數據庫:
4:如何刪除數據庫:


A:數據庫的邏輯結構:
通常我們在企業管理器中看到的數據庫和裏面的對像都只是數據庫的邏輯結構.也就是它們並不像在企業管理器中所看到的那樣的結構去存儲在計算機中.企業管理器只是爲了方便用戶查看數據和操作數據而在前臺表象上作了一個“虛假”的顯示結構即爲數據庫的邏輯結構.而數據庫中真正的數據是存儲在硬盤中.而且是以文件的形式來保存的.於是有了數據庫的物理結構.

B:數據庫的物理結構:
既然數據庫裏面的所有數據是以文件的形式存儲在硬盤中,那麼究竟一個數據庫庫由那樣文件組成呢?組成一個數據庫的文件由以下三種文件組成:
1:主要數據文件:
  作用:主要數據文件包含數據庫的初始信息.記錄數據庫還擁有那些文件,並且用來存儲數據.如用戶建的表等數據.
  特點:每一個數據庫有且只有一個主要數據文件.擴展名爲 mdf
2:次要數據文件:
  作用:次要文件也是用來存儲數據庫中的各類信息的,用戶可以選擇是否需要次要數據文件.也就是說它是可選的,它的擴展名爲 ndf
  爲什麼要引入次要數據文件:
    1:或許你的主要文件的數據非常龐大,以至於超過所在的硬盤分區.如果沒有次要數據文件幫助則用戶添加的數據將不能加入到數據庫裏面去.
    2:可以爲一個數據庫創建多個次要文件,並把這些文件放到不同的硬盤中,既可將一個數據庫中的數據存儲在多個不同的物理硬盤中.[可以提高查詢效率:以下再作解釋]
    3:日誌文件:我們知道由於關係型數據庫遵循“先寫日誌再操作”的原則,所以必須有一個文件來存儲用戶對該數據庫所作的一切操作的筆記的文件,這就是日誌文件.擴展名爲:ldf.說明:一個數據庫必須至少有一個日誌文件,也可以有多個日誌文件.

所有數據庫基本上由這個三類文件組成.另外補充一點:當你創建數據庫並指定一個數據文件或日誌文件時,系統會讓你輸入兩種表示形式的文件名:一個是不帶路徑的文件名,一個是要帶路徑的文件.它們分別是:邏輯文件名,物理文件名
  1:邏輯文件名:用於在sql語句命令中對該文件進行訪問,即不需要指明路徑.
  2:物理文件名:是文件實際存儲在磁盤上的文件名,必須包括路徑,指明該文件在磁盤中的什麼位置.
總結:邏輯文件名與物理文件名就像一個房主與房子地址一樣,我們用房子的主人就可以代表房子本身即:房子的地址.

文件組
文件組:如果一個數據庫有很多文件就不便於管理了,爲了管理和分配的目的,sql server允許你將多個文件歸納爲同一個組.這樣文件組中的文件就和其它文件組中的文件沒有直接關係.這就是文件組.
說明:
   1:一個數據庫裏面必須有且僅有一個主文件組爲:primary filegroup.用戶可以根據需要來定義其它文件組.
   2:一個文件只能屬於一個文件組,它不能同時屬於兩個文件組.
   3:文件組只能夠管理數據文件,也就是日誌文件不能放入文件組,因爲日誌文件是分開管理的
   4:所有建的次要數據文件如果不特別指定組則自動被放入primary組.

sql server對文件組中的每個文件的填充策略:
如果用戶有數據要寫入文件組時(比如用戶建一個表,並指定它屬於的文件組時,之後用戶對該表加入記錄)sql server會採用“按比例填充”的原則:即以屬於該組每個文件的可用空間比例來將數據分割並分別寫入每一個文件中.而不是先寫入第一個文件,第一個文件寫滿之後再寫第二文件.但是sql server對日誌文件的數據分配是採用“寫滿爲止“的策略.

爲什麼要引入文件組:
理由:
1)用戶可以在一個數據庫裏面建多個數據文件並指定它們的“物理名”爲不同的磁盤,然後再把它們放入一個組中.這樣當用戶在這個組中創建一個表時這個表中的數據將按“比例填充”方式放入該組中所有的數據文件中,這樣就可以實現把一個表中的數據放入多個磁盤,即可以實現數據庫的“廣域”存儲.此時如果要對該表進行查詢,則多個磁盤的讀寫磁頭將能夠同時並行的訪問數據,從而加快數據庫的操作.
2)通過爲某些數據容量很大且經常需要使用的表直接存儲在一個特定的高速的磁盤上,而把一些不經常使用且容量較小的表存儲另一個磁盤上,就能提供工作效率.

怎樣使用文件組:
  1:大多數的數據庫只需要一個主要數據文件和一個日誌文件就中以非常好的運行.
  2:如果在創建數據庫之前估計某個對像(如表)以後會佔用大量數據則在數據庫創建時,在多個磁盤分別建立一個數據文件,然後把它們設爲屬於同一個組.然後把該對像放於該組,則因爲多個磁盤能並行操作而加快操作速度.
  3:如果某些表經常要執行“連接查詢”且容量很大,則應該把這些表分別存儲在不同的文件組中,如此一來因爲能對被連接的數據實施並行磁盤搜索而提高效率.

C:如何創建數據庫:
  1:通過企業管理器:
  2:sql語句:
     格式:create database 數據庫名
          on

          primary
         (
          name=/'數據文件1的邏輯文件名/',
          filename=/'數據文件1的物理文件名/',
          size=大小,
          maxsize=大小,
          filegrowth=大小
         ),
         (
          name=/'數據文件2的邏輯文件名/',
          filename=/'數據文件2的物理文件名/',
          size=大小,
          maxsize=大小,
          filegrowth=大小
         ),
          ............

          filegroup 用戶自定義文件組名
         (
          name=/'數據文件1的邏輯文件名/',
          filename=/'數據文件1的物理文件名/',
          size=大小,
          maxsize=大小,
          filegrowth=大小
         ),
        (
          name=/'數據文件2的邏輯文件名/',
          filename=/'數據文件2的物理文件名/',
          size=大小,
          maxsize=大小,
          filegrowth=大小
         ),

          log on
         (
          name=/'日誌文件1的邏輯文件名/',
          filename=/'數據文件1的物理文件名/',
          size=大小,
          maxsize=大小,
          filegrowth=大小
         )

說明:
1:數據文件名之間不能同名,數據文件名與日誌文件名也不能同名.
2:在給一個組加上文件時,每個文件之間用“逗號”隔開.
3:數據文件與日誌文件的分界時不要加逗號.
4:由於日誌文件不能放入任何組,所以不要爲日誌文件設定組.
5:如果不指明組則添加的數據文件都自動放入primary組.
6:必須有一個主數據文件.
7:如果數據文件還有較大的空間但是日誌文件的空間已佔滿則對數據進行的所有更新操作將都因無法寫入日誌而終止.
注意:數據文件和文件組絕對不能與日誌文件存儲在相同的磁盤上.

D:如何刪除數據庫:
   1:通過企業管理器:
   2:sql語句:
    格式:drop database 數據庫名
    說明:
      1:數據庫刪除後,數據庫裏面的數據文件與日誌文件就會被刪除,系統數據庫master關於該數據庫的信息也被刪除了.
      2:建議在刪除數據庫之後立即備份master數據庫.否則你在刪除了一個數據庫之後而後卻因爲某種原因還原了過去所備份的master數據庫,則會出錯.
      3:master,model,msdb,tempdb這四個數據庫不能刪除.
      4:如果數據庫正在被使用則不能刪除.
創建和維護數據庫(下)
5:如何修改數據庫:
6:快速查看數據庫的內容:
7:附加和分離數據庫:
8:生成數據庫的sql腳本:
9:數據庫複製嚮導:

E:如何修改數據庫
1:更改數據庫的名字:sp_renamedb 舊名,新名
  說明:修改數據庫的名字一定要小心,因爲客戶端應用程序都是以原先的名字來訪問的.
       必須確認沒以任何人連接以數據庫中才可以更名.

2:擴充分配給數據庫的數據文件或日誌文件的空間:
  你在創建數據時,可以設置數據庫文件的自動增長空間,事實上除了讓sql server自動去擴充之外,還可以人工的方式來擴展數據庫,還可以爲已經創立的數據庫增加新的文件.
   方法:企業管理器:數據庫,屬性
   說明:在給已經存在數據文件重新分配大小時,分配的大小不能比原來的小.

3:收縮分配給數據庫的數據文件或日誌文件.
  當你覺得你的數據庫的初始值設定過於大,或者增長方式設置不符合你的業務,以致使數據庫產生多餘空間時,就可以收縮數據庫了.
方法:企業管理器  “收縮數據庫”
說明:1:收縮後文件的最大可用空間:可以指定一個數值來決定收縮後文件的可用空間,數值越大,收縮越小,反之收縮越大.
     2:在收縮前將移動頁文件起始位置:在收縮之前會把位於頁裏面的數據集中到文件開頭從而得到更多的可用空間,但由於要做移動數據等動作,則會花費較多的時間.
     3:調度:可以讓sql server定期來收縮數據庫,從而實現自動化管理.
     4:壓縮頁然後截斷文件中的可用頁:收縮數據頁,然後將收縮頁產生的可用空間刪除.
     5:從文件結尾處截斷可用空間.
   6:清空文件:清空數據文件或日誌文件而該文件中的數據遷移到文件組中的其他文件中.
     7:收縮文件至:將選定的文件收縮到特定的大小.
     8:在一段時間之後收縮:到了某一時間之後再收縮.[預定義]
思考:能不能通過刪除數據文件或日誌文件的方法來收縮數據庫.

4:添加或刪除數據文件和事務日誌:
   你可以添加數據文件或事務日誌文件來擴充數據庫的大小,也可以通過刪除數據文件和事務日誌文件來收縮數據庫.下面着重來講解數據庫文件的刪除:
     1:對於數據文件的寫入方式是“按比例”寫入,所以如果用戶要建一個表則該表所屬的文件組中的任何一個數據文件都將或多或小的寫入數據.                      
     2:而日誌文件的寫入方式是“寫滿爲止”的策略來寫入,即只有當第一個日誌文件寫滿了之後纔去寫下一個日誌,這就是說如果你爲一個數據庫建多個日誌文件,有可能有些日誌文件是空的.
     3:要刪除數據庫文件必須保證數據庫文件裏面沒有任何數據.
     4:要得到刪除數據庫文件必須首先將它裏面的數據遷移動同一個文件組中的其它文件裏面去.
         格式:dbcc shrinkfile (數據文件名,emptyfile)
     5:方法:數據庫====屬性:

5:更改數據庫的所有者:
  1:什麼是所有者:數據庫的創建都就是數據庫的所有者(dbo)
  2:數據庫所有者和sa對該數據庫有任何操作權限.
  3:數據庫所有者與sa的區別在於sa是全局的,而數據庫所有者是局部的.
  4:格式:sp_changedbowner 登錄用戶名
    說明:1:只能夠更改當前數據庫的dbo
         2:如果指定的登錄名已經是當前數據庫的用戶,則不能更改
6:更改數據庫的配置:
  A:僅僅供數據庫擁有者或者sa能夠使用:
     用途:當你作爲一名數據庫管理員需要改變表的結構時,你不希望別的用戶來使用該表,可以把此項設置,當你把表的結構改了之後再把它改回來.
     sql語句:sp_dboption /'數據庫名/',/'dbo use only/',/'true/'[false]
  B:單用戶:同一時間只能夠有一位用戶連接到數據庫來訪問它:
     用途:更改數據庫名稱,還原數據庫的時候.
            sp-dboption /'數據庫名/',/'single user/',/'true/'[false]
  C:只讀:使數據庫只讀.
            sp-dboption /'數據庫名/',/'read only/',/'true/'[false]

F:快速查看數據庫的內容
    1:企業管理器:任務板:
           A:常規:給出關於數據庫一些詳細資料.
           B:表:查看數據庫中各個表的詳細資料.
           C:嚮導:很方便的打開向導和工具來完成操作.
    2:sql語句:
           A:sp_helpdb 數據庫名[指定數據庫的詳細資料,包括各數據庫文件]
           B:sp_helpdb [當前服務器中所有數據庫的詳細資料,不包括數據庫文件]
           C:sp_databases[顯示當前服務器所有可以使用的數據庫]
           D:sp_helpfile [查看當前數據庫的所有文件的資料]

G:附加和分離數據庫:
   目的:就是移動數據庫的位置.
   注意:在sql裏面沒有複製,剪切,粘貼等命令.
   用途:
    1:將數據庫移動到其它已經註冊到你的企業管理器的其它的sql server 服務器中.
     問題:要把服務器www中chen數據庫移動到test服務器中.
     比較:常規方法:
     本方法:先讓chen與www分離,然後再把chen的數據文件和日誌全部移到test服務器對應的路徑,接着再把www附加到test服務器.
    2:改變數據庫中數據文件或日誌文件的磁盤的目錄:
     比如存儲數據或日誌文件的空間已不足了時你便要移動數據文件或日誌文件的位置到其它有更大的空間的位置上.
      A:數據庫創建之後數據文件和日誌文件的位置便不能更改.
      B:只有把數據庫分離之後纔可以改變.

H:生成數據庫的sql腳本.
通過生成數據庫的sql腳本我們能夠產生創建現有數據庫各個數據庫對像的sql語句.然後可以把此腳本再次運行.
  例能夠產生出一個和原數據庫有相同結構(不是數據也相同)的新數據庫.
用途:
   1:重新創建一個與某個數據庫結構完全相同的數據庫.
      比如:你在服務器A裏面建了一個數據庫test,你現在要把test的結構複製到B服務器裏面去(注意:不是數據,僅僅是結構,也就是說對於表而言將不會有數據存在),那麼你可以先在服務器A中生成一個關於test數據庫的sql腳本,然後再在服務器B中去運行.
   2:備份一個腳本,以便允許用戶可以重建所有的用戶,角色,登錄與權限.
      比如:你好不容易在某個服務器上創立了一些數據庫用戶或角色,或登錄或權限.這個時候你可以生成一個你當前創建這些對像的腳本,如果以後有人惡意刪除了這些對像,則可以通過把這些代碼重新運行一次,重而免去重新創建這些對像的麻煩.
   3:更新數據庫開發代碼.
      比如:你可以在生成sql腳本的基礎上,再對源代碼進行修改,從而可以在源數據庫的基礎上擴展一些功能
方法:企業管理器:
  說明:
     1:爲每個對像創建create命令:爲用戶在常規選項卡里面選擇的各對像創建create語句.
     2:生成全部相關腳本:生成在常規選卡中選中與之相關的對像. 比如:如果你在常規選項卡里只選擇了視圖,而沒選擇了表,當你運行這種sql代碼就會出錯.因爲視圖需要表支持.如果選中此項則sql會自動將支持視圖的相關對像一起創建.
     3:在腳本中包含說明性的標題:在生成代碼的同時,加上一些說明性的文字
     4:編寫數據庫腳本:要生成數據庫的代碼.
     5:編寫數據庫的用戶和角色腳本:要生成數據庫的用戶和角色的代碼.
     6:編寫sql server登錄腳本:要生成服務器登錄的腳本.
     7:編寫對像級別權限的腳本:爲你在“常規”頁面中選取的各個數據庫對像設置權限而編寫的sql代碼

I:數據庫複製嚮導
利用數據庫複製嚮導,我們可以很輕易地把一個服務器的數據庫複製到另外一個服務器中.
1:選擇是複製服務器的登錄用戶:
  A:包括運行時檢測到的所有登錄:將要複製的數據庫所在的服務器全部登錄帳戶複製到另外一個服務器中
  B:僅包括數據庫使用的登錄:只複製“要複製的數據庫”使用的登錄的部分帳戶.
2:選擇master數據庫裏面的共享存儲過程:
  A:包括運行時檢測到的所有的存儲過程:將把要複製的數據庫所有服務器中master數據庫裏面的存儲過程都複製到目的服務器所在的master數據庫中.
  B:用戶選定的存儲過程:可以決定要複製的數據庫所有服務器中master數據庫裏面的存儲哪些要複製哪些不要複製.

創建和維護表(tables)
1:表的結構:
2:創建表:
3:自動編號字段:
4:活用用戶定義數據類型:
5:創建計算字段:
6:快速查看、添加、修改與刪除數據記錄:
7:更改表的結構:
8:更改表的名稱:
9:更改表的所有者:
10:刪除表:
11:用戶表與臨時表與系統表:

A:表的結構:表的結構基本決定了表擁有哪些字段名、使用的數據類型.
   1:字段名(field)
     1)字段名最長可達128個字符
     2)同一個表中字段名絕對不能重複
   2:長度、精度和小數位數,NULL值.
     1)長度:指字段所能容納的最大數據量.對於不同類型的數據,長度對字段的意義可能有些不同
       一:對於字符型數據類型而言:長度代表字段所能容納的字符的數目,因此它會限制用戶所能輸入的的文本長度[長度可以修改]
       二:對於數值型數據類型而言:長度代表字段使用多少個字節來存放數據,它決定了字段所能存放的最大數最小數[長度固定不能更改].比如: int 4字節=4*8=32位,則最大的數爲: - 2^(32-1)-----2^(32-1)
     2)精度:一般精度是相對於小數而言,表示數中數字的個數.
     3)小數位數:小數點後數字的位數.
          比如:1234.678 其精度是:7(不包括小數點),小數位數是:3
      說明:有些數據類型精度,小數位數都不能改,有些可以改.decimal,numeric
   3:數據類型(datatype)
      特殊的類型:char,varchar的區別,精確數據類型:decimal,numeric [都可以指定小數數位數和精度]
                 image,money,datatime[固定保留四位小數],bigint,int,smallint,tinyint
   4:NULL值:
     1:NULL值並不等於數值0,空格,它是虛無值.
     2:NULL值是說此字段中的數據是否可以是未知的或未定義的,如果允許爲NULL則該字段的數據是允許未知,否則只能是已知的  
     3:快捷方式:ctrl+0

B:創建表:
     1:通過企業管理器:
        1:添加或插入字段:
        2:刪除字段:
        3:表的屬性窗口:所有者[該表所在的數據庫裏必須有用戶],表名,表文件組,備註,是否爲空
        4:描述,默認值,精度,小數位數,標識,標識種子,標識遞增量.[如果把某一個列定義成爲標識列,則該列不能編輯]
     說明:一個數據庫包括表最多隻能夠有2^(32-1)個對像  每一個表最多可以擁有最多1024個字段
     2:通過sql語句.
        格式:create table 表名
            (
             列名1 數據類型(長度) not NULL [NULL],
             列名2 數據類型(長度) not NULL [NULL],
             ................
            )
             [on] [放入指定的文件組]
       說明:
        1:對於字符型要指明長度,比如:職工號 char(20),姓名 vchar(20)
        2:對於除decimal,numeric(6,2)以外的數值型類型,不需要指明指定長度.比如:基本工資 int,單價 float
        3:可以對每個字段指定是否允許爲空,如果省略則可以爲空.[not null]
        4:可以指定把創建的表放入一個文件組,如果省略則自動放入primary組.[該組必須存在]

C:自動編號字段
       說明:
        1:自動編號的字段類型只能是以下幾種:int字樣的數據
        2:如果把某一個字段設置爲自動編號,則用戶不能去更改裏面的內容
        3:每一個表只能擁有一個自動編號字段

D:活用用戶自定義類型
    1:爲什麼要使用用戶自定義類型:
       理由:有時候爲了建多個表,而這些表中都具有相同類型相同格式的某一種系統數據類型.如果每次建一個表都要去設置很不划算,可以引入用戶自定義類型.
    2:怎麼定義或使用用戶自定義類型:
    3:刪除用戶自定義類型:
        1:顯示相關性:
        2:如果該數據類型被其它對像使用,則不允許刪除
           說明:
            1:在某一個數據庫裏創建的用戶自定義數據類型只能夠被該數據庫的對像使用.不能被其它數據庫使用.
            2:問題:如何創建一個數據類型可以讓新建的數據庫都可以使用?(在模板數據庫中創建)

E:創建計算字段:
      計算字段:計算字段不是表中的字段,而是由表中其它字段通過計算而得來的.比如:單價*數量=銷售量
        1:爲什麼要創建計算字段:
        2:怎麼創建計算字段:創建表的時候才能夠創建計算型字段
           A:通過sql語句:
                 比如:create table ww
                (
                 商品名 vchar(10),單價 float,銷售量 int,總金額 as 單價*銷售量
                )
           B:格式爲:計算字段名 as 表中字段表達式.
           C:通過企業管理器:公式列中進行
             注意:計算字段也可以參與查詢,但不能更新

F:快速查看、添加、修改、刪除數據記錄
       1:查看:打開表.
       2:添加:直接加.
       3:刪除數據:刪除一行,刪除多行
       4:打開表,單右:菜單

G:更改表的結構 :
       1:通過企業管理器:
       2:使用sql語句
         格式:
          1:修改原有字段的數據類型
             alter table 表名
             alter column 列名 新的數據類型
           說明:
            1:一次只能修改一個字段的數據類型.
            2:不能修改計算字段,或使用在計算字段中的列.
            上述命令只能夠修改數據類型不能修改字段名稱.要修改字段名稱可以用:sp_rename column 新的列名,
                  格式:sp_rename /'表名.舊列名/',/'新列名/',/'column/'
          2:在原有表的基礎上添加新的字段.
             alter table 表名
             add 數據的字段名 數據類型 [添加時,沒有column關鍵字]
                  可以一次添加多個字段,字段與字段之間用逗號隔開      
          3:刪除原有表的字段:
             alter table 表名
             drop column 列名 [刪除時,需要column關鍵字]
            1:可以一次刪除多個字段,字段與字段之間用逗號隔開
            2:可以刪除計算字段,但不能刪除使用在計算字段中的列.

H:更改表的名稱
    1:企業管理器:
    2:sql語句:  
         格式:sp_rename 舊錶名,新表名
         說明:
           1:如果一個表被某個或多個對像引用,則不要改名,否則會使這些對象不可用.
           2:不要對系統表改名,這有可能會使系統損壞

I:更改表的所有者
    1:通過企業管理器:
    2:sql格式:sp_changeobjectsowner /'舊擁有者.表名/',/'新的數據庫用戶/'

J:刪除表
    1:通過企業管理器:
        1:刪除前的準備:查看有哪些對像在引用此表
        2:刪除:
    2:sql語句:
       格式:drop table 表名    可以一次性刪除多個表,表名和表名之間用逗號隔開

K:用戶表臨時表系統表
    sql server把整個表分成三種類型:用戶表,系統表,臨時表.用戶表和系統表已經熟悉
     臨時表:
       什麼是臨時表:就是臨時存放數據的地方,一但不使用時會自動刪除.
       爲什麼要使用臨時表:有時候在進行數據操作時,希望產生一些階段性或者過濾性的數據,這些數據只是暫時使用,而當工作結束時,我們希望它們能自動刪除,而不是人爲去刪除.這個時候我們就需要臨時表.
       臨時表的分類:
         1:本地臨時表:
            創建本地臨時表:當你創建表時,在表名字前面加上“#”號,則這個表就成爲本地臨時表.
            特點:本地臨時表只有創建它的用戶可以訪問它,其它用戶將不能訪問,而且一旦這位用戶斷開與sql server的連接,本地臨時表會自動刪除.
         2:全局臨時表:
            創建全局臨時表:當你創建本時,在表名字前面加上“##”號,則這個表就成爲全局臨時表.
            特點:當一個用戶創建一個全局臨時表時,其它連接到sql server服務器的用戶都可以使用,當創建者與服務器斷開後,sql server並不會立即刪除該用戶所創建的全局臨時表,而是會去檢查當前還沒有別的用戶的作業在訪問該表,如果有,則暫時不刪除全局臨時表,但是不允許用戶再去訪問它,直到在sql server服務器再沒有關於該表的作業時,才刪除.



設計、創建和維護索引(index)(上)
1:索引的基本概念:
2:索引的設計準則:
3:索引的類型:
4:聚集索引和非聚集索引:
5:唯一索引和非唯一索引:

A:索引的基本概念
   索引在關係型數據庫中扮演着極其重要的角色,它最主要的作用是:
     1:確保數據的唯一性:2:提高數據查詢速度
        提高數據的查詢速度
          爲什麼可以提高數據的訪問速度:索引可以把表中的數據進行排序.
          舉例:創建一個work表最好有80萬行.執行:select * from work where 年齡<50
              1:[不建索引]觀察所用時間
              2:[創建一個索引]觀察所用時間
          
       1:表掃描:一行一行把表的數據全部掃描到.[tabscan]
       2:使用索引:把表的數據進行排序,從而可以提高數據的查詢效率
       3:索引的結構:索引頁,數據頁
      舉列說明:
      A:select * from work where 職工號=/'001/'.如果事先能夠爲職工號建立索引.則可以提高查詢速度
      B:select * from work where 基本工資>1200 and 基本工資<3000.如果事先能夠爲基本工資創建索引則可以提高查詢效率
      C:select * from work order by 基本工資.若能夠事先爲基本工資創建索引也能夠提高查詢效率

sql server在什麼時候要使用索引:
不要以爲只要爲某個字段創建索引之後,sql server在查詢的時候就一定要使用它.事實上sql server在執行查詢之前會通過一個叫“查詢優化器”的對像來判斷是採用表掃描,還是使用索引,如果利用索引不能使查詢得到優化,則不會使用索引,而改用表掃描.

確保數據的唯一性:
索引中有一類索引叫唯一索引(unique),利用它可以保證以該字段爲索引的值不會出現重複但它可以爲空.與主鍵有區別,當然如果你創建的索引不要求保持數據唯一性,只是爲了提高查詢效率你完全可以不建唯一索引,建一個一般的索引就行了.當然確保數據唯一性的方法有很多,比如可以創立主鍵等.索引只是確保數據唯一性的其中一種方法.

B:設計索引的準則
1:經常被用來查詢數據記錄的字段.
   說明:經常被用來查詢數據記錄的字段最好是識別度較高的字段(也就是數據內容重複性低).
   比如:使用員工編號或身份證號來作索引是非常恰當的.但如果使用家庭住址或使用基本工資來尋找員工就顯然不恰當.家庭住址一般有很多字符,會使索引過於龐大,基本工資識別性太低.
2:主鍵所定義的字段一般應作索引,不過sql server自動幫我們作好了
3:在查詢中用來連接表的字段:
4:經常用作排序的字段:
   說明:不能爲bit,text,image等數據類型的字段創建索引.

索引的負面影響:
那既然索引可以加快查詢效率,那我們就把索引建多,越多越好,這一種說法完全錯誤.
理由:
  1:索引顯然會佔用磁盤空間,創建不必要的索引只會浪費空間[任務面板中查看]
    一個索引的大小絕對大於以該字段作爲索引的大小乘以記錄條數.
  2:以某個字段創建一個索引之後,當以後修改或添加該字段時,爲了讓索引能夠實時反映表的動態更新必須有相關的索引.[索引頁]
    所以得到一個結論:如果一個表是作爲引用性的,也就是說它僅僅只作爲查詢,或者說它的改動非常少,多幾個索引倒也無所謂,但是一個經常性修改的表則請謹慎的創建必須的索引[舉列說明]
    A:在work中執行update work set 年齡=年齡+1 where 年齡=20[觀察使用時間]
    B:在work中創建一個索引以年齡爲索引,再執行同樣的語句[觀察使用的時間]
  3:數據記錄越多,索引提高數據訪問效率越明顯,反過來如果表內含有數據記錄很少,建個索引是不會有任何作用的,所以不主張對一個記錄很少的表創建索引

C:索引的類型
1:按存儲結構區分:聚集索引(clustered index),非聚集索引(nonclustered index)
2:按數據唯一性分:唯一索引(unique index)和普通索引
3:以鍵列的個數分:單列索引與多列索引.

D:聚集索引和非聚集索引
聚集索引:數據頁內容排列的次序與索引頁的索引字段的值相同.即:聚集索引會改變表原先的排列順序使之按照索引升序或降序排列.
正由於聚集索引會使得值相同的數據記錄排列在一起,因此要搜索介於某範圍的數據值時將會特別有效.因爲一但使用聚集索引找到第一條符合條件的記錄,則同範圍之後的記錄保證是相鄰排列的,也就是說把這一範圍找到之後就不會往下面找了.
怎麼使用聚集索引
一般而言下列的數據訪問操作非常適合使用聚集索引:
    1:如果某個字段所包含的有差別的數據較少,則非常適合以該字段創建聚集索引.比如:員工表中部門字段用來存放員工所在的部門.但一個單位的部門不會超過十個,則以部門創建聚集索引最好.[爲什麼?]
    2:使用betwwen,>,>=,<=,<等運算符查詢[注意不是等於]
    3:會返回大結果集的查詢 至少10萬以上
   說明:
      1:每一個表最多隻能有一個聚集索引
      2:聚集索引可以是一個唯一索引或普通索引
      3:聚集索引的大小平均是表大小的5%,在創建聚集索引期間,它需要使用數據庫的一些磁盤空間來存放編制索引過程中的一些臨時數據,所需的臨時空間大約是表大小的1.2倍,這些臨時數據會在索引創建完成後釋放出來.
      4:如果某一個字段的內容經常變動則非常不適合給這個字段創建聚集索引.因爲聚集索引要求表的記錄按照索引列排序,所以如果一個字段的變動將會導致整個表的記錄的要重新排列一次
  
非聚集索引:
與聚集索引不同的是,非聚集索引儘管可以按照升序或降序排列,但它絲毫不影響表中數據的實際的存放順序[注意:索引的排序與表的實際數據的排序的區別]
所以非聚集索引並不會使表的記錄排序[是不是就達不到提高數據搜索的效果呢?思考]
另外每一個表中可以擁有多個非聚集索引,正是由於一個表能擁有多個非聚集索引,所以如果你不需要用多種方式搜索數據記錄時,非聚集索引便顯得特別好用.比如你想先對年齡進行搜索而後又對基本工資進行搜索則我們可以分別爲年齡和基本工資創建一個非聚集索引
怎麼使用非聚集索引
一般而言下列情況非常適合使用非聚集索引:
    1:如果某字段包含的有差別數據非常多,則非常適合爲該字段創建非聚集索引.比如:一個客戶表的姓名而言,雖然也有相同的姓名,但是大多數的客戶的姓名都不一樣,所以就要以姓名作爲非聚集索引
    2:所返回的結果量是不大的查詢
    3:使用where子句的字段,並要求該字段等於特殊的某個值.比如:where 職稱=/'經理/'
    4:每一個表最多能夠擁有249個非聚集索引
    5:非聚集索引可以是唯一索引和普通索引

E:唯一索引和非唯一索引
  唯一索引
如果在創建索引的時候加上unique關鍵字就變成的唯一索引,唯一索引的特點:
   1:唯一索引可以確保索引列不包含重複的值.在多列唯一索引的情況下,該索引可以確保索引列中每個值組合都是唯一的.
   2:聚集索引和非聚集索引都可以是唯一的.因此,只要列中的數據是唯一的,就可以在同一個表上創建一個唯一的聚集索引和多個唯一的非聚集索引.
   3:唯一索引不僅可以保證數據唯一性還可以提高查詢效率[用執行計劃的io成本來察看]
    思考:如果你創建唯一索引的目的僅僅是爲了保證數據唯一性,沒有必要創建索引,但如果你創建唯一索引的目的是既要保持數據唯一性又要提高查詢效率,想一想應該創建聚集的還是非聚集的.
   4:當你爲一個表創建一個主鍵時,sql server會自動幫你創建一個唯一索引
   5:唯一索引與主鍵都能夠確保數據唯一性,但是它與主鍵有區別[思考有什麼區別]
    思考:有work表有職工號,姓名,學歷.假如本公司沒有一個人同名,應該怎麼做:
     方法1:創建一個由列職工號和姓名組成的主鍵.
     方法2:由創建一個主鍵職工號,再創建一個唯一索引,其索引列爲:姓名
          分析兩種方法的結果.
怎麼使用唯一索引
1:雖然唯一索引可以保證數據的唯一性,但是如果你只想保證數據唯一性話,則不是必須要設置唯一索引,你可以使用sql server其它方法  比如:主鍵,約束等.
2:只有你既希望保證數據唯一又想提高查詢效率時,才使用唯一索引.
   比如:work表中有職工號,姓名,性別,年齡,學歷.假定本公司沒有同名的人,爲了在以後輸入姓名的過程中避免出現複製錯,而且你經常要用姓名列進行查詢,則你可以在姓名列上創建一個唯一索引,這樣既保證了數據的完整性又可以提高查詢的效率

  非唯一索引
如果你在創建索引時沒有使用unique關鍵字,則你創建的索引爲非唯一索引,這樣該索引的作用僅僅是爲了提高查詢的效率



設計、創建和維護索引(index)(中)
6:單列索引和多列索引:
7:填充因子:
8:統計信息:
9:創建索引:
10:刪除索引:

F:單列索引和多列索引
  單列索引
可以爲一個列創建一個索引也可以爲多個列創建一個索引,爲一個列創建的索引就爲單列索引,爲多個列創建的索引被稱爲多列索引.以上討論的都是單列索引,在這裏就不在討論,下面討論多列索引.

  多列索引:由多個列組成的索引被稱爲多列索引
  爲什麼要使用多列索引
    1:當你需要爲多個列確保數據唯一性時[不是主鍵],你可以設置一個多列的唯一索引.
      比如:work:職工號,姓名,性別,年齡,學歷,基本工資.假定本公司中規定姓名和性別都同時相同時,你可以作一個唯一的索引,這個索引以姓名和性別作爲列.
    2:如果你想對某些列按照不同的字段排序時,請使用多列的聚集索引.
      比如:你想按年齡升序排列,而年齡相同的又按照基本工資降序排列,則你可以創建一個有年齡,基本工資的聚集索引  
      思考:在work表中有職工號,姓名,年齡,學歷,基本工資,職稱
           要做如下查詢:select * from work where 基本工資<1200 and 年齡<25
      要提高效率有兩種方法:
        1:創建一個多列索引,索引列爲年齡 升序,基本工資 降序
        2:創建兩個單列索引,一個索引的索引列爲年齡,一個索引的索引列爲基本工資.
          分析哪一種方法可以更好的提高查詢效率
結論:覆蓋的查詢可以提高性能.覆蓋的查詢是指查詢中所有指定的列都包含在同一個索引中.例如,如果在一個表的a、b和c列上創建了組合索引,則從該表中檢索a和b列的查詢被視爲覆蓋的查詢.
          
G:填充因子:
    頁拆分
在創建聚集索引時,表中的數據按照索引列中的值的順序存儲在數據庫的數據頁中.在表中插入新的數據行或更改索引列中的值時可能重新組織表中的數據存儲,以便爲新行騰出空間,保持數據的有序存儲.向一個已滿的索引頁添加某個新行時,SQL Server會通過拆頁以便爲新行騰出空間.這種重組稱爲頁拆分.頁拆分會降低性能並使表中的數據存儲產生碎片.

    解決辦法:
創建索引時,如果在每個數據頁預留一些空間,這樣以後修改和增加數據時就沒有必要移動每個頁中的數據以便爲新的數據騰出空間了,則可以大加快修改和增加數據的效率.在前面我們已經知道數據被分了多個頁每一個頁的大小爲8kb,那麼爲每一個頁已經填充的空間與整個頁的空間的比例就是填充因子.
    特點:
  1:很顯然填充因子越大,則意味着預留空間越小,當爲100%時,表示填滿了.
  2:填充因子值越小則數據頁上的空閒空間越大,這樣可以減少在索引增長過程中對數據頁進行拆分[思考:是不是填充因子越小越好]
    怎麼設置填充因子:
     1:對於一個經常要修改的表,由於要經常對數據進行修改,則拆分頁的可能性越大,爲了避免拆分頁,可以把填充因子設置得小一點[預留空間越大],但是很浪費空間.這是以犧牲表的存儲空間來提高數據的更新的效率的
     2:對於一個只讀的表,或者說很少修改的表,爲了不浪費空間建議把填充因子設得大一點.
     3:填充因子只在創建索引時執行,以後隨着用戶不斷往表中添加或刪除數據時,由於每一頁的可用空間要減少或增加,所以填充因子會改變.所以如果對一個表作了大量的改動時,可以刪除索引再重新分配數據
       思考:如果在不考慮存儲空間的情況下,把填充因子設得很小,這樣是否可以避免分頁

H:統計信息:
    什麼是統計信息
我們知道在用戶創建索引之後,sql server在查詢的時候並不一定要使用它.事實上sql server在執行查詢之前會通過一個叫“查詢優化器”的對像來估算按索引查詢所需的成本和直接使用表掃描所需成本,如果發現使用索引所需要的成本大於使用表掃描使用的成本,則不會使用索引而改用表掃描,反之則使用索引.
那麼查詢優化器依賴什麼來估算使用索引查詢所需要的成本呢?它只能通過“每一個索引值在索引列中的分佈情況的統計信息”估算.實現上在創建索引時,SQL Server會自動存儲有關值在索引列中的分佈情況的統計信息.SQL Server中的查詢優化器使用這些統計信息估算使用該索引進行查詢的成本.
但是隨着用戶對錶的修改會導致列中數據的不斷更新,則這種統計信息就會過時,從而導致查詢優化器選擇的查詢處理方法不是最佳的,很顯然使用過期的“統計信息”估算成本是不真實的,也就是說它不是最優的查詢.

  自動更新統計信息與手動更新統計信息
    自動更新:
因此,隨着表中的數據發生變化,SQL Server會自動定期更新這些統計信息.以保證“查詢優化器”總是採用最優查詢,但是如果用戶每次對錶進行一點點修改,如果sql server都要去更新統計信息這顯然會加大sql server的負荷.所以並不是只要用戶對一個表進行更改sql server就會馬上去更新“統計信息”,而是更新的頻率取決數據更改量.例如,對於一個包含10000行的表,當1000個索引值發生更改時,該表的統計信息便可能需要更新,因爲1000個值可能在該表中佔有很大的比例.而對於包含10000000個索引條目的表來說,有1000個索引值發生更改的意義要小得多,因此統計信息便可能不會自動更新.
 你可以選擇是否要讓sql server自動更新還是手動更新:數據庫->屬性->自動更新統計信息

    手動更新:
請注意:sql server在對“統計信息”進行更新時,它是不會分析表的所有數據的,而是會從表中隨機抽樣,這樣可以極大地減少這種統計信息的自動更新所帶來的成本.所以有可能在某些情況下,統計採樣無法獲得表中精確的“統計信息”,這個時候我們可以手動更新,比如:我們可以指定對錶中所有數據進行抽樣以取得精確的“統計信息”,或者指定對錶的多少行進行採樣.
    如何手動更新:
    update statistics 表名 索引名 [with fullscan或者sample 數值 percent或者rows]
  說明:
   1:如果省略索引名將對錶的所有索引進行手動更新
  2:如果使用fullscan關鍵字,則表示對錶中所有行進行採樣,這樣會費很長時間,但會得到更優的查詢
  3:如果使用sample 數值 percent則表示對整個錶行的百分之幾進行採樣
  4:如果使用sample 數值 rows則表示對整個表的只取多少行進行採樣.
   比如: 在work表創立兩個索引 年齡,基本工資
         如果執行:
                1:update statistics work with fullscan[表示什麼意思]
                2:update statistics work with sample 10 percent[表示什麼意思]
                3:update statistics work with sample 10 rows[表示什麼意思]
    什麼時候需要手動更新:如果索引列中添加、更改或刪除大量數據請使用update statistics手動更新

I:創建索引
1:通過企業管理器:
   A:索引文件組:可以把索引也放在數據庫的文件組中.你可以把關於一個表中創建的索引與表放在一個文件組中,也可以把基於一個表的索引放在不同的文件組中,這樣可以在查詢時由表所在的驅動器與該表索引所在的驅動器同時並行查詢,從而提高查詢效率.
   B:但是一個聚集索引只能夠放在primary組中.
   C:不自動重新計算:如果選擇該項則sql server不會自動更新“統計信息”,當用戶在對錶作了大量的修改之後再查詢時因爲“優化器”使用的是“過時的統計的信息”,所以可能得不到最優的查詢,除非用戶手動更新.
2:通過sql語句.
    格式:create [unique][clustered] index 索引名 on 表名(列[asc|desc]) with fillfactor=整數
      說明:
         A:如果省略unique則是非唯一索引
         B:如果省略clustered表示一個非聚集索引
         C:在列後面可以指明是升序還是降序,如果省略則爲asc(升序),否則必須指明desc(降序)
         D:如果要創建多列索引可以寫多個列,列與列之間用逗號隔開.
           例如:
             A:create unique clustered index 年齡 on work(年齡 desc)
             B:create unique clustered index 年齡,基本工資 on work(年齡 desc,基本工資)
           思考:
             假定你要創建一個聚集索引和一個非聚集索引,你是先創建非聚集索引還是先創建聚集索引
           結論:
             sql server會在刪除或創建任何聚集索引的時候重新創建非聚集索引,所以在創建任何非聚集索引之前創建聚集索引.

J:刪除索引:
  注意以下兩點:
   1:當一個索引不再需要,可以將其從數據庫中刪除,以回收它當前使用的存儲空間.這些回收的空間可以由數據庫中任何對象使用.
   2:當你把一個聚集索引刪除後,sql servr必須把以前的同一個表上的所有非聚集索引重新創建一次,所以刪除一個聚集索引比刪除一個非聚集索引要花費更多的時間.
   3:只有表的所有者或sa可以刪除其索引.
  方法:
     A:通過企業管理器:打開表的設計窗口,單右->索引->刪除
B:通過sql語句:格式:drop index 表名.索引名




設計、創建和維護索引(index)(下)
11:索引的維護操作:
12:索引的評估和分析:
13:爲計算字段創建索引:
14:爲視圖創建索引:
15:索引優化嚮導.

K:索引的維護
你創建了一個索引之後,用戶可能要對錶進行修改,而爲了讓索引能發揮它的最大用途,必須對它進行維護.
我們通常對索引有下面的維護:
  1:重建索引
     一個索引已經創建好了,爲什麼還要去重建索引呢?
    A:爲什麼要重建索引:
     在數據庫中創建索引時,查詢所使用的索引信息存儲在索引頁中,隨着用戶對錶進行不斷的修改,填充因子會不斷的改變,這樣就會生成很多碎片,這顯然不利於查詢.我們可以重建索引以重新組織索引數據來達到清除碎片的目的.
    B:怎麼重建索引:
     思考:假設你已經爲work表作了一個“年齡”聚集索引,隨着用戶不斷更新該表,使它產生很多碎片,現在要重建你該怎麼辦:[首先刪除原先建的年齡索引,再來創建一個年齡索引,行嗎]
     結論:這樣做雖然可以,但會花費更多的成本,因爲我們已經知道,每用戶刪除一個聚集索引,時sql server會把該表所有的非聚集索引全部刪除之後再重新創建,顯然不划算,那麼可以在不刪除原有索引的基礎上來新建一個與原索引一樣的索引嗎?當然可以.
   那麼可以看到不刪除原有的索引而重新創建一個索引的好處,有以下兩點:
    1:免了刪除和重新創建非聚集索引這些不必要的工作
    2:可以使用現有索引中的數據排序次序,從而避免了對數據重新排序.這對於聚集索引十分有用,可以顯著減少重建索引的成本.
      方法:只需要在創建索引的時候加上with drop_existing關鍵字就行了.
      比如:create unique clustered index 年齡 on work(年齡 desc) with drop_existing
      思考:是否執行了這個命令之後就意味着所有的非聚集索引不會刪除之後再創建了呢?
      結果:當建的新的聚集索引與原聚集索引的列相同時,纔不會刪除非聚集索引,否則還是會刪除非聚集索引之後再創建.
  2:查看索引:
      在創建索引之後我們可能需要
        A:查看某個索引類型
        B:一個表的全部索引
        C:某個索引使用的數據庫空間總量.
      方法:
        1:查看錶中的索引
           格式:sp_helpindex 表名
        2:查看數據庫中的全部索引及使用的空間
           通過:任務面板
  3:碎片整理
      我們已經知道,當用戶對一個表創建一個索引之後,由於用戶對錶不斷的改變,會導致產生很多碎片.你既可以重建索引,也可以選擇不重建索引,而直接對索引進行碎片整理.
       方法:dbcc indexdefrag(數據庫名,表名,表中的索引名)  
       比如:dbcc indexdefrag(陳文傑,work,年齡)[對數據庫陳文傑表work裏面的年齡索引進行碎片整理]
         顯示的信息會給出:有多少頁掃描了,有多少頁被移動了,有多少頁被刪除了
         注意:若索引的碎片相對較少,則整理該索引的速度比生成一個新索引要快,這是因爲碎片整理所需的時間與碎片的數量有關.對碎片太多的索引進行整理可能要比重建花更多的時間.
  4:更名
     方法:sp_rename /'表名.原索引名/',/'新索引名/',/'index/'
     例如:sp_rename /'work.年齡/',/'年/',/'index/'[把work表“年齡”索引名改爲“年”]
  5:索引管理器:可以方便對選擇的數據庫中相應的索引進行修改,刪除,還可以方便進行索引的新建刪除等.
              操作方法:在企業管理器中選擇某個表->單右->管理索引

L:索引的評估和分析:
實際上評估一個查詢是不是最優查詢,並不是由時間來決定的,因爲相同的一個查詢在計算機很忙的時候運行所花費的時間絕對要大於計算機很空閒的時候運行所花費的時間,因爲當計算機很忙的時候cpu要把時間分給其它的程序,這顯然會延長一個查詢所花的時間,而當計算機很閒時,相當於把cpu的時間全部給這個查詢,可以減少運行時間,所以僅憑運行時間來判定一個查詢是否最優是不精確的,那麼我們可以根據這個查詢所花費的成本來決定一個查詢的優劣.可以通過“執行計劃”來察看
    方法:顯示執行計劃,快捷方式:ctrl+k
         A:查詢分析器是採用表掃描還是採用索引來執行查詢.
         B:如果採用索引查詢,是用的哪個索引
         C:查詢所花費的成本.
            i/o成本:用於操作的所有I/O活動的預計成本(I/O成本).該值應儘可能低.
            成本:查詢優化器執行此操作的成本佔查詢總成本的百分比.由於查詢引擎選擇最高效的操作執行查詢或執行語句,因此該值應儘可能低.

M:爲計算字段創建索引
計算列雖然不是表的的字段,但是可以參與查詢,所以爲了加快查詢效率,我們有時候希望在計算列上創建索引,在計算列上創建索引的方法與在非計算列中創建索引一樣,但是需要注意二點:
    在創建表的時候[不是在表創建好之後],既在執行create table的時候必須滿足:
        1:爲計算列的表達式上使用的表的字段類型不能有float型,被稱爲不確定或不精確
        2:ANSI_NULLS:必須設置爲on 方法:SET ANSI_NULLS on[一般情況下]
             說明:默認爲off,表示可以在查詢中使用=null或<>null條件,否則不允許使用

N:爲視圖創建索引
我們知道視圖並沒有存儲數據,而是存儲定義,所以當視圖在剛剛打開的一瞬間會根據定義從相關的表中收集數據,相當於從相關表中做一個查詢,然後再把數據導入到視圖中,也就是要動態生成與視圖定義相關的結果集.
於是用戶要對一個視圖進行查詢時,將經過兩步查詢:
   表----------->視圖---------->用戶
         查詢           查詢
但是對一個很大的表來說,如果用戶在查詢之前都要從基本表是導入數據,將是很費時的事,如果我們把定義視圖的數據直接存儲在視圖中這樣當用戶去查詢時,就會直接從視圖中搜索數據,這顯然可提高效率.具備有這種特點的視圖被稱爲索引視圖.
   視圖(包括數據)-------->用戶
                   查詢
  思考:怎麼驗證當創建索引視圖之後,確實把數據存儲到視圖裏面去了.[任務板]
  說明:  
     1:在視圖上創建的第一個索引必須是唯一聚集索引.
     2:在創建唯一聚集索引後,可創建其它非聚集索引,也就是說在視圖上不能創建單一的聚集索引.
  方法:
   A:通過企業管理器:
         單右-->設計視圖---->單右---->索引管理:創建索引
   B:sql語句:
         格式:create [unique][clustered] index 索引名 on 視圖名 (列[asc|desc])
         很顯然:除去視圖上的聚集索引將刪除存儲的結果集.[如何驗證:刪除索引視圖的聚集索引]

索引優化嚮導
可以這樣說,沒有哪個人能夠真正的設計一個非常優秀的索引,因爲這需要深入瞭解SQL Server的數據庫結構、工作負荷和內部原理.即使是微軟高級工程師也不敢說自己創建的索引是最完美的,況且你只是一個一般的使用者呢?考慮到這些,微軟爲我們提供了一個能夠讓大多數用戶操作,而又不需要去深入瞭解sql server內部結構、原理的操作平臺,去做一個最好的索引,這就是“索引優化嚮導”.
  說明:
    要想讓sql server建更好的索引,必須要指明:
      A:指明一個服務器以及該服務器中一個數據庫,以及該數據庫中一個或多個表.[因爲索引是對錶而言的]
      B:由於要創建索引,而我們知道創建什麼樣的索引是和所執行的sql語句有關的,所以必須要讓sql server執行一個包括許多sql語句的一個sql腳本文件,我們把它叫工作負荷,爲了讓創建的索引能夠真實的幫助你提高查詢效率,要把與你工作相關的經常執行的sql語句放在一個腳本文件裏面
      C:假設你在使用“優化嚮導”之前已經創建一些索引,那麼你可以選擇讓sql server是保留原有索引還是讓sql server“優化嚮導”通過分析來決定是如何對現在索引進行更正,而增加新的索引.很顯然如果你選擇“要保留現有索引”,也就是說不管你以前的索引做得好還是壞,sql server都不會對你以前的索引提出真實的建議,這也許會使sql server“優化嚮導”沒有辦法提出新的建議,因爲有可能某些確實可以提高查詢效率的的建議是與你以前的索引情況相反的,而你要選擇了“保留了現有索引”,所以不主張保留“現有索引”.
      D:在sql server索引優化嚮導爲你建議了新的索引之後會對以前的索引作一些操作比如:修改或刪除,而創建新建議的索引
      E:同時爲了讓用戶能夠對使用“優化嚮導”之前與使用“優化嚮導”之後的結果作一個對比會給出一個對比列表
        方法:嚮導---------->優化嚮導  
        說明:
          A:優化模式:優化模式決定了“優化嚮導”建議索引的準確性.
            快速:建議的索引最優性不是最好的,但可以節約時間.
            徹底:建議的索引比起“快速”與“適中”而言更準確.
            建議:使用徹底
          B:將要抽樣的工作負荷查詢的數目限制爲指定要抽樣的工作負荷查詢的數目.默認值爲200個查詢.從指定的工作負荷文件中隨機選取查詢.如果設置值超過工作負荷文件中的查詢數,則優化所有查詢.
          C:用於建議索引的最大空間(MB)
           “優化嚮導”建議的所有索引的最大空間(以MB爲單位),默認空間大小是當前數據大小的三倍.
          D:每個索引的最大列數
            指定索引優化嚮導建議的多列索引中的列的最大數.允許的最大值是16,這是默認值.
          E:報表
            A:索引使用報表:給出在使用“優化嚮導”之前與建議之後的每個表中每個索引的使用率和大小.
            B:查詢關係報表:給出在使用“優化嚮導”之前與建義之後每個查詢使用的索引的情況.
            C:優化摘要表:給出在使用“優化嚮導”之後,有多少個索引被優化,刪除了多少個以前的索引,新建了多少建議的索引,優化了多少個查詢,分析的時間.
    試驗:做一個work表:職工號,姓名,性別,年齡,學歷,基本工資.有180萬行.
       在查詢分析器中寫上:
          select * from work where 年齡<25
          select * from work where 基本工資<1500
       保存作爲工作負荷
         分析:不用優化嚮導,要對提高這個查詢效率而設置索引
         討論方法:並按討論的方法在work表創建索引.
         並運行:記下成本.
       通過“優化索引向導”來創建索引
         說明:在運行“優化索引向導”的時候,先後選擇“保留索引”和“不保留索引”,看優化索引向導所提出的建議是否一樣,執行完“優化索引向導”以後,再運行:記下成本.比較兩次的成本. 2004-3-11 08:11
            冒頓
Moderator




積分 236
發貼 136
註冊 2004-2-24
來自 湖北武漢
狀態 離線 transact ---sql查詢基礎
1:select語句最簡單的用法.
2:where子句的用法.
3:用in,not in和between關鍵字來縮小查詢範圍.
4:用like子句來實現模糊查詢.
5:用order by子句來爲結果排序.

A:select 語句最簡單的用法
    work表:職工號,姓名,性別,年齡,學歷,職稱,基本工資
     A:簡單的select查詢格式:select 列名[1..n] from 表名 [從一個表中有選擇性的查看某些列,而不是全部]
       比如:select 職工號,姓名,學歷,基本工資 from work [從work表中檢索出職工號,姓名,學歷,基本工資的信息]
     B:select * from 表名 [從表中檢索出全部的列]
     C:可以使用select語句進行無數據源查詢,就是查詢的不是表,而是系統變量.
       比如:select @@version[獲得版本],select @@language [獲得sql server使用的語言]
     D:使用top關鍵字.
       作用:用於只返回前面一定數量的數據.
       用法:1):top n值:返回一個表中前n行的數據.
            2):top n值 percent[返回一個表中百分之n的結果] 格式:必須緊跟在select的後面,所有列前面
                比如:1:select top 10 職工號,姓名,學歷 from work[從work表中返回前10行職工號,姓名,學歷等信息]
                       [不要寫成:select 職工號,姓名,學歷 top 10 from work]
                     2:select top 10 percent * from work [從work表中返回前10%的記錄]              
                     3:使用計算列 [score表:姓名,語文,數學,化學]
                       比如:select 姓名,語文,數學,化學,語文+數學+化學 from score [會顯示無列名]
                       或:select *,語文+數學+化學 from score
                     說明:可以在計算列上加上as指定列名,爲計算列指定列名
                          可以計算列上使用:+,-,*,/,%[取餘],或字符連接字符“+”
                     比如:select /'職工號: /'+職工號+/'姓名:/'+姓名+/'性別 /'+性別 from work
     E:使用distinct[種類]
       作用:返回無重複的行.
              檢索出work表中有多少種學歷
                select 學歷 from work [將會得到重複的值]
                改爲:select distinct 學歷 from work    
                說明:distinct只能用於列名前面,是對整個列進行檢驗.
                比如:select 學歷,distinct 職稱 from work[分析會得到什麼答案]
                只能改成:select distinct 學歷,職稱 from work
                  [則會顯示出學歷,職稱沒有全部都相同的記錄,意義:可以檢索出各學歷各個職稱的分佈情況]
     F:操作查詢的列名
       可以根據實際需要對查詢數據的列標題進行修改或者爲沒有標題的列增加標題.對列名進行操作有三種方式:  
             1):原列名 新列名
                比如:select 職工號 /'職工編號/'(或職工編號),姓名,學歷 from wrok[對已經存在的列名進行標題操作]
                再如:select *,語文+數學+化學 總分 from score[對沒有標題的列增加標題]
             2):用“=”號  格式:新列名=舊列名
             3):用as關鍵字 格式:舊列名 as 新列名
             說明:
                1:當使用中文列名時,可以不加引號.
                2:當使用的英文列名中當中有空格時,必須加上引號或者中括號.
                3:可以在一個表達式中同時使用上述的三種方法:
                  比如:select 職工號 as 職工編號,姓名 員工姓名,員工年齡=年齡 from work

B:where 子句的用法
    使用select語句可以對錶中的列進行取捨,而不能對錶中的行進行取捨,而使用where子句可以對錶的行進行篩選
      比如:1:從work中檢索出所有年齡大於25歲的職工.
             select * from work where 年齡>25
           2:從work中檢索出所有年齡在20與40之間的職工.
             select * from work where 年齡>25 and 年齡<40
           3:從work中檢索出學歷是本科和大專的職工.
             select * from work where 學歷=/'本科/' or 學歷=/'大專/'
      說明:在where中可以運用關係運算符和邏輯運算符
              關係運算符: >,>=,<,<=,=,<>等.
              邏輯運算符:and or not
           比如:檢索出學歷是本科,大專,中專的職工.
             select * from work where not 學歷=/'中專/'

C:使用in 或 not in,between  and
        in:表示位於集合裏面.
        not in:表示不位於集合裏面.
        between and:表示在兩者之間 [格式:列 between 上界值 and 下界值]
       舉例:
          1:檢索出work表學歷是大專,本科的職工.
             select * from work where 學歷 in(/'大專/',/'本科/') [注意引號不能少]
          2:檢索出職稱經理,廠長,文員的職工. [假定職稱只有:經理,廠長,文員,主管,祕書]          
             select * from work where 職稱 not in(/'主管/',/'祕書/')
          3:檢索出年齡在20到40之間的職工.
             select * from work where 年齡 between 20 and 40

D:使用like子句進行模糊查詢.
  說明:like子句中的查詢條件通過與通配符一起使用.sql server爲我們提供了以下四種作用的通配符.
       A:%(百分號)表示0個或多個任意字符.
       B:_(下劃線):表示單個的任意字符.
       C:[]表示方括號裏面列出的任意一個字符.
       D:[^]表示任意一個沒有在方括號裏面列出的字符.
      舉例:
          1:檢索出姓張或姓李的人.
              select * from work where 姓名 like /'張%/' or 姓名 like /'王%/'
              或者:select * from work where 姓名 like /'[張王]%/'
          2:檢索出姓名爲兩個字的職工.
              select * from work where 姓名 like /'__/'
          3:檢索出姓名爲三個字符且第二個字符爲“小”的職工.
              select * from work where 姓名 like /'_小_/'
          4:檢索姓名爲二個字或三個字的職工.[假設沒有姓名爲四個字的職工]
              select * from work where 姓名 like /'__/' or 姓名 like /'___/'
              或者:select * from work where len(姓名 ) in (2,3)
          5:檢索出姓爲“張、黃、劉”的職工.
              select * from work where 姓名 like /'[張黃劉]%/'
          6:檢索出既不姓“劉”與不姓“張”的職工.
              select * from work where 姓名 like /'[^張劉]%/'
          7:假設work表中有基本工資等級字段取值可以從A--Z的任意字符.要檢索出工資等級爲A到G之間的職工.
              1:select * from work where 基本工資等級=/'A/' or 基本工資等級=/'B/'...or 基本工資等級=/'G/'
              2:select * from work where 基本工資等級 in (/'A/',/'B/',/'C/'.../'G/')
              3:select * from work where 基本工資等級 like /'[A-G]/'
                說明:可以用方括號和連字符“-”來指定一個範圍.
                再如:select * from work where 年齡 like /'2[1-5]/'
                     檢索出年齡在21到25之間的職工.

E:轉義字符的使用:
  使用通配符可能會產生這樣的問題,萬一查詢的字符中包括了通配符作爲字符串的一部分,該如何處理,transact-sql爲我們提供的轉義字符可以解決這個問題: 用關鍵字escape.
    用法:凡是遇到escape後第一個字符,表示通配符的字符僅作普通字符處理.
    舉列:1:檢索出轉義字符表b列中包括“%”字符的所有記錄
           select * from 轉義字符 where b like %A%% escape /'A/'
         2:檢索出轉義字符表b中以“c]/'”結尾的記錄
           select * from 轉義字符 where b like /'%c]/'/'/'  
             說明:在sql中“/'/'”纔算“/'”

F:用order by子句來排序.
  說明:可以用order by子句來爲查詢之後的結果來排序.需要注意的是:執行該查詢之後,雖然顯示在用戶面前是排好序的列,但它不會改變原表的排列情況
  格式:order by 列名 asc|desc
  說明:1:對一個列指定排序次序時,默認爲升序(asc),如果要特別指明降序必須指明desc關鍵字.
        比如:檢索出所有職工,並按基本工資降序排序.
             select * from work order by 基本工資 desc  
      2:一般情況都是對一個列進行排序,也可對多個列進行排序,此時只寫一個order by就行了,列與列之間用逗號隔開        
        比如:檢索出所有職工,先按年齡降序排序,年齡相同再按基本工資升序排序.
             select * from work order by 年齡 desc,基本工資[asc]
        注意:select * from work order by 基本工資 desc,年齡[asc] 完全不一樣.
      3:可以使用列的序號來進行排序列的指定.
        比如:select 職工號,姓名,年齡,基本工資 order by 4 desc [4:表示“基本工資”的位置]
      4:可以根據未曾出現在select列表中的值進行排列.
        比如:select 職工號,姓名,職稱 from work order by 基本工資 [基本工資並沒有出現在select中]
      5:如果有where子句則order by必須放在where的後面.
        比如:按基本工資的降序檢索性別是男的所有職工.
             select * from work where 性別=/'男/' order by 基本工資 desc
             select * from work order by 基本工資 desc where 性別=/'男/' [錯錯錯錯]
      6:order by子句後面是排序的列,也可是計算列,支持別名.
        比如:檢索出score表中所有同學的總分並按總分升序排序
             select 姓名,語文+數學+化學 as 總分 from score order by 總分




--  作者:hanzhufeng
--  發佈時間:2004-8-29 10:17:25

--  
編輯維護表格數據
1:利用insert語句向表中插入新行.
2:利用update語句實現表中數據的修改.
3:利用delete語句實現表中數據的刪除.

A:使用insert語句向表中添加數據
   格式:insert  表名(列名1,列名2....列名n) values(表達式1,表達式2...表達式n)
   比如:1:insert work(職工號,姓名,性別) values(/'0001/',/'陳小表/',/'男/')
          說明:如果表中沒有被指定的列,其列值爲null,也就是如果沒有被指定列中有不能爲空的列,則插入失敗
        2:“值列表”必須和被指定的列有相同的個數.
        3:可以省略insert裏面的/'列說明/',條件是必須爲表中每一個列提供值.
          比如:insert work values(/'034/',/'陳立/',/'男/',23,/'文員/',/'經理/',1400)  不能少,否則會發生錯誤
        4:注意類型必須能夠相互轉化.
          比如:insert work(職工號,基本工資) values(/'001/',/'abc/')  因爲/'abc/'無法與int型轉換而出錯
          上述語句一次只能插入一行語句,下面的語句一次可以一次性插入多行數據.
          格式:insert 目的表名(目的表列名1...目的表列名n)
               select 源表列名1...源表列名n from 源表名 [where 條件]
          比如:有一空的address表:職工號,姓名,婚否,住址,聯繫方式.現在要把work表中學歷是大專或者本科的職工的職工號和姓名列的值全部都插入address表.
               insert address(職工號,姓名)
               select 職工號,姓名 from work where 學歷 in(/'本科/',/'大專/')

B:利用update實現數據的修改
  格式:update 表名 set 列名1=表達式,列名2=表達式....列名n=表達式 [where 條件]
  比如:1:需要把work表學歷是本科的基本工資提高1%
         update work set 基本工資=基本工資*1.01 where 學歷=/'本科/'
       2:有一個錄取表:姓名,性別,學歷,所學專業,是否有工作經驗,錄取否
         要求把符合:學歷是大專或大專以上的,並且所學專業與計算機相關的,有工作經驗的人錄取.
             update 錄取 set 錄取否=/'是/'
             where 學歷 not in(/'高中/',/'中專/') and 所學專業 like /'%計算機%/' and 有無工作經驗=/'有/'
         說明:1:如果不加條件會更新表中每一行,但只能更新一個表.
              2:可以更新一個表中的多個字段,字段與字段之間用逗號隔開.
              3:可以在update後面使用[from 表名]表示以其中一個表作爲一個條件而去更新另一張表.
                舉例:A:把work銷售部的員工的基本工資加上100.[work,部門表]
                       update work set 基本工資=基本工資+100 from 部門
                       where 部門.部門編號=work.部門編號 and 部門名稱=/'銷售部/'
                     B:更新work表前5條記錄,把基本工資加上100
                       update work set 基本工資=基本工資+100 from (select top 5 * from work) as temp  
                       where temp.職工號=work.職工號

C:使用delete刪除表中的數據
  格式:delete 表名 where 條件 [注意:不要from]
  例如:刪除work表職稱是“經理”的職工
       delete work where 職稱=/'經理/'
  說明:如果省略where條件則刪除表中的所有記錄
  例如:delete work [刪除work表的全部記錄]
       可以加上[from 表名 where 條件],這樣是以後面一個表作條件來刪除前面一個表相應的記錄.
  比如:delete work from 部門
       where work.部門編號 not in(select 部門編號 from 部門)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章