实用SQL小总结

WHERE 条件 column 为纯英文字符 或 不包含任何字符

语法:

sql 复制代码
SELECT * FROM your_table WHERE REGEXP(your_column,'^[A-Za-z]+$');
SELECT * FROM your_table WHERE NOT REGEXP(your_column,'^[A-Za-z]+$');

例:

sql 复制代码
SELECT DISTINCT t.pldlibho FROM kibb_pldlyw t WHERE REGEXP_LIKE(t.pldlibho, '[a-zA-Z]+$');
-- 不包含任何英文字符
SELECT DISTINCT t.pldlibho FROM kibb_pldlyw t WHERE NOT REGEXP_LIKE(t.pldlibho, '[a-zA-Z]+$');

WHERE 条件 column 为纯数字 或 不包含任何数字

语法:

sql 复制代码
SELECT * FROM your_table WHERE REGEXP(your_column,'^[0-9]+$');
SELECT * FROM your_table WHERE NOT REGEXP(your_column,'^[0-9]+$');

例:

sql 复制代码
SELECT DISTINCT t.pldlibho FROM kibb_pldlyw t WHERE REGEXP_LIKE(t.pldlibho, '^[0-9]+$');
--不包含任何数字
SELECT DISTINCT t.pldlibho FROM kibb_pldlyw t WHERE NOT REGEXP_LIKE(t.pldlibho, '^[0-9]+$');

PARTITION BY 的简单使用

部分内容转载至:
https://blog.csdn.net/weixin_44711823/article/details/135966741?fromshare=blogdetail&sharetype=blogdetail&sharerId=135966741&sharerefer=PC&sharesource=FuTian0715&sharefrom=from_link

更详细的讲解请点击链接查看。

说明:

partition by窗口函数 和 group by分组的区别:

partition by关键字是分析性函数的一部分,它和聚合函数(如group by)不同的地方在于它能返回一个分组中的多条记录,而聚合函数一般只有一条反映统计值的记录。

partition by用于给结果集分组,如果没有指定那么它把整个结果集作为一个分组。

partition by与group by不同之处在于前者返回的是分组里的每一条数据,并且可以对分组数据进行排序操作。后者只能返回聚合之后的组的数据统计值的记录。

partition by相比较于group by,能够在保留全部数据的基础上,只对其中某些字段做分组排序(类似excel中的操作),而group by则只保留参与分组的字段和聚合函数的结果; 简单来说窗口函数对部分数据进行排序、计算等操作,group by对一组值进行聚合,即窗口函数是每一行都会保留,group by是从多行浓缩为少数行。

语法:

sql 复制代码
<窗口函数> over ( partition by<用于分组的列名> order by <用于排序的列名>)

窗口函数:

专用窗口函数: rank(), dense_rank(), row_number()

聚合函数 : sum(), max(), min(), count(), avg() 等

例:

sql 复制代码
SELECT m.qyuezhao,
       CASE m.dxnqyzht
         WHEN '3' THEN
          '欠费'
         WHEN '4' THEN
          '暂停'
       END
  FROM (SELECT Row_number() over(PARTITION BY t.dxnqyzht ORDER BY t.qyuezhao) rn,
               t.qyuezhao,
               t.dxnqyzht
          FROM kibb_dxinqy t
         WHERE t.dxnqyzht IN ('3', '4')) m
 WHERE rn <= 10;
sql 复制代码
SELECT *,rank() over(partition by type order by price desc) as  mm from commodity;
SELECT *,row_number() over(partition by type order by price desc) as  mm from commodity;
SELECT *,dense_rank() over(partition by type order by price desc) as  mm from commodity;

从以上结果来看:

rank()函数:如果存在并列名次的行,会占用下一个名次的位置,比如苹果的组内排名 1,2,3,4, 但是由于有两个是并列的,所以显示的排名是 1,1,3,4 ,其中 2 的位置还是被占用了

row_number()函数:不考虑并列的情况,此函数即使遇到了price 相同的情况,还是会默认排出一个先后来

dense_rank()函数:如果存在并列名次的行,不会占用下一个名次的位置,例如图片的最后显示的是 1,1,2,3


json格式字符串处理相关函数

IS JSON

判断某个字段是否为有效json

sql 复制代码
select * from kapb_jioybw bw where bw.quanjuls = 'GFTS002021051100001685916' and bw.jiaoyirq = '20210511';


JSON_VALUE

JSON_VALUE只支持scalar value,即只返回一行一列,通常用在select语句或where条件中。

JSON_VALUE接受两个参数,即JSON文档(document)和到指定属性的路径(path),返回值可以格式化。

