C#快速入門教程(27)—— SQL Server資料庫

曹化宇發表於2018-11-11

如果需要在專案中處理大量的資料,資料庫是不二之選,本課將瞭解SQL Server資料庫的基本應用,下一課將討論如何在C#程式碼中操作SQL Server資料庫。

學習或輕量級應用中,可以使用SQL Server Express,這是一個免費版本。此外,為操作方便,大家還需要一個圖形化的管理工具,這裡當然是使用SSMS(Microsoft SQL Server Management Studio),此工具同樣可以從微軟網站免費下載使用。

安裝SQL Server Express時,有幾點需要注意,以防下一課測試時無法連線到資料庫。第一,在例項配置中需要記得“例項 ID”,如下圖所示。

enter image description here

第二,需要配置超級管理員sa的密碼,如下圖所示。請注意,這裡只是在自己的計算機測試時使用,實際工作中是不應該直接使用sa使用者的,而是根據需要合理建立使用者並以最小化原則分配許可權。

enter image description here

SQL Server Express和SSMS安裝成功後,可以測試一下資料的連線,開啟SSMS,如下圖所示。

enter image description here

這裡,選擇“Windows 身份驗證”,單擊“連線”,如果能成功連線,如會在左側的“物件資源管理器”中看到連線的例項,如下圖所示。

enter image description here

現在,資料庫環境已經準備好了,接下來,再瞭解一些關於資料庫操作的基本概念。首先,SQL Server屬於關係型資料庫,特點是,資料都以二維表的形式儲存和處理,如果大家不熟悉二維表,可以開啟Excel或WPS表格熟悉一下,如下圖所示。

enter image description here

這裡分為列(Column)和行(Row)。其中,列又稱為欄位(Field),定義了每行資料中每一個資料的名稱、型別等資訊,如圖中的UserID、UserName、UserPwd、IsLocked、CreationTime。行則是表中真正的資料,每一行稱為一條記錄(Record),上圖中共包含了3行記錄。

運算元據庫時,我們會使用SQL(結構化查詢語句,Structured Query Language)。現在,我們開啟SSMS,並連線到資料庫例項;然後,新建一個查詢,如下圖所示。

enter image description here

然後,我們輸入如下內容。

create database Cdb_Test;
go

use Cdb_Test;
go

create table UserMain(
    UserId bigint identity(1,1) not null,
    UserName nvarchar(50) not null unique,
    UserPwd nvarchar(50) not null,
    IsLocked int not null default(0),
    CreationTime datetime,
    primary key (UserID)
);

按鍵盤F5鍵執行此程式碼,我們可以在資料,如下圖所示。

enter image description here

程式碼中,首先使用create database語句建立了Cdb_Test資料庫,然後,使用use語句引用它,這樣,接下來的操作就會預設在Cdb_Test資料庫中進行。

create table語句用於建立資料表,其中定義了幾個欄位,分別是:

  • UserID,定義為bigint型別,即64位整數,並指定為自動管理的ID資料,設定為從1開始,每次自動加1。not null指定資料不能為空值(NULL)。在運算元據時,不需要人工管理,此欄位資料可以自動生成。
  • UserName,定義為nvarchar(50)型別,指定可以最多儲存50個Unicode字元。unique關鍵字指定欄位的資料不能重複。
  • UserPwd,同樣定義為可以儲存50個Unicode字元。
  • IsLocked,定義為int型別,即32位整數。default(0)指定欄位預設值為0,即沒有指定資料時,欄位資料就是0。
  • CreationTime,定義為datetime型別,即用於儲存日期和時間的型別。這裡沒有指定not null,表示如果沒有指定欄位資料,其資料為空值(null);請注意,這裡的空值是指沒有資料,注意區別C#中的null,它表示為物件的空引用。

最後,我們使用primary key語句定義了表的主鍵,即以UserID欄位作為表的主鍵,主鍵欄位會作為記錄的唯一標識資料。

新增資料

接下來,我們就來操作UserMain表中的資料。首先,新建查詢,並執行如下程式碼。

use Cdb_Test;
go

insert into UserMain(UserName,UserPwd)
values('Tom','123456');

insert into UserMain(UserName,UserPwd,IsLocked)
values('Jerry','123456',1);

insert into UserMain(UserName,UserPwd,CreationTime)
values('John','123456','2018-11-7 15:51:45');

如果程式碼執行成功,就會向UserMain表中新增三條記錄,使用下面的語句可以檢視新增的資料。

use Cdb_Test;
go

select * from UserMain;

程式碼執行結果如下圖所示。

enter image description here

向資料表新增記錄時,我們使用insert into語句,其格式如下。

insert into <表名> (<欄位1>,<欄位2>,<欄位3>,...) 
values(<值1>,<值2>,<值3>,...);

這裡應注意欄位和值的一一對應關係。此外,如果欄位名中包含特殊字元,可以使用一對方括號定義,如[UserName]。指定欄位值時,數值類可以書寫,而文字和日期類則需要使用一對單引號定義。

常用資料型別

下面,我們瞭解一些在SQL Server中常用的資料型別:

  • int型別,32位整數,對應C#中的int型別。
  • bigint型別,64位整數,對應C#中的long型別。
  • nvarchar(n)型別,處理Unicode編碼的可變長度字串,n指定最大的字元數量,如果定義為最大字元數,可以定義為nvarchar(max)。
  • nchar(n)型別,處理Unicode編碼的定長字串,n指定字元數。
  • datetime型別,日期和時間型別,一般可以使用標準的格式,如'YYYY-MM-DD hh:mm:ss'。
  • decimal(m,n)型別,定義實數型別,m指定整數和小數部分共有幾位,n指定小數位,如decimal(5,2)可以儲存123.45格式的資料。

