




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
CASE函數用法1單值判斷,相當于switchcaseCASE
expressionWHEN
value1
THEN
returnvalue1WHEN
value2
THEN
returnvalue2WHEN
value3
THEN
returnvalue3ELSE
defaultreturnvalueEND例子:論壇中用戶的等級
case
levelwhen
1
then'骨灰'when
2
then'大蝦'when
3
then'菜鳥'endCase函數注意點:用法:直接對列的值進行值判斷(switch
case)then
后面值的類型必須要一致,因為是一列CASE函數用法2CASEWHENcondition1THENreturnvalue1WHEN
condition
2
THEN
returnvalue2WHEN
condition
3
THEN
returnvalue3ELSE
defaultreturnvalueEND相當于if…elseif…else….例子:百分制轉換為素質教育例子:根據電話,添加地區列PhoneNum兩種用法的區別:第一種case后面需要跟上列的名稱,是定值判斷
第二種case后面不需要跟上列的名稱,是區間判斷第二種case后面的不一定非得是列名練習2單號金額Rk110Rk220Rk3-30Rk4-10將上面的表輸出為如下的格式:單號收入支出Rk1100Rk2200Rk3030Rk4010*練習3有一張表student0,記錄學生成績namesubject
result張三語文80張三數學90張三物理85李四語文85李四數學92李四物理NULL物理要求輸出下面的格式:name
語文 數學李四張三85809290085數據和參考答案見備注索引Index全表掃描:對數據進行檢索(select)效率最差的是全表掃描,就是一條條的找。如果沒有目錄,查漢語字典就要一頁頁的翻,而有了目錄只要查詢目錄即可。為了提高檢索的速度,可以為經常進行檢索的列添加索引,相當于創建目錄。創建索引的方式,在表設計器中點擊右鍵,選擇“索引/鍵”→添加→在列中選擇索引包含的列。使用索引能提高查詢效率,但是索引也是占據空間的,而且添加、更新、刪除數據的時候也需要同步更新索引,因此會降低
Insert、Update、Delete的速度。只在經常檢索的字段上(Where)創建索引。(*)即使創建了索引,仍然有可能全表掃描,比如like、函數、類型轉換等。索引畫圖演示聚簇索引和非聚簇索引。通過代碼創建索引。create
clustered
index
IX_TestInex_phone
on
TestIndex(phone)--創建非聚簇索引create
nonclustered
indexIX_TestIndex_nameonTestIndex(name)使用索引的條件和索引失效1、在經常使用的列上添加索引索引失效的條件:Where后面使用<>、not
in、!=、or等。對列使用了函數Avg()Sum()
Convert()對索引列進行運算:錯誤:select
*
from
test
where
id-1=9正確:select
*
from
test
where
id=10like.在where中使用isnull或者is
notnull.select
*
from
teat
where
1=1子查詢所謂子查詢就是在查詢語句中查詢另一個查詢語句的結果集。SELECT
*
FROM(SELECT
*
FROMstudent
where
sAge<30)
as
t使用子查詢的時候,要給要查詢的結果集取一個列名。例:錯誤:select
*
from
Student
where
sClassId
in
(select
*
from
Classwhere
cid=1)爭取:select
*
from
Student
where
sClassId
in
(select
cid
from
Classwhere
cid=1)in、not
in、exist
、not
existexist的用法:(了解*)exists:強調的是是否返回結果集,不要求知道返回什么,檢測行的存在。比如:
select
*
from
Student
where
exists(select
*
from
Class
whereStudent.sClassId=Class.cid),只要exists引導的子句有結果集返回,那么exists這個條件就算成立了所以exists子句不在乎返回什么,而是在乎是不是有結果集返回。所以可以認為exists返回其實是true或者fasle而exists
與in
最大的區別在于in引導的子句只能返回一個字段。而exists不在乎返回多少字段可以用來if判斷:演示any
、all(了解*)any其實就或者orall其實就是并且and
select
*
from
PhoneNum
where
pTypeIdin(1,2,3)select
*
from
PhoneNum
where
ptypeid=any(select
ptId
from
PhoneType)select
*
from
PhoneNum
where
ptypeid=all(select
ptid
fromPhoneType)in和any、all相同點:匹配的結果只能有一個列子查詢注意點:重做Unionall的一道題。要求在一個表格中查詢出學生的英語最高成績、最低成績、平均成績.查詢高二二班的所有學生select*
from
studentwhere
sClassId
=
(select
cId
from
class
wherecName='高二二班')錯誤:SELECT
1
AS
‘A’,2,(SELECT
english
FROM
score)正確:select
english
,2
from
Score正確:select
1,2,3結論:當列為常量的時候,必須出現在有from的語句中。子查詢返回的值不止一個。當子查詢跟隨在=、!=、<、<=、>、>=之后,或子查詢用作表達式時,這種情況是不允許的。子查詢如果子查詢是多行單列的子查詢,這樣的子查詢的結果集其實是一個集合。可以使用in關鍵字代替=號查詢高二一班和高二四班的所有學生select
*
from
student
where
sClassId
in(selectcIdfrom
classwherecName='高二一班'or
cName='高二四班')查詢劉關張的成績select
studentId,english
from
score
where
studentId
in(select
sId
from
student
where
sName='劉備'or
sName='關羽'orsName='張飛')刪除劉關張的成績delete
from
student
where
sId
in(select
sId
from
student
where
sName='劉備'or
sName='關羽
'or
sName='張飛')分頁對data表分頁,每頁5條求總頁數(ceiling)Row_Number函數排序后給每行數據進行編號。over中寫排序規則。表連接Join(區別Union
all)案例1:查詢所有學生的姓名、年齡及所在班級案例2:查詢年齡超過20歲的學生的姓名、年齡及所在班級案例3:查詢學生姓名、年齡、班級及成績output
joinInner
Join..on(內連接)、Left
Join、Right
Join(*)Cross
Join
交叉連接笛卡爾積其它連接的基礎畫圖演示CrossJoin練級練習1:查詢所有及格的學生姓名、年齡及成績練習2:查詢所有參加考試的(分數不為null)學生姓名、年齡及成績練習3:查詢所有學生(參加和未參加考試)的學生姓名、年齡、成績,如果沒有參加考試顯示缺考,如果小于60分顯示不及格視圖概述回顧數據怎么存儲的視圖是一張虛擬表,它表示一張表的部分數據或多張表的綜合數據,其結構和數據是建立在對表的查詢基礎上視圖在操作上和數據表沒有什么區別,但兩者的差異是其本質是不同:數據表是實際存儲記錄的地方,然而視圖并不保存任何記錄,它存儲的實際上是查詢語句相同的數據表,根據不同用戶的不同需求,可以創建不同的視圖(不同的查詢語句)視圖的目的是方便查詢,所以一般情況下不能對視圖進行增刪改優點:篩選表中的行防止未經許可的用戶訪問敏感數據降低數據庫的復雜程度系統視圖
sys.database
sys.object自定義視圖:演示創建視圖局部變量_先聲明再賦值聲明局部變量DECLARE
@變量名
數據類型DECLARE
@name
varchar(20)DECLARE
@id
intdeclare:可以一次性聲明多個變量注意逗號
set:只能給一個變量賦值
select:打印,給多個變量賦值,在查詢語句中給變量賦值把張三的年齡賦值給變量@ageselect
@age=sname
from
student
where
sname=@name輸出變量的值SELECT
以表格的方式輸出,可以同時輸出多個變量PRINT
以文本的方式輸出,一次只能輸出一個變量的值SELECT
@name,@id
表格的方式輸出PRINT
@name
文本的方式輸出PRINT
@id變量種類變量分為:局部變量:局部變量必須以標記@作為前綴,如@Age
int局部變量:先聲明,再賦值全局變量(系統變量):全局變量必須以標記@@作為前綴,如@@version全局變量由系統定義和維護,我們只能讀取,不能修改全局變量的值全局變量變量含義@@ERROR最后一個T-SQL錯誤的錯誤號@@IDENTITY最后一次插入的標識值@@LANGUAGE當前使用的語言的名稱@@MAX_CONNECTIONS可以創建的同時連接的最大數目@@ROWCOUNT受上一個SQL語句影響的行數@@SERVERNAME本地服務器的名稱@@TRANCOUNT當前連接打開的事務數@@VERSIONSQL
Server的版本信息IF
ELSEIF(條件表達式)BEGIN
--相當于C#里的{語句1……END
--相當于C#里的}ELSEBEGIN語句1……END計算平均分數并輸出,如果平均分數超過60分輸出成績最高的三個學生的成績,否則輸出后三名的學生declare
@avg
floatselect
@avg
=
avg(english)
from
scoreprint'平均分數'+convert(varchar(20),@avg)if(@avg>60)Beginprint'前三名‘select
top
3
sName,english
from
student
inner
join
score
onstudent.sId=score.studentId
order
by
english
descEndElse例:WHILE循環WHILE(條件表達式)BEGIN
--相當于C#里的{語句……BREAKEND
--相當于C#里的}如果不及格的人超過半數(考試題出難了),則給每個人增加2分例:把所有未及格的人的成績都加及格事務-為什么需要事務如,轉賬問題:假定錢從A轉到B,至少需要兩步:A的資金減少然后B的資金相應增加update
bank
setbalance=balance-1000
wherecid='0001'update
bank
set
balance=balance
+
1000
where
cid='0002'--查看結果。SELECT
*
FROMbank會否出問題?什么是事務(Transaction)事務:同生共死指訪問并可能更新數據庫中各種數據項的一個程序執行單元(unit)--也就是由多個sql語句組成,必須作為一個整體執行這些sql語句作為一個整體一起向系統提交,要么都執行、要么都不執行語法步驟:開始事務:BEGIN
TRANSACTION事務提交:COMMIT
TRANSACTION事務回滾:ROLLBACK
TRANSACTION判斷某條語句執行是否出錯:全局變量@@ERROR;@@ERROR只能判斷當前一條T-SQL語句執行是否有錯,為了判斷事務中所有T-SQL語句是否有錯,我們需要對錯誤進行累計;例:SET@errorSum=@errorSum+@@error存儲過程存儲過程---就像數據庫中運行方法(函數)和C#里的方法一樣,由存儲過程名/存儲過程參數組成/可以有返回結果。前面學的if
else/while/變量/insert/select
等,都可以在存儲過程中使用優點:執行速度更快–在數據庫中保存的存儲過程語句都是編譯過的允許模塊化程序設計–類似方法的復用提高系統安全性–防止SQL注入減少網絡流通量–只要傳輸存儲過程的名稱系統存儲過程由系統定義,存放在master數據庫中名稱以“sp_”開頭或”xp_”開頭自定義存儲過程由用戶在自己的數據庫中創建的存儲過程系統存儲過程系統存儲過程說明sp_databases列出服務器上的所有數據庫。sp_helpdb報告有關指定數據庫或所有數據庫的信息sp_renamedb更改數據庫的名稱sp_tables返回當前環境下可查詢的對象的列表sp_columns回某個表列的信息sp_help查看某個表的所有信息sp_helpconstraint查看某個表的約束sp_helpindex查看某個表的索引sp_stored_procedures列出當前環境中的所有存儲過程。sp_password添加或修改登錄帳戶的密碼。sp_helptext顯示默認值、未加密的存儲過程、用戶定義的存儲過程、觸發器或視圖的實際文本。創建存儲過程定義存儲過程的語法CREATE
PROC[EDURE]
存儲過程名@參數1
數據類型=默認值OUTPUT,@參數n
數據類型=默認值OUTPUTASSQL語句參數說明:參數可選參數分為輸入參數、輸出參數輸入參數允許有默認值EXEC
過程名[參數]-自定義不帶參數的存儲過程大部分學生不及格,提分,直到一半學生及格為止usp_upGrade自定義帶默認參數的存儲過程計算班級中英語和數學不及格的人數@passEng
@passMath調用帶默認參數存儲過程的方式在存儲過程中使用輸出參數想要獲得在加分的過程中一共加了多少次的分數輸出參數關鍵字:output將剛才不及格的人數改為輸出參數。存儲過程實現分頁的存儲過程實現登陸的存儲過程判斷是否鎖定如果超過十五分鐘,解鎖判斷用戶名是否正確如果用戶名正確在判斷密碼是否爭取,如果登錄成功,更新錯誤次數為0如果登錄失敗,記錄錯誤時間,錯誤次數加1實現表為參數的存儲過程觸發器觸發器是一種特殊類型的存儲過程,它不同于前面介紹過的一般的存儲過程。一般的存儲過程通過存儲過程名稱被直接調用,而觸發器主要是通過事件進行觸發而被執行。觸發器是一個功能強大的工具,在表中數據發生變化時自動強制執行。觸發器可以用于SQL
Server約束、默認值和規則的完整性檢查,還可以完成難以用普通約束實現的復雜功能。那究竟何為觸發器?觸發器對表進行插入、更新、刪除的時候會自動執行的特殊存儲過程。觸發器一般用在check約束更加復雜的約束上面。觸發器和普通的存儲過程的區別是:觸發器是當對某一個表進行操作。諸如:update、insert、delete這些操作的時候,系統會自動調用執行該表上對應的觸
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 江西省師范大學附屬中學、九江第一中學2025屆高一物理第二學期期末復習檢測試題含解析
- xte鄉村獸醫管理辦法
- 集團內部建設管理辦法
- 隧道倉庫堆放管理辦法
- 成品食品儲備管理辦法
- 保險消費投訴管理辦法
- 機關單位托幼室管理辦法
- 江蘇金融租賃管理辦法
- 混凝土施工過程管理辦法
- 商場前臺工作總結
- 地鐵安檢培訓課件
- 摸魚活動策劃方案
- 化療所致血小板減少癥CIT
- 2025年北京市中考物理試卷真題(含答案)
- 湖北省八校聯考2024-2025學年高一下學期6月期末物理試卷(含答案)
- 管理學基礎期末考試試題及答案
- 2025年定向士官心理測試題及答案
- 2025年安徽高考地理試卷真題(含答案)
- 2025至2030中國覆銅板行業項目調研及市場前景預測評估報告
- 護理靜脈留置針課件
- 2025年上海市中考語文試卷真題(含答案及解析)
評論
0/150
提交評論