JSON_VALUE支持错误处理,例如当指定的path不正确(如路径不存在,大小写不匹配),返回多个值(非scalar)时。错误处理方式有3种,默认为返回空值(NULL ON ERROR),其它为返回指定默认值(DEFAULT on ERROR),报错(ERROR ON ERROR)。

NULL演示

sql 复制代码
-- 错误示例1:Address返回多个属性,不是scalar. Address改为Address.city就正确了。
select JSON_VALUE(xnybwvar ,'$.ShippingInstructions.Address')
 from kapb_jioybw p
 where JSON_VALUE(xnybwvar ,'$.PONumber' returning NUMBER(10)) = 1
 and p.quanjuls = 'GFTS002021051100001685917' and p.jiaoyirq = '20210511';
sql 复制代码
-- 错误示例2:大小写错误,Name应为name
select JSON_VALUE(xnybwvar ,'$.ShippingInstructions.Name')
 from kapb_jioybw p
 where JSON_VALUE(xnybwvar ,'$.PONumber' returning NUMBER(10)) = 450
 and p.quanjuls = 'GFTS002021051100001685917' and p.jiaoyirq = '20210511';
sql 复制代码
-- DEFAULT on ERROR演示
sql 复制代码
-- ERROR ON ERROR演示
sql 复制代码
-- 以上所的错误处理只针对运行时错误,例如以下Address前的.写成了,号,则不在以上所说错误处理的范畴:

JSON_QUERY

JSON_QUERY是JSON_VALUE的补充,参数个数与类型与其一样,但可返回一个对象或array。


输出中省去了很多空格,但为了美观,你也可以加PRETTY关键字以添加缩进和对齐:

下例为使用array index以返回array中的一个对象:

注意JSON_QUERY只能返回对象,如果path指定是一个scalar值,则默认返回空值,例如:

JSON_QUERY的错误处理有三种,默认为NULL ON ERROR, ERROR ON ERROR与JSON_VALUE类似,EMPTY ON ERROR返回空的array。

最常见的错误是返回值不是object或array,而是scalar值。

不过还有一种特殊方式,可将scalar转换为array:

利用WITH ARRAY WRAPPER将结果强制转换为array

JSON_TABLE

第一个查询显示了如何从文档中最多发生一次的值投射一组列。值可能来自任何级别的嵌套,只要它们不来自组的键,或来自阵列的后裔,除非使用索引来识别数组中的一个项目。

sql 复制代码
select M.*
 from kapb_jioybw p,
      JSON_TABLE(p.xnybwvar,
                 '$' columns PO_NUMBER NUMBER(10) path '$.PONumber',
                 REFERENCE VARCHAR2(30 CHAR) path '$.Reference',
                 REQUESTOR VARCHAR2(32 CHAR) path '$.Requestor',
                 USERID VARCHAR2(10 CHAR) path '$.User',
                 COSTCENTER VARCHAR2(16 CHAR) path '$.CostCenter',
                 TELEPHONE VARCHAR2(16 CHAR) path
                 '$.ShippingInstructions.Phone[0].number') M
 where p.quanjuls = 'GFTS002021051100001685917'
  and p.jiaoyirq = '20210511'
  and PO_NUMBER between 1 and 2;

如果输出的列仍是对象或array,则可使用嵌套(NESTED PATH):

sql 复制代码
select M.*
 from kapb_jioybw p,
      JSON_TABLE(p.xnybwvar,
                 '$' columns(PO_NUMBER NUMBER(10) path '$.PONumber',
                         REFERENCE VARCHAR2(30 CHAR) path '$.Reference',
                         REQUESTOR VARCHAR2(32 CHAR) path '$.Requestor',
                         USERID VARCHAR2(10 CHAR) path '$.User',
                         COSTCENTER VARCHAR2(16) path '$.CostCenter',
                         NESTED PATH '$.LineItems[*]'
                         columns(ITEMNO NUMBER(16) path '$.ItemNumber',
                                 DESCRIPTION VARCHAR2(32 CHAR) path
                                 '$.Part.Description',
                                 UPCCODE VARCHAR2(14 CHAR) path
                                 '$.Part.UPCCode',
                                 QUANTITY NUMBER(5, 4) path '$.Quantity',
                                 UNITPRICE NUMBER(5, 2) path
                                 '$.Part.UnitPrice'))) M
 where p.quanjuls = 'GFTS002021051100001685917'
  and p.jiaoyirq = '20210511'
  and PO_NUMBER between 1 and 2;

JSON_TABLE常用于建立关系型视图,然后可以用标准的SQL语句操作。

