SQL server 语句理解

SQL server 语句理解??

同事写的SQL 太长看不懂

select ROW_NUMBER() over (order by id desc),收件公司名称,日期,快递名称,快递单号,case when [sta]=1 and len(isnull(收件人姓名,''))>1 then left(isnull(收件人姓名,''),1)+left('*****************',len(isnull(收件人姓名,''))-1) else isnull(收件人姓名,'') end 收件人姓名,case when [sta]=1 then dbo.地址处理(收件人联系方式) else 收件人联系方式 end 收件人联系方式,case when [sta]=1 then dbo.地址处理(省+市+县+地址) else 省+市+县+地址 end 收件人地址,物品名称 from kd_record where 寄件人工号='[工号]' and convert(date,日期)>='[日期]' and 日期 is not null and 快递名称+快递单号 is not null and isnull(快递单号,'')+isnull(快递名称,'')+isnull(收件公司名称,'')+isnull(收件人姓名,'')+isnull(收件人联系方式,'')+isnull(省+市+县+地址,'') like '%[key]%'  order by id desc

请问向遇到这种很长的语句改怎么看??

拆分成多行啊

你可以运行一下看他出来得是什么东西你再去扣sql语句

格式化代码再看就比较容易了

这个sql很短了,这里说的“短”,是指它的结构,就只有一个select查询一张表而已。
分析sql语义,

  1. 先找 “from”后面,看看它是查的一个表还是多个表,甚至可能查询的有包含子查询
  2. 然后看"where"后面 ,这个后面就是用来做数据记录的过滤的
  3. 再看“select”后面的,就是查询要显示出哪些字段

对应到题目中的这个sql,就是

  1. 只查kd_record这个表
  2. 数据过滤条件为
    where 寄件人工号 = '[工号]'
    and convert(date, 日期) >= '[日期]'
    and 日期 is not null
    and 快递名称 + 快递单号 is not null
    and isnull(快递单号, '') + isnull(快递名称, '') + isnull(收件公司名称, '') +
        isnull(收件人姓名, '') + isnull(收件人联系方式, '') +
        isnull(省 + 市 + 县 + 地址, '') like '%[key]%'
    
  3. 显示字段为
    ROW_NUMBER() over(order by id desc),
        收件公司名称,
        日期,
        快递名称,
        快递单号,
        case
          when [ sta ] = 1 and len(isnull(收件人姓名, '')) > 1 then
           left(isnull(收件人姓名, ''), 1) +
           left('*****************', len(isnull(收件人姓名, '')) - 1)
          else
           isnull(收件人姓名, '')
        end 收件人姓名,
        case
          when [ sta ] = 1 then
           dbo.地址处理(收件人联系方式)
          else
           收件人联系方式
        end 收件人联系方式,
        case
          when [ sta ] = 1 then
           dbo.地址处理(省 + 市 + 县 + 地址)
          else
           省 + 市 + 县 + 地址
        end 收件人地址,
        物品名称
    

然后where后面以及select后面,使用的函数及语法

  1. convert 转换格式
  2. isnull 如果第一个参数为空则返回第二个参数
  3. left 左填充
  4. len 返回字符串长度
  5. case when ... then ... else ... end 一种语法,表示 "当 ...则....否则..."
  6. dbo.地址处理 应该是个用户自定义的函数,可以打开这个函数查看里面的逻辑
  7. ROW_NUMBER() over() 基本的分析函数用法了,这里是用来生成一个行号
    • 加号,在sqlserver中,可以用来做字符串拼接