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 的使用,从两张不同表格里取出一条数据的两列数据。

        Sqlserver 增删该查----查

Sqlserver 增删该查----查

  把两条数据合并

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

 Sqlserver 增删该查----查

left jion ,right jion的使用

--左表SELECT [DB_ID] ,[DB_CODE],[DB_PORT] FROM [DuanJu].[dbo].[JZ_DIANBIAO] where JZ_ID=2294

   Sqlserver 增删该查----查

--右表SELECT [DB_ID],[DB_CODE],[DB_PORT]FROM [DuanJu].[dbo].[JZ_DIANBIAO] where JZ_ID=2294 and DB_PORT=5041

Sqlserver 增删该查----查

左关联:

Sqlserver 增删该查----查

右关联:

    Sqlserver 增删该查----查

   3,查询不同类型的最新一条数据。

     下面是一张数据表格,记录了,不同JZ_ID的多条记录,我们要想办法查找不同JZ_ID下的最新一条记录。

    Sqlserver 增删该查----查

--其实方法有很多种,我们这里只说一种就行了。--首先我们得到JZ_ID,记住是去重后的JZ_ID,因为在一张表里同一个JZ_ID对应多条数据。然后就是得到每一个JZ_ID最新一条数据的具体时间select JZ_ID ,MAX(UpdateTime) UpdateTime   from  [DuanJu].[dbo].[JZ_POWER_DAYHIS] group by  JZ_ID

Sqlserver 增删该查----查

--然后根据该查询结果和原表利用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

Sqlserver 增删该查----查

注意:如果要查询最新一条记录,其实不必查询整张表的,如果这张表的数据量很大,几千万条,或者上亿条,那你查询整张表,是非常耗时的。所以一般要求不是太苛刻的话,我建议你最好多加个条件,比如

  大于某个时间,三天内的,或者一天内的。当然这个要根据实际情况来。

 4,从多张表中获取不同列参数,合并一起作为查询输出表。

    从三张表中分别获取一列,组合在一起输出:

    Sqlserver 增删该查----查

 Sqlserver 增删该查----查

  方法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

Sqlserver 增删该查----查

   方法二:

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

Sqlserver 增删该查----查

6,将一对多条记录的,作为一个字符串输出。

如下图将同一个jz_ID对应的不同DB_CODE拼接成字符串,作为一行输出。

Sqlserver 增删该查----查

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,‘‘)

Sqlserver 增删该查----查

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

Sqlserver 增删该查----查

其实在实际开发中遇到的查询远不止这些,只能具体情况具体对待,有的时候一个算法所写的sql代码可能和后台代码一样长,还需要注意的是在保证你所需的查询结果后,还有保证查询的效率,如果查询一个结果需要十几秒或者更长,那就不好了,毕竟对用户体验不好,所以在你能需要学习一些sql代码优化的知识了,比如索引。。。等。