3.1 表結構和數據類型數據庫
3.1.1 表和表結構express
每一個數據庫包含了若干個表。表是SQL Server中最主要的數據庫對象,它是用來存儲數據的一種邏輯結構。表由行和列組成,所以也稱爲二維表。表是在平常工做和生活中常用的一種表示數據及其關係的形式,表3.1就是用來表示學生狀況的一個學生表。架構
下面簡單介紹與表有關的幾個概念:編輯器
(1)表結構。組成表的各列的名稱及數據類型,統稱爲表結構。post
(2)記錄。每一個表包含了若干行數據,它們是表的「值」,表中的一行稱爲一個記錄。所以,表是記錄的有限集合。spa
(3)字段。每一個記錄由若干個數據項構成,將構成記錄的每一個數據項稱爲字段。例如,表3.1中表結構爲(學號,姓名,性別,出生時間,專業,總學分,備註),包含7個字段,由5個記錄組成。對象
(4)空值。空值(NULL)一般表示未知、不可用或將在之後添加的數據。若一個列容許爲空值,則向表中輸入記錄值時可不爲該列給出具體值;而一個列若不容許爲空值,則在輸入時必須給出具體值。blog
(5)關鍵字。若表中記錄的某一字段或字段組合能惟一標識記錄,則稱該字段或字段組合爲候選關鍵字(Candidate key)。若一個表有多個候選關鍵字,則選定其中一個爲主關鍵字(Primary key),也稱爲主鍵。當一個表僅有惟一的一個候選關鍵字時,該候選關鍵字就是主關鍵字。這裏的主關鍵字與第1章中的主碼所起的做用是相同的,都用來惟一標識記錄行。索引
例如,在學生表中,2個及其以上記錄的姓名、性別、出生時間、專業、總學分和備註這6個字段的值有可能相同,可是「學號」字段的值對錶中全部記錄來講必定不一樣,即經過「學號」字段能夠將表中的不一樣記錄區分開來。因此,「學號」字段是惟一的候選關鍵字,學號就是主關鍵字。再例如,學生成績表記錄的候選關鍵字是(學號,課程號)字段組合,它也是惟一的候選關鍵字。ci
3.1.2 數據類型
列的數據類型能夠是SQL Server提供的系統數據類型,也能夠是用戶定義的數據類型。SQL Server 2008提供了豐富的系統數據類型,現將其列於表3.2中。
表3.2 系統數據類型表
在討論數據類型時,使用了精度、小數位數和長度3個概念,前兩個概念是針對數值型數據的,它們的含義以下。
下面分別說明經常使用的系統數據類型。
1.整數型
整數型包括bigint、int、smallint和tinyint,從標識符的含義就能夠看出,它們的表示數範圍逐漸縮小。
bigint:大整數,數範圍爲-263~263-1,其精度爲19,小數位數爲0,長度爲8字節。
int:整數,數範圍爲-231~231-1,其精度爲10,小數位數爲0,長度爲4字節。
smallint:短整數,數範圍爲-215~215-1,其精度爲5,小數位數爲0,長度爲2字節。
tinyint:微短整數,數範圍爲0~255,長度爲1字節,其精度爲3,小數位數爲0,長度爲1字節。
[19/2]=10 10/2=5 [5/2]=3
2.精確數值型
精確數值型數據由整數部分和小數部分構成,其全部的數字都是有效位,可以以完整的精度存儲十進制數。精確數值型包括decimal 和 numeric兩類。在SQL Server 2008中,這兩種數據類型在功能上徹底等價。
聲明精確數值型數據的格式是numeric | decimal(p[,s]),其中,p爲精度,s爲小數位數,s的默認值爲0。例如,指定某列爲精確數值型,精度爲6,小數位數爲3(最少保留多少位,整數少了可給小數),即decimal(6,3),那麼當向某記錄的該列賦值56.342 689時,該列實際存儲的是56.3427。
decimal和numeric可存儲–1038 +1~1038 –1 的固定精度和小數位的數字數據,它們的存儲長度隨精度變化而變化,最少爲5字節,最多爲17字節。
例如,如有聲明numeric(8,3),則存儲該類型數據需5字節;而如有聲明numeric(22,5),則存儲該類型數據需13字節。
3.浮點型
浮點型也稱近似數值型。顧名思義,這種類型不能提供精確表示數據的精度,使用這種類型來存儲某些數值時,可能會損失一些精度,因此它可用於處理取值範圍很是大且對精確度要求不過高的數值量,如一些統計量。
有兩種近似數值數據類型:float[(n)]和real,二者一般都使用科學計數法表示數據,即形爲尾數E階數,如5.6432E20,–2.98E10,1.287659E-9等。
real:使用4字節存儲數據,表數範圍爲–3.40E + 38~3.40E + 38,數據精度爲7位有效數字。
float:float型數據的數範圍爲–1.79E+308~1.79E+308。定義中的n取值範圍是1~53,用於指示其精度和存儲大小。當n在1~24之間時,實際上將定義一個real型數據,存儲長度爲4字節,精度爲7位有效數字。當n在25~53之間時,存儲長度爲8字節,精度爲15位有效數字。當省略n時,表明n在25~53之間。
數據定義:指對數據庫對象的定義、刪除和修改操做。
數據庫對象主要包括數據表、視圖、索引等。
數據定義功能經過CREATE、ALTER、DROP語句來完成。
按照操做對象分類來介紹數據定義的SQL語法。
數據表是關係模式在關係數據庫中的實例化,是數據庫中惟一用於存儲數據的數據庫對象,它是整個數據庫系統的基礎。建立數據表是數據庫創建的重要組成部分,由SQL語言中的CREATE TABLE語句來完成,其語法格式以下:
CREATE TABLE [schema_name.]table_name(
column1_name data_type [integrality_condition_on_column]
[,column2_namedata_type [integrality_condition_on_column]]
…
[, integrality_condition_on_TABLE]);
所涉及參數說明以下:
tanble_name爲所定義的數據表的名稱,即表名。在一個數據庫中表名必須惟一,並且表名應該可以歸納該數據表保存數據所蘊涵的主題。
schema_name爲表所屬的架構的名稱。自SQL Server 2008開始,每數據庫對象都屬於某一個架構,若是在定義時不指定架構,則使用默認架構dbo。關於架構的做用和意義將在第12章中介紹。
column1_name、column2_name表示字段名,或者稱字段名。在一個表中,字段名也必須惟一,最好可以歸納該字段的含義。
data_type表示數據類型。根據須要,它能夠設置爲上節介紹的數據類型中某一種。
integrality_condition_on_column表示字段級的完整性約束條件。這些約束條件只對相應的字段起做用,其取值以下:
NOT NULL:選取該條件時,字段值不能爲空。
DEFAULT:設定字段的默認值,設置格式爲:DEFAULT constant,其中constant表示常量。
UNIQUE:選取該條件時,字段值不能重複。
CHECK:用於設置字段的取值範圍,格式爲:CHECK(expression),其中expression爲約束表達式。
PRIMARY KEY:選取該條件時,相應字段被設置爲主碼(主鍵)。
FOREIGN KEY:選取該條件時,相應字段被設置爲外碼(外鍵)。外碼的設置涉及到兩個表,其格式以下:
FOREIGN KEY column_name REFERENCES
foreign_table_name(foreign_column_name)
integrality_condition_on_TABLE表示表級的完整性約束條件。
與integrality_condition_on_column不一樣的是,integrality_condition_on_column僅僅做用於其對應的字段,而不能設置爲同時做用於多個字段;integrality_condition_on_TABLE則能夠做用多個字段或整個數據表。
上述的約束條件中,除了NOT NULL和DEFAULT之外,其餘的約束條件均可以在integrality_condition_on_TABLE中定義,使它們同時做用多個字段。凡是涉及到多個字段的約束條件都必須在integrality_condition_on_TABLE中定義。
注意: 由兩個字段組成的主碼必須利用PRIMARY KEY在
integrality_condition_on_TABLE中定義。
SQL語言對大小寫不敏感。
【例5.1】 表5.8給出了學生信息表(student)的基本結構。表中列出了全部的字段名及其數據類型和約束條件。
根據上述介紹的內容,咱們不難構造出下列的CREATE TABLE語句,用於建立本例設定的學生信息表student:
CREATE TABLE student(
s_no char(8) PRIMARY KEY,
s_name char(8) NOT NULL,
s_sex char(2) CHECK(s_sex = '男' OR s_sex = '女'),
s_birthday smalldatetimeCHECK(s_birthday>='1970-1-1' AND
s_birthday<='2000-1-1'),
s_speciality varchar(50) DEFAULT '計算機軟件與理論',
s_avgrade numeric(3,1) CHECK(s_avgrade >= 0 AND s_avgrade <= 100),
s_dept varchar(50) DEFAULT '計算機科學系'
);
本書涉及的SQL代碼都是在SQL Server Management Studio(簡稱SSMS)中的SQL代碼編輯器中執行。
【例子】 圖5.1是執行上述CREATE TABLE語句來建立表student時的界面。
在以上的CREATE TABLE語句中,約束條件都是在字段級的完整性約束定義上實現的。實際上也能夠在表級的完整性約束定義上實現上述的部分或所有約束條件。
下列的CREATE TABLE語句等價於上述語句:
CREATE TABLE student(
s_no char(8) ,
s_name char(8) NOT NULL,
s_sex char(2) ,
s_birthday smalldatetime,
s_speciality varchar(50) DEFAULT '計算機軟件與理論',
s_avgrade numeric(3,1) CHECK(s_avgrade >= 0 AND s_avgrade <= 100),
s_dept varchar(50) DEFAULT '計算機科學系',
PRIMARY KEY(s_no),
CHECK(s_birthday>='1970-1-1' AND s_birthday<='2000-1-1'),
CHECK(s_sex ='男' OR s_sex ='女')
);
當涉及到多字段的約束條件時,則必須使用表級的完整性約束定義來實現。
若是須要將字段s_name和字段s_birthday設置爲主鍵,則必須經過表級的完整性約束定義來實現,相應的語句以下:
CREATE TABLE student(
s_no char(8) ,
s_name char(8) NOT NULL,
s_sex char(2) CHECK(s_sex = '男' OR s_sex = '女'),
s_birthday smalldatetimeCHECK(s_birthday>='1970-1-1' AND s_birthday<='2000-1-1'),
s_speciality varchar(50) DEFAULT '計算機軟件與理論',
s_avgrade numeric(3,1) CHECK(s_avgrade >= 0 AND s_avgrade <= 100),
s_dept varchar(50) DEFAULT '計算機科學系',
PRIMARY KEY(s_name, s_birthday)
);
【例5.2】 表5.9給出了導師信息表(supervisor)的基本結構,其中c_hour表示導師的工做量,其取值由其指導的學生數量s_n肯定:每指導一位學生計15個課時。
根據上述要求,用AS將c_hour定義爲計算列,結果CREATE TABLE語句代碼以下:
CREATE TABLE supervisor(
t_noint PRIMARY KEY,
t_namevarchar(8) NOT NULL,
s_nint NOT NULL CHECK(s_n>=0 and s_n<=20),
c_hour AS s_n*15
);
當數據表已經確認不須要時,可將其刪除。刪除格式以下:
DROP TABLE table1_name [,table2_name,…];
【例子】 刪除以上建立的表student,可用下列的SQL語句:
DROP TABLE student;
當一個數據表被刪除時,其中的數據也將所有被刪除。在使用刪除語句的時候要特別慎重。
數據表的修改是指對數據表結構的修改,包括修改字段名和完整性約束條件、增長和刪除字段等。這些操做主要由ALTER TABLE語句來完成。
(1)增長字段
在數據表中增長新字段的語法格式爲:
ALTER TABLE table_name
ADD new_column data_type [integrality_condition]
【例5.3】 在表student中增長一個新字段——nationality(民族),其長度爲20個字符。
可由下列語句完成:
ALTER TABLE student
Add nationality varchar(20);
若是要使得新增長的字段爲非空,則可在上述語句後添加「NOT NULL」來完成:
ALTER TABLE student
Add nationality varchar(20) NOT NULL;
但在執行上述語句時,表student必須爲空。
(2)刪除字段
刪除某一個字段的語法格式以下:
ALTER TABLE table_name
DROP COLUMN column_name
【例5.4】 刪除表student中的字段nationality。
能夠用下列語句完成:
ALTER TABLE student
DROP COLUMN nationality
(3)修改字段的數據類型
在數據表中,修改一個字段的數據類型的語法格式以下:
ALTER TABLE table_name
ALTER COLUMN column_name new_data_type
column_name爲待修改的字段,new_data_type爲新的數據類型。
【例5.5】 將表student中的字段s_dept的長度由原來的50改成80。
該要求可下列語句實現:
ALTER TABLE student
ALTER COLUMN s_dept varchar(80);
將字段s_no由原來的字符型改成整型,則可用下列的語句:
ALTER TABLE student
ALTER COLUMN s_no int;