SQL Server 一些使用小技巧
1、查询的时候把某一个字段的值拼接成字符串
以下是演示数据。
第一种方式:使用自定义变量
DECLARE @Names NVARCHAR(128) SET @Names='' -- 需要先赋值为空字符串,不然结果会是 null SELECT @Names=@Names+S_Name+',' -- S_Name 类型为字符串类型,如果不能隐示转换,就需要强制转换
FROM Student SELECT @Names
这种方法有一个好处就是,拼接出来的字符串可以赋值给变量或直接插入表中指定字段,可以适用于存储过程之类的。
第二种方式:转换为 XML 格式
SELECT t.S_Name + ','
FROM
(
SELECT S_Name
FROM Student
) t
FOR XML PATH('')
使用这种方式有一个缺点就是,不能直接赋值给变量或插入表,适用于查看时使用。
如果想要使之能够赋值给变量或插入表中,那就需要转换一下。如下:
DECLARE @Names NVARCHAR(128) SET @Names='' SELECT @Names=
(
SELECT t.S_Name + ','
FROM
(
SELECT S_Name
FROM Student
) t
FOR XML PATH(''),TYPE
).value('.','NVARCHAR(128)') SELECT @Names
2、查询一个字段同时满足多个条件的方法
举个栗子:比如现在有一些订单,而每一个订单有多个产品,现在我要查出同时具有某几个产品的订单。
再拿学生和课程来举例,一个学生可以选择多门课程,而每一门课程也可以同时被多个学生所选择,那么我现在要查出选择了某几门课程的学生。
下面是演示数据。
现在我要查出同时选择了 C# 和 SQL 课程的学生信息。如下:
SELECT s.S_Id,s.S_No,s.S_Name
FROM Student s
INNER JOIN Student_Course_Relation r ON s.S_Id=r.S_Id
INNER JOIN Course c ON r.C_Id=c.C_Id
WHERE c.C_Name='C#' OR c.C_Name='SQL'
GROUP BY s.S_Id,s.S_No,s.S_Name
HAVING COUNT(1) >= '' -- 这个数字是根据 where 条件来定
3、SQL Server 实现多行转列
之前也写过一篇博客,SQL Server 使用 Pivot 和 UnPivot 实现行列转换,但是之前都是相对于“单列”的转换,于是最近碰到一个需要两列的问题。最后在网上找了一些相关资料,得出了下面的解决方法。下面先建立一个表,插入一些模拟的数据。如下:
create table OrderDemo
(
ID int not null identity(1,1) primary key,
CustomerCode nvarchar(16) not null,
OrderCount int not null default(0),
TotalAmount decimal(13,3) not null default(0),
YearDate nvarchar(8) null,
MonthDate nvarchar(8) null
) insert into OrderDemo
(
CustomerCode,
OrderCount,
TotalAmount,
YearDate,
MonthDate
)
select 'A001','','28.650','','' union all
select 'A001','','123.123','','' union all
select 'A002','','28.320','','' union all
select 'A002','','51.221','','' union all
select 'A003','','452.200','','' union all
select 'A003','','523.210','','' union all
select 'A004','','230.220','','' union all
select 'A004','','180.567','','' union all
select 'A005','','230.789','','' union all
select 'A005','','340.450','','' select * from OrderDemo
以上的数据是模拟的按客户、订单年份和订单月份统计的订单数量和金额,由于年月的时间段非固定的,所以这里使用的是动态sql,下面直接上代码:
declare @strSql nvarchar(1024)
declare @strWhere nvarchar(1024) set @strWhere='' -- 用作转换之后的列头
select @strWhere = @strWhere+TitleCount+','+TitleAmount+','
from
(
select distinct '['+YearDate+'年'+MonthDate+'月'+'数量'+']' TitleCount,'['+YearDate+'年'+MonthDate+'月'+'金额'+']' TitleAmount
from OrderDemo
) t -- 去掉最后一个逗号
if(CHARINDEX(',',REVERSE(@strWhere))=1)
begin
set @strWhere=SUBSTRING(@strWhere,1,len(@strWhere)-1)
end set @strSql='select *
from
(
select CustomerCode,ComDate+ColumnName ComDate,CountAndAmount
from
(
select CustomerCode,YearDate+''年''+MonthDate+''月'' ComDate,
cast(OrderCount as nvarchar) ''数量'',
cast(TotalAmount as nvarchar) ''金额''
from OrderDemo
) a
UNPIVOT
(
CountAndAmount for ColumnName
IN ([数量],[金额])
) b
) c
pivot
(
max(CountAndAmount)
for ComDate
in ('+ @strWhere +')
) d ' exec (@strSql)
结果如下:
既然两列可以这么实现,那么如果在多一列呢,或者多很多列。这里我稍稍修改了一下,多增加了一列进行测试(多列同理),修改之后的代码如下:
create table OrderDemo
(
ID int not null identity(1,1) primary key,
CustomerCode nvarchar(16) not null,
OrderCount int not null default(0),
ProductCount int not null default(0),
TotalAmount decimal(13,3) not null default(0),
YearDate nvarchar(8) null,
MonthDate nvarchar(8) null
) insert into OrderDemo
(
CustomerCode,
OrderCount,
ProductCount,
TotalAmount,
YearDate,
MonthDate
)
select 'A001','','','28.650','','' union all
select 'A001','','','123.123','','' union all
select 'A002','','','28.320','','' union all
select 'A002','','','51.221','','' union all
select 'A003','','','452.200','','' union all
select 'A003','','','523.210','','' union all
select 'A004','','','230.220','','' union all
select 'A004','','','180.567','','' union all
select 'A005','','','230.789','','' union all
select 'A005','','','340.450','','' select * from OrderDemo declare @strSql nvarchar(1024)
declare @strWhere nvarchar(1024) set @strWhere='' -- 用作转换之后的列头
select @strWhere = @strWhere+TitleCount+','+TitleAmount+','+TitleProduct+','
from
(
select distinct '['+YearDate+'年'+MonthDate+'月'+'数量'+']' TitleCount,
'['+YearDate+'年'+MonthDate+'月'+'金额'+']' TitleAmount,
'['+YearDate+'年'+MonthDate+'月'+'产品数量'+']' TitleProduct
from OrderDemo
) t -- 去掉最后一个逗号
if(CHARINDEX(',',REVERSE(@strWhere))=1)
begin
set @strWhere=SUBSTRING(@strWhere,1,len(@strWhere)-1)
end set @strSql='select *
from
(
select CustomerCode,ComDate+ColumnName ComDate,CountAndAmount
from
(
select CustomerCode,YearDate+''年''+MonthDate+''月'' ComDate,
cast(OrderCount as nvarchar) ''数量'',
cast(TotalAmount as nvarchar) ''金额'',
cast(ProductCount as nvarchar) ''产品数量''
from OrderDemo
) a
UNPIVOT
(
CountAndAmount for ColumnName
IN ([数量],[金额],[产品数量])
) b
) c
pivot
(
max(CountAndAmount)
for ComDate
in ('+ @strWhere +')
) d ' exec (@strSql)
PS:需要注意的是当需要转换的列的数据类型不同时需要转换为同一种类型,比如这里的 “数量、金额、产品数量”。
4、在子查询中使用 Order By
比如,我现在有这样一些数据。如下:
我现在想要使用子查询按字段 “Stu_Age” 排序,那么就有了如下代码:
可以看见这样是有错误的,那么下面有两种解决办法。
第一种: row_number() over() 排名开窗函数
select *
from
(
select [StudentID],Stu_FullName,Stu_Age,Stu_Address,Stu_Phone,
ROW_NUMBER() over(order by Stu_Age) RowNum
from Student
) t
第二种:TOP 100 PERCENT,英语比较好的朋友就知道 percent 就是百分比的意思,结果显而易见。top 100 percent 就表示百分之百,即全部的数据。
select *
from
(
select top 100 percent [StudentID],Stu_FullName,Stu_Age,Stu_Address,Stu_Phone
from Student
order by Stu_Age
) t
其实我个人的话还是喜欢第一种方式,第二种也是偶尔看到的。
5、删除所有字段都相同的重复的数据
首先创建一个临时表并插入一些数据,用于模拟该场景。
create table #temp
(
ID int not null,
Name varchar(20) null
) insert into #temp(ID,Name) values('','测试');
insert into #temp(ID,Name) values('','测试');
insert into #temp(ID,Name) values('','测试'); select * from #temp
类似于上面这种数据,第一条和第二条数据明显属于完成重复,故需要删除其中一条。
刚开始第一时间想到的方式是,把两条数据全部删除,然后再插入一条。
后来又想到了下面这种方式,个人觉得还不错。
with tes as
(
select ID,Name,row_number() over(partition by ID,Name order by ID) RowNum
from #temp
)
delete from tes where RowNum > 1 select * from #temp
到此结束,最后再删除临时表。
drop table #temp
SQL Server 一些使用小技巧的更多相关文章
- SQL Server中的小技巧(重复、替换、截取、去空格、去小数点后的位数)
PS:随笔写的在SQL Server中要用到的 (重复.替换.截取.去空格.去小数点后的位数) /*---------------------------重复--------------------- ...
- sql server 之函数小技巧 && 整数类型为空是用空字符串替代实现
1.判空函数 说明:使用指定的替换值替换 NULL. 语法:ISNULL ( check_expression , replacement_value ) 参数: check_expression:将 ...
- SQL Server数据库性能优化技巧
查询速度慢的原因很多,常见如下几种: 1.没有索引或者没有用到索引: 2.I/O吞吐量小,形成了瓶颈效应: 3.内存不足: 4.网络速度慢: 5.查询出的数据量过大: 6.锁或者死锁: 7.返回了不必 ...
- SQL Server Management Studio 使用技巧
Ø 前言 本文主要介绍 SQL Server Management Studio 工具的使用,相信很多开发人员都比较熟悉此工具,特别是做 C# 开发的程序员,基本上都会经常使用该工具,当然也可以使用 ...
- Windows Server 2008 R2 小技巧 (转)
一些 Windows Server 2008 R2 的小技巧,包括启用「God Mode (上帝模式)」.添加「快速启动」工具栏.启用桌面「个性化」服务.停用「密碼複雜性」要求,对老程序员熟悉新版的 ...
- Sql Server常用函数及技巧
使用Sql Server好长时间了,今天特别想总结一下,算是回顾吧! 总结: 其实很多技巧,都是基于SQL Server自带的System Views,System Stored Procedures ...
- SQL Server的一些小问题
一.SQL Server远程调用失败 解决办法:在控制面板-程序和功能中卸载“Microsoft SQL Server 2012 Express LocalDB”,具体版本根据你安装的VS版本决定,我 ...
- sql server nullif的使用技巧,除数为零的处理技巧
在sql server中做除法处理的时候,我们经常需要处理除数为零的情况,因为如果遇到这种情况的时候,sqlserver会抛出遇到以零作除数错误的异常,我们总不希望把这个异常显示给用户吧. 做个会报这 ...
- hive批量执行sql命令及使用小技巧
root@hadoop-senior hive-0.13.1]$ bin/hive -helpusage: hive -d, --define <key=value> Variable s ...
随机推荐
- TortoiseSVN中分支和合并实践【转】
使用svn几年了,一直对分支和合并敬而远之,一来是因为分支的管理不该我操心,二来即使涉及到分支的管理,也不敢贸然使用合并功能,生怕合并出了问题对团队造成不良影响,最主要的原因是,自己对分支的目的和合并 ...
- 第七篇:Logistic回归分类算法原理分析与代码实现
前言 本文将介绍机器学习分类算法中的Logistic回归分类算法并给出伪代码,Python代码实现. (说明:从本文开始,将接触到最优化算法相关的学习.旨在将这些最优化的算法用于训练出一个非线性的函数 ...
- OpenGL 4.0 GLSL 基础教程概览——VAO和VBO常用操作接口
(一) OpenGL 4.3 最新渲染管线图 从OpenGL 2.0 到 OpenGL 3.0变化非常大,但从OpenGL 3.0 到OpenGL 4.0 变化不是太大. 着色器程序直接运行在GPU ...
- php 关于日期的知识总结
1.UNIX时间戳 time() echo time(); 2.UNIX时间戳转换为日期用函数: date() 一般形式:date(); 即 echo date(date('Y-m-d H:i:s ...
- MYSQL系列之(二)
上一篇文章讲的是mysql的基本操作,这一篇会有一点难以理解,本节主要内容mysql视图,存储过程,函数,事务,触发器,以及动态执行sql 视图view 视图是一个虚拟表,其内容由查询定义.同真实的表 ...
- BNU4204:动物PK
稀奇稀奇真稀奇,动物园摆出了擂台赛.小动物们纷纷上台比试,谁能获得最后的冠军呢? 动物园长发现小动物们打擂只与自身的三项属性有关:血量,攻击力和防御力.此外,小动物在赛前都为自己准备了一系列的攻击计划 ...
- JSP自定义标签开发入门《转》
JSP自定义标签开发入门 一般情况下开发jsp自定义标签需要引用以下两个包 import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; ...
- handlebars的使用
web 开发中,js 解析JSON 是经常的事情.非常繁琐.handlebars 使用了模版,只要你定义一个模版,提供一个json对象,handlebars 就能吧json对象放到你定的模版中 htm ...
- Java初学者笔记一:元类、获取类型、枚举
零.绪论: 2018年新年伊始,学习Java的冲动越来越强烈,毕竟以后无论是做安全开发还是安全研究都必不可少的掌握这门语言,所以在不断完善Python作为脚本语言的主语言的情况下觉得学习Java作为高 ...
- Windows Phone 独立存储查看器
1.为了查看我们存放在独立存储的数据,我们需要借助独立存储查看器. 2.简单介绍下,IsoStoreSpy 下载地址:http://download.csdn.net/download/lhb1097 ...