日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

数据库基础知识系列

發(fā)布時(shí)間:2024/4/17 数据库 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据库基础知识系列 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
來自:http://www.cnblogs.com/AaronYang/archive/2012/04/24/2468095.html?

?數(shù)據(jù)庫的設(shè)計(jì)

Net?stop?mssqlserver??? ?(開啟SQL)

Net?start?mssqlserver???????(關(guān)閉SQL)

?

1.1設(shè)計(jì)數(shù)據(jù)庫的步驟:

需求分析階段

1)?收集信息

2)?標(biāo)識(shí)實(shí)體

3)?標(biāo)識(shí)每個(gè)實(shí)體需要存儲(chǔ)的詳細(xì)信息

4)?標(biāo)識(shí)實(shí)體之間的關(guān)系

概要設(shè)計(jì)階段

5)?繪制E-R

6)?將E-R圖轉(zhuǎn)換為數(shù)據(jù)庫模型圖

7)?遵循三大范式

詳細(xì)設(shè)計(jì)階段

三個(gè)范式的含義

1)?確保每列的原子性

2)?確保表中的每列都和主鍵相關(guān)(只描述一件事)

3)?確保每列都和主鍵列直接相關(guān),而不是間接相關(guān)(兩列不能描述同一件事)

???三個(gè)范式的優(yōu)點(diǎn)

4)?有助于規(guī)范化數(shù)據(jù)庫的設(shè)計(jì)

5)?有助于減少數(shù)據(jù)沉(冗)余

?

1.2基數(shù)都有哪幾種基數(shù)

1.?一對一:?1:?1??eg:?夫妻

2.?一對多:???1:?N??eg:?一個(gè)老師可以有多個(gè)學(xué)生

3.?多對一:???N:?1???eg:?多個(gè)學(xué)生可以有一個(gè)老師

4.?多對多:??M?:?N???eg:?群毆

1.3E-R圖?要用哪幾個(gè)圖形

l?矩形——實(shí)體集

l?橢圓——屬性

l?菱形——聯(lián)系集

l?直線——連接屬性和實(shí)體集,也用來聯(lián)系實(shí)體集和聯(lián)系集

?

?

?

1.4實(shí)體規(guī)范化和性能的關(guān)系

規(guī)范化——從關(guān)系型數(shù)據(jù)庫表中除去沉(冗)余數(shù)據(jù)的過程

??????????用于獲得高效的關(guān)系型數(shù)據(jù)庫表的邏輯結(jié)構(gòu)的最好和最容易的方法

設(shè)計(jì)數(shù)據(jù)庫時(shí)要遵守三大范式,滿足的范式級別越高,系統(tǒng)性能就越低,因此允許適當(dāng)?shù)臄?shù)據(jù)沉余列

.?SQL?Server?數(shù)據(jù)庫的基礎(chǔ)

1?.數(shù)據(jù)庫

含義:由表,關(guān)系,以及操作對象組成。

作用:存儲(chǔ)數(shù)據(jù)、檢索數(shù)據(jù)、生成新的數(shù)據(jù)

要求:統(tǒng)一、安全、性能等

按用途可分為:系統(tǒng)數(shù)據(jù)庫??用戶數(shù)據(jù)庫

?

行:實(shí)際對應(yīng)一個(gè)實(shí)體?(一個(gè)實(shí)體一條記錄)(實(shí)體)

列:(字段)(屬性)

表:實(shí)體的集合,用來存儲(chǔ)具體的數(shù)據(jù)的。

?

2數(shù)據(jù)庫系統(tǒng)和數(shù)據(jù)庫管理系統(tǒng)

數(shù)據(jù)庫管理系統(tǒng):是一種系統(tǒng)軟件,由一個(gè)相互關(guān)聯(lián)的數(shù)據(jù)集合和一組訪問數(shù)據(jù)的程序構(gòu)成。

這個(gè)數(shù)據(jù)集合稱為數(shù)據(jù)庫

作用:維護(hù)數(shù)據(jù)庫

?

數(shù)據(jù)庫系統(tǒng):是一個(gè)實(shí)際可運(yùn)行的軟件系統(tǒng),可以對系統(tǒng)提供數(shù)據(jù)進(jìn)行存儲(chǔ)、維護(hù)、應(yīng)用。

通常有?:軟件、數(shù)據(jù)庫、數(shù)據(jù)庫管理員組成。

?

3.Miscrosoft?SQL?Server?提供了4個(gè)系統(tǒng)數(shù)據(jù)庫

?

1):Master?數(shù)據(jù)庫:?所有的登錄賬號和系統(tǒng)配置設(shè)置

??????????????????????所有其他的數(shù)據(jù)庫及數(shù)據(jù)庫文件的位置

??????????????????????Sql?server?的初始化信息

?

2):Tempdb?數(shù)據(jù)庫:保存所有的臨時(shí)表和臨時(shí)存儲(chǔ)過程,以及臨時(shí)生成的工作表?(啟動(dòng)時(shí)都重新創(chuàng)建)

?

(3):???Model?數(shù)據(jù)庫:創(chuàng)建的所有數(shù)據(jù)庫的模板。

4):?Msdb?數(shù)據(jù)庫:代理調(diào)度警報(bào)、作業(yè)、以及記錄操作時(shí)使用。

?

4.創(chuàng)建數(shù)據(jù)庫

