• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

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

    发布者: 天下网吧 | 发布时间: 2025-6-18 09:16| 查看数: 59| 评论数: 0|帖子模式

    背景

    本专栏文章以 SAP 实施顾问在实施项目中需要掌握的 sql 语句为偏向进行选题,用例使用的是 SAP B1 的数据库,使用工具为 SQL Server。
    本篇为复杂查询中功能强大、使用边界的条件语句 LIKEDISTINCTHAVING,与排序、子查询等查询设置。
    不考虑表连接的基础上,在查询信息时,本文涉及到的各逻辑条件排列顺序如下:
    1. --()表示结构可省略,[]表示该位置内容
    2. SELECT (DISTINCT) (TOP 获取前几条) [*/字段名]
    3. FROM [表名/子查询]
    4. (WHERE [字段名] LIKE [查询模糊条件])
    5. (GROUP BY [分组条件])
    6. (HAVING [过滤条件])
    7. (ORDER BY [排序字段] (ASC|DESC))
    复制代码
    一、LIKE - 模糊查询

    模糊查询 LIKE 用于字符搜索,通过对所需查找的信息进行条件设定,如某字开头、某字结尾、包含某字、不含某字、第几位是某字等,将所需信息筛出。与之功能对应的还有 REGEXP(正则表达式) ,并且其功能更强大,表达更简略。但是 SQL Server 不支持使用。
    其基本语法如下:
    1. SELECT [需要查询的列名]
    2. FROM [表名]
    3. WHERE [条件列] LIKE '[条件内容]'
    复制代码
    1. 通配符 %

    使用模糊查询 LIKE 时,对于所需核对的信息进行位置限定,需要根据条件使用 “%”,若需要以某字开头则形式为 'X%' ,某字结尾则为 '%X' 。
    :查找【业务伙伴主数据】表单中含有 “京” 字的公司。
    此时需要在条件词左右打上 “%”,对文本所在位置进行限制,即 “京” 字出现在的任何一个位置,都将被查找出来:
    1. SELECT CardCode,CardName
    2. FROM OCRD
    3. WHERE CardName LIKE N'%京%' --查询内容为中文字符时需要增加前缀“N”才能被sql server识别
    复制代码
    查询结果为:


    2. 占位符 _

    如果对于查询信息有严格的位数要求,如需要第几位是某字,即可通过占位符 “_” 占出前面位数,
    例1:查找【业务伙伴主数据】表单中业务伙伴编码第二位为 “1” 的公司。
    使用占位符占用第一位,意思是无论第一位是什么都无所谓只要有东西就行,第二位是要求 “1”,其后一共几位无所谓了所以用通配符 “%”。
    1. SELECT CardCode,CardName
    2. FROM OCRD
    3. WHERE CardCode LIKE '_1%'
    复制代码
    查询结果:

    例2:查找【业务伙伴主数据】表单中业务伙伴编码为 6 位的公司。
    1. SELECT CardCode,CardName
    2. FROM OCRD
    3. WHERE CardCode LIKE '______'--一共六条下划线
    复制代码
    查询结果(结果行数较多,仅展示部分):


    3. 指定集合 []

    设定某一位,为在一定范围内任意一个值都可以,则使用 “[]” 框选集合,无论中括号内放多少字符,中括号都只算一位。
    例:查找【业务伙伴主数据】表单中业务伙伴编码以 “C” 或 “V” 开头的公司。
    1. SELECT CardCode,CardName
    2. FROM OCRD
    3. WHERE CardCode LIKE '[CV]%'
    复制代码
    查询结果(结果行数较多,仅展示部分):


    3.1 表示否定 ^

    否定符 “^” 仅能在中括号内使用,哪怕只有一位,要使用否定符 “^”,也需要加上 “[]”。
    例:查找【业务伙伴主数据】表单中业务伙伴编码不以 “C” 开头的公司。
    1. SELECT CardCode,CardName
    2. FROM OCRD
    3. WHERE CardCode LIKE '[^C]%' --不加[]的话数据库会把^理解为判断字符
    复制代码
    查询结果:


    3.2 表示范围 -

    在 “[]” 内设定内容存在既定顺序时,可以使用 “-”,主要包含:字母按照字母表顺序和数字按照大小顺序。
    例:查找【业务伙伴主数据】表单中业务伙伴名称含有数字的公司。
    1. SELECT CardCode,CardName
    2. FROM OCRD
    3. WHERE CardName LIKE '%[0-9]%'
    复制代码
    查询结果:


    4. 否定 NOT

    对于 LIKE 级别的综合否定,均可用 NOT LIKE 来实现。
    例:查找【业务伙伴主数据】表单中业务伙伴名称不含有数字的公司。
    1. SELECT CardCode,CardName
    2. FROM OCRD
    3. WHERE CardName NOT LIKE '%[0-9]%'
    复制代码
    则会查询出上一节 3.2 案例的查询结果的补集,即返回上一案例以外的内容行。

    二、DISTINCT - 去重查询

    在 SELECT 之后增加 DISTINCT,可以对查询数据去重。
    使用场景:比如在查询所有下过采购订单的客户时,可以使用得到去重后的客户名单
    1. SELECT DISTINCT CardCode,CardName
    2. FROM ORDR
    复制代码
    三、HAVING - 过滤查询

    对分组后的数据过滤,一般会先使用 GROUP BY;倘若没有出现 GROUP BY,则默认 HAVING 把整张表当作一组进行过滤
    HAVING 和 WHERE 的区别:

    • WHERE 在分组前过滤,HAVING 在分组后过滤。
    • WHERE 语句里不能包含聚合函数,HAVING 语句可以,并且 HAVING 语句中的子句一般来说不是聚合函数就是分组列。
    例:查找平均销售额大于 1000 的客户。
    1. SELECT CardCode,CardName,AVG(DocTotal) AS '平均销售额'
    2. FROM ORDR
    3. GROUP BY CardCode,CardName
    4. HAVING AVG(DocTotal)>1000
    复制代码
    查询结果:


    四、小的查询设置


    1. ASC|DESC - 排序

    放在 ORDER BY 后面,起到一个对分组进行升序(ASC)或降序(DESC)续排列的作用。
    例:按【销售金额】对平均销售额大于 1000 的客户进行【倒序】排列
    1. SELECT CardCode,CardName,AVG(DocTotal) AS '平均销售额'
    2. FROM ORDR
    3. GROUP BY CardCode,CardName
    4. HAVING AVG(DocTotal)>1000
    5. ORDER BY AVG(DocTotal) DESC
    复制代码
    查询结果:


    2. TOP - 限制

    放在 SELECT 之后,按照 TOP + [数量] 的格式,实现对前 [数量] 行信息的效果。
    例:查询【销售金额】对平均销售额前十的客户名单
    1. SELECT TOP 10 CardCode,CardName FROM ORDR
    2. GROUP BY CardCode,CardName
    3. ORDER BY AVG(DocTotal) DESC
    复制代码
    查询结果:


    3. 子查询

    在 WHERE 后,除了可以接某张已经存在的具体表,还可以接一个【子查询】,即由一个新的查询构建的新表,将其嵌套进原有的查询命令时,形成一个【子查询】。
    注意:子查询返回的值能且仅能为一个
    例:查找销售额最高的客户在【业务伙伴主数据】中登记的业务伙伴代码、业务伙伴名称、业务伙伴类型、组代码、电话 1、联系人信息。
    1. SELECT CardCode,CardName,CardType,GroupCode,Phone1,CntctPrsn
    2. FROM OCRD
    3. WHERE CardCode = (
    4. SELECT TOP 1 CardCode FROM ORDR
    5. GROUP BY CardCode
    6. ORDER BY SUM(DocTotal) DESC
    7. )
    复制代码
    查询结果


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

    在 MySQL 中,可以利用 LIMIT 对查询的信息条目进行限制,如查前 x 条数据、跳过前 y 条数据查找后面的 z 条数据。但是 SQL Server 中不支持 LIMIT,可以使用 TOP 联合 not 和 子查询完成以上功能的实现。
    例:跳过销售金额平均值前十的客户,返回第 11-15 名的客户名单
    1. SELECT TOP 5 CardCode,CardName FROM OPOR
    2. WHERE CardCode NOT IN(
    3. SELECT TOP 10 CardCode FROM ORDR
    4. GROUP BY CardCode
    5. ORDER BY AVG(DocTotal) DESC
    6. )
    复制代码
    查询结果:

    到此这篇关于SQL Server 查询设置 - LIKE/DISTINCT/HAVING/排序的文章就介绍到这了,更多相关SQL Server LIKE/DISTINCT/HAVING/排序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    来源:https://www.jb51.net/database/3344577ww.htm
    免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    ×

    最新评论

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表