T-SQL編程[整理系列]


“記錄一些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、創建測試數據

View Code
--行轉列
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

[待]

 

本文版權歸本人和博客園共同所用,轉載請注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM