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;

函数

表值函数

标量值函数

相关文章
相关标签/搜索