在學習SQL編程前,先給大家分享幾個段子吧,咱先樂呵樂呵! 《桃花庵--程式員版》寫字樓里寫字間,寫字間中程式員;程式人員寫程式,又將程式換酒錢;酒醒只在屏前坐,酒醉還來屏下眠;酒醉酒醒日復日,屏前屏下年復年;但願老死電腦間,不願鞠躬老闆前;賓士寶馬貴者趣,公交自行程式員;別人笑我太瘋癲,我笑自己命...
在學習SQL編程前,先給大家分享幾個段子吧,咱先樂呵樂呵!
《桃花庵--程式員版》
寫字樓里寫字間,寫字間中程式員;程式人員寫程式,又將程式換酒錢;
酒醒只在屏前坐,酒醉還來屏下眠;酒醉酒醒日復日,屏前屏下年復年;
但願老死電腦間,不願鞠躬老闆前;賓士寶馬貴者趣,公交自行程式員;
別人笑我太瘋癲,我笑自己命太賤;但見滿街漂亮妹,哪個歸得程式員。
程式員的八榮八恥
以動手實踐為榮,以只看不練為恥。
以列印日誌為榮,以出錯不報為恥。
以局部變數為榮,以全局變數為恥。
以單元測試為榮,以手工測試為恥。
以代碼重用為榮,以複製粘貼為恥。
以多態應用為榮,以分支判斷為恥。
以定義常量為榮,以魔法數字為恥。
以總結思考為榮,以不求甚解為恥。
好了回歸正題,進入SQL編程
1.0使用變數:
變數是可以存儲數據值的對象,可以使用局部變數向SQL語句傳遞數據。在T-SQL中執行一批SQL語句時,可以聲明許多變數以
便臨時使用。聲明變數以後,可以在批處理中用一條T-SQL語句設置該變數的值,該批處理中的下一條語句可以從該變數中檢索數值
,並給出結果。
T-SQL中的變數分為局部變數和全局變數。局部變數的使用也是先聲明,在賦值。而全局變數由系統定義和維護,可以直接使用
但一般不自定義全局變數。
1.1局部變數:
T-SQL中,局部變數的名稱必須以標記@作為首碼。
聲明局部變數的語句如下:
語法
DECLARE @Exam DataType
其中@Exam為局部變數的名稱,DataType為數據類型
例如:
DECLARE @name nvarchar(32)
DECLARE @num int
局部變數的賦值方法有兩種:也就是SET , SELECT語句
語法
SET @name ='小強'
或
SELECT @name = '小強'
示例根據學號查找“小強”的信息及“小強”的學號相鄰的學生信息
--查找小強的信息
DECLARE @name nvarchar(32) --聲明局部變數存儲姓名
SET @name = '小強' --使用給SET給變數賦值
SELECT StuNo,StuName,BornDate,Address From Student
Where StudentName = @name
--查找與小強學號相鄰的學生信息
DECLARE @StuNo int
--使用SELECT 賦值
SELECT @StuNo = StudentNo From Student
Where StuName= @name
SELECT StuNo,StuName,BornDate,Address From Student
Where (StuNo=@StuNo+1) OR (StuNo=@StuNo-1)
GO
示例中可以看出,局部變數可用於在上下語句中傳遞數據(比如學號@StuNo)
在TSQ語言中,為局部變數賦值的語句有SET語句和SELECT語句。其中,SET賦值語句一般
賦予給變數指定的數據常量,如本例中的小強;SELECT賦值語句一般用於從表中查詢數據,在
賦給變數。需要註意的是,SELECT語句需要確保篩選的記錄不多於一條。如果查詢的記錄多餘
一條,則將把最後一條記錄的值賦給變數。
SET語句與SELECT語句的區別如下:
SET | SELECT | |
同時對多個變數賦值 | 不支持 | 支持 |
表達式返回多個值時 | 出錯 | 將返回的最後一個值賦給變數 |
表達式未返回值時 | 變數被賦值NULL | 變數保持原值 |
下麵我用代碼為你們展示他倆的不同之處
--先聲明多個變數
DECLARE @add=' ' nvarchar(100) ,@name=' ' nvarchar(100)
SET @add='北京',@name='張三' --發生語法錯誤
SELECT @add='北京',@name='張三' --為兩個局部變數@add,@name賦值
SET @add = (SELECT Address FROM Student) --發生語法錯誤
SELECT @add = Address FROM Student --最後一條記錄將賦值於@add
--查詢無結果時,@add被賦值NULL
SET @add =(SELECT Address From Student where 1<0)
--查詢無結果時,@add保持原值 '北京'
SELECT @add = '北京'
SELECT @add = Address from Student where 1<0
1.1全局變數:
T-SQL中,全局變數的名稱必須以標記@@作為首碼。
變數 | 含義 |
@@ERROR | 最後一個T-SQL錯誤的錯誤號 |
@@IDENTITY | 最後一次插入的標識值 |
@@LANGUAGE | 當前使用的語言名詞 |
@@MAX_CONNECTIONS | 可以創建的,同時可以連接的最大數目 |
@@ROWWCOUNT | 受上一個SQL語句影響的行數 |
@@SERVERNAME | 本地伺服器的名稱 |
@@SERVICENAME | 該電腦上的SQL伺服器名稱 |
@@TIMETICKS | 當前電腦上的每刻度的微秒數 |
@@TRANSCOUNT | 當前連接打開的事物數 |
@@VERSION | SQLSERVER的版本信息 |
全局變數的使用
SELECT @@IDLE as w --返回SQL自上次啟動後閑置的時間,單位為毫秒
SELECT @@IO_BUSY AS w --返回SQL自上次啟動後用於執行輸入和輸出操作的時間,單位為毫秒
SELECT @@LANGID AS w --返回當前所使用語言的本地語言標識符(ID)。
SELECT @@LANGUAGE AS w --返回當前使用的語言名
SELECT @@LOCK_TIMEOUT as w --當前會話的當前鎖超時設置,單位為毫秒。
SELECT @@MAX_CONNECTIONS as w --返回SQL上允許的同時用戶連接的最大數。返回的數不必為當前配置的數值
SELECT @@SERVERNAME as w --返回運行SQL伺服器名稱。
SELECT @@SERVICENAME as w --返回SQL正在其下運行的註冊表鍵名
SELECT @@TIMETICKS as w --返回SQL伺服器一刻度的微秒數
SELECT @@TOTAL_READ as w --返回 SQL伺服器自啟動後讀取磁碟的次數。
SELECT @@TOTAL_WRITE as w --返回SQL伺服器自啟動後寫入磁碟的次數。
SELECT @@TRANCOUNT as w --返回當前連接的活動事務數。
SELECT @@VERSION as w --返回SQL伺服器安裝的日期、版本和處理器類型。
有一個小技巧分析一下就是再給變數賦值的時候使用SET語句要比使用SELECT語句的效率高,因為
SET沒有結果集,占用資源比較少。
2.0輸出語句:
T-SQL支持輸出語句,用於顯示處理的數據結果,常用輸出語句有兩種,即PRINT和SELECT
語法
PRINT 局部變數 或字元串
SELECT 局部變數 AS 自定義列名
這裡我重點說一下啊!!!其中使用SELECT 語句輸出的數據是查詢語句的特殊應用。
廢話不多說上代碼:
PRINT '伺服器的名稱:' + @@SERVERNAME
PRINT '伺服器的版本:' + @@VERSION
SELECT @@SERVERNAME AS '伺服器的名稱'
SELECT @@VERSION AS '伺服器的版本'
大家可以看到我用PRINT語句輸出的結果在消息視窗中以文本方式顯示,用SELECT 語句輸出的結果
在結果視窗中以表格中顯示
使用PRINT語句 時要求+運算符兩側的操作數的數據類型必須一致,需要類型一致我想你應該想到了用
CONVERT()函數轉化,是的,沒錯不光用CONVERT ()我們還要學習另一個轉化函數CAST()
語法:
CAST(表達式 AS 數據類型)
CONVERT (數據類型[長度] ,表達式,[樣式])
CAST 與 CONVERT 都是用於將某種數據類型的表達式轉化為另一種數據類型的表達式。與CAST不同的是
在轉化日期時間類型/浮點類型的數據轉換為字元串時,CONVERT函數可以通過第三個參數指定轉化後的字元樣式。
上代碼:
declare @date datetime set @date=getdate() print '今天是'+convert(nvarchar(20),@date,120)
還有倆個函數比較有意思就是floor和ceiling函數
--floor:
select floor(1.92) --向下取整
結果為1
--ceiling
select ceiling(1.01) --向上取整
結果為2
2.1邏輯控制語句
T-SQL語言中,常用的邏輯語句有以下幾種
順序結構控制語句 BEGIN-END語法:
BEGIN
語句或語句塊
END
類似於C#中的{}表示語句中的開始和結束。
分支結構控制語句 IF-ELSE語句和CASE-END語句語法:
IF(條件)
BEGIN
語句1
語句2
..........
END
ELSE
.......
迴圈結構控制語句 WHILE語句語法:
WHILE(條件)
BEGIN
語句或語句塊
[break | CONTINUE]
END
使用BREAK語句將跳出迴圈結束迴圈,使用後者將跳過CONTINUE後面的語句回到第一次根據條件迴圈
在SQL 中,只有while一種迴圈,沒有do-while和for迴圈
並且沒有while(true)的寫法,可以使用while(1=1)替代。
註意:SQL中比較是否相等,用單等號(=)
while迴圈示例
--1到100之間所有偶數的和
--01.定義一個變數,保存總和
declare @sum int
set @sum=0
--02.定義一個初始變數
declare @num int
set @num=1
--03.進行while迴圈
while(@num<=100)
begin
--判定
if(@num%2=0) --代碼執行到這裡,證明@num是偶數
begin
set @sum+=@num
end
set @num+=1
end
--出了迴圈,列印總和sum
print @sum
--用迴圈的方式列印出直角三角形(不是重點,是難點)
第一種
declare @i int
declare @j int
declare @str nvarchar(100)
set @i=1
set @j=1
set @str=''
while(@i<=5)
begin
while(@j<=@i)
begin
set @str+='*'
set @j+=1
end
print @str
set @i+=1
end
第二種
declare @str2 nvarchar(200)
declare @count int
declare @result nvarchar(200)
set @str2='*'
set @count=0
set @result=''
while(@count<5)
begin
set @result+=@str2
print @result
set @count+=1
end
福利共用:
--經典while迴圈加分題目
--檢查學生“oop”課最近一次考試是否有不及格(分及格)的學生。
--如有,每人加2分,高於95分的學生不再加分,直至所有學生這次考試成績均及格
--***********************************************************************
--01.看一下oop課程最近一次考試分以下人數
--準備一個變數,保存不及格人數,科目編號,最近考試時間
--01.科目編號
select * from result
declare @subid int
select @subid=subjectid from subject
where subjectname='oop'
--02.最近一次考試時間
declare @mydate datetime
select @mydate=max(examdate) from result
where subjectid=@subid
--03.不及格人數
declare @num int
select @num=count(1) from result
where subjectid=@subid
and examdate=@mydate
and studentresult<70
--04.
while(@num>0) --有成績低於分的學員,
begin
--每個人+2分,但是95分以上不加分
update result set studentresult+=2
where studentresult<95
and subjectid=@subid
and examdate=@mydate
select @num=count(1) from result
where subjectid=@subid
and examdate=@mydate
and studentresult<70
print @num
end
select * from result
order by subjectid,examdate
2.2case多分支語句語法:
CASE
WHEN 條件1 THEN 結果1
WHEN 條件2 THEN 結果2
ELSE 其他結果
END
-- .Case End 經典練習
--採用美國ABCDE五級打分制顯示學生oop課最近一次考試成績(姓名等級)
--A級: 90分以上
--B級:80-分
--C級: 70-分
--D級:60-分
--E級:60分以下
declare @subid int
declare @maxdate datetime
select @subid=subjectid
from subject
where subjectname='oop'
select @maxdate=max(examdate)
from result
where subjectid=@subid
select studentname,等級=
case
when studentresult>=90 then 'A'
when studentresult>=80 then 'B'
when studentresult>=70 then 'C'
when studentresult>=60 then 'D'
else 'E'
end
from student,result
where student.StudentNo=result.StudentNo
and subjectid=@subid
and examdate=@maxdate
好了,今天的總結就到這裡了,希望可以幫助到看完整篇的人
雖然很累但是心裡很開心!熱愛代碼熱愛生命!