- SQL Server 2016 從入門到實戰(視頻教學版)
- 孫亞男
- 4354字
- 2019-12-12 17:28:45
4.1 數據表概述
數據表是數據庫中最基本的操作對象,通常說的把數據存放在數據庫中其實就是存放在數據庫中的一張張數據表中。數據表中的數據按照行和列的規則來進行數據存儲,每一行為一條數據記錄,一條數據記錄是由多個字段的描述信息組成的。每一列稱為一個字段,列的標題稱為字段名,它們都具有相同的描述信息,如數據類型、字段大小等。一系列行和列的合集稱為域。
在具體的學習過程中,讀者可以把數據庫理解為一個記錄本,數據表就是其中的每一頁紙。一個數據庫數據內容的多少其實并不是指這本記錄本有多大多厚,而是指每一頁紙張記錄的內容有多少。
數據表的主要作用是存儲各類數據信息,由行和列組成。例如,有一張記錄了員工信息的employee表,每一個字段就是用來描述員工的一個特定類型信息,比如姓名,每一行則包含用于描述某一員工的所有信息:工號、姓名、性別、學歷,這些信息的集合稱為一條記錄,如表4.1所示。
表4.1 employee表的結構

4.1.1 SQL Server 2016基本數據類型
數據雖然是用戶存儲數據的基本依據,用于設置保存數據的基本類型。SQL Server 2016中支持多種數據類型的設置,包括字符型、數值型、日期型等。數據類型的作用在于規劃每個字段所存儲的數據內容類別和數據存儲量的大小,合理地分配數據類型可以達到優化數據表和節省空間資源的效果。
SQL Server 2016數據庫管理系統中的數據類型分為兩類:一類是系統提供給用戶使用的默認數據類型,稱為基本數據類型;另一類是用戶自定義的數據類型。下面先介紹基本數據類型的內容。
1.整數類型
整數類型是SQL Server 2016中常用的數據類型之一,主要用于存儲整數值,如存放“年齡”“工齡”等信息,數值型的數據可以直接進行運算處理。具體來說,SQL Server 2016的整數類型包含如下4種:
(1)INT(INTEGER)
INT(或INTEGER)的存儲容量為4個字節,其中一個二進制位表示正負符號,一個字節8位。根據字節大小,用戶可以算出它所能存儲的數據容量為31位,用于存儲-231~231-1內所有的整數。
(2)SMALLINT
SMALLINT的存儲量為2個字節,其中一個二進制位表示正負符號,剩余的15位用來存儲數據內容,用于存儲-215~215-1內所有的整數。
(3)TINYINT
TINYINT只占用一個字節存儲空間,用于存儲0~255的所有整數。
(4)BIGINT
BIGINT是所有整數類型中存儲量最大的,存儲容量達到8個字節,用于存儲-263~263-1中所有的整數。
2.浮點數據類型
浮點數據類型用于存儲十進制的小數。浮點類型的數值在SQL Server 2016中使用了上舍入(或稱只入不舍)的方法進行存儲,當且僅當要舍入的是一個非零整數時,對其保留數字部分的最低有效位上的數值加1,并進行必要的進位。SQL Server 2016的浮點數據類型包含如下3種:
(1)REAL
REAL類型的存儲空間為4個字節,可精確到第7位小數,其范圍為-3.4E+38~3.40E+38。
(2)FLOAT
FLOAT數據類型是一種近似數值類型,供浮點數使用。浮點數是近似的,是因為在其范圍內不是所有的數都能精確表示。浮點數可以是從-1.79E+308~1.79E+308的任意數。
(3)DECIMAL
DECIMAL數據類型提供浮點數所需要的實際存儲空間,能用來存儲從-1038-1~1038-1的固定精度和范圍的數值型數據。使用這種數據類型時,必須指定范圍和精度。范圍是小數點左右所能存儲的數字的總位數,精度是小數點右邊存儲的數字的位數。例如,DECIMAL(13 3)表示共有13位,其中整數10位、小數3位。
3.字符類型
字符類型同樣是SQL Server 2016中常用的數據類型,可用于存儲漢字、符號、英文、標點符號等,數字同樣可以作為字符類型來存儲。SQL Server 2016的字符類型包含如下4種:
(1)CHAR
CHAR數據類型用來存儲指定長度的定長非統一編碼型的數據。當定義一列此類型的數據時,用戶必須指定列長。當用戶知道要存儲的數據的長度時,此數據類型就較為適用。例如,當一個字段要用于存儲手機號碼時,需用到11個字符,CHAR類型默認為存儲一個字符,最多可存儲8000個字符。
(2)VARCHAR
VARCHAR數據類型與CHAR類型一樣,用來存儲非統一編碼型字符數據。與CHAR型不一樣的是,此數據類型為變長。當定義一列該數據類型的數據時,用戶要指定該列的最大長度。它與CHAR數據類型最大的區別是,存儲的長度不是列長,而是數據的長度。
(3)NCHAR
NCHAR數據類型用來存儲定長統一編碼字符型數據。統一編碼用雙字節結構來存儲每個字符,而不是用單字節(普通文本中的情況)。它允許大量地擴展字符。此數據類型能存儲4000種字符,使用的字節空間上增加了一倍。
(4)NVARCHAR
NVARCHAR數據類型是一種變長類型的字符型數據,具有統一的編碼方式。此數據類型能存儲4000種字符,使用的字節空間增加了一倍。
4.日期和時間類型
(1)DATE
DATE類型用于存儲常用日期,該類型占3個字節的存儲空間,數據的存儲格式為YYYY-MM-DD。
● YYYY:表示日期的年份,取值范圍為0001~9999。
● MM:表示日期中的月份,取值范圍為01~12。
● DD:表示日期中的某一天,取值范圍為01~31。
(2)TIME
TIME類型用于存儲一天當中的某一個時間,該類型占5個字節的存儲空間,數據的存儲格式為HH:MM:SS[.NNNNNNN]。
● HH:表示存儲時間的小時位,取值范圍為0~23。
● MM:表示存儲時間的分鐘位,取值范圍為0~59。
● SS:表示存儲時間的秒位,取值范圍為0~59。
● N:表示存儲時間秒的小數位,取值范圍為0~9999999。
(3)DATETIME
DATETIME數據類型用來表示日期和時間。這種數據類型存儲從1753年1月1日到9999年12月3 1日的所有日期和時間數據,精確到三百分之一秒或3.33毫秒,該類型占用8個字節的存儲空間。
(4)DATETIME 2
DATETIME 2是從SQL Server 2008版本以后支持的新日期類型,是DATETIME的擴展。相比于DATETIME,DATETIME 2所支持的日期從0001年01月01日到9999年12月31日,時間精度為100納秒,占用6~8字節的存儲空間。
(5)SMALLDATETIME
SMALLDATETIME類型與DATETIME類型相似,只是它所支持的日期范圍更小,從1900年1月1日到2079年6月6日,占用4字節的存儲空間。
5.文本和圖形數據類型
(1)TEXT
TEXT數據類型用于存儲大容量的文本數據,它的理論容量為231-1(2 147 483 674)個字節,在實際使用TEXT類型時需要注意硬盤容量。
(2)NTEXT
NTEXT數據類型與TEXT類型相似,不同的是NTEXT類型采用UNICODE標準字符集(Character Set),因此其理論容量為230-1(1 073 741 823)個字節。
(3)IMAGE
IMAGE數據類型用于存儲大量的二進制數據,理論容量為231-1(2 147 483 647)個字節。其存儲數據的模式與TEXT數據類型相同。通常用來存儲圖形等(OLE Object Linking and Embedding,對象連接和嵌入)對象。
在未來的Microsoft SQL Server版本中將不再使用TEXT、NTEXT和IMAGE數據類型,為了避免在開發過程中出現問題,最好不要使用,可以使用nvarchar(max)、varchar(max)和varbinary(max)代替。
6.貨幣數據類型
(1)MONEY
MONEY數據類型用于存儲貨幣值,存儲范圍是-922 337 203 685 477.5808~+922 337 203 685 477.5807,占用8個字節的存儲空間。
(2)SMALLMONEY
SMALLMONEY與MONEY數據類型的作用一致,只是取值范圍更小,取范圍是-214 748.3648~214 748.3647,占用4個字節的存儲空間。
7.位數據類型
bit在SQL Server 2016中稱為位數據類型,取值范圍是0或1。bit類型常用于邏輯判斷,TRUE為1,FALSE為0。
8.二進制數據類型
(1)BINARY
BINARY(N)是一個固定長度為N字節的二進制數據類型,存儲范圍由N來決定,N的取值范圍為1~8000,存儲空間為N字節。為了表示二進制數據,在輸入時需在數據前面加上0X作為二進制標識,例如輸入0XBB4代表BB4。
(2)VARBINARY
VARBINARY數據類型用來存儲可達8000字節長的變長的二進制數據。當輸入表的內容大小可變時,應該使用這種數據類型。
9.其他數據類型
(1)ROWVERSION
在SQL Server 2016中,每一次對數據表的更改,SQL Server都會更新一個內部的序列數,這個序列數就保存在ROWVERSION字段中。所有ROWVERSION列的值在數據表中是唯一的,并且每張表中只能有一個包含ROWVERSION字段的列存在。
使用ROWVERSION作為數據類型的列,其字段本身的內容是無自身含義的,這種列主要是作為數據是否被修改過、更新是否成功的作用列。
(2)TIMESTAMP
TIMESTAMP時間戳數據類型和ROWVERSION有一定的相似性,每次插入或更改包含TIMESTAMP的記錄時,TIMESTAMP的值就會更新,一張表中只能有一個TIMESTAMP列。在創建表時只需提供數據類型即可,不需要為TIMESTAMP所在的數據列提供列名:
CREATE TABLE TestTable1(PriKey int PRIMARY KEY, timestamp)
使用ROWVERSION時不具備這種特性,如果要為某一列指定為ROWVERSION數據類型,需聲明列名:
CREATE TABLE TestTable2(PriKey int PRIMARY KEY, VeCol rowversion)
(3)UNIQUEIDENTIFIER
全局唯一標識符GUID,一般用作主鍵的數據類型,是由硬件地址、CPU標識、時鐘頻率所組成的隨機數據,在理論上每次生成的GUID都是全球獨一無二、不存在重復的。通常在并發性較強的環境下可以考慮使用。它的優點在于全球唯一性、可對GUID值隨意修改,但是缺點也很明顯,檢索速度慢、編碼閱讀性差。
(4)CURSOR
游標數據類型,該類型的數據用來存放數據庫中選中所包含的行和列,只是一個物理地址的引用,并不包含索引,用于建立數據集。
(5)SQL_VARIANT
用于存儲SQL Server 2016支持的各種數據類型(不包括TEXT、NTEXT、IMAGE、TIMESTAMP和SQL_VARIANT)的值。
在微軟后續的SQL版本中將不再使用TIMESTAMP數據類型,請避免使用。已使用的請修改設計,避免出現問題。
4.1.2 用戶自定義數據類型
在SQL Server 2016中,除了系統提供的基本數據類型外,用戶還可以根據自己的需求自定義數據類型。這里要注意的是,用戶自定義數據類型并不是完全按照自己的意愿憑空創造,而是建立在系統的基礎數據類型之上。用戶在自定義數據類型的時候需要指定該類型的名稱、所基于的基礎數據類型是否可以為空等。在SQL Server 2016中可以使用兩種方法來創建自定義數據類型,下面分別對這兩種方法進行介紹。
1.使用資源管理器創建
首先連接SQL Server 2016服務器,創建一個用于測試的數據庫test,配置參數使用系統默認的即可。創建自定義數據類型的操作步驟如下:
步驟01 數據庫創建成功后,依次單擊【test】|【可編程性】|【類型】節點,在【類型】節點打開之后可以看到【用戶定義數據類型】節點,右擊此節點,在彈出的快捷菜單中選擇【新建用戶定義數據類型】命令,如圖4.1所示。

