SQL 常用腳本

查詢常用:

---查詢20條客戶的購買訂單記錄(帶個人信息)

SELECT  top 20                    --- 取前20條數據
ROW_NUMBER() OVER ( ORDER BY a.id ) AS 序號 ,   ---查詢時,新增序號列
        RealName AS 真實姓名 ,    ---AS 的意思 是將原列名重新命名爲‘真實姓名’
        *                         ---查詢兩個表所有字段
		
FROM   	dbo.[Order] AS b          ---訂單表
        LEFT JOIN  dbo.Member AS a  ON a.Id = b.MemberId   ---左關聯 個人信息表,關聯條件:客戶Id (左關聯:有個人信息就帶出來,沒有就放空)
---where :帶條件查詢
WHERE   a.AddTime > '2018-01-01'  ---創建時間> '2019-01-01'
        AND Nation LIKE '%漢%'    ---模糊查詢:字段裏值帶有‘漢’字的
---order by 排序
ORDER BY a.Id ,
        NickName DESC             ---根據ID,和暱稱倒序排序 (正序排序 ASC)

	
---------------------------------------------------------------------------------

----查詢訂單表用戶購買次數
SELECT  ReceiveName AS 姓名 ,
        MemberId AS 用戶ID ,
        COUNT(1) AS 購買次數   
FROM    dbo.[order]
GROUP BY MemberId ,      ----分組 把訂單表按用戶的ID,收件人分組
        ReceiveName  	

-----------------------------------------------------------
--- 查詢日期:

  select CONVERT(varchar(7), getdate() , 120) + '-1'   
---獲取當月1號

 SELECT DATEADD(ms, -3, DATEADD(mm, DATEDIFF(m, 0, getdate()) + 1, 0)) 
 ----獲取當月月底 例如2017-08-31號23:59:59

SELECT  left(convert(nvarchar(10),dateadd(m,-1,getdate()),120),8)+'21'   
-----獲取上月21日  

-------------------------------------------------------------------

----創建臨時表並插入數據
---方法1:
---創建:
    CREATE TABLE #T
    (
      id INT NOT NULL ,
      NAME NVARCHAR(50)
    )

---插入:
     INSERT INTO #T
        ( id, NAME )
 VALUES ( 0, -- id - int
          N'3r23t4te'  -- NAME - nvarchar(50)
          ) 
 INSERT INTO #T
        ( id ,
          NAME
        )
        SELECT  SortNo ,
                CnName
        FROM    dbo.QuestionReportType


---第二種方法:
---創建並插入數據
SELECT SortNo ,
        CnName
 INTO   #T1
 FROM   dbo.QuestionReportType



更新或刪除操作:

---刪除表裏字段DiscountStatus
ALTER TABLE fund.BusinessTicketFormItem DROP COLUMN DiscountStatus

   ---增加表裏某個字段
ALTER TABLE ReportDB.dbo.EntryFlowTracking ADD TotalTime DECIMAL(10,2)

---字段改名(DiscountStatus改爲DiscountState)
exec sp_rename  N'fund.LetterOfCreditFormItem.DiscountStatus','DiscountState','COLUMN'

---修改替換某字段的值
UPDATE fund.BusinessTicketFormItem SET DiscountState = REPLACE(DiscountState,'50','2') WHERE DiscountState LIKE '50'

---刪除表裏所有的數據
DELETE FROM fund.DiscountReceiptForm  where 1=1

---修改字段屬性   (score原本是decimal(18,4)類型)
ALTER TABLE qn.QUESTION_ANSWER ALTER COLUMN SCORE DECIMAL(18,2)


---插入數據
INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)

---修改某字段的值

UPDATE REportDb.qn.OPTION_COPY SET SCORE = 0 WHERE   CODE IN('c676fc52-c366-4977-b6a7-91a3061208d0')

---模糊查詢

Select * from Test where Cn_Name LIKE '%1%'(只要帶字符爲1的都能查到)

‘%1’    以1結尾的數據能查到; ‘1%’ 以1開頭的能查到

^  剔除字符,不包含1的數據  ; ‘1_ ‘ 以1開頭並且1後面只帶一個字符的數據 


--- IN用法

SELECT * FROM SubjectDB.QN.[OPTION] 
WHERE TEMPLATE_CODE IN (
'9e7c4a5e-e906-4541-ba03-7017a60e4f6f',
'da65dda1-5607-4e6a-a4f8-8258d854e3fd',
'c59747ac-9077-4300-9976-5844538d1e11',
'8eadc369-5d08-4225-b9f2-d597f50e21d1',
'046e9ab4-bd25-4ff4-a0d1-a727deb8d29a'
)

--- 計算天數
select datediff(dd,'2015-07-01','2016-01-01')


----數據庫腳本編規範

BEGIN TRAN

USE ReportDB

Insert into ...

ROLLBack TRAN ---回滾

COMMIT TRAN ---提交


---去重 查詢
     SELECT DISTINCT 
            E_Code ,
            E_LeaveDate
   FROM   dbo.DimissionInformation

---去重 創建序號碼,獲取序號碼都爲1的數據
---語法:row_number() OVER (PARTITION BY COL1 ORDER BY COL2)
---表示根據COL1分組,在分組內部根據 COL2排序,而此函數計算的值就表示每組內部排序後的順序編號(組---內連續的唯一的)
WITH    T AS ( SELECT   ROW_NUMBER() OVER ( PARTITION BY LOGON_NAME ORDER BY ALL_PATH_NAME ) AS roenumber ,
                        *
               FROM     SubjectDB.dbo.User_Syn
               WHERE    LOGON_NAME IN ( 'liming', 'fanhy' )
             )
    SELECT  *
    FROM    T
    WHERE   roenumber = 1

 

 

 

行轉列

例子:成績表有姓名,月份,成績,要生成左邊的效果

CREATE TABLE StudentScore(NAME NVARCHAR(10),months NVARCHAR(10),score INT)
INSERT INTO  StudentScore VALUES('張三','一月',85)
INSERT INTO  StudentScore VALUES('張三','二月',97)
INSERT INTO  StudentScore VALUES('李四','一月',77)
INSERT INTO  StudentScore VALUES('李四','二月',86)
INSERT INTO  StudentScore VALUES('王五','一月',86)
INSERT INTO  StudentScore VALUES('王五','二月',88)
INSERT INTO  StudentScore VALUES('李白','二月',90)

-- 靜態SQL,指月份只有一月和二月

--方法一:
SELECT  NAME AS 姓名,
 MAX(CASE months WHEN '一月' THEN score ELSE 0 END) 一月,
 MAX(CASE months WHEN '二月' THEN score ELSE 0 END) 二月
FROM StudentScore
GROUP BY name
   
    
--方法二(SQL Server2005 以上版本支持):
select * from StudentScore 
pivot (
max(score) /*行轉列後 列的值*/
for months /*需要行轉列的列*/ in (一月,二月) ) /*列的值*/
b



--動態SQL,指月份不止一月和二月
--方法一:
declare @sql varchar(8000)
set @sql = 'select name '
select @sql = @sql + ' , max(case months when ''' + months + ''' then score else 0 end) [' + months + ']'
from (select distinct months from StudentScore) as a
set @sql = @sql + ' from StudentScore group by name'
exec(@sql) 


--方法二(SQL Server2005 以上版本支持):
declare @sqla varchar(8000)
select @sqla = isnull(@sqla + ',' , '') + months from StudentScore group by months
exec ('select * from StudentScore pivot (max(score) for months in (' + @sqla + ')) b')

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章