一個(gè)數(shù)據(jù)庫至少包含一個(gè)數(shù)據(jù)庫文件和一個(gè)事物日志文件。

mdf是?primary?data?file?的縮寫?

ndf是Secondary?data?files的縮寫?

?

1):數(shù)據(jù)庫文件:主數(shù)據(jù)庫文件的擴(kuò)展名為?.mdf?,用來存儲(chǔ)數(shù)據(jù)庫的啟動(dòng)信息數(shù)據(jù)。?一個(gè)數(shù)據(jù)庫只能那個(gè)由一個(gè)主數(shù)據(jù)庫,其他數(shù)據(jù)庫文件被稱為次數(shù)據(jù)庫文件。

?

2):事物日志文件:擴(kuò)展名為:.ldf,?事物日志文件名后需要加一個(gè)“_Log”。

一個(gè)數(shù)據(jù)可以有一個(gè)或多個(gè)事物日志文件。

?

3):次文件:擴(kuò)展名為:ndf?;?次文件可有可無,由用戶定義并存儲(chǔ)用戶數(shù)據(jù)。通過將每個(gè)文件放在不同的磁盤驅(qū)動(dòng)器上,次要文件可用于將數(shù)據(jù)分散到多個(gè)磁盤上。另外,如果數(shù)據(jù)庫超過了單個(gè)?Windows?文件的最大大小,可以使用次要數(shù)據(jù)文件,這樣數(shù)據(jù)庫就能繼續(xù)增長。

?

?

?

第2章??數(shù)據(jù)庫的實(shí)現(xiàn)

2.1建庫刪庫

?

【解決方案:】

use?master??--設(shè)置當(dāng)前數(shù)據(jù)庫為master?便于訪問sysdatabases

--exists(查詢語句)檢測某個(gè)查詢是否存在

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

Drop?dataBase?MySchool?--刪除后再創(chuàng)建

2.2創(chuàng)建文件夾

//****//D盤創(chuàng)建名為project的文件夾

exec?sp_configure?'show?advanced?options',1??//顯示高級配置信息

reconfigure

exec?sp_configure?'xp_cmdshell',1??//需要執(zhí)行sp_configure啟用xp_cmdshell

reconfigure

exec?xp_cmdshell?'mkdir?D:\project',NO_output?//DOS命令?創(chuàng)建文件夾

?

擴(kuò)展存儲(chǔ)過程(Extened?Stored?Procedures)允許使用其他編程語言創(chuàng)建外部存儲(chǔ)過程,為用戶提供SQL?Sever?實(shí)例到外部程序的接口,便于維護(hù)。以“xp_”為前綴,以DLL形式單獨(dú)存在

2.3建表刪表

use?MySchool??//指明在哪個(gè)數(shù)據(jù)庫中建表

//判斷若存在先刪除

if?Exists(select?*?from?sysobjects?where?name?='Student')

drop?table?Student

//創(chuàng)建表

create?table?Student

?(

//identity?(標(biāo)識(shí)增量,標(biāo)識(shí)種子)

//?標(biāo)識(shí)列不能為varchar類型,只能是(bigint(8),int(4),?smallint(2),tinyint(1(0-255之間)),decimal

StudentNo?int?not?null?identity?(1,1),?//非空,是標(biāo)識(shí)列

????LoginPwd?varchar(20)?not?null,

????StudentName?varchar(20)?not?null,

????Sex?bit?not?null,

????GradeId?int?not?null,

????Phone?nvarchar(50)?null,

????Address?nvarchar(255)?null,

????Borndate?datetime?not?null,

????Email?nvarchar(50)?null,

IndentityCard?varchar(18)?not?null

?)

2.3創(chuàng)建和刪除約束

--主鍵

alter?table?Student

add?constraint?PK_StudentNo?primary?key?(StudentNo)

?

--唯一(可以為NULL值,但不能重復(fù))

alter?table?Student

add?constraint?UQ_IdentityCard?unique?(IdentityCard)

?

--默認(rèn)

alter?table?Student?

add?constraint?DF_Address?default('安徽')?for?Address

?

--檢查

alter?table?Student

add?constraint?CK_BornDate?Check(BornDate>=1990-01-01)

?

--外鍵(主表Student和從表Result通過關(guān)聯(lián)列StudentNo建立關(guān)系)

alter?table?Result????????????????????????????????????????????????

add?constraint?FK_Student_Result?foreign?key?(StudentNo)?references(引用Student(StudentNo)

--刪除約束

alter?table?Student

drop?constraint?DF_Address

?

?

二.數(shù)據(jù)庫表的管理

1?數(shù)據(jù)完整性:

有四種類型的約束

?

1):實(shí)體完整性約束??:要求表中的每一行數(shù)據(jù)反映不同的實(shí)體,不能存在相同的數(shù)據(jù)行

????????????通過:?索引、唯一約束(Unique)、主鍵約束(primary?key)或標(biāo)識(shí)列(identity)屬性。

?

2):域完整性約束:??給定?列的輸入有效值

通過:限制數(shù)據(jù)類型、檢查約束(check)、輸入格式、外鍵約束(Foreign?Key?References)、

默認(rèn)值(default)、空約束(?null)?、非空約束(not?null)

?

?

3):引用完整性約束:?輸入或刪除數(shù)據(jù)行時(shí),此約束用來保持表之間已定義的關(guān)系。