圖4.1 選擇【新建用戶定義數據類型】命令
步驟02 在彈出的【新建用戶定義數據類型】對話框中,可以對一些常用的參數進行設置:【名稱】用于標識用戶定義新數據類型的名字,在這里定義的新數據類型名為MyNewType;在【數據類型】下拉列表中選擇nchar類型;將【長度】設置為4000;如果該字段能夠為空,可以選中【允許NULL值】復選框,如圖4.2所示。

圖4.2 設置自定義數據類型
步驟03 所需的參數都輸入完成之后,單擊【確定】按鈕就完成了自定義數據類型的設置,可以通過展開【用戶定義數據類型】節點看到,如圖4.3所示。

圖4.3 建立好的自定義數據類型
數據庫正在使用的用戶自定義數據類型不能被刪除。
2.使用T-SQL語句創建
在SQL Server 2016中除了能夠使用管理器創建自定義類型之外,還可以通過存儲過程提供的sp_addtype語句來創建,語法規則如下:
sp_addtype[@typename=] type, [@phystype=] system_data_type [,[@nulltype=]'null_type'] [,[@owner=]'owner_name']
【參數解釋】
● [@typename=]type:創建自定義類型的名稱。
● [@phystype=] system_data_type]:該類型所依附的基本數據類型。
● [@nulltype=]'null_type':指定該數據類型的空屬性,其值可為null、not null、nonull。
【例4-1】創建一個自定義數據類型——ZipCode郵編地址類型,操作步驟如下。
步驟01 在對應的數據庫中創建一個查詢,在彈出的查詢編輯器中輸入如圖4.4所示的代碼。

