“記錄一些T-SQL編程中的零散知識[開篇]”
1、 變量的聲明
1.1 USE語句用來切換當前數據庫。
1.2 Declare 聲明變量,變量名前綴@。
使用set、select都可以為變量賦值。
主要區別在於:·當執行簡單的變量賦值時,使用set
·當基於查詢進行變量賦值時,使用select
DECLARE @temp money; Set @temp=(select max( UnitPrice) from SaleOrderDetail); Select @temp; DECLARE @temp money; Select @temp= max( UnitPrice) from SaleOrderDetail; Select @temp;
1.3 系統函數(@@全局變量)
http://msdn.microsoft.com/zh-cn/library/ms187786.aspx
1.4 系統表及系統存儲過程
【待補】
2、流程控制語句
- IF……ELSE
IF NOT EXISTS ( SELECT s.name AS SchemaName,t.name AS TableName FROM sys.schemas s JOIN sys.tables t ON s.schema_id=t.schema_id WHERE s.name='dbo' AND t.name='IFTestTable' ) BEGIN
CREATE TABLE IFTestTable( ID int PRIMARY KEY ); END
ELSE
BEGIN INSERT INTO IFTestTable VALUES('1');
END
利用Begin……End組織T-SQL代碼塊
CASE語句:基本上只是一個替換操作符而不是流程控制語句。最大的好處是可以與SELECT語句“內聯”使用。
我們將利用CASE語句實現“行轉列”的操作。
1、創建測試數據