?????????????????通過:主鍵和外鍵之間的引用關(guān)系實(shí)現(xiàn)。

?

(4):??自定義完整約束

?

?

2:主鍵和外鍵

?

主鍵:一個(gè)表只能有一個(gè)主鍵

原則:唯一、最少性、非空性、穩(wěn)定性

?

外鍵:一個(gè)表可以有多個(gè)外鍵

?

?

3.標(biāo)識(shí)列:

?identity?(標(biāo)識(shí)種子,標(biāo)識(shí)增量)

標(biāo)識(shí)列常被定義為主鍵,在插入數(shù)據(jù)時(shí),不許為標(biāo)識(shí)列指定值。

4.主表和子表的關(guān)系

1):子表的相關(guān)項(xiàng)目的數(shù)據(jù),在主表中必須存在

2):主表中相關(guān)項(xiàng)的數(shù)據(jù)更改了,則子表對性的數(shù)據(jù)項(xiàng)也應(yīng)當(dāng)隨之更改。

3):在刪除子表之前,不能夠刪除主表。

?

?

5.數(shù)據(jù)類型

?

分類

備注和說明

數(shù)據(jù)類型

說明

?

?

二進(jìn)制數(shù)據(jù)類型

?

?

?

用來存儲(chǔ)非字符和文本的數(shù)據(jù)

binary

固定長度的二進(jìn)制數(shù)據(jù)

varbinary

可變長度的二進(jìn)制數(shù)據(jù)

image

可用來存儲(chǔ)圖像

?

?

?

文本數(shù)據(jù)類型

?

?

?

字符數(shù)據(jù)包括任意字母、符號、或數(shù)字字符的組合

char

固定長度的非Unicode字符數(shù)據(jù),最大長度為8000個(gè)字符

varchar

可變長度的Unicode

(可存放新詞)

nvarchar

可變長度的Unicode數(shù)據(jù)(全球統(tǒng)一標(biāo)識(shí)符)

ncahr

固定長度的Unicode

text

存儲(chǔ)長文本信息

ntext

存儲(chǔ)可變長度的長文本

?

日期和時(shí)間

日期和時(shí)間在單引號內(nèi)分別輸入

DateTime

日期和時(shí)間

數(shù)字?jǐn)?shù)據(jù)

數(shù)字(正數(shù)、負(fù)數(shù)、分?jǐn)?shù))

Int

?

占用4個(gè)字節(jié)的整數(shù)

smallint

占用2個(gè)字節(jié)的整數(shù)

tinyint

占用1個(gè)字節(jié)的整數(shù)

貨幣數(shù)據(jù)類型

十進(jìn)制貨幣值,且精確到小數(shù)點(diǎn)4位數(shù)字

Money?

smallMoney

固定四位小數(shù)

Bit?數(shù)據(jù)類型

10或空值

Bit

布爾類型(表示是/否)

?

?

浮點(diǎn)型

近似數(shù)值類型

real

供浮點(diǎn)數(shù)使用

float

存儲(chǔ)精度比較高的(如貨幣金額)

Decimal(18,2)

?numeric

固定精度和范圍的數(shù)值型數(shù)據(jù)

?

?

?

?

?

?

?

?

?

第3章??SQL編程

3.1?使用變量

//***//根據(jù)學(xué)號查找’?李斯文’的信息,及與’?李斯文’相鄰的學(xué)生信息

use?MySchool?//使用MySchool數(shù)據(jù)庫

?

//聲明變量

declare?@name?varchar(8)

declare?@no?int

?

//?局部變量的賦值有兩種方法:使用?set?和?select

set?@name='李斯文'

select?*?from?Student?where?StudentName=@name

select?@no?=StudentNo?from?Student?where?StudentName=@name

?

//兩種方式實(shí)現(xiàn)查詢和李斯文相鄰學(xué)號的信息

select?*?from?Student?where?(StudentNo=@no?-1)?or?(StudentNo=@no?+1)?

select?*?from?Student?where?(StudentNo?in?(@no+1,@no?-1))

?

編號

區(qū)分方面

set

select

1

同時(shí)對多個(gè)變量賦值

不支持

支持

2

表達(dá)式返回多個(gè)值時(shí)

出錯(cuò)

將返回的最后一個(gè)值賦給變量

3

表達(dá)式未返回值時(shí)

變量被賦空值

變量保持原值

?

eg:

???1.set?不能同時(shí)為兩個(gè)變量賦值】

???

???

2.A?==set?只能賦一個(gè)值??B==select查詢有多個(gè)值時(shí),賦值查詢的最后一個(gè)結(jié)果】

?

?

3.【查詢無結(jié)果時(shí)?set?==?@addr被賦NULL值?select?==@addr?保持原值?】

?

?

【警告:】select?@addr=(select?Address?from?Student?where?1<0)此寫法將顯示空值

3.2全局變量

?

【@@ERROR?>0?表示上一條執(zhí)行語句有誤

?

?

【注意】?常用的全局變量有:@@ERROR?——錯(cuò)誤號

??@@IDENTITY?——標(biāo)識(shí)列

??@@RowCount?——受影響的行數(shù)

3.3?輸出語句

?print??局部變量或字符串????//在消息框中顯示

?select?局部變量?as?自定義列名????//在結(jié)果框中顯示

???eg:?

?print??'服務(wù)器的名稱:'+@@ServerName