查詢資料

前面,我們已經使用select語句進行資料的查詢的操作,下面瞭解一些常用的資料查詢語法;首先,使用select語句從資料表中執行查詢的一般格式如下。

select <欄位> from <表> where <條件>;

其中:

  • select、from和where為SQL關鍵字。
  • <欄位>指定返回資料的欄位列表,每個欄位使用逗號分隔,返回表中所有欄位時,可以使用*萬用字元。
  • <表>指定資料表的名稱。
  • where <條件>為可選,用於指定查詢條件,如果返回所有記錄,則不需要使用where子句。

下面著重瞭解<條件>的設定,常用的條件型別有:

  • =,等於。
  • <>,不等於。
  • >,大於。
  • >=,大於等於。
  • <,小於。
  • <=,小於等於。
  • like,字串模糊查詢,可以使用%符號匹配0到多個字元,也可以使用_(下畫線)匹配一個字元,如UserName like 'J%'就是查詢UserName資料中使用J開頭的記錄。
  • between,指定一個範圍,如Age between 1 and 10就是匹配Age資料從1到10的記錄。
  • in,指定一個值列表,如UserName in ('Tom','Jerry')就是查詢UserName等於Tom和Jerry的記錄。
  • is null,查詢欄位資料為空的記錄,如CreationTime is null。
  • is not null,查詢欄位資料不為空的記錄,如CreationTime is not null。

下面的程式碼,我們查詢UserName以J開頭的記錄。

use Cdb_Test;
go

select * from UserMain where UserName like 'J%';

程式碼執行結果如下圖所示。

enter image description here

下面的程式碼查詢CreationTime為空的記錄。

use Cdb_Test;
go

select * from UserMain where CreationTime is null;

程式碼執行結果如下圖所示。

enter image description here

更多的條件設定,大家可以自己動手測試。

更新資料

更新資料表的語法如下:

update <表名> set <欄位與資料列表> where <條件>;

這裡,<表名>和<條件>相信大家已經不陌生了,而<欄位與資料列表>則是設定新資料的列表,每個新欄位和資料使用逗號分隔,如UserName = 'Tom',IsLocked = 0。

請注意,使用沒有條件的update語句是很危險的,它會更新表中所有記錄的資料!!!

下面的程式碼,將UserName為Jerry的記錄中的IsLocked設定為0。

use Cdb_Test;
go

update UserMain set IsLocked=0 where UserName = 'Jerry';

執行程式碼後,我們使用"select * from UserMain;"語句就可以看到資料的變化,如下圖所示。

enter image description here

刪除資料和清空資料表

刪除資料表中的記錄時,使用如下語法。

delete from <表名> where <條件>;

請注意,沒有條件的刪除操作也是非常危險的!!!

如果真的需要清空資料表的內容,可以使用如下語句。

truncate table <表名>;

執行此語句後,資料表會被重置,就像剛剛建立那樣,Identity欄位的值也會從初始值開始重新計數。

高階查詢

排序,可以使用order by子句,如下面的程式碼會按使用者名稱(UserName)升序排序記錄。

use Cdb_Test;
go

select * from UserMain order by UserName asc;

執行結果如下圖所示。

enter image description here

實際上,語句中的asc關鍵字是可以省略的,因為排序的預設方式就是升序,如果需要降序排列,可以使用desc關鍵字。排序時,還可以指定多個欄位,當第一個欄位的資料相同時,就會按第二個欄位進行排序,以此類推。

分組統計,如下面的程式碼,我們將統計CreationTime欄位的每種資料各有多少個。

use Cdb_Test;
go

select CreationTime,count(CreationTime) from UserMain group by CreationTime;

程式碼執行結果如下圖所示。

enter image description here

除了在select關鍵字後使用count()計數函式,還可以使用以下一些函式進行簡單的計算工作:

  • min()函式,求指定欄位資料中的最小值。
  • max()函式,求指定欄位資料中的最大值。
  • sum()函式,求指定欄位資料的和。
  • avg()函式,求指定欄位資料的平均值。

當查詢結果只需要返回一定數量的記錄時,可以在select關鍵字後,欄位列表前使用top n子句,其中n指定返回的記錄數量,如“select top 2 * from UserMain;”;此外,在SQL Server中,還可以使用top(n)格式。

當查詢結果中有完全重複的記錄時,可以在select關鍵字後使用distinct子句過濾,如“select distinct CreationTime from UserMain;”。

更多內容

一篇文章能學會SQL Server資料庫??我也不相信哦!以上內容只是簡單地瞭解瞭如何運算元據表中的資料,而像SQL Server這樣的大型資料庫系統,功能是非常強大的,應用和學習也是一個長期的過程;在學習和工作中,可以根據需要選擇一些知識點逐步學習和應用,下面,介紹一些在C#應用開發中可能需要關注的知識點,大家可以參考學習。

檢視(View),簡單的理解就是定義了查詢模板。請注意,檢視並不是真的儲存資料,從檢視中查詢資料時,會先生成檢視資料集合,然後再從這個集合中進行查詢操作。

儲存過程(SP,Stored Procedure),相當於功能封裝程式碼,並可以帶入引數,就像C#中的方法。對於經常操作的查詢,可以定義為儲存過程,以簡化功能的實現。

事務(Transaction),相當於一組任務的集合,但其特點是,這些任務要不全部完成,要不什麼都不做。如銀行的轉賬操作,從A賬戶向B賬戶轉賬,就必須從A賬戶扣款,並在B賬戶新增相應的金額,兩項任務都成功執行時,轉賬才算真的完成。

下一課將討論如何在C#程式碼中操作SQL Server資料庫。

CHY軟體小屋原創作品!

相關文章