sql 复制代码
create or replace view json_test_view
as
select M.*
 from kapb_jioybw p,
      JSON_TABLE(p.xnybwvar,
                 '$' columns(PO_NUMBER NUMBER(10) path '$.PONumber',
                         REFERENCE VARCHAR2(30 CHAR) path '$.Reference',
                         REQUESTOR VARCHAR2(32 CHAR) path '$.Requestor',
                         USERID VARCHAR2(10 CHAR) path '$.User',
                         COSTCENTER VARCHAR2(16) path '$.CostCenter',
                         NESTED PATH '$.LineItems[*]'
                         columns(ITEMNO NUMBER(16) path '$.ItemNumber',
                                 DESCRIPTION VARCHAR2(32 CHAR) path
                                 '$.Part.Description',
                                 UPCCODE VARCHAR2(14 CHAR) path
                                 '$.Part.UPCCode',
                                 QUANTITY NUMBER(5, 4) path '$.Quantity',
                                 UNITPRICE NUMBER(5, 2) path
                                 '$.Part.UnitPrice'))) M
 where p.quanjuls = 'GFTS002021051100001685917'
  and p.jiaoyirq = '20210511'
  and PO_NUMBER between 1 and 2;

定义完这些视图后,开发者就可以完全利用SQL的能力了。

JSON_EXISTS

用在where语句中,和EXISITS类似,测试JSON document中是否存在指定的path。

sql 复制代码
select count(*)
 from kapb_jioybw p
 where JSON_EXISTS(p.xnybwvar, '$.ShippingInstructions.Address.state')
  and p.quanjuls = 'GFTS002021051100001685917'
  and p.jiaoyirq = '20210511'

JSON_EXISTS可以区分key不存在或key存在,value不存在或为空的情形,试比较以下输出:

sql 复制代码
select JSON_VALUE(p.xnybwvar, '$.ShippingInstructions.Address.county'),
      count(*)
 from kapb_jioybw p
 where p.quanjuls = 'GFTS002021051100001685917'
  and p.jiaoyirq = '20210511'
 group by JSON_VALUE(p.xnybwvar, '$.ShippingInstructions.Address.county');
sql 复制代码
select JSON_VALUE(p.xnybwvar, '$.ShippingInstructions.Address.county'),
      count(*)
 from kapb_jioybw p
 where p.quanjuls = 'GFTS002021051100001685917'
  and p.jiaoyirq = '20210511'
  and JSON_EXISTS(p.xnybwvar, '$.ShippingInstructions.Address.county')
 group by JSON_VALUE(p.xnybwvar, '$.ShippingInstructions.Address.county');

JSON_EXISTS还支持predicate,就是可以带条件。

sql 复制代码
select p.xnybwvar
 from kapb_jioybw p
 where JSON_EXISTS(p.xnybwvar,
                  '$?(@.PONumber == $PO_NUMBER)' passing 1 as "PO_NUMBER")
  and p.quanjuls = 'GFTS002021051100001685917'
  and p.jiaoyirq = '20210511';
sql 复制代码
SELECT COUNT(1)
  FROM kapb_jioybw p
 WHERE JSON_EXISTS(p.xnybwvar,
                   '$?(@.PONumber == $PO_NUMBER)' passing 1 AS "PO_NUMBER")
   AND p.quanjuls = 'GFTS002021051100001685917'
   AND p.jiaoyirq = '20210511';

JSON索引

使用JSON_VALUE创建的唯一索引,基于的值必须是scalar,而且必须唯一。可以是B-Tree索引或Bitmap索引。

sql 复制代码
create unique index PO_NUMBER_IDX
   on kapb_jioybw p (
         JSON_VALUE(
            p.xnybwvar,'$.PONumber' returning NUMBER(10) ERROR ON ERROR NULL ON EMPTY
         )
      )


相关推荐
Frank牛蛙7 小时前
1.每日SQL----2024/11/7
数据库·sql
上海_彭彭7 小时前
【提效工具开发】Python功能模块执行和 SQL 执行 需求整理
开发语言·python·sql·测试工具·element
成富12 小时前
文本转SQL(Text-to-SQL),场景介绍与 Spring AI 实现
数据库·人工智能·sql·spring·oracle
songqq2712 小时前
SQL题:使用hive查询各类型专利top 10申请人,以及对应的专利申请数
数据库·sql
时差95315 小时前
【面试题】Hive 查询:如何查找用户连续三天登录的记录
大数据·数据库·hive·sql·面试·database
Mephisto.java15 小时前
【大数据学习 | kafka高级部分】kafka的优化参数整理
大数据·sql·oracle·kafka·json·database
山海青风16 小时前
第七篇: BigQuery中的复杂SQL查询
sql·googlecloud
lzhlizihang18 小时前
【Hive sql 面试题】求出各类型专利top 10申请人,以及对应的专利申请数(难)
大数据·hive·sql·面试题
威哥爱编程19 小时前
SQL Server 数据太多如何优化
数据库·sql·sqlserver