?select??@@ServerName?as?'服務(wù)器的名稱'

3.4?數(shù)據(jù)類型轉(zhuǎn)換

Cast?(表達(dá)式?as?數(shù)據(jù)類型)?????Cast(date?as?varchar(10))????????

?Convert(varchar(10),@date,111)

Convernt?(數(shù)據(jù)類型(長度)?,?表達(dá)式?,?日期型(1-131)、浮點(diǎn)型指定轉(zhuǎn)換的格式)

print?'成績:'+convert(varchar(20)?,@result)

???????????print?'成績:'+cast(@result?as?varchar(20)))

???獲取年齡

@age=floor(DATEDIFF(DY,Borndate,GETDATE())/365)

?Floor?小于某個(gè)數(shù)的最大整數(shù)???eg:?Floor(27.7)????27(周歲)

Ceiling?大于某個(gè)數(shù)的最小整數(shù)??eg:?Ceiling?(27.7)?????28(虛歲)

3.5?邏輯控制語句

順序??begin?~?end????相當(dāng)于?大括號{}

分支??if?~?else??和?case?~?end

循環(huán)??while

??????set?nocount?on?--不顯示“n行受影響,寫在執(zhí)行SQL語句的上面

3.6?批處理

GO——把SQL語句批量處理(以一條命令的方式來處理一組命令的過程稱為批處理。)

它可以提高語句執(zhí)行的效率。

?

【★☆】“不顯示n行受影響”——set?nocount?on

?

?

三.數(shù)據(jù)管理

1.?T-SQL的組成

DML(數(shù)據(jù)操作語言)?:?用來插入、刪除、修改、查詢數(shù)據(jù)庫中的數(shù)據(jù)(?insert??delete??update??select)

DCL?(????控制?????):?用來控制數(shù)據(jù)庫組件的存取許可、存取權(quán)限等。(Grant??Revoke

DDL?(????定義?????):??用來建立數(shù)據(jù)庫、數(shù)據(jù)庫對象和定義其列?。

大部分Greate開頭的命令?:(Greate?Table???Great?view??drop?Tabel

?

2.比較運(yùn)算符:

>???<??=???>=??<=??<>(不等于)??!?()

?

?

?

3.通配符

通配符

解釋

示例

‘_’

一個(gè)字符

A?like?‘C_’

%

任意長度的字符串

B?like?‘CO_%’

[]

括號里所有指定范圍內(nèi)的一個(gè)字符

C?like?‘9wo[1-2]’

[^]

不再括號中指定范圍內(nèi)的任意一個(gè)字符

D?like??like’9wo[^1-2]’

?

通配符經(jīng)常與???like??關(guān)鍵字使用。

?

4.?邏輯表達(dá)式

T-sql?支持的邏輯運(yùn)算符有notAndor

???eg:?采購訂單表中—付款方式:信用卡

???????????????????—約束要求:牡丹卡、金穗卡、龍卡、陽光卡

Not(付款方式=’信用卡’)??or??(?信用卡?in??(?‘牡丹卡’?,?’?金穗卡’?,?’?龍卡’?,?’?陽光卡’)?)

在一個(gè)語句中使用了多個(gè)邏輯運(yùn)算符時(shí),首先求not?值,然后求and值,最后且or值

注:int?關(guān)鍵字用來限制范圍。

?

??????????????????????列名?Between?低值?And?高值

?Where?條件種類??????And?Or?Not(與,或,非)

??????????????????????In(值列表)???egSelect?*?from?stuInfo?Where?stuAge?IN?(21,25)

??????????????????????Like(模糊查詢)

5.SQL語句

1.?一次插入一行

Insert?[into]??<表名>??[列名列表]??values??<值列表>

????列名列表順序可自己指定,但值列表的順序應(yīng)該和列名列表相同

2.?一次插入多行

l?Insert?[into]??<新表名>[此表必須預(yù)先創(chuàng)建]?

?select?<列名>??from?<查詢的表>

?

l?Select?<列名>???into??<新表名>[必須預(yù)先沒有]?from??<查詢的表>

?

l?Insert??<查詢的表>[列名1,?列名2,列名3]????——得到的是虛擬表

Select?'?',?'?',?'?'?union

Select?'?',?'?',?'?'?union

Select?'?',?'?',?'?'?

?

?

Delete??from??<表名>??[where?<刪除條件>]

只要?jiǎng)h除就是刪除整條記錄,不會(huì)只刪除單個(gè)字段,所以在delete?后不出現(xiàn)字段名。

注:delete...from...只要?jiǎng)h除就是刪除整條記錄,不會(huì)刪除單個(gè)字段,所有在delete后不能出現(xiàn)字段名,例如:

“delete?SAddress?from?Students”?此語句將會(huì)報(bào)錯(cuò)

?

Truncate??table??<表名>

注意:1執(zhí)行刪除不能刪除主外建關(guān)系的表數(shù)據(jù)

??????2?刪除表中所有數(shù)據(jù)

??????3執(zhí)行效率高(快)

?

Update??<表名>?set?<列名=更新值>??[where?<更新條件>]

Select?<列名>

From?<表名>

Where?[查詢條件表達(dá)式]

Group?by?[分組]

Having??[過濾]??——不單獨(dú)使用,只與group?by?一起使用(相當(dāng)于Where)

