2.1 T-SQL語句回顧sql
在《使用SQL Server管理和查詢數據》中,咱們學習過T-SQL語句,它是Microsoft SQL Server 數據庫對SQL語句的擴展,T-SQL語句的數據操做語法以下。數據庫
1. 添加數據windows
語法:Insert [into] 表名 (字段1,字段2,···) Values (值1,值2,···)安全
其中,Into 可選。服務器
例如: Insert into stuInfo (stuName, stuNo, stuAge) values ('張三', 's25301', 22)antd
2. 修改數據併發
語法:Update 表名 set 字段1 = 值1 , 字段2 = 值2,··· Where (條件)ide
例如:Update StuInfo set stuAge = 24 where stuName = '張三'函數
3. 查詢數據性能
語法:Select 字段1,字段2,··· from 表名 where (條件) Order by 字段名
例如:Select stuName, stuNo from stuInfo where stuAge < 25 Order by stuNo
4. 刪除數據
語法:Delete from 表名 where (條件)
例如:Delete from stuInfo where stuAge < 20
當項目經測試基本知足客戶的需求後,須要部署在客戶的實際環境中試運行。咱們在部署前須要考慮的是,後臺的數據庫如何移植到客戶的計算機中?考慮各類數據庫版本的兼容性,行之有效的辦法就是編寫比較通用的SQL語句,包括建立庫、建立表、添加約束、插入測試數據等。編寫完畢後,存入*.sql文件中,最後複製到客戶的計算機中,並執行*.sql文件中的SQL語句,從而實現後臺數據庫的移植。因此,咱們還須要掌握如何使用SQL語句,實現建立庫、建立表、添加約束和建立登陸帳戶等。
2.2 使用SQL語句建立和刪除數據庫
咱們先簡要回顧一下SQL Server數據庫的基礎知識。
數據庫文件由如下3部分組成。
》》》主數據文件:*.mdf。
》》》次要數據文件:*.ndf。
》》》日誌文件:*.ldf。
其中,次要數據文件庫可選,能夠有多個數據庫文件和日誌文件。
數據庫文件的其餘屬性。
》》》文件存放位置,分配的初始空間,屬於哪一個文件組。
》》》文件的增加設置,能夠按百分比或實際大小指定增加速度。
》》》文件容量設置,能夠指定文件增加的最大值或不受限。
其中,文件組容許對數據文件進行分組,以便於管理和數據的分配/放置。例如,能夠分別在3個硬盤驅動器上建立3個文件(Data1.mdf,Data2.ndf和Data3.ndf),並將這3個文件指派到文件組fgroup1中。而後,能夠明確地在文件組fgroup1中建立一個表。對錶中數據的查詢將分散到3個磁盤上,能夠採用併發查詢,於是性能得以提升。
2.2.1 建立數據表
T-SQL建立數據庫的語法以下:
Creat Database 數據庫名
On [PRIMARY]
(
<數據文件參數>[,···n] [<文件組參數>]
)
[Log on]
(
{<日誌文件參數>[,···n]}
)
文件的具體參數的語法以下。
([Name = 邏輯文件名,]
FileName = 物理文件名
[, Size = 大小]
[, MaxSize = (最大容量 | Unlimited)]
[, Filegrowth = 增加量]) [,···n]
文件組參數的語法以下。
Filegroup 文件組名 <文件參數>[,···n]
其中,「[]」表示可選部分,「{}」表示必需的部分。各參數的含義說明以下。
》》》數據庫名:數據庫的名稱,最長爲128個字符。
》》》Primary:該選項是一個關鍵字,指定主文件組中的文件。
》》》Log on:指明事務日誌文件的明肯定義。
》》》Name:指定數據庫的邏輯名稱,這是在SQL Server系統中使用的名稱,是數據庫在SQL Server中的標識符。
》》》FileName:指定數據庫所在文件的操做系統文件名稱和路徑,該操做系統文件名和Name的邏輯名稱一一對應。
》》》Size:指定數據庫的初始容量大小。
》》》Maxsize:指定操做系統文件能夠增加到的最大尺寸。
》》》Filegrowth:指定文件每次增長容量的大小,當指定數據爲0時,表示文件不增加。
示例一:
建立一個數據文件和一個日誌文件。
Create Database stuDB
on primary --默認就屬於primary主文件組,可省略
(
/*-- 數據文件的具體描述 --*/
Name = 'stuDB_data', --主數據文件的邏輯名稱
filename = 'D:\stuDB_data.mdf', --主數據文件的物理名稱
size = 5mb, --主數據文件的初始大小
Maxsize = 100mb, --主數據文件增加的最大值
Filegrowth = 15%, --主數據文件的增加率
)
Log on
(
/*-- 日誌文件的具體描述,各參數含義同上 --*/
Name = 'stuDB_log',
FileName = 'D:\stuDB_log.ldf',
size = 2mb,
Filegrowth = 1mb
)
go --和後續的SQL語句分隔開
在示例1中建立了學員信息數據庫stuDB,該數據庫的主數據文件邏輯名稱爲stuDB_data,物理文件名稱爲stuDB_data.mdf,初始大小爲5MB,最大尺寸爲100MB,增加速度爲15%。數據庫的日誌文件邏輯名稱爲stuDB_log,物理文件名稱爲stuDB_log.ldf,初始大小爲2MB,增加速度爲1MB。該數據庫存放在D:盤。
示例二:
建立多個數據文件和多個日誌文件。
Create DataBase employees
on Primary
(
/*-- 主數據文件的具體描述 --*/
Name = 'employees1',
FileName = 'D:\employees1.mdf',
Size = 10,
Filegrowth = 10%,
),
(
/*-- 次要數據文件的具體描述 --*/
Name = 'employee2',
FileName = 'D:\employee2.ndf',
Size = 20,
MaxSize = 100,
FileGrowth = 1
)
Log On
(
/*-- 日誌文件1的具體描述 *--/
Name = 'employeelog1',
FileName = 'D:\employeelog1_log.ldf',
Size = 10,
MaxSize = 50,
FileGrowth = 1
)
(
/*-- 日誌文件2的具體描述 *--/
Name = 'employeelog2',
FileName = 'D:\employeelog2_log.ldf',
Size = 10,
MaxSize = 50,
FileGrowth = 1
)
go -- 和後續的SQL語句分隔開
示例2建立了employees數據庫,有1個10MB和1個20MB的數據文件,還有兩個10MB的事務日誌文件。數據文件邏輯名稱爲employee1和employee2,物理文件名稱爲employee1.mdf和employee2.ndf。主文件是employee1,由primary指定,兩個數據文件的最大尺寸分別爲無限大和100MB,增加速度分別爲10%和1MB。事務日誌文件的邏輯名稱爲employeelog1和employeelog2,物理文件名稱爲employeelog1_log.ldf和employeelog2_log.ldf,最大尺寸均爲50MB,文件增加速度均爲1MB。
2.2.2 刪除數據庫
若是SQL Server中已存在stuDB數據庫,再次運行示例1的建立數據庫的語句,就會發現系統提示錯誤:該數據庫已存在,建立失敗。如何解決?
咱們應預先檢測是否存在stuDB數據庫,若是已存在,就應先刪除stuDB數據庫,而後再建立。
刪除數據庫的語法以下。
Drop database 數據庫名
例如:Drop database stuDB
如今的問題是,如何檢測是否存在stuDB數據庫?答案很簡單,SQL Server將數據庫的清單存放在master系統數據庫的sysdatabases表中,只須要查看該表是否存在於該數據庫中就能夠了,因此,示例1完整的T-SQL語句即以下所示。
User master
go
if exists (select * from sysdatabases where name = 'stuDB')
Drop database stuDB
Create database stuDB
···
Exists (查詢語句)檢測某個查詢是否存在。若是查詢語句返回的記錄結果不爲空,則表示存在;不然表示不存在。
2.3 使用SQL語句建立和刪除表
咱們先簡要回顧如下SQL Server中表的基礎知識。
(1)建表的步驟以下。
肯定表中有哪些列。
肯定每列的數據類型。
給表添加各類約束。
建立各表之間的關係。
(2)爲方便查閱,下面列出SQL Server中的數據類型。
類型 | 數據類型 | 描述 |
整型 | int | int 數據類型能夠存儲 -2(31次方)(-2147183648)~2(31次方)---1(2147483647)之間的整數。存儲到數據庫的幾乎全部數值型的數據均可以用這種數據類型。這種數據類型在數據庫中佔用4個字節 |
smallint | smallint 數據類型能夠存儲-2(15次方)(-32768)~2(15次方)---1(32767)之間的整數。這種數據類型對存儲一些常限定在特定範圍內的數值型數據很是有用。這種數據類型在數據庫中佔用兩個字節 | |
tinyint | tinyint 數據類型能夠存儲0~255之間的整數,它在只打算存儲有限數目的數值時頗有用,這種數據類型在數據庫中佔用1個字節 | |
浮點型 | numeric | numeric 數據類型於decimal 型相同 |
real | real 數據類型像浮點數同樣,是近似數值類型。它能夠表示數值在-3.40E+308~1.79E+308之間的任意數 | |
float | float 數據類型是一種近似數值類型,供浮點數使用。說浮點數是近似的,是由於在其範圍內不是全部的數都能精確地表示。浮點數能夠是-1.79E+308~1.79E+308之間的任意數 | |
decimal | decimal 數據類型用來存儲從-10(38次方)~10(38次方)-1的固定精度和範圍的數值型數據。使用這種數據類型時,必須指定範圍和精度。範圍是小數點左右所能存儲的數字的總位數,精度是小數點右邊存儲的數字的位數 | |
字符型 | char | char數據類型用來存儲指定長度的定長非統一編碼型的數據。當定義一列爲此類型時,必須指定列長。當總能知道要存儲的數據的長度時,此數據類型頗有用。例如。當按郵政編碼加4個字符格式來存儲數據時,應知道總要用到10個字符。此數據類型的列寬最大爲8000個字符。 |
varchar | varchar 數據類型同 char 類型同樣,用來存儲非統一編碼型字符數據。與char 類型不同的是,此數據類型爲變長。當定義一列爲該數據類型時,要指定該列的最大長度。它與 char 數據類型最大的區別是,存儲的長度不是列長,而是數據的長度 | |
text | text 數據類型用來存儲大量的非統一編碼型字符數據。這種數據類型最多能夠有2(31次方)-1或20億個字符 | |
Unicode型 | nchar | nchar 數據類型用來存儲定長 Unicode (統一編碼) 字符型數據。Unicode 編碼用雙字節結構來存儲每一個字符,而不是用單字節(普通文本中的狀況)。它容許大量地擴展字符。此數據類型能存儲4000種字符,使用的字節空間增長了一倍 |
nvarchar | nvarchar 數據類型用做變長的 Unicode 編碼字符型數據。這種數據類型能存儲4000種字符,使用的字節空間增長了一倍 | |
ntext | ntext 數據類型用來存儲大量的 Unicode 編碼字符型數據。這種數據類型能存儲 2(30次方)-1 或將近10億個字符。使用的字節空間增長了一倍 | |
是/否型 | bit | bit 數據類型表示是/否值,其值只能是0、1或空值。這種數據類型用於存儲只有兩種可能值的數據,如yes 或 no 、 true 或 false 、 on 或 off。 |
二進制型 | binary | binary 數據類型用來存儲可達8000 字節長的定長的二進制數據。當輸入表的內容接近相同的長度時,應該使用這種數據類型 |
varbinary | varbinary 數據類型用來存儲可達8000 字節長的變長的二進制數據。當輸入表的內容大小可變時,應該使用這種數據類型 | |
image | image 數據類型用來存儲變長的二進制數據,最大可達 2(31次方)-1 或 20億字節 | |
貨幣型 | money | money 數據類型用來表示錢和貨幣值。這種數據類型能夠存儲從-9220 ~ 9220 億之間的數據,能夠精確到貨幣單位的1/10000 |
smallmoney | smallmoney 數據類型用來表示錢和貨幣值。這種數據類型能夠存儲從-214748.3648 ~ 214748.3647 之間的數據,能夠精確到貨幣單位的1/10000 | |
日期時間型 | datetime | datetime 數據類型用來表示日期和時間,這種數據類型存儲從1753年1月1日到9999年12月31日間全部的日期和時間數據,能夠精確到11300秒或3.33毫秒 |
smalldatetime | smalldatetime 數據類型用來表示從1990年1月1日到2079年6月6日間的日期和時間,精確到一分鐘 | |
特殊類型 | timestamp | timestamp數據類型是一種特殊的數據類型,用來建立一個數據庫範圍內的惟一時間戳。一個表中只能有一個timestamp列。每次插入或修改一行時,timestamp列的值都會改變。儘管它的名字中有'time',但timestamp列不是人們可識別的日期。在一個數據庫中,timestamp值是惟一的 |
uniqueidentifier | uniqueidentifier 數據類型用來存儲一個全局的惟一標識符,既GUID.這個數幾乎沒有機會在另外一個系統中被重建,可使用NEWID 函數或轉換一個字符串爲惟一標識符來初始化具備惟一標識符的列 |
2.3.1 建立表
建立表的語法以下:
create table 表名 { 字段1 數據類型 列的特徵, 字段2 數據類型 列的特徵 }
其中,「列的特徵」包括該列是否爲空(NULL)、是不是標識列(自動編號)、是否有默認值、是否爲主鍵等。
考慮各類開發語言的兼容性,表中各字段名稱推薦使用英文縮寫。
示例 3
建立學員信息表 stuInfo
Use stuDB --- 將當前數據庫設置爲stuDB,以便在stuDB數據庫中建立表
Go
Create Table stuInfo( --- 建立學員信息表
stuName varcahr(20) not null, --- 學員姓名,非空(必填)
stuNo char(6) not null, --- 學號,非空(必填)
stuAge int not null, --- 年齡,int類型不用指定大小,默認是4個字節
stuID Numeric(18,0), --- 身份證號,numeric(18,0)表明18位數字,
stuSeat SmallInt Identity(1,1), --- 座位號,自動編號(標識列),從1開始遞增
stuAddress text --- 住址,容許爲空,便可選輸入
)GO
其中,列屬性「Identity」(起始值,遞增量)表示「stuSeat」列爲自動編號,也稱爲標識列。
示例 4
建立學員成績表 stuMarks
create table stuMarks (
examNo char(7) not null,
stuNo char(6) not null,
writtenExam int not null,
labexam int not null
) go
2.3.2 刪除表
同建立數據庫同樣,若是當前數據庫中已存在stuInfo表,再次建立時系統將提示出錯。解決的辦法也同樣。咱們須要預先檢測是否存在該表,若是存在,則先刪除,再建立。
刪除表的語法以下。
Drop table 表名
例如:
Drop table stuInfo
某個數據庫中表的清單又存放在那裏呢?答案是該數據庫的系統表sysobjects,因此上述完整的建立表的語句應以下所示。
User stuDB
go
if exists (select * from sysobjects where name = 'stuInfo')
drop table stuInfo
create table stuInfo (...) go
2.4 使用SQL語句建立和刪除約束
約束的目的是確保表中數據的完整性。
經常使用的約束類型以下。
=== 主鍵約束(Primary key constraint): 要求主鍵列數據惟一,而且不容許爲空。
=== 惟一約束(Unique Constraint): 要求該列惟一,容許爲空,但只能出現一個空值。
=== 檢查約束(Check Constraint): 某列取值範圍限制、格式限制等,若有關年齡的約束。
=== 默認約束(Default Constraint): 某列的默認值,如咱們的男性學員較多,性別默認爲男。
=== 外鍵約束(Foreign key Constraint): 用於在兩表之間創建關係,須要指定引用主表的那一列。
2.4.1 添加約束
在建立表時,咱們能夠在字段後添加各類約束,但通常不這樣混合使用,推薦將添加約束和建立表的語句分開編寫。
添加約束的語法以下。
Alter table 表名
Add constraint 約束名 約束類型 具體的約束說明
上述語法表示修改某個表,添加某個約束。其中,約束名的命名規則推薦採用「約束類型_約束字段」這樣的形式。
例如:
爲學號字段(stuNo)添加的主鍵約束,約束名推薦爲「PK_stuNo」
爲身份證號字段(stuID)添加的惟一約束,約束名推薦取名爲「UQ_stuID」
爲地址字段(stuAddress)添加的默認約束,約束名推薦取名爲「DF_stuAddress」
爲年齡字段(stuAge)添加的檢查約束,約束名推薦取名爲「CK_stuAge」
爲學員成績表字段(stuMarks)添加的外鍵約束,約束名推薦取名爲「FK_stuNo」
示例5
--- 添加主鍵約束(將stuNo做爲主鍵)
Alter table stuInfo
Add Constraint PK_stuNo Primary key (stuNo)
--- 添加惟一約束(身份證號惟一,由於每一個人的身份證號全國惟一)
Alter table stuInfo
Add Constraint UQ_stuID Unique (stuID)
--- 添加默認約束(若是地址不填,默認爲「地址不詳」)
Alter table stuInfo
Add Constraint DF_stuAddress Default ('地址不詳') for stuAddress
--- 添加檢查約束,要求年齡只能在15~40歲之間
Alter table stuInfo
Add Constraint CK_stuAge Check ( stuAge BetWeen 15 and 40)
--- 添加外鍵約束(主表stuInfo和從表stuMarks創建關係,關聯字段爲stuNo)
Alter table stuMarks
Add Constrint FK_stuNo
foreign key(stuNo) references stuInfo (stuNo)
go
2.4.2 刪除約束
若是錯誤地添加了約束,則能夠刪除約束
刪除約束的語法以下
Alter table 表名
Drop Constraint 約束名
例如:刪除stuInfo 表中地址默認約束的語句以下。
Alter table stuInfo
Drop Constraint DF_stuAddress
2.5 使用SQL語句建立登陸
正如一個防衛森嚴的小區,若是要進入本身的房間,須要闖3關。第一關:須要經過小區的門衛檢查,進入小區。第二關:到了所在的單元樓門前,還須要單元門的鑰匙或門鈴密碼。第三關:進了單元門後,還須要本身房間的鑰匙。
咱們回憶如下SQL Server 的3層安全模型,很是相似於小區的3層驗證關口。
=== 第一關:須要登陸到SQL Server系統,即須要登陸帳戶。
=== 第二關:須要防衛某個數據庫(至關於咱們的單元樓),即須要成爲該數據庫的用戶。
=== 第三關:須要訪問數據庫中的表(至關於打開咱們的房間),即須要數據庫管理員DBA給本身受權,如增添、修改、刪除、查詢等權限。
2.5.1 建立登陸帳戶
登陸驗證有如下兩種方式。
SQL 身份驗證:適合於非Windows平臺的用戶或Internet用戶,須要提供帳戶和密碼
Windows身份驗證:適合於Windows平臺用戶,不須要提供密碼,和Windows集成驗證。
因此,咱們建立的登陸帳戶相應有兩種:SQL帳戶和Windows帳戶。
添加Windows登陸帳戶須要調用SQL Server內置的系統存儲過程sp_grantlogin,調用語法以下:
Exec sp_grantlogin 'windows域名/域帳戶'
其中,Exec關鍵字表示調用執行,若是是本機,可用計算機名替換「Windows域名」。關於存儲過程,將在後續章節中講解。
添加SQL登陸帳戶須要調用系統存儲過程sp_addlogin,調用語法以下。
Exec sp_addlogin '帳戶名','密碼'
示例6
--- 添加windows登陸帳戶
Exec sp_grantlogin 'qaz\s123'
--- Windows用戶爲qaz\s123,qaz表示域
--- 添加SQL登陸帳戶
Exec sp_addlogin 'zhangsan','123' --- 帳戶名爲 zhangsan, 密碼爲123
go
2.5.2 建立數據庫用戶
正如您進入了小區,但還不能進入單元門同樣。建立了登陸帳戶,如今能登陸到SQL Server服務器,但還不能訪問某個數據庫。若是但願訪問某個數據庫,必須有「打開」該數據庫的「通關鑰匙」,即須要成爲該數據庫的一個用戶。
建立數據庫用戶須要調用系統存儲過程sp_grantdbaccess,調用語法以下。
Exec sp_grantdbaccess '登陸帳戶', '數據庫用戶'
其中,「數據庫用戶」爲可選參數,默認爲登陸帳戶,即數據庫用戶默認和登陸帳戶同名。
示例7
--- 在stuDB數據庫中添加兩個用戶
User stuDB
go
Exec sp_grantdbaccess 'qaz\s123' , 's123DBUser'
--- s123DBUser 爲數據庫用戶名
Exec sp_grantdbaccess 'zhangsan', 'zhangsanDBUser'
2.5.3 給數據庫用戶受權
數據庫中有不少表,因此,必須讓數據庫管理員DBA給您受權,指定具備訪問哪些表格的哪些權限。經常使用的權限包括添加數據(Insert)、刪除數據(Delete)、更新數據(Update)、查看數據(Select)和建立表(Create Table)等操做。
受權的語法以下:
Grant 權限 [on 表名] to 數據庫用戶
示例8
user stuDB
go
--- 爲zhangsanDBUser 分配對錶stuInfo的Select、insert、update權限
Grant select , insert , update on stuInfo to zhangsanDBUser
--- 爲s123DBUser 分配建立表的權限
Grant create table to s123DBUser