数据库基础知识系列
?數(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.3畫E-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ù)類型 | 1和0或空值 | 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)算符有not、And、or。
???eg:?采購訂單表中—付款方式:信用卡
???????????????????—約束要求:牡丹卡、金穗卡、龍卡、陽光卡
Not(付款方式=’信用卡’)??or??(?信用卡?in??(?‘牡丹卡’?,?’?金穗卡’?,?’?龍卡’?,?’?陽光卡’)?)
在一個(gè)語句中使用了多個(gè)邏輯運(yùn)算符時(shí),首先求not?值,然后求and值,最后且or值
注:int?關(guān)鍵字用來限制范圍。
?
??????????????????????列名?Between?低值?And?高值
?Where?條件種類??????And?Or?Not(與,或,非)
??????????????????????In(值列表)???eg:Select?*?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)text、ntext、image數(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í)間/日期類型)
?
4.count?(返回提供的表達(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????貨幣格式??????eg:2000??————¥2,000.000
????????????????///D3?????十進(jìn)制格式????eg:2000?————2000
????????????????///F3?????小數(shù)點(diǎn)后的位數(shù)固定??eg:?2000?————2000,000
????????????????///N?????用逗號隔開的數(shù)字?eg:?250000?————250,000.00
????????????????///P3????百分比計(jì)算法??eg:0.3256??————32.56
????????????????///X000??十六進(jìn)制格式??eg:12??————?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é)
- 上一篇: InChatter系统开源聊天模块前奏曲
- 下一篇: Linux自动备份MySQL数据库脚本代