圖4.4 在查詢編輯器中輸入代碼
步驟02 代碼編輯完成后,單擊【執行】按鈕。執行成功后,右擊【用戶定義數據類型】,在彈出的快捷菜單中選擇【刷新】命令,可以看到數據類型已創建成功,如圖4.5所示。

圖4.5 新建用戶定義數據類型
用戶定義的數據類型基于在Microsoft SQL Server中提供的數據類型。當幾個表中必須存儲同一種數據類型,并且為保證這些列有相同的數據類型、長度和可控性時,可以使用用戶定義的數據類型。
- JBoss Weld CDI for Java Platform
- Boost程序庫完全開發指南:深入C++”準”標準庫(第5版)
- C# 2012程序設計實踐教程 (清華電腦學堂)
- R語言數據可視化之美:專業圖表繪制指南
- Mastering Ubuntu Server
- 編寫高質量代碼:改善C程序代碼的125個建議
- Rust Essentials(Second Edition)
- Learning JavaScript Data Structures and Algorithms
- 第一行代碼 C語言(視頻講解版)
- Processing創意編程指南
- Microsoft 365 Certified Fundamentals MS-900 Exam Guide
- Oracle實用教程
- 玩轉.NET Micro Framework移植:基于STM32F10x處理器
- Visual Basic程序設計全程指南
- Kotlin進階實戰