[order?by?<排序的列名>?[ASC?或DESC(降序)]

1.?選擇指定數(shù)量的記錄,通常配合order?By使用

Eg;?Select?Top?2?*?From?stuInfo?Order?By?stuAge?Desc

第4章?高級查詢

4.1子查詢

含義:嵌入的查詢稱為子查詢或嵌套查詢

實(shí)現(xiàn)方式:可通過關(guān)系運(yùn)算符、in?exists?實(shí)現(xiàn)的查詢

注意:子查詢語句必須放置在一對圓括號內(nèi)。

與關(guān)系運(yùn)算符使用時(shí),必須保證子查詢返回的值不能多于一個(gè)

舉例:

--查詢最近一次C#?OOP考試成績最高分和最低分

select?科目='C#?OOP',MAX(StudentResult)?as?最高分?,?Min(StudentResult)as?最低分??from?dbo.Result?

where?SubjectNo=(select?SubjectNo?from?dbo.Subject?where?SubjectName='C#?OOP')

and?ExamDate=(select?Max(ExamDate)from?dbo.Result?where?SubjectNo=(select?SubjectNo?from?dbo.Subject?where?SubjectName='C#?OOP'))

go

4.2??表聯(lián)接

內(nèi)聯(lián)接——返回兩表的交集

select?列名,列名,列名,列名

from?表1?inner?join??表2?on?(表1.?列名=表2.?列名)

?inner?join?表3?on?主外鍵關(guān)系

第一個(gè)?on??主外鍵關(guān)系是表1?和表2

第二個(gè)?on??主外鍵關(guān)系是表2和表3的或表1?和表3

(在內(nèi)連接中,參與連接的表的地位是平等的,沒有主從之分)

?

外聯(lián)接——??A?C?B

1.?左外聯(lián)接(left?join??或?left??outer?join)????A+C

2.?右外連接(Right?join??Right?outer?join)????B+C

3.?完整外聯(lián)接???(Full?join??Full?outer?join)?????A+B+C

????????

select?列名,列名,列名,列名

from表1?left?join??表2?on?(表1.?列名=表2.?列名)?

left?join?表3?on?主外鍵關(guān)系

第一個(gè)?on??主外鍵關(guān)系是表1?和表2

第二個(gè)?on??主外鍵關(guān)系是表2和表3

(在外部的連接中參與連接的表有主從之分,left?join?左邊的表是主表,右邊是從表?)

?

交叉聯(lián)接——返回兩表之積

4.3??in?和?not?in

???和where做查詢使用

--查詢S1學(xué)期開設(shè)得課程in)(not?in?查詢的是非S1開始的課程)

select?SubjectName?from?dbo.Subject?

where?GradeID?in?(select?GradeID?from??dbo.Grade?where?GradeName='S1')

go

4.4??Exists?not?Exists

???和if做判斷使用

--如果有S1的學(xué)生,就將他的在讀年級更新為S2

if?exists(?SELECT?*?FROM?Student?INNER?JOIN?Grade?ON?

???????????Student.GradeId=Grade.GradeId?WHERE?GradeName='S1')

begin

?????update??dbo.Student?set?GradeId=(select?GradeID?from?dbo.Grade?where?GradeName='S2')

?????from?dbo.Student?inner?join?dbo.Grade?on?Student.GradeId=Grade.GradeID?

?????where?GradeName='S2'

end

go

4.5??表聯(lián)接和子查詢的區(qū)別

??表聯(lián)接都可以用子查詢替換,反之不可以。

??子查詢——適合于作為查詢的篩選條件

??表聯(lián)接——更適合于查看多表的數(shù)據(jù)

4.6??子查詢的注意事項(xiàng)

1.?父查詢中的子查詢可包括

??????select?、?from?、?where?、?group?by?、?having

??????但排序語句(order?by)不能寫在子查詢中

1.?子查詢的select子句中不能出現(xiàn)textntextimage數(shù)據(jù)類型的列

2.?子查詢中包含而父查詢中沒有的列不能包含在輸出列中

?

?

select?*?from?(select?*?from?Result)?Info?

?

第5章???☆☆?SQL函數(shù)

5.1???字符串函數(shù)

/*字符串函數(shù)*/

--1.查找一個(gè)字符串在另一個(gè)字符串中位置

--從第一個(gè)位置開始查找青鳥在合肥科海北大青鳥中出現(xiàn)的位置

select?CharIndex('青鳥','合肥科海北大青鳥',1)?

?

--2.返回給定字符串的長度

select?len('合肥科海北大青鳥')

?

--3.將字符串轉(zhuǎn)換成大寫

select?upper('hefei-kehai')

?

--4.將字符串轉(zhuǎn)換成小寫

select?lower('HEFEI-kehai')

?

--5.去除字符串左邊空格

select?ltrim('??hefei??')

?

--6.去除字符串右邊空格

select?rtrim('??hefei??')

?

--7.從左邊返回指定長度的字符串

--?返回結(jié)果(合肥科海)

select?left('合肥科海北大青鳥',4)

?

--8.從右邊返回指定長度的字符串

--?返回結(jié)果(北大青鳥)

select?right('合肥科海北大青鳥',4)

?

--9.替換字符串中的字符

--??合肥替換成安徽

select?replace('合肥科海北大青鳥','合肥','安徽')

?

--10.在指定位置刪除指定的長度的字符串,并在此插入行的字符串

