sql server(經常使用)

普通用法

//生成 uuid 並轉爲小寫
select LOWER(SUBSTRING(uuid,1,8)+'-'+SUBSTRING(uuid,10,4)+'-'+SUBSTRING(uuid,15,4)+'-'+SUBSTRING(uuid,20,4)+'-'+SUBSTRING(uuid,25,12)) 
from (select cast(NEWID() as varchar(36)) as uuid) s  //ea52a7bb-a2aa-44b8-be28-5ebc64defcf9

//獲取時分秒
select DateName(hour,GetDate())+ DateName(minute,GetDate())+DateName(second,GetDate()) //143054

//1000-9999隨機數
select floor(9000*RAND()+1000)

//日期格式化
select GETDATE()                            //2019-02-12 14:30:16.763
Select CONVERT(varchar(100), GETDATE(), 8)  //10:57:46
Select CONVERT(varchar(100), GETDATE(), 12) //060516
Select CONVERT(varchar(100), GETDATE(), 20) //2006-05-16 10:57:47
Select CONVERT(varchar(100), GETDATE(), 21) //2006-05-16 10:57:47.157    
Select CONVERT(varchar(100), GETDATE(), 23) //2006-05-16
Select CONVERT(varchar(100), GETDATE(), 24) //10:57:47
Select CONVERT(varchar(100), GETDATE(), 25) //2006-05-16 10:57:47.250
Select CONVERT(varchar(100), GETDATE(), 102)//2006.05.16
Select CONVERT(varchar(100), GETDATE(), 111)//2006/05/16
Select CONVERT(varchar(100), GETDATE(), 112)//20060516

進階

order by

group by

咱們常常會使用group by對查詢的結果進行去重,可是在使用的過程當中必定要確保 group by 裏面要只是有一個惟一性的條件,不然極有可能把須要的條目去重了,致使查詢結果異常,並且這個問題排查難度不小html

聯表查詢

SQL查詢多列合併一列

select ID,hosID +'/'+ hosCode +'/'+ name as '診所編號/診所Code/醫生項目'
from Doctor where hosCode = 'xxxx'
//return: 71bfc474-7725-e8fb-ecbd-a204bbaxxxxx 15xx/A75xxx/宋xx

SQL查詢將多行合併成一行(轉載)

//將param1中自startIndex(SQL中都是從1開始,而非0)起,刪除length個字符,而後用param2替換刪掉的字符。
stuff(param1, startIndex, length, param2)

param1:一個字符數據表達式。param1能夠是常量、變量,也能夠是字符列或二進制數據列。
startIndex:一個整數值,指定刪除和插入的開始位置。若是 startIndex或 length 爲負,則返回空字符串。若是startIndex比param1長,則返回空字符串。startIndex能夠是 bigint 類型。
length:一個整數,指定要刪除的字符數。若是 length 比param1長,則最多刪除到param1 中的最後一個字符。length 能夠是 bigint 類型。數據庫

例如:安全

select STUFF('abcdefg',1,0,'1234')       --結果爲'1234abcdefg'
select STUFF('abcdefg',1,1,'1234')       --結果爲'1234bcdefg'
select STUFF('abcdefg',2,1,'1234')       --結果爲'a1234cdefg'
select STUFF('abcdefg',2,2,'1234')       --結果爲'a1234defg'

拓展:for xml path,將查詢結果集以XML形式展示函數

如今想把兩條數據經過PerworkSampleInfoId和Barcode合併成一條ui

select ID,PerworkSampleInfoId,Barcode, ApplyItemId,ApplyItemName,ItemPrice
from Perwork_SampleItem where Barcode = 'A75004xxxxxx'

clipboard.png

select PerworkSampleInfoId,Barcode,
    (
        select STUFF(
            (select ',' + ApplyItemName from Perwork_SampleItem where Barcode = a.Barcode for xml path('')),
            1,
            1,
            ''        
        )
    ) as ApplyItemNames,
    (
        select STUFF (
            (select sum(ItemPrice) from Perwork_SampleItem where Barcode = a.Barcode),
            1,
            0,
            ''
        )
    )as totalItemPrice
from Perwork_SampleItem a
where Barcode = 'A75004xxxxxx'
group by PerworkSampleInfoId,Barcode

clipboard.png

視圖

存儲過程

優勢:spa

   1.存儲過程只在創造時進行編譯,之後每次執行存儲過程都不需再從新編譯,而通常SQL語句每執行一次就編譯一次,因此使用存儲過程可提升數據庫執行速度。code

  2.當對數據庫進行復雜操做時(如對多個表進行Update,Insert,Query,Delete時),可將此複雜操做用存儲過程封裝起來與數據庫提供的事務處理結合一塊兒使用。xml

  3.存儲過程能夠重複使用,可減小數據庫開發人員的工做量htm

  4.安全性高,可設定只有某此用戶才具備對指定存儲過程的使用權blog

缺點:

   1.若是更改範圍大到須要對輸入存儲過程的參數進行更改,或者要更改由其返回的數據,則您仍須要更新程序集中的代碼以添加參數、更新 GetValue() 調用,等等,這時候估計比較繁瑣了。

   2.可移植性差
因爲存儲過程將應用程序綁定到 SQL Server,所以使用存儲過程封裝業務邏輯將限制應用程序的可移植性。

基本用法:

//建立存儲過程
use WEHealth
go
create procedure pro_test
@_code varchar(50)
as
IF ( @_code IS NOT NULL )
    select *
    from Hospital
    where Code like '%'+@_code+'%';
    
ELSE
    select *
    from Hospital;
//調用存儲過程
exec pro_test '101999';
exec pro_test null;

函數

表值函數

標量值函數

相關文章
相關標籤/搜索