1. 程式人生 > 其它 >SQL server基礎筆記

SQL server基礎筆記

SQl server

第一章 資料庫基礎

1.1、 SQL Server軟體的安裝

(1)安裝SQLServer前的準備工作:

副檔名為.iso的安裝包檔案,推薦使用虛擬光碟機軟體Daemon Tools進行安裝(注意:安裝Daemon

Tools時選擇“免費許可”)。

(2)安裝SQLServer時的注意事項:

功能選擇“最小化安裝”:資料庫引擎服務(3個子項)、客戶端連線工具、管理工具-基本(1個子項)。

1.2 、SQL Server軟體的解除安裝

如何完全解除安裝SqlServer2012,參見以下網址:

https://jingyan.baidu.com/article/e4d08ffffd69b6330fd2f60d90.html

1.3資料庫的分類

一般來說,資料庫按照組織式分為兩大類:關係型資料庫和非關係型資料庫。

當前主流的關係型資料庫有Oracle、DB2、Microsoft SQL Server、MySQL、Microsoft Access等。

SqlServer:由Microsoft開發。

Oracle:由Oracle(甲骨文)開發 ,於1983年推出的世界上第一個開放式商品化關係型資料庫管理系

統。

DB2:是美國IBM公司開發的一套關係型資料庫管理系統,它主要應用於大型應用系統 。

MySQL:

由瑞典 MySQL AB 公司開發,目前屬於 Oracle 旗下公司,一般用於中小型網站 的開發。

參見:

(1)https://www.php.cn/sql/421899.html

(2)https://www.zhihu.com/question/432781043/answer/1604375728

第二章 企業管理器

2.1資料庫檔案

資料庫檔案的副檔名:

主資料庫檔案: .mdf( 是 primary data fifile 的縮寫

次資料庫檔案: .ndf(是Secondary data fifiles的縮寫 )

事務日誌檔案: .ldf( 是Log data fifiles的縮寫)

​ 主要資料檔案包含資料庫的啟動資訊,並指向資料庫中的其他檔案,所有表、檢視、儲存和資料都

​ 在這個檔案。使用者資料和物件可儲存在此檔案中,也可以儲存在次要資料檔案中。每個資料庫有一個主 要資料檔案。

​ 次要資料檔案是可選的,由使用者定義並存儲使用者資料。通過將每個檔案放在不同的磁碟驅動器上,次要檔案可用於將資料分散到多個磁碟上。另外,如果資料庫超過了 小,可以使用次要資料檔案,這 樣資料庫就能繼續增長。

事務日誌檔案儲存用於恢復資料庫的日誌資訊。每個資料庫必須至少有一個日誌檔案。

2.2 、資料庫的常用操作

1、離線:

對資料庫名右擊-->任務-->離線

2、聯機:

它是離線的反操作。

2、分離:

對資料庫名右擊——>任務——>分離,注意勾選”刪除連線“。

附加:他是分離的反操作,對“資料庫”右擊——>附加。

3、刪除資料庫:

對資料庫名右擊-->刪除

2.3、 SQL Server的資料型別

SqlServer常用資料型別參考:https://www.cnblogs.com/jojoword/p/10543763.html

2.3.1文字資料型別

char:固定長度的非unicode字元(一個漢字佔兩個位元組)。

varchar:可變長度的非unicode字元(一個漢字佔兩個位元組)。

nchar:固定長度的unicode字元(一個漢字佔一個位元組)。

nvarchar:可變長度的unicode字元(一個漢字佔一個位元組)。

示例:

char(6):可以存6個字母或數字,但只能存3個漢字。

nchar(6):可以存6個字母、數字或漢字。

長文字型別:

text:

儲存可變長度的非Unicode資料,最大長度為2^31-1(2,147,483,647)個字元。

ntext:

儲存可變長度的Unicode資料。

注意:

nchar、nvarchar、ntext這三種從名字上看比前面三種多了個“N”。它表示儲存的是Unicode資料型別

的字元。我們知道字元中,英文字元只需要一個位元組儲存就足夠了,但漢字需要兩個位元組儲存,英文與

漢字同時存在時容易造成混亂,Unicode字符集就是為了解決字符集這種不相容的問題而產生的,它所

有的字元都用兩個位元組表示,即英文字元也是用兩個位元組表示。nchar、nvarchar的長度是在1到4000

之間。和 char、varchar比較起來,nchar、nvarchar則最多儲存4000個字元,不論是英文還是漢字;

而char、varchar最多能儲存 8000個英文,或4000個漢字。可以看出使用nchar、nvarchar資料型別時不用擔心輸入的字元是英文還是漢字,較為方便,但在儲存英文時數量上有些損失。 所以一般來說,

如果含有中文字元,用nchar/nvarchar,如果純英文和數字,用char/varchar。

2.3.2、 整數資料型別

(1).bigint(相當於C#中的long)

每個bigint儲存在8個位元組中,其中一個二進位制位表示符號位,其它63個二進位制位表示長度和大

小,可以表示-2的63次方~2的63次方-1範圍內的所有整數。

(2).int(相當於C#中的int)

int或者integer,每個int儲存在4個位元組中,其中一個二進位制位表示符號位,其它31個二進位制位表示長度

和大小,可以表示-2的31次方~2的31次方-1範圍內的所有整數。

(3).smallint(相當於C#中的short)

每個smallint型別的資料佔用了兩個位元組的儲存空間,其中一個二進位制位表示整數值的正負號,其它

15個二進位制位表示長度和大小,,可以表示-2的15次方~2的15次方-1範圍內的所有整數。

(4).tinyint(相當於C#中的byte)

每個tinyint型別的資料佔用了一個位元組的儲存空間,可以表示0~255範圍內的所有整數.

2.3.3浮點資料型別

浮點資料型別儲存十進位制小數,用於表示浮點數值資料的大致數值資料型別。浮點資料為近似值;浮點

數值的資料則Sql Server中採用了只入不捨的方式進行儲存,即當且僅當要舍入的數是一個非零數時,

對其保留數字部分的最低有效位上加1,並進行必要的近位。

(1).real:相當於C#中的flfloat型別。

可以儲存正的或者負的十進位制數值,它的儲存範圍從-3.40E+38~-1.18E-38、0以及1.18E-

38~3.40E+38.每個real型別的資料佔用4個位元組的儲存空間。

(2)flfloat[(n)]:相當於C#中的double型別。

其中為用於儲存flfloat數值尾數的位數(以科學計數法表示),因此可以確定精度和儲存大小。如果

指定了n它必須是介於1和53之間的某個值。n的預設值為53.

其範圍從-1.79E+308-2.23E-308、0以及2.23E+3081.79E-308。如果不指定資料型別flfloat的長

度,它佔用8個位元組的儲存空間。flfloat資料型別可以寫成flfloat(n)的形式,n為指定flfloat資料的精度,n

為153之間的整數值。當n取124時,實際上定義了一個real型別的資料,系統用4個自己儲存它。當n

取25~53時,系統認為其是flfloat型別,用8個位元組儲存它。

(3).decimal[(p[,s])]和numeric[(p[,s]):相當於C#中的decimal型別。

帶固定精度和小數位數的數值資料型別。使用最大精度時,有效值從-1038+1~1038-1。

numeric在功能上等價於decimal。

p(精度)指定了最多可以儲存十進位制數字的總位數,包括小數點左邊和右邊的位數,該精度必須是從

1到最大精度38之間的值,預設精度為18.

s(小數位數)指定小數點右邊可以儲存的十進位制數字的最大位數,小數位數必須是從0到p之間的值,

僅在指定精度後才可以指定小數的位數。預設小數位數是0;因此,0<=s<=p。最大儲存大小基於精度

而變化。例如:decimal(10,5)表示共有10位數,其中整數5位,小數5位。

2.3.4、 日期時間型別

datetime:年月日時分秒.毫秒

smalldatetime:年月日時分秒

date:年月日2.3.5 位資料型別

bit: 稱為位資料型別,只取0或1為值,長度1位元組。bit值經常當作邏輯值用於判斷true(1)或false(0),輸

入非0值時系統將其替換為1。

第三章 查詢分析器

select*from 表名--查詢表中所有的資訊
select*from 表名where條件表示式--帶條件查詢
select*(可以換成單獨的表中某個表名列名)from 表名where條件表示式--帶條件查詢

3.1建庫

語法:create database 資料庫名

建庫案例:

建立資料庫StuInfo2的程式碼如下所示。

use master 

go

--若存在資料庫StuInfo2,則刪除該庫 

if exists(select * from sysdatabases where name='StuInfo2') 

begin 

drop database StuInfo2 

end 

go

--建立資料庫 

create database StuInfo2 

on primary --主資料庫檔案 

( 

name='StuInfo2', 

filename='E:\Database\SophomoreYearDB\2020級\6班\StuInfo2.mdf', 

size=5MB, 

maxsize=unlimited, 

filegrowth=1MB 

)

log on --日誌檔案 

( 

name='StuInfo2_log', 

filename='E:\Database\SophomoreYearDB\2020級\6班\StuInfo2_log.ldf', 

size=5MB, 

maxsize=unlimited, 

filegrowth=1MB 

)

go

3.2 、建表

語法:create table 表名

建表案例:

在上面的案例程式碼的基礎上,繼續編寫如下程式碼:

--使用資料庫StuInfo2來建表

use StuInfo2

create table StuBase 

( 

StuNo bigint not null, 

StuName nvarchar(50) not null, 

Gender bit not null, 

IdCard char(18) not null, 

Age int not null, 

Remark nvarchar(200) null 

)

go

create table Score 

(

StuNo bigint not null, 

CSharpScore float not null 

)

go

3.3約束

3.3.1 、SQL Server常見的7種約束

(1)主鍵約束:primary key(PK)

(2)唯一約束:unique(UQ),在表裡可以存在多個唯一約束,但一個唯一約束裡面不能存在同樣的

值。

(3)檢查約束:check(CK),自定義的約束。

(4)預設值約束:default(DF)

(5)外來鍵約束:foreign key(FK)

(6)非空約束:not null

(7)標識列:identity ,系統自動填值進去,它是從哪個值開始,每次增加多少。 identity(1,1)前面表

示從1開始,後者表示每次增長1。

3.4、加五種鍵約束案例:

在上面的案例程式碼的基礎上,繼續編寫如下程式碼:

3.4.1、新增主鍵約束

alter table StuBase add constraint PK_StuNo primary key(StuNo); 

3.4.2、新增預設約束

--alter table StuBase add constraint DF_Gender default(1) for Gender; 

alter table StuBase add constraint DF_Gender default 1 for Gender; 

3.4.3、新增唯一約束(表設計介面對任一列右擊,選擇“索引/鍵”可檢視新增的約束)

alter table StuBase add constraint UQ_IdCard unique(IdCard); 

3.4.4、新增檢查約束

alter table StuBase add constraint CK_Age check(Age>=18); 

3.4.5、新增外來鍵約束

alter table Score add constraint FK_StuNo foreign key(StuNo) references 

StuBase(StuNo); 

3.5、刪除約束

alter table 表名 drop constraint 約束名;

alter table StuBase drop constraint d_Gender;

第四單元

4.1、 T-SQL中的運算子

4.1.1比較運算子

運算子 含義

= 等於

> 大於

< 小於

>= 大於或等於

<= 小於或等於

<> 不等於

! 非

4.1.2 、邏輯運算子

邏輯表示式 說明 示例

AND 邏輯與 1 AND 1 = ; 1 AND 0 = 0; 0 AND 0 = 0;

OR 邏輯或 1 OR 1 = 1; 1OR 0 = 1; 0 OR 0 = 0;

NOT 邏輯非 NOT 1 = 0; NOT 0 = 1;

4.2簡單查詢資料

4.2.1、查表中所有記錄:

select * from 表名 

4.2.2、帶條件的查詢:

select*from 表名 where 條件表示式 

4.3、刪除表

語法:drop table 表名

4.4、插入資料

語法:insert  into 表名(列名列表)values(值列表)

注意:在插入資料時,若表中有自增列,則該列的值由系統自動分配,不需要程式設計師給定值。

4.5、更新資料行的語法:

update 表名 set 列名=新值 where 列名=舊值

4.6、刪除資料行:

delete from 表名 where 行名

delete from team where name=2;

--Truncate table執行的速度更快,使用的系統資源和事務日誌更少,不能刪除主鍵外來鍵關係的主鍵表中的資料,若要刪除主鍵表中的資料,需要用delete來完成。

Truncate table Team。

Truncate table 表名。

Truncate table可以刪除存在主外來鍵關係的外來鍵表中的所有資料。

Truncate table Player

4.7、一次性插入多條資料:

insert
select.(插入的資料).union

4.8、一次性多條資料行:

將一張表中的資料拷貝到另一張新的資料表中,使用SELECT...INTO語句
--將Team表中的資料行復制到Team2中.

select*into Team2 from Team;

4.9、查詢學生的學號,姓名,性別的三種方法

--給查詢的列取別名的三種方式

select '學號'=StuNo,Name '姓名',(case when Gender=1 then '男' else '女' end) as '性別'
from Baselnfo ;

select  '學號'=StuNo,'姓名'=Name ,'性別'=(case when Gender=1 then '男' else '女' end)  from Baselnfo;

select StuNo '學號',Name '姓名',(case when Gender=1 then '男' else '女' end) '性別' from Baselnfo;

select  StuNo as '學號',Name as '姓名',(case when Gender=1 then '男' else '女' end) as '性別'  from Baselnfo;

select Name+'-'+Idcard as'姓名-身份證號碼'
from Baselnfo;

第五單元

5.1、關係運算符:

<>、!=

5.1.1、邏輯運算子:

and、or、not

5.2、過濾表中已有資訊

5.2.1、過濾重複行(針對單列過濾)

select distinct Gender from  Baselnfo;

5.2.2、過濾重複行(針對多列過濾)

select distinct Gender,Name from  Baselnfo;

select top 3 *from Baselnfo

select top 3 *from Baselnfo where 列名

5.3 、使用TOP關鍵字僅顯示前面若干條記錄

top 整數:前多少條記錄 

top 整數 percent:前百分之多少條記錄

5.4、使用order by查詢表中的正序排名:

select top 2 * from StuScore where Subject='C#'  order by Score desc ;

5.5、查詢連結在一起顯示

select cast(StuNo as varchar) +'-'+Name as'學號-姓名'
from Baselnfo;

5.6、查詢除了這個之外所有的資料:

select*from  表名where 列名<> '列名中的資料'

select*from  表名where 列名!='列名中的資料'

5.7、查詢多少到少之間的資料:

select*from StuScore where Subject='C#' and Score >= 40 and Score<=90;

5.5、對查詢結果篩選列表運算子in

in:用於匹配值列表

not in

5.5.1、in用於跟多個具體的值做等值比較,滿足任意一個即可

select*from Baselnfo where StuNo  in(20209130501);

5.5.2、not in:跟不等於這多個具體值的資料進行匹配

select*from Baselnfo where StuNo not in(20209130501,20209130503,20209130504);

5.6、模糊查詢

語法:like結合萬用字元(%、_、[]、[^])使用

--查詢姓‘哈’的學生資訊
select*from Baselnfo where Name like '哈%';

select*from 表名 where 列名 like '查詢的名字';

--查詢不姓‘哈’的學生資訊
select*from Baselnfo where Name not like '哈%';

select*from 表名where 列名 not like '查詢的 字';

--查詢姓名只有兩個字,且第二個字不為‘哈’的同學
select*from Baselnfo where Name like'_[^哈]';

select*from 表名where 列名 not like '查詢的 字';——下劃線代表佔一個位元組

5.8、order by字句可以依據多個欄位排序

--查詢成績資訊,將C#成績按降序排序,成績相同的按學號升序排序

select  * from StuScore where Subject='SQlSever'  order by Score desc, StuNo asc;--降序
select  * from StuScore where Subject='SQlSever'  order by Score desc ;--降序

select  * from 表名 where 列名='列裡面新增的資料'  order by 列名desc ;--降序

5.9、聚合函式

SUM():用於統計數值型欄位的總和,它只能用於數值型欄位,而且 NULL 值將被忽略。

AVG():用於計算一個數值型欄位的平均值,該欄位中的NULL 值在計算過程中將被忽略。

MAX():用於返回欄位的最大值,在計算過程中遇到 NULL 值時予以忽略。

MIN():用於返回欄位的最小值,在計算過程中遇到 NULL 值時予以忽略。

COUNT():統計記錄行數。

5.9.1、求總分

select '總分'=SUM(Score) from StuScore;

select '總分'=SUM(列名) from 表名;

5.9.2、求每門課程的總分(各,每)

--在一個查詢語句中可以使用任意多個欄位對結果欄位內的記錄進行分組,欄位列表中的每個輸出欄位必須在GROUP BY字句中出現或者用在某個聚合函式中。

select Subject '科目',SUM(Score)'總分' from StuScore group by Subject;

select 列名'科目',SUM(列名)'總分' from 表名group by 列名;

5.9.3、求各科平均分,並按降序排

select Subject '科目',AVG(Score)'平均分' from StuScore group by Subject order by AVG(Score) desc;

5.9.4、求各科最高分數

select Subject '科目',MAX(Score)'最高分' from StuScore group by Subject;

5.9.5、求各科最低分數

select Subject '科目',MIN(Score)'最低分' from StuScore group by Subject;

5.9.6、求各科參考人數

select Subject '科目',count(*)'實際參加考試的人數' from StuScore group by Subject;

5.10、HAVING子句:篩選

select Subject '科目',AVG(Score)'平均分>=70' from StuScore group by Subject having AVG(Score)>=70 order by AVG(Score) desc;

第六章

如果一個查詢需要對多個表進行操作,就稱為聯接查詢。聯接查詢的結果集或結果表,稱為表之間的連

接。

聯接查詢分為內部聯接查詢,自聯接查詢,外部聯接查詢和複合條件聯接查詢等等。

6.1、內(部)連結

select bi.StuNo,Name,Gender,Age,Idcard,Subject,Score
from Baselnfo bi inner join StuScore ss on bi.StuNo= ss.StuNo

--兩個表名中間使用逗號分隔,使用where子句寫關聯的欄位

select bi.StuNo,Name,Gender,Age,IdCard,Subject,Score
from Baselnfo bi inner join StuScore ss
on bi.StuNo=ss.StuNo

6.2、外(部)聯接

6.2.1、左外聯接:left [outer] join

--特點:以left join左邊的表為主表,右邊的表為從表,,優先顯示主表的所有記錄的所有記錄,若從表中沒有相匹配的記錄,則用“NULL”填充。

select bi.StuNo,Name,Gender,Age,IdCard,Subject,Score
from Baselnfo bi left join StuScore ss
on bi.StuNo=ss.StuNo

6.2.2、右外聯接:right [outer] join

--特點:以right join右邊的表為主表,左邊的表為從表,,優先顯示主表的所有記錄的所有記錄,若從表中沒有相匹配的記錄,則用“NULL”填充。

select bi.StuNo,Name,Gender,Age,IdCard,Subject,Score
from Baselnfo bi right join StuScore ss on bi.StuNo=ss.StuNo;

6.3、交叉聯接:cross [outer] join

--特點:查詢結果集的記錄條數等於cross join左右兩邊表的記錄條數的乘積。

select count(*)
from Baselnfo cross join StuScore

select count(*)from Baselnfo--9
select count(*) from StuScore--7

6.4、 自聯接

聯接不僅可以在表之間進行,也可以使一個表同其自身進行聯接,這種聯接稱為自聯接,相應的查詢稱

為自聯接查詢。

6.5 、更復雜的聯接查詢

SELECT 欄位列表 FROM 表1 INNER JOIN 表2 ON 條件表示式1 INNER JOIN 表3 ON 條件表示式2 

6.6、集合運算

union和unionall--並集運算

intersect--交集運算

except--減集

6.6.1、 使用UNION和UNION ALL進行並集運算

UNION 和 UNION ALL都將兩組查詢進行了並集,唯一的區別在於,UNION不允許有重複列而UNION

ALL允許有重複的列。

UNION 返回的結果集的標題僅從第一個查詢獲得。

6.6.2、使用INTERSECT進行交集運算

交集同樣的是對多個結果集合進行操作。交集將兩個結果集中相同的記錄取出來,形成一個新的集合。

6.6.3 、使用EXCEPT進行減集運算

減集是指比較2個結果集,將EXCEPT 關鍵字前的結果集除去交集部分而組成的新的集合。

注意:減集的最後獲得的結果與2個結果集放的順序有密切的關係。

Microsoft Visio 2010軟體