实用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
         )
      )


相关推荐
十碗饭吃不饱1 小时前
sql报错:java.sql.SQLSyntaxErrorException: Unknown column ‘as0‘ in ‘where clause‘
java·数据库·sql
呆呆小金人2 小时前
SQL入门: HAVING用法全解析
大数据·数据库·数据仓库·sql·数据库开发·etl·etl工程师
l1t7 小时前
用parser_tools插件来解析SQL语句
数据库·sql·插件·duckdb
TDengine (老段)7 小时前
TDengine 数学函数 ABS() 用户手册
大数据·数据库·sql·物联网·时序数据库·tdengine·涛思数据
Hello.Reader10 小时前
Apache StreamPark 快速上手从一键安装到跑起第一个 Flink SQL 任务
sql·flink·apache
养生技术人18 小时前
Oracle OCP认证考试题目详解082系列第57题
运维·数据库·sql·oracle·开闭原则
养生技术人1 天前
Oracle OCP认证考试题目详解082系列第53题
数据库·sql·oracle·database·开闭原则·ocp
豆沙沙包?1 天前
2025年--Lc171--H175 .组合两个表(SQL)
数据库·sql
养生技术人1 天前
Oracle OCP认证考试题目详解082系列第48题
运维·数据库·sql·oracle·database·开闭原则·ocp
工作中的程序员1 天前
hive sql优化基础
hive·sql