Sqlserver 增删该查----查
数据查询应该是数据库中最常用的操作了,下面就来介绍一下我在实际开发中常用的一些查询。
1,具有多个条件的查询方式
这个我在sqlserver多条件查询中已经介绍过了。(地址:https://www.cnblogs.com/zpy1993-09/p/11677406.html)
2,需要分页的查询方式
sqlserver分页查询中介绍了(地址:https://www.cnblogs.com/zpy1993-09/p/11751597.html)
3, 需要把数据合并的查询方式
我们通常都会用(union,union all ,left jion ,right jion)
union,union all 的使用,从两张不同表格里取出一条数据的两列数据。
把两条数据合并
select top 1 P_NUM,P_NUMPUE from [DuanJu].[dbo].[JZ_POWER_DAYHIS] where DB_ID=52 union
select top 1 P_NUM1,P_NUM2 from [DuanJu].[dbo].[JZ_POWER_HIS] where DB_ID=8
select top 1 P_NUM,P_NUMPUE from [DuanJu].[dbo].[JZ_POWER_DAYHIS] where DB_ID=52 union all
select top 1 P_NUM1,P_NUM2 from [DuanJu].[dbo].[JZ_POWER_HIS] where DB_ID=8
left jion ,right jion的使用
--左表SELECT [DB_ID] ,[DB_CODE],[DB_PORT] FROM [DuanJu].[dbo].[JZ_DIANBIAO] where JZ_ID=2294
--右表SELECT [DB_ID],[DB_CODE],[DB_PORT]FROM [DuanJu].[dbo].[JZ_DIANBIAO] where JZ_ID=2294 and DB_PORT=5041
左关联:
右关联:
3,查询不同类型的最新一条数据。
下面是一张数据表格,记录了,不同JZ_ID的多条记录,我们要想办法查找不同JZ_ID下的最新一条记录。
--其实方法有很多种,我们这里只说一种就行了。--首先我们得到JZ_ID,记住是去重后的JZ_ID,因为在一张表里同一个JZ_ID对应多条数据。然后就是得到每一个JZ_ID最新一条数据的具体时间select JZ_ID ,MAX(UpdateTime) UpdateTime from [DuanJu].[dbo].[JZ_POWER_DAYHIS] group by JZ_ID
--然后根据该查询结果和原表利用JZ_ID和最新更新时间进行关联,就得到我们想要的结果了。select a.* from [DuanJu].[dbo].[JZ_POWER_DAYHIS] a, ( select JZ_ID ,MAX(UpdateTime) UpdateTime from [DuanJu].[dbo].[JZ_POWER_DAYHIS] group by JZ_ID) b where a.JZ_ID=b.JZ_ID and a.UpdateTime=b.UpdateTime
注意:如果要查询最新一条记录,其实不必查询整张表的,如果这张表的数据量很大,几千万条,或者上亿条,那你查询整张表,是非常耗时的。所以一般要求不是太苛刻的话,我建议你最好多加个条件,比如
大于某个时间,三天内的,或者一天内的。当然这个要根据实际情况来。
4,从多张表中获取不同列参数,合并一起作为查询输出表。
从三张表中分别获取一列,组合在一起输出:
方法1:
select a.JZ_NAME,b.DB_CODE,SBD_NAME from [DuanJu].[dbo].[JZ_JIZHAN] a,[DuanJu].[dbo].[JZ_DIANBIAO] b ,[DuanJu].[dbo].[JZ_SheBeiDetail] cwhere a.JZ_ID=b.JZ_ID and b.JZ_ID=c.JZ_ID and b.DB_ID=c.DB_ID
方法二:
SELECT (select JZ_NAME from [DuanJu].[dbo].[JZ_JIZHAN] where JZ_ID=a.JZ_ID) JZ_NAME ,(select DB_CODE from [DuanJu].[dbo].[JZ_DIANBIAO] where JZ_ID=a.JZ_ID and DB_ID=a.DB_ID) DB_CODE ,a.[SBD_NAME] FROM [DuanJu].[dbo].[JZ_SheBeiDetail] a
6,将一对多条记录的,作为一个字符串输出。
如下图将同一个jz_ID对应的不同DB_CODE拼接成字符串,作为一行输出。
SELECT Name = STUFF((SELECT ‘,‘+a.DB_CODE FROM [DuanJu].[dbo].[JZ_DIANBIAO] a where a.JZ_ID=2292 FOR XML PATH(‘‘),TYPE).value(‘.‘,‘NVARCHAR(MAX)‘),1,1,‘‘)
7,将查询结果拼接成json字符串的格式输出。
select ‘{"SBD_ID":‘+cast(a.SBD_ID as varchar)+‘,"SBD_NAME":"‘+a.SBD_NAME+‘","datas":[‘+ (SELECT Name=STUFF((SELECT ‘,‘+‘{"P_NUM":‘+ cast(P_NUM as varchar)+‘,"AddDate":"‘+cast(AddHour as varchar)+‘"}‘ FROM Power_SBHour where SBD_ID=a.SBD_ID and convert(char(10),AddTime,120)=‘2020-01-10‘ order by AddTime asc FOR XML PATH(‘‘),TYPE).value(‘.‘,‘NVARCHAR(MAX)‘),1,1,‘‘)) +‘]}‘ as strJson from JZ_SheBeiDetail a where a.JZ_ID=2292
其实在实际开发中遇到的查询远不止这些,只能具体情况具体对待,有的时候一个算法所写的sql代码可能和后台代码一样长,还需要注意的是在保证你所需的查询结果后,还有保证查询的效率,如果查询一个结果需要十几秒或者更长,那就不好了,毕竟对用户体验不好,所以在你能需要学习一些sql代码优化的知识了,比如索引。。。等。