--行轉列 CREATE TABLE StuScore( stuid int NOT NULL, subject nvarchar(30) NULL, score decimal(5,1) NULL ); go INSERT INTO StuScore(stuid, subject,score)VALUES('3','chinese', '76.0') INSERT INTO StuScore(stuid, subject,score)VALUES('3','math', '86.0') INSERT INTO StuScore(stuid, subject,score)VALUES('3','chinese', '96.0') INSERT INTO StuScore(stuid, subject,score)VALUES('4','chinese', '66.0') INSERT INTO StuScore(stuid, subject,score)VALUES('3','chinese', '86.0') INSERT INTO StuScore(stuid, subject,score)VALUES('3','math', '79.0') INSERT INTO StuScore(stuid, subject,score)VALUES('4','chinese', '70.0') INSERT INTO StuScore(stuid, subject,score)VALUES('3','math', '78.0') INSERT INTO StuScore(stuid, subject,score)VALUES('4','chinese', '78.0') INSERT INTO StuScore(stuid, subject,score)VALUES('3','math', '76.0') INSERT INTO StuScore(stuid, subject,score)VALUES('4','chinese', '100.0') go --查詢測試數據 SELECT stuid, subject, score FROM StuScore;
stuid subject score
----------- ------------------------------
3 chinese 76.0
3 math 86.0
3 chinese 96.0
4 chinese 66.0
3 chinese 86.0
3 math 79.0
4 chinese 70.0
3 math 78.0
4 chinese 78.0
3 math 76.0
4 chinese 100.0
我們需要將數據轉變成這樣:
stuid chinese math
----------- --------------------------------------- ---------------------------------------
3 258.0 319.0
4 314.0 0.0
2、實現“行轉列”思路
--"行轉列" 關鍵是首先知道有多少列,如何去創建列。 --實現1,我們先問題分解,假設我們知道chinese、math列 SELECT DISTINCT StuScore.stuid,0 AS chinese,0 AS match FROM StuScore
結果:
stuid chinese match
----------- ----------- -----------
3 0 0
4 0 0
我們發現這個結構和我們想象的表結構是一樣,接下我們我們用數據進行填充。
--實現2 SELECT StuScore.stuid, CASE subject WHEN 'chinese' THEN score ELSE 0 END AS chinese, CASE subject WHEN 'math' THEN score ELSE 0 END AS math FROM StuScore;
結果:
stuid chinese math
----------- --------------------------------------- ---------------------------------------
3 76.0 0.0
3 0.0 86.0
3 96.0 0.0
4 66.0 0.0
3 86.0 0.0
3 0.0 79.0
4 70.0 0.0
3 0.0 78.0
4 78.0 0.0
3 0.0 76.0
4 100.0 0.0
以上結果,已經基本接近我們的想要的結果。我們對每一行做SUM()。
--實現3 SELECT StuScore.stuid, sum(CASE subject WHEN 'chinese' THEN score ELSE 0 END) AS chinese, sum(CASE subject WHEN 'math' THEN score ELSE 0 END )AS math FROM StuScore GROUP BY stuid;
結果:
stuid chinese math
----------- --------------------------------------- ---------------------------------------
3 258.0 319.0
4 314.0 0.0
這樣結構就出來了,那么我們怎么去知道chinese、math列。
SELECT DISTINCT subject FROM StuScore
我們利用動態拼接SQL語句實現“行轉列”
declare @sql varchar(2000) set @sql='select stuid' select @sql =@sql+ ',sum(case subject when '''+subject+''' then score else 0 end) as ' + subject from (select distinct subject from dbo.StuScore) as sub set @sql=@sql + ' from dbo.StuScore group by stuid' exec(@sql)
SQL server 2005以上提供了“PIVOT”實現行轉列,UNPIVOT實現列轉行
以上功能可以利用pivot函數實現:
SELECT * FROM StuScore PIVOT (max(score)FOR subject IN (chinese,math)) a
- WHILE語句。當條件為TRUE時,進行循環。使用BREAK退出循環。
- WAITFOR語句。延遲操作。使用Delay參數指定時間段,使用TIME,指定時間的點。
- GOTO
- TRY……CATCH語句。用於捕獲異常。
3、T-SQL編程
3.1 分頁
1、SQL server 2005以上 利用RowNumber()函數實現分頁。
---RowNumber()函數分頁 --ANIC_Compound為分頁源表 SELECT * FROM (SELECT ROW_NUMBER() OVER (ORDER BY ID asc)AS rowId,* FROM ANIC_Compound) AS T WHERE T.rowId BETWEEN 11 AND 20
2、“雙TOP”分頁(取10~30的記錄集)
--雙top分頁 SELECT TOP 10 * FROM (SELECT TOP 30 * FROM ANIC_Compound ORDER BY ID asc)AS T ORDER BY T.ID DESC
3、分頁存儲過程
3.2 SQL編程技巧[記錄一些實際用的SQL語句]
1、跨數據庫操作數據
場景:需要DatabaseA中查詢結果后,插入BatabaseB
DECLARE @imgCount int DECLARE @imgName nvarchar(20)--eg:027461.jpg DECLARE @productId nvarchar(20)=SELECT REPLACE(@imgName,'.jpg','') SELECT @imgCount = COUNT(1) FROM ProductImages WHERE imgName LIKE '@productId%' BEGIN DELETE SELECT * FROM ProductImages WHERE imgName = @imgCount SELECT @imgCount = @imgCount-1 END UPDATE ays..Product --ays數據庫名稱,..為dbo SET PicCount = @imgCount WHERE productId = @productId
2、字符串截取
http://www.cnblogs.com/penglink/archive/2009/03/07/1405360.html
3、時間函數及轉換
1)SELECT GETDATE() 返回當前時間。eg:2012-08-23 16:39:12.103
2) SELECT CONVERT(varchar(10),getdate(),20) 獲取當前日期 。eg:2012-08-23
3) SELECT DATEPART(month, GETDATE()) AS YueFen 取當前月份。
日期部分 參數: | 縮寫 |
---|---|
year |
yy, yyyy |
quarter |
qq, q |
month |
mm, m |
dayofyear |
dy, y |
day |
dd, d |
week |
wk, ww |
weekday |
dw |
hour |
hh |
minute |
mi, n |
second |
ss, s |
millisecond |
convert(nvarchar(10),DATEPART(yy,GETDATE()))+'-'+convert(nvarchar(10),DATEPART(mm,GETDATE())) +'-'+convert(nvarchar(10),DATEPART(dd,GETDATE()))
4、獲取(刪除)不重復的記錄。
eg: Id name age salary
1 yzk 20 1000
2 yzk 20 3000
3 tom 30 4000
4 tom 30 4000
5 imi 20 5000
[待]
本文版權歸本人和博客園共同所用,轉載請注明出處。