当前位置: 代码网 > it编程>数据库>MsSqlserver > SQL Server 查询设置  LIKE/DISTINCT/HAVING/排序详解

SQL Server 查询设置  LIKE/DISTINCT/HAVING/排序详解

2025年01月20日 MsSqlserver 我要评论
背景本专栏文章以 sap 实施顾问在实施项目中需要掌握的sql 语句为偏向进行选题,用例使用的是 sap b1 的数据库,使用工具为 sql server。本篇为复杂查询中功能强大、使用边界的条件语句

背景

本专栏文章以 sap 实施顾问在实施项目中需要掌握的 sql 语句为偏向进行选题,用例使用的是 sap b1 的数据库,使用工具为 sql server。

本篇为复杂查询中功能强大、使用边界的条件语句 likedistincthaving,与排序、子查询等查询设置。

不考虑表连接的基础上,在查询信息时,本文涉及到的各逻辑条件排列顺序如下:

--()表示结构可省略,[]表示该位置内容
select (distinct) (top 获取前几条) [*/字段名] 
from [表名/子查询]
(where [字段名] like [查询模糊条件])
(group by [分组条件])
(having [过滤条件])
(order by [排序字段] (asc|desc))

一、like - 模糊查询

模糊查询 like 用于字符搜索,通过对所需查找的信息进行条件设定,如某字开头、某字结尾、包含某字、不含某字、第几位是某字等,将所需信息筛出。与之功能对应的还有 regexp(正则表达式) ,并且其功能更强大,表达更简略。但是 sql server 不支持使用。

其基本语法如下:

select [需要查询的列名]
from [表名]
where [条件列] like '[条件内容]'

1. 通配符 % 

使用模糊查询 like 时,对于所需核对的信息进行位置限定,需要根据条件使用 “%”,若需要以某字开头则形式为 'x%' ,某字结尾则为 '%x' 。

:查找【业务伙伴主数据】表单中含有 “京” 字的公司。

此时需要在条件词左右打上 “%”,对文本所在位置进行限制,即 “京” 字出现在的任何一个位置,都将被查找出来:

select cardcode,cardname
from ocrd
where cardname like n'%京%' --查询内容为中文字符时需要增加前缀“n”才能被sql server识别

查询结果为:

2. 占位符 _

如果对于查询信息有严格的位数要求,如需要第几位是某字,即可通过占位符 “_” 占出前面位数,

例1:查找【业务伙伴主数据】表单中业务伙伴编码第二位为 “1” 的公司。

使用占位符占用第一位,意思是无论第一位是什么都无所谓只要有东西就行,第二位是要求 “1”,其后一共几位无所谓了所以用通配符 “%”。

select cardcode,cardname
from ocrd
where cardcode like '_1%'

查询结果:

例2:查找【业务伙伴主数据】表单中业务伙伴编码为 6 位的公司。

select cardcode,cardname
from ocrd
where cardcode like '______'--一共六条下划线

查询结果(结果行数较多,仅展示部分):

3. 指定集合 []

设定某一位,为在一定范围内任意一个值都可以,则使用 “[]” 框选集合,无论中括号内放多少字符,中括号都只算一位。

例:查找【业务伙伴主数据】表单中业务伙伴编码以 “c” 或 “v” 开头的公司。

select cardcode,cardname
from ocrd
where cardcode like '[cv]%'

查询结果(结果行数较多,仅展示部分):

3.1 表示否定 ^

否定符 “^” 仅能在中括号内使用,哪怕只有一位,要使用否定符 “^”,也需要加上 “[]”。

例:查找【业务伙伴主数据】表单中业务伙伴编码不以 “c” 开头的公司。

select cardcode,cardname
from ocrd
where cardcode like '[^c]%' --不加[]的话数据库会把^理解为判断字符

查询结果:

3.2 表示范围 -

在 “[]” 内设定内容存在既定顺序时,可以使用 “-”,主要包含:字母按照字母表顺序和数字按照大小顺序。

例:查找【业务伙伴主数据】表单中业务伙伴名称含有数字的公司。

select cardcode,cardname
from ocrd
where cardname like '%[0-9]%'

查询结果:

4. 否定 not

对于 like 级别的综合否定,均可用 not like 来实现。

例:查找【业务伙伴主数据】表单中业务伙伴名称不含有数字的公司。

select cardcode,cardname
from ocrd
where cardname not like '%[0-9]%'

则会查询出上一节 3.2 案例的查询结果的补集,即返回上一案例以外的内容行。

二、distinct - 去重查询

在 select 之后增加 distinct,可以对查询数据去重。 

使用场景:比如在查询所有下过采购订单的客户时,可以使用得到去重后的客户名单

select distinct cardcode,cardname
from ordr

三、having - 过滤查询

对分组后的数据过滤,一般会先使用 group by;倘若没有出现 group by,则默认 having 把整张表当作一组进行过滤

having 和 where 的区别:

  • where 在分组前过滤,having 在分组后过滤。
  • where 语句里不能包含聚合函数,having 语句可以,并且 having 语句中的子句一般来说不是聚合函数就是分组列。

例:查找平均销售额大于 1000 的客户。

select cardcode,cardname,avg(doctotal) as '平均销售额'
from ordr
group by cardcode,cardname
having avg(doctotal)>1000

查询结果:

四、小的查询设置

1. asc|desc - 排序

放在 order by 后面,起到一个对分组进行升序(asc)或降序(desc)续排列的作用。

例:按【销售金额】对平均销售额大于 1000 的客户进行【倒序】排列

select cardcode,cardname,avg(doctotal) as '平均销售额'
from ordr
group by cardcode,cardname 
having avg(doctotal)>1000
order by avg(doctotal) desc

查询结果:

2. top - 限制

放在 select 之后,按照 top + [数量] 的格式,实现对前 [数量] 行信息的效果。

例:查询【销售金额】对平均销售额前十的客户名单

select top 10 cardcode,cardname from ordr
group by cardcode,cardname
order by avg(doctotal) desc

查询结果:

3. 子查询

在 where 后,除了可以接某张已经存在的具体表,还可以接一个【子查询】,即由一个新的查询构建的新表,将其嵌套进原有的查询命令时,形成一个【子查询】。

注意:子查询返回的值能且仅能为一个

例:查找销售额最高的客户在【业务伙伴主数据】中登记的业务伙伴代码、业务伙伴名称、业务伙伴类型、组代码、电话 1、联系人信息。

select cardcode,cardname,cardtype,groupcode,phone1,cntctprsn
from ocrd
where cardcode = (
select top 1 cardcode from ordr
group by cardcode
order by sum(doctotal) desc
)

 查询结果

4. not in - 取补集(limit效果)

在 mysql 中,可以利用 limit 对查询的信息条目进行限制,如查前 x 条数据、跳过前 y 条数据查找后面的 z 条数据。但是 sql server 中不支持 limit,可以使用 top 联合 not 和 子查询完成以上功能的实现。

例:跳过销售金额平均值前十的客户,返回第 11-15 名的客户名单

select top 5 cardcode,cardname from opor
where cardcode not in(
select top 10 cardcode from ordr
group by cardcode
order by avg(doctotal) desc
)

查询结果:

到此这篇关于sql server 查询设置 - like/distinct/having/排序的文章就介绍到这了,更多相关sql server like/distinct/having/排序内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com