--?刪除科海插入圣大

select?stuff('合肥科海北大青鳥',3,2,'圣大')

?

--11.從指定位置返回指定長度的字符串

--?返回結(jié)果北大青鳥

select?substring('合肥科海北大青鳥',5,4)

?

?

5.2??日期函數(shù)

/*數(shù)據(jù)庫日期函數(shù)*/

--1.獲取系統(tǒng)當(dāng)前日期

select?getdate()

?

--2.將指定的數(shù)增加到指定的日期上

--?返回對月增加結(jié)果-11-06?00:00:00:000

select?dateAdd(mm,2,'2009-09-06')

?

--3.返回兩個(gè)日期指定部分之差

--?返回年差結(jié)果為

select?datediff(yy,'2000-07-07','2009-02-09')

?

--4.返回日期中指定部分的字符串

--?返回日期中的日為

select?dateName(dd,'2009-9-18')

?

--5.返回日期中指定部分的整數(shù)

--?返回日期為

select?datePart(day,'2009-9-15')

?

?

?

/*截取各種時(shí)間格式*/

--1.截取時(shí)間格式為-09-15(--)

select?convert(varchar(10),getdate(),20)

?

--2.截取時(shí)間格式為:28:34(時(shí)--)

select?convert(varchar(10),getdate(),8)

?

--3.截取時(shí)間格式為-09-15?21:31:03(---時(shí)--)

select?convert(varchar(20),getdate(),120)

?

--4.截取時(shí)間格式為-15-2009(--)

select?convert(varchar(100),getdate(),110)

?

--5.截取時(shí)間格式為/09/15(//)

select?convert(varchar(100),getdate(),11)

?

5.3??數(shù)學(xué)函數(shù)

--1.取絕對值

select?ABS(-43)

?

--2.取大于或等于指定數(shù)值、表達(dá)式的最小整數(shù)

select?ceiling(43.5)?

?

--3.取小于或等于指定數(shù)值、表達(dá)式的最大整數(shù)

select?floor(43.5)

?

--4.取冪值

select?power(5,2)

?

--5.四舍五入到指定精度

select?round(43.543,1)

?

--6.正數(shù)返回+1?、負(fù)數(shù)返回-1?、返回

select?sign(-43)

?

--7.取浮點(diǎn)表達(dá)式的平方根

select?sqrt(9)

?

?

5.4??聚合函數(shù)

1.??sum?放回?cái)?shù)值的總和??(只能用于數(shù)字類型的列?,不能匯總字符、日期等其他數(shù)據(jù)類型)

?

2.??avg??返回?cái)?shù)值的平均值???(只能用于數(shù)字類型的列)

?

3.??max(返回最大值)?和min(返回最小值)??

?(可以用于數(shù)字型、字符型、以及時(shí)間/日期類型)

?

4count?(返回提供的表達(dá)式非空值的計(jì)數(shù)?)(可用數(shù)字和字符串類型)

?

?

?

?

第6章??事務(wù)、視圖和索引

6.1??事務(wù)

含義:

是單個(gè)邏輯工作單元執(zhí)行的一系列操作。

如果某一事務(wù)成功,則該事物中進(jìn)行的所有數(shù)據(jù)更改均會(huì)提交,成為數(shù)據(jù)庫的永久組成部分。

如果事務(wù)遇到錯(cuò)誤且必須取消或回滾,則所有數(shù)據(jù)更改均被清楚

特性:

一個(gè)邏輯單元必須有四個(gè)屬性(ACID)。

原子性(Atomicity)??一致性(Consistency)??隔離性(Isolation)???持久性(Durability

語法:

??????begin?transaction??--開始事務(wù)

commit?transaction?????--提交事務(wù)

rollback?transaction???--回滾事務(wù)

分類:

?????顯式事務(wù)——用begin?transaction明確指定事務(wù)的開始

??????隱式事務(wù)——通過設(shè)置set?implicit_transactions?on?將隱式事務(wù)模式設(shè)置為打開。

無需描述每個(gè)事務(wù)的開始,只需要提交或回滾每個(gè)事務(wù)

??????自動(dòng)提交事務(wù)——SQL?Server?的默認(rèn)模式,它將每條T-SQL語句視為一個(gè)事務(wù),自動(dòng)提交或回滾

編寫事務(wù)的原則:

l?事務(wù)盡可能簡短

l?事務(wù)中訪問的數(shù)據(jù)量盡量最少?

l?查詢數(shù)據(jù)時(shí)盡量不要使用事務(wù)

l?在事務(wù)處理過程中盡量不要出現(xiàn)等待用戶輸入的操作

6.2??視圖

含義:

?????保存在數(shù)據(jù)庫中的select查詢。是一種虛擬表,由一個(gè)或多個(gè)表中的列和行組合而成。

使用原因:

?????1.?數(shù)據(jù)的安全性。用戶不必查看整個(gè)數(shù)據(jù)庫結(jié)構(gòu),有所側(cè)重

?????2.?符合用戶日常業(yè)務(wù)邏輯,使他們對數(shù)據(jù)更容易理解

如何操作視圖:

l?篩選表中的行

l?防止未經(jīng)許可的用戶訪問敏感數(shù)據(jù)

l?將多個(gè)物理數(shù)據(jù)表抽象為一個(gè)邏輯數(shù)據(jù)表

特點(diǎn):

?????視圖并不是數(shù)據(jù)庫中存儲(chǔ)的數(shù)據(jù)值的集合,它的行和列來自查詢中引用的表。在執(zhí)行時(shí),直接顯示表中的數(shù)據(jù)。

使用方法:

一:使用Microsoft?SQL?Server?Management?Studio

??1.?選中數(shù)據(jù)庫下的“視圖”,右擊選擇“新建視圖”

??

??2.?在打開的對話框中選擇需要連接的表后,單擊“添加”按鈕

??3.?選擇希望查看的列,可以取別名,然后單擊??即可

????

?

?

二:使用T-SQL語句

?????use?MySchool

go

--檢測視圖是否存在,視圖記錄存放在系統(tǒng)表sysobjects中

if?exists(select?*?from?sysobjects?where?name='vw_Stu_Result_Subject')

drop?view?vw_Stu_Result_Subject

go

?

--創(chuàng)建視圖

create?view?vw_Stu_ReSub

as

SELECT?Student.StudentName?AS?學(xué)生姓名,?Student.Phone?AS?聯(lián)系電話,

???????Result.StudentResult?AS?成績,?Result.ExamDate?AS?考試日期,?

???????Subject.SubjectName?AS?課程名稱

FROM?Student?

INNER?JOIN?Result?ON??Student.StudentNo?=?Result.StudentNo?

INNER?JOIN?Subject?ON?Result.SubjectNo?=?Subject.SubjectNo

go

?

--查看視圖結(jié)果

select?*?from?vw_Stu_Result_Subject

?

注意事項(xiàng):

l?每個(gè)視圖中可使用多張表

l?一個(gè)視圖可以嵌套另一個(gè)視圖

l?視圖定義中的select語句不能包括以下內(nèi)容

??Order?by子句,除非查詢語句的選擇列表中也有一個(gè)TOP子句

??Into?關(guān)鍵字

??引用臨時(shí)表或表變量

6.3??索引

作用:

???提升數(shù)據(jù)庫的檢索速度,改善數(shù)據(jù)庫性能

分類:

??唯一索引——不允許兩行具有相同的索引值(不建議使用)

??主鍵索引——是唯一索引的特殊類型,它要求主鍵中的每個(gè)值都是唯一的

??聚集索引——按字母(字母是邏輯順序,頁碼是物理順序)一個(gè)表只能由一個(gè)聚集索引

??非聚集索引——按筆畫排序

??復(fù)合索引——多列組合而成的索引

??全文索引——基于標(biāo)記的功能性索引

使用方法:

一:使用Microsoft?SQL?Server?Management?Studio

在設(shè)計(jì)表中右擊“索引/鍵”,點(diǎn)擊“添加”——索引列的排序、是唯一的……

二:使用T-SQL語句

???use?MySchool

go

?

--檢測是否存在該索引(索引存放在系統(tǒng)表sysindexes)

if?exists(select?name?from?sysindexes?where?name?='IX_Student_StudentName')

drop?index?Student.IX_Student_StudentName??--刪除索引

?

--創(chuàng)建非聚集索引,填充因子30%

--unique(唯一索引)?clustered?(聚集索引)?nonclustered?(非聚集索引)

create?nonclustered?index?IX_Student_StudentName?

???on?Student(StudentName)

???with?fillfactor=30

go

?

/*--指定按索引:IX_Student_StudentName查詢--*/???

select?*?from?Student

???with(index=IX_Student_StudentName)

???where?StudentName?like?'%'

建立索引的標(biāo)準(zhǔn):

??頻繁搜索的列

??經(jīng)常用作查詢選擇的列

??經(jīng)常排序分組的列

??經(jīng)常用作連接的列(主鍵/外鍵)

第7章??存儲(chǔ)過程

7.1??存儲(chǔ)過程的概念

含義:

SQL語句和控制語句的預(yù)編譯集合。包括?聲明變量、邏輯控制語句、編程

優(yōu)點(diǎn):

??模塊化程序設(shè)計(jì)——?jiǎng)?chuàng)建一次,調(diào)用多次

??執(zhí)行速度快,效率高——已創(chuàng)建的存儲(chǔ)過程,可直接執(zhí)行,無需編譯優(yōu)化

??減少網(wǎng)絡(luò)流量——使用一行執(zhí)行語句即可

??具有良好的安全性——不同權(quán)限用戶使用不同存儲(chǔ)過程,通過提交的存儲(chǔ)過程名稱執(zhí)行

?

一個(gè)完整的存儲(chǔ)過程包括以下三個(gè)部分:

??輸入?yún)?shù)和輸出參數(shù)

??在存儲(chǔ)過程中執(zhí)行的T-SQL語句

??存儲(chǔ)過程的返回值

?

分類:

一:系統(tǒng)存儲(chǔ)過程

二:用戶自定義的存儲(chǔ)過程

7.2??系統(tǒng)存儲(chǔ)過程

?????exec?sp_databases??--列出當(dāng)前系統(tǒng)中的數(shù)據(jù)庫

exec?sp_renamedb?'MyBank','Bank'?--改變數(shù)據(jù)庫名稱

use?MySchool

go

?

exec?sp_tables??--當(dāng)前數(shù)據(jù)庫中可查詢對象的列表

exec?sp_columns?Student??--查詢Student表中列的信息

exec?sp_help?Student?????--查詢Student表的所有信息

exec?sp_helpconstraint?Student???--查看Student表的約束

exec?sp_helptext?'vw_Stu_Result_Subject'??--查看視圖的語句文本

exec?sp_stored_procedures??--返回當(dāng)前數(shù)據(jù)庫中的存儲(chǔ)過程列表

exec?sp_helpindex?Student??--查詢Student表的索引

exec?sp_stored_procedures??--顯示存儲(chǔ)過程的列表

7.3??用戶自定義的存儲(chǔ)過程

set?@errorSum=@errorSum+@@ERROR??--顯示錯(cuò)誤數(shù)

????set?@subjectNo=@@IDENTITY??--獲得課程編號(獲取主鍵標(biāo)識(shí)列的編號)

l?創(chuàng)建不帶參數(shù)的存儲(chǔ)過程

?????use?MySchool

go

?

if?exists(select?*?from?sysobjects?where?name='usp_StudentResult')

drop?procedure?usp_StudentResult???--刪除存儲(chǔ)過程-

go

?

/*--創(chuàng)建不帶參數(shù)的存儲(chǔ)過程--*/

create?procedure?usp_StudentResult

as

SELECT?Student.StudentName?AS?學(xué)生姓名,?Student.Phone?AS?聯(lián)系電話,

???????Result.StudentResult?AS?成績,?Result.ExamDate?AS?考試日期,?

???????Subject.SubjectName?AS?課程名稱

FROM?Student?

INNER?JOIN?Result?ON??Student.StudentNo?=?Result.StudentNo?

INNER?JOIN?Subject?ON?Result.SubjectNo?=?Subject.SubjectNo

Go???--go不能省,要省略需寫???begin?end

?

exec?usp_StudentResult???--調(diào)用執(zhí)行存儲(chǔ)過程

l?創(chuàng)建帶輸入?yún)?shù)的存儲(chǔ)過程

create?procedure?usp_unpass

?

@score?int???--平均成績???@score?int=50

???@subName?varchar(50),--考試課程?

As

?

??--輸入?yún)?shù)

exec?usp_unpass??50,?'SQL?Base'

exec?usp_unpass?@score=50,?@subName='SQL?Base'

?

--輸入?yún)?shù)采用默認(rèn)值

exec?usp_unpass??default,?'SQL?Base'

exec?usp_unpass??@subName='SQL?Base'

?

l?創(chuàng)建帶輸出參數(shù)的存儲(chǔ)過程

???create?procedure?usp_query_num

?

???@UnPassNum?int?output,?--未通過人數(shù)****輸出參數(shù)

???@TotalNum?int?output,???--參加考試人數(shù)****輸出參數(shù)

???@subName?varchar(50),--考試課程****輸入?yún)?shù)

???@score?int=60???--平均成績****輸入?yún)?shù)

??

As

?

--聲明變量用于接收輸出的值

declare?@UnPassNum?int

declare?@TotalNum?int

exec?usp_query_num?@UnPassNum?output?,@TotalNum?output,'Java?Logic',50

?

例如:??1.?輸入?yún)?shù)???2.Exec執(zhí)行

??

7.4??處理錯(cuò)誤信息

作用:向用戶報(bào)告錯(cuò)誤

語法:

--創(chuàng)建存儲(chǔ)過程

create?procedure?usp_存儲(chǔ)過程名

as

??if(@GradeName?is?null?or?@SubjectName?is?null)

??begin

?????raiserror('學(xué)期名稱和課程名稱是否為空',16,1)

?????return??--立即返回,退出存儲(chǔ)過程

??end

??--SQL語句

7.5??注意

???存在于sysobjects中的有——??表???、???視圖???、存儲(chǔ)過程?

????string?account=string.Format("{0:000000}",int.Parse(userItem[1]));

????????????????///C3????貨幣格式??????eg2000??————¥2000.000

????????????????///D3?????十進(jìn)制格式????eg2000?————2000

????????????????///F3?????小數(shù)點(diǎn)后的位數(shù)固定??eg:?2000?————2000000

????????????????///N?????用逗號隔開的數(shù)字?eg:?250000?————250000.00

????????????????///P3????百分比計(jì)算法??eg0.3256??————32.56

????????????????///X000??十六進(jìn)制格式??eg12??————?C

????????????????string?Money?=?string.Format("{0:C2}",int.Parse(userItem[2]));??//貨幣格式?小數(shù)點(diǎn)后兩位小數(shù)

?

?

其他:

CREATE PROCEDURE P_GetPagedOrders2005
@startIndex INT,?
@pageSize INT?
AS
begin
WITH orderList AS (?
SELECT ROW_NUMBER() OVER (ORDER BY O.orderid DESC)AS Row, O.orderid,O.orderdate,
O.customerid,C.CompanyName,E.FirstName+' '+E.LastName as EmployeeName?
from orders O
left outer join Customers C
on O.CustomerID=C.CustomerID
left outer join Employees E
on O.EmployeeID=E.EmployeeID)

SELECT orderid,orderdate,customerid,companyName,employeeName
FROM orderlist
WHERE Row between @startIndex and @startIndex+@pageSize-1
end

轉(zhuǎn)載于:https://www.cnblogs.com/llhhll/p/3407577.html

總結(jié)

以上是生活随笔為你收集整理的数据库基